首页
题库
公司真题
专项练习
面试题库
在线编程
面试
面试经验
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
全部评论
推荐
最新
楼层
暂无评论,快来抢首评~
相关推荐
12-18 14:38
西北工业大学 Java
开始学习Java面试专题(day1),还想问问大家27届现在做完力扣100和苍穹外卖还需要做什么呢
Java面试专题 职业技能: springboot + ssm + redis + 数据库 ::其他技术(微服务、ES、MQ、源码、高并发、JVM、技术选型、设计能力 比如(要针对性的写一些): 1.熟练使用Redis等非关系型数据库 ❌ 2.精通Redis,深入理解Redis线程模型以及Redis的核心数据结构和使用场景,熟悉多级缓存架构,比如:缓存雪崩、穿透、击穿、双写一致、缓存失效等;自主搭建过Redis高可用集群✔ Redis 使用场景: flowchart TD A[使用场景] B[缓存] C[分布式锁] D[计数器] E[保存token] F[消息队列] G[延迟队列] A --&...
java面试专题学习记录
点赞
评论
收藏
分享
12-18 11:09
门头沟学院 算法工程师
推荐一个AI Agent开发项目
非常适合准备入门Agent开发或者是毕业生拿来做毕设的同学!!!包含的技术栈:LangChain + LangGraph + RAG + Agent + MCP + Memory + Python + FastAPIAgent下又有ReAct-Agent、CodeAct-Agent、Plan-and-Execute-Agent 的三种范式的示例链接为:https://github.com/Shy2593666979/AgentChat目前项目的Star数量≈100,已经收获来自理想汽车员工、西安电子科技大学同学等等等等的一致好评,遇到问题,尽管的提issue,作者还可直接远程操控电脑帮忙解决,...
点赞
评论
收藏
分享
12-11 11:13
已编辑
湖南大学 安卓
北邮毕业拿字节228万offer
非常夸张,已经超过学校本身的意义了,和学校没啥关系,绝对是个人能力问题!!!牛的人在任何地方都牛!听说他是 2025 年毕业,进了 seed,赶上了 8 月增发那 100 万期权,算下来才有这么多。感觉在印钞厂上班一样,好夸张,已经不是羡慕了,十分震惊!第二个百万offer如下,也是字节给北邮开的200whttps://www.nowcoder.com/feed/main/detail/a8518f8e5eb9487a803f18612dd8036a?sourceSSR=users
BloodEngin...:
上个厕所都挣几百?
字节开奖
点赞
评论
收藏
分享
10-29 19:48
河南科技大学 Java
刚打开boss就看到了爱耄hr
点赞
评论
收藏
分享
昨天 21:18
蚌埠坦克学院 嵌入式软件开发
提前实习好处就是赚米
提前实习可以赚钱,对很多学生来说,这不仅是积累工作经验的机会,也是一条实际收益的途径。通过提前进入职场实习,学生可以将课堂所学与真实项目结合,提前熟悉企业流程和职业要求,同时获得一定报酬。这种经验既可以减轻经济压力,也能让个人在毕业前就具备一定的竞争力。提前实习的收入虽然不一定很高,但对于理财和生活支出都有帮助,同时还能为将来的正式工作积累实战经验和人脉资源。总的来说,提前实习既能学习成长,又能赚钱,是学生迈向职场的一种双赢选择。
一人说一个提前实习的好处
点赞
评论
收藏
分享
评论
点赞成功,聊一聊 >
点赞
收藏
分享
评论
提到的真题
返回内容
全站热榜
更多
1
...
26届双非本鼠硕拿下5个ssp的秋招总结及一条龙经验分享
5434
2
...
大二混子终于找到实习了...
2764
3
...
【求助】被hr骂“刷子”什么意思?
2547
4
...
校招入职半年之后又回到了这个地方
2073
5
...
在mentor视角谈谈实习生摸鱼
1489
6
...
字节客户端实习
1291
7
...
把“购买社保”打成“狗买社保”
1044
8
...
牛爷爷们帮忙选一下offer
952
9
...
小红书日常
916
10
...
初次找实习总结
838
创作者周榜
更多
正在热议
更多
#
实习没事做是福还是祸?
#
4975次浏览
74人参与
#
应届生进小公司有什么影响吗
#
108244次浏览
1103人参与
#
一人说一个提前实习的好处
#
1600次浏览
22人参与
#
OPPO求职进展汇总
#
755568次浏览
5390人参与
#
团建是“福利”还是是 “渡劫”
#
2159次浏览
56人参与
#
你小心翼翼的闯过多大的祸?
#
4755次浏览
73人参与
#
重来一次,你会对开始求职的自己说
#
1021次浏览
20人参与
#
今年形式下双非本找得到工作吗
#
265939次浏览
1541人参与
#
公司情报交流地
#
127168次浏览
1232人参与
#
实习简历求拷打
#
25047次浏览
253人参与
#
从顶到拉给所有面过的公司评分
#
144485次浏览
516人参与
#
正在实习的你,有转正机会吗?
#
465881次浏览
3063人参与
#
投格力的你,拿到offer了吗?
#
155130次浏览
829人参与
#
作业帮求职进展汇总
#
85642次浏览
559人参与
#
携程工作体验
#
18981次浏览
66人参与
#
哪些公司笔/面试难度大?
#
7102次浏览
32人参与
#
国庆前的秋招小结
#
266003次浏览
1719人参与
#
机械人,签完三方你在忙什么?
#
75495次浏览
260人参与
#
在牛客分享我的求职旅程
#
176850次浏览
2688人参与
#
那些我实习了才知道的事
#
253189次浏览
1785人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务