首页
题库
公司真题
专项练习
面试题库
在线编程
面试
面试经验
AI 模拟面试
简历
求职
学习
基础学习课
实战项目课
求职辅导课
专栏&文章
竞赛
搜索
我要招人
发布职位
发布职位、邀约牛人
更多企业解决方案
AI面试、笔试、校招、雇品
HR免费试用AI面试
最新面试提效必备
登录
/
注册
web3366
广州大学 Web前端
发布于广东
关注
已关注
取消关注
好
@阿珊和她的猫:
1. 仿网易云音乐播放器(technical-architecture)
1. 架构设计2. 技术描述3. 路由定义路由用途/首页推荐页面,展示个性化推荐内容/discover发现音乐页面,音乐分类和排行榜/mine我的音乐页面,个人歌单和收藏/playlist/:id歌单详情页面,显示歌单内歌曲列表/player播放页面,音乐播放控制和歌词显示/search搜索页面,音乐搜索功能/profile用户中心页面,个人信息和设置/music-hall音乐馆页面,精选内容和专题4. 核心组件架构4.1 音频播放管理// 音频状态管理interface AudioState { currentSong: Song | null playlist: Song[] currentIndex: number isPlaying: boolean playMode: 'loop' | 'single' | 'random' volume: number progress: number duration: number}// 歌曲数据结构interface Song { id: string title: string artist: string album: string duration: number cover: string url: string lyrics: LyricLine[]}interface LyricLine { time: number text: string}4.2 歌单管理// 歌单数据结构interface Playlist { id: string name: string description: string cover: string playCount: number songCount: number creator: User songs: Song[] createTime: number}interface User { id: string nickname: string avatar: string level: number followers: number followings: number}4.3 搜索功能// 搜索结果类型interface SearchResult { songs: Song[] playlists: Playlist[] artists: Artist[] albums: Album[]}interface Artist { id: string name: string avatar: string followers: number}interface Album { id: string name: string artist: string cover: string publishTime: number}5. 状态管理设计5.1 Pinia Store结构5.2 核心Store定义// 播放器Storeexport const usePlayerStore = defineStore('player', { state: () => ({ currentSong: null as Song | null, playlist: [] as Song[], currentIndex: 0, isPlaying: false, playMode: 'loop' as 'loop' | 'single' | 'random', volume: 1, progress: 0, duration: 0 }), actions: { playSong(song: Song) { this.currentSong = song this.isPlaying = true }, togglePlay() { this.isPlaying = !this.isPlaying }, nextSong() { // 根据播放模式切换歌曲逻辑 }, prevSong() { // 上一首歌曲逻辑 } }})6. Mock数据设计6.1 模拟API结构// Mock数据配置interface MockConfig { songs: Song[] playlists: Playlist[] artists: Artist[] albums: Album[] users: User[]}// 模拟API端点const MOCK_APIS = { // 推荐歌单 '/api/recommend/playlist': 'GET', // 歌单详情 '/api/playlist/:id': 'GET', // 搜索 '/api/search': 'GET', // 歌曲URL '/api/song/url/:id': 'GET', // 歌词 '/api/lyric/:id': 'GET', // 排行榜 '/api/toplist': 'GET'}6.2 音频播放技术实现// Web Audio API播放器类class AudioPlayer { private audioContext: AudioContext private audioElement: HTMLAudioElement private gainNode: GainNode private analyser: AnalyserNode constructor() { this.audioContext = new AudioContext() this.audioElement = new Audio() this.setupAudioNodes() } private setupAudioNodes() { const source = this.audioContext.createMediaElementSource(this.audioElement) this.gainNode = this.audioContext.createGain() this.analyser = this.audioContext.createAnalyser() source.connect(this.gainNode) this.gainNode.connect(this.analyser) this.analyser.connect(this.audioContext.destination) } play(url: string) { this.audioElement.src = url this.audioElement.play() } pause() { this.audioElement.pause() } setVolume(volume: number) { this.gainNode.gain.value = volume } getProgress(): number { return this.audioElement.currentTime / this.audioElement.duration }}7. 组件设计规范7.1 基础组件结构<!-- 歌曲列表项组件 --><template> <div class="song-item" @click="handlePlay"> <img class="cover" :src="song.cover" /> <div class="info"> <h3 class="title">{{ song.title }}</h3> <p class="artist">{{ song.artist }}</p> </div> <div class="actions"> <van-icon name="play-circle-o" @click.stop="handlePlay" /> <van-icon name="ellipsis" @click.stop="showActions" /> </div> </div></template><script setup lang="ts">import { usePlayerStore } from '@/stores/player'interface Props { song: Song showAlbum?: boolean}const props = defineProps<Props>()const playerStore = usePlayerStore()const handlePlay = () => { playerStore.playSong(props.song)}</script>7.2 页面布局结构<!-- 基础页面布局 --><template> <div class="page-container"> <van-nav-bar :title="title" left-arrow @click-left="onClickLeft" /> <div class="page-content"> <router-view /> </div> <PlayerBar /> <van-tabbar v-model="activeTab" route> <van-tabbar-item icon="home-o" to="/">首页</van-tabbar-item> <van-tabbar-item icon="search" to="/discover">发现</van-tabbar-item> <van-tabbar-item icon="music-o" to="/mine">我的</van-tabbar-item> <van-tabbar-item icon="user-o" to="/music-hall">音乐馆</van-tabbar-item> </van-tabbar> </div></template>8. 性能优化策略8.1 懒加载实现// 图片懒加载指令const lazyLoad = { mounted(el: HTMLImageElement, binding: DirectiveBinding) { const observer = new IntersectionObserver((entries) => { entries.forEach(entry => { if (entry.isIntersecting) { el.src = binding.value observer.unobserve(el) } }) }) observer.observe(el) }}8.2 虚拟滚动长列表使用虚拟滚动优化性能歌曲列表、搜索结果等大数据量展示场景使用第三方库如vue-virtual-scroller8.3 音频预加载预加载下一首歌曲缓存常用音频资源使用Service Worker进行资源缓存
点赞 3
评论 3
全部评论
推荐
最新
楼层
暂无评论,快来抢首评~
相关推荐
02-16 10:47
联想(北京)有限公司_后端开发部_JAVA开发工程师(准入职员工)
康冠科技内推,康冠科技内推码
康冠科技硬件工程师面经8.7 一面终面 只有一次面试决定是否通过1.为什么选择珠三角这个地方来工作(改开前列,经济发达地区有更多机会,也有更多的资源)2.珠三角和长三角在同等条件下,会选择哪个区域,为什么3.平时有什么兴趣爱好4.个人有什么缺点(决策不够决断,指定目标的时候有些太远,可实施性不高)5.从哪里了解到的康冠6.对STM32单片机了解的多吗,32的GPIO口在我们使用的时候,需要进行哪些初始化动作(引脚复用的上下拉电阻,代码也需要确定使用输入输出;单功能接口不需要设置)7.STM32单片机的输入输出IO口最高工作速度,大概是多少兆8.项目中使用的传感器与单片机是怎么通信的,用...
点赞
评论
收藏
分享
02-21 16:10
上海交通大学 算法工程师
拼多多 / Temu 招商运营 二面
岗位名称:招商运营面试时长:1h自评分:8/10是否下一轮:是动机与岗位匹配度你的专业和跨境电商并不相关,为什么想做招商运营?(追问)这个决定是临时起意还是长期规划?有没有做过相关准备?你是从什么时候开始关注 Temu 的?(追问)最早是通过什么渠道了解到 Temu?当时的第一印象是什么?你觉得招商运营这份工作最核心的能力是什么?(追问)这些能力你觉得目前具备哪些?哪些还需要提升?教育背景与个人选择当初为什么决定读研,而不是本科毕业就直接找工作?选择现在这所学校时,你当时主要考虑了哪些因素?(追问)有没有放弃其他机会?当时怎么权衡的?回头看,你觉得读研给你带来的最大变化是什么?(追问)这种变化...
运营必备题库
点赞
评论
收藏
分享
02-16 01:39
南昌大学 Java
字节这么逗
今日首蚌,真的很难绷住
坚持无悔意无休:
xhs上集美最爱说谎博人眼球
点赞
评论
收藏
分享
02-21 16:00
上海交通大学 算法工程师
拼多多 / Temu 招商运营 一面
岗位名称:招商运营面试时长:45min–1h自评分:7.5/10是否下一轮:是自我介绍与动机背景三分钟自我介绍研究生专业和互联网不相关,为什么想进入互联网行业?是什么契机让你对跨境电商或平台招商运营产生兴趣?(追问)你是从什么时候开始系统了解跨境电商的?具体做过哪些调研?(追问)如果最终没有进入平台招商方向,你还会考虑哪些岗位?实习经历与个人能力实习中最有成就感的一件事是什么?你主要负责哪些具体工作?(追问)这件工作最终结果如何衡量?有没有量化指标?(追问)如果重新再做一次,你会优化哪个环节?遇到高强度任务时你是如何推进和完成的?(追问)有没有出现过延期或目标未达成的情况?当时怎么处理?行业认...
运营必备题库
点赞
评论
收藏
分享
评论
点赞成功,聊一聊 >
点赞
收藏
分享
评论
提到的真题
返回内容
全站热榜
更多
1
...
实习租房焚决
1679
2
...
嵌入式应届生春招怎么准备——从零到拿 Offer 的系统攻略
513
3
...
HTTP 和 HTTPS 区别
486
4
...
27届实习近一年的年度经历和总结
384
5
...
暑期实习来得及吗
384
6
...
04男大去相亲了
300
7
...
美团推荐算法一面
288
8
...
专升本三本计科应届,Java学了又停、试了几份工都不合适,现在毕设快做完,是继续死磕Java开发,还
212
9
...
agent实习都干什么?prompt设计
205
10
...
Redis 的 Zset底层是怎么实现的?
194
创作者周榜
更多
正在热议
更多
#
牛客新年AI问运
#
15086次浏览
169人参与
#
记录实习开销
#
183640次浏览
766人参与
#
牛客AI体验站
#
18029次浏览
307人参与
#
大家每天通勤多久?
#
82684次浏览
631人参与
#
正在实习的你,几点下班
#
296038次浏览
2005人参与
#
牛客租房专区
#
153047次浏览
1554人参与
#
不给转正的实习,你还去吗
#
2625314次浏览
22847人参与
#
如何缓解入职前的焦虑
#
259540次浏览
1458人参与
#
你小时候最想从事什么职业
#
154130次浏览
2059人参与
#
选择和努力,哪个更重要?
#
191314次浏览
1495人参与
#
有转正机会的小厂实习值得去吗?
#
1039次浏览
21人参与
#
校招入职后的感受
#
488132次浏览
3682人参与
#
牛友们,签完三方你在忙什么?
#
137524次浏览
997人参与
#
担心入职之后被发现很菜怎么办
#
282698次浏览
1189人参与
#
选了这个offer,你有没有后悔?
#
742014次浏览
4475人参与
#
你最讨厌面试被问什么
#
1896次浏览
28人参与
#
你觉得今年秋招难吗
#
1988502次浏览
18492人参与
#
ai智能作图
#
635133次浏览
5641人参与
#
金融银行求职进展汇总
#
309567次浏览
1685人参与
#
投递无反馈,如何优化求职策略?
#
8618次浏览
43人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务