首页
题库
公司真题
专项练习
面试题库
在线编程
面试
面试经验
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
全部评论
推荐
最新
楼层
暂无评论,快来抢首评~
相关推荐
01-31 15:11
浙江大学 算法工程师
C++面试八股文(Qt 数据库)
1. Qt中如何连接数据库?在 Qt 中,连接数据库的基本步骤如下:加载数据库驱动:Qt 支持多种数据库(如 SQLite、MySQL、PostgreSQL 等)。需要加载适当的数据库驱动。创建 QSqlDatabase 对象:通过 QSqlDatabase::addDatabase() 来创建一个数据库连接对象,并设置连接类型(例如 SQLite、MySQL)。设置连接参数:配置数据库连接的参数,如数据库文件路径、用户名、密码等。打开数据库:调用 open() 方法来打开数据库连接,并检查连接是否成功。2. QSqlDatabase、QSqlQuery、QSqlTableModel的作用是什...
C++八股文全集
点赞
评论
收藏
分享
02-02 13:41
美团_后台开发工程师
我的第一款小程序上线啦!
大家好呀,我是飞鱼最近我做了个小程序:躺了么,我简单介绍下,也欢迎大家试用。为什么做「躺了么」说白了,就是想做个轻松点的小工具,让自己别老被工作牵着走,也别总觉得摸鱼是罪过。记录每天到底花了多少时间在工作、多少时间在放松?有了数据,心里就有数。名字的灵感来自最近很火的APP:死了么,这种反讽风格。我可以把它转成更轻松的问法:不是逼你卷,而是简单问一句:今天躺了吗?这里说句题外话,其实死了么这个APP的创意,应该很多人都能想得到。毕竟现在是孤独经济时代,独居年轻人这个群体规模已经非常庞大。我之前也想做一个类似的,但觉得太简单了,一直在问自己,真有人用么。现在明白了,AI时代了,有想法创意之后任何...
牛客AI体验站
点赞
评论
收藏
分享
01-19 18:53
已编辑
蚌埠坦克学院 Java
被mentor温暖到了
实习第三天了,讲讲感受吧,mentor每天都会喊我一起去食堂吃饭,会给我推荐哪家的好吃,吃完饭还会等我,经常没事,会来问我有没有问题,有问题随时来找他。看到我就一个电脑分屏比较困难,还帮我安排了一个新的显示器,可以看下面的图,到现在都没给我派什么任务,让我先熟悉。反正,心里暖暖的
飞屋一号:
碰到这样的mt可以直接托付终生了
点赞
评论
收藏
分享
01-15 10:49
安徽新华学院 Python
cc简历
27寒假想找个实习,找不到咩
点赞
评论
收藏
分享
不愿透露姓名的神秘牛友
01-31 13:09
中信证券校招管培生面经
上海分公司在正式面试前会设置一轮线下意向面谈,主要目的就是看你的心理准备和长期意愿。面试官直接问你知不知道这个岗位的销售性质,直说会在营业部,有6个月的实习期,和两年半保护期,有开户量、交易量KPI要求。会聊个人基本情况(本地人有房有资源应该是加分项),其余就是针对简历常规问题。面试要穿正装,1v1,体验很好。要穿正装,签到时看了名单,很多人鸽了,但还是很海。
点赞
评论
收藏
分享
评论
点赞成功,聊一聊 >
点赞
收藏
分享
评论
提到的真题
返回内容
全站热榜
更多
1
...
AI 应用开发学习全景路线图
1.5W
2
...
害怕被嘲笑就不去做了吗?
6162
3
...
大厂到底想要什么样的人???
5335
4
...
2026的你,应该知道哪些AI面试题?
2391
5
...
面试官视角聊聊,AI大模型产品到底是做什么的?
2261
6
...
字节财经业务一面凉经
1723
7
...
我用AI做了个小游戏,来玩!
1691
8
...
测试/测开方向刷题经验分享
1564
9
...
后端 offer选择
1392
10
...
因为简历太烂被培训班找上了吗
1040
创作者周榜
更多
正在热议
更多
#
在大厂上班是一种什么样的体验
#
4619次浏览
68人参与
#
找工作的破防时刻
#
251646次浏览
1953人参与
#
程序员找工作至少要刷多少题?
#
9313次浏览
146人参与
#
你投递的公司有几家约面了?
#
157783次浏览
995人参与
#
论秋招对个人心气的改变
#
5887次浏览
104人参与
#
我的AI电子员工
#
26136次浏览
159人参与
#
OPPO求职进展汇总
#
770924次浏览
5396人参与
#
为了减少AI幻觉,你注入过哪些设定?
#
1855次浏览
54人参与
#
刚入职的你踩过哪些坑
#
4191次浏览
91人参与
#
程序员能干到多少岁?
#
5763次浏览
90人参与
#
一张图晒一下你的AI员工
#
2943次浏览
62人参与
#
牛客AI体验站
#
3346次浏览
91人参与
#
我现在比当时_,你想录用我吗
#
3663次浏览
63人参与
#
想辞职但是不敢的原因
#
20156次浏览
88人参与
#
ai智能作图
#
624718次浏览
5627人参与
#
AI Coding的使用心得
#
2328次浏览
60人参与
#
关于春招/暑期实习,你想知道哪些信息?
#
3950次浏览
84人参与
#
牛客租房专区
#
146735次浏览
1464人参与
#
晒晒你司的新年福利
#
3971次浏览
70人参与
#
虾皮求职进展汇总
#
373390次浏览
2792人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务