首页
题库
公司真题
专项练习
面试题库
在线编程
面试
面试经验
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
全部评论
推荐
最新
楼层
暂无评论,快来抢首评~
相关推荐
03-28 08:56
浙江大学 算法工程师
C++ 八股文速通
一、语言本质:C++ 是什么C++ = 多范式语言支持:面向过程(C 风格)面向对象(class / inheritance / polymorphism)泛型编程(template)元编程(constexpr / TMP)核心思想:零成本抽象(Zero-overhead abstraction)—— 你不用的功能不会带来运行时开销二、内存模型与对象生命周期1. 内存分区典型程序内存布局:栈(stack):局部变量,自动分配释放堆(heap):动态分配(new / malloc)静态区(data / bss):全局变量、static变量常量区:字符串常量等代码区(text)2. new / d...
点赞
评论
收藏
分享
03-30 18:59
广州大学 前端工程师
双非前端字节一面面经(难度 plus ultra 版)
真是一场苦战,索性该答的都答了个七七八八加粗的是没答上来的Reconciler 如何遍历 fiber 树(先序遍历)为什么要这么设计(这我上哪知道了)DOM 树和 fiber 树的区别diff 算法是怎么比较新旧两个树的(还没学到 diff 算法呢)浏览器从拿到渲染树以后都经过了哪些阶段(布局→分层→分块→光栅化→直接显示(其实是合成))为什么光栅化要由 GPU 去做(GPU 擅长光栅化的操作)为什么会这样呢(疯了吧问这个)Webpack 和 Vite 有什么区别Vite 打包用的什么(我想也是 ESM 吧)ESM 和 CJS 区别(提到同步导入和异步导入)微任务队列和宏任务队列都是什么任务循...
查看20道真题和解析
点赞
评论
收藏
分享
03-24 14:04
门头沟学院 Web前端
不是我应聘个it技术支持岗位4-6k 还学历歧视上了😭
点赞
评论
收藏
分享
03-26 18:33
中国传媒大学 数据分析师
你的实习产出是真实的还是包装的?
现在找工作卷成这样,很多人简历上的实习经历看着特别厉害,又是独立负责项目,又是数据显著提升,又是产出重要成果。可真要细问几句,流程说不清楚,细节对不上号,逻辑也稀碎。 其实包装一点可以理解,但别把自己都骗了。真正有用的实习,是你真的参与、真的思考、真的解决过问题。全靠编出来的漂亮产出,面试一戳就破,入职之后也扛不住活。与其花心思美化简历,不如踏踏实实做点能拿得出手的东西,心里有底,说话才硬气。#你的实习产出是真实的还是包装的?#
点赞
评论
收藏
分享
评论
点赞成功,聊一聊 >
点赞
收藏
分享
评论
提到的真题
返回内容
全站热榜
更多
1
...
我放弃互联网大厂了。。
2954
2
...
Vibe Coding开发前的 7 个关键步骤
2614
3
...
字节实习一、二、三、HR面面经
2454
4
...
双非前端字节一面面经(难度 plus ultra 版)
1997
5
...
我招了!当年就是被招行这么招进去的
1600
6
...
京东零售平台产品与研发中心一面
1556
7
...
美团后端暑期实习一面
1349
8
...
如何把面试主动权握在手里?Ai岗面试焚诀!
1276
9
...
美团暑期二面
1218
10
...
在工作中,如何正确使用vibe coding来增效?
1218
创作者周榜
更多
正在热议
更多
#
你觉得大几开始实习最合适?
#
9168次浏览
89人参与
#
实习生的蛐蛐区
#
921243次浏览
4697人参与
#
开放七大实习专项,百度暑期实习值得冲吗
#
28335次浏览
527人参与
#
你见过哪些招聘隐形歧视?
#
6423次浏览
64人参与
#
毕业季等于分手季吗
#
59229次浏览
680人参与
#
面试被问到不会的问题,你怎么应对?
#
8477次浏览
68人参与
#
厦门银行科技岗值不值得投
#
12717次浏览
306人参与
#
面试吐槽bot
#
182110次浏览
865人参与
#
好好告别我的学生时代
#
138080次浏览
1553人参与
#
25届秋招公司红黑榜
#
328651次浏览
1292人参与
#
小厂实习有必要去吗
#
87328次浏览
417人参与
#
租房前辈的忠告
#
380259次浏览
7491人参与
#
你都用vibe coding做过什么?
#
3675次浏览
156人参与
#
做完笔试后你收到面试了吗?
#
8853次浏览
80人参与
#
Vibe Coding 会干掉初级岗位吗?
#
7519次浏览
128人参与
#
实习转正进行时
#
168314次浏览
1064人参与
#
AI Coding实战技巧
#
2773次浏览
75人参与
#
你现在一天AI几次?
#
2568次浏览
57人参与
#
牛友の3月总结
#
12975次浏览
120人参与
#
如果人生可以debug你会改哪一行?
#
3428次浏览
73人参与
#
大厂实习和小厂实习最大的区别是什么?
#
16901次浏览
109人参与
#
百度工作体验
#
319641次浏览
2239人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务