微信小程序仿网易音乐播放器项目

news2024/11/25 13:18:23

一、项目展示

主页:
home
播放页:

play
搜索页:

search
排行榜页:

排行榜
小控件:
在这里插入图片描述

二、项目结构

接口

三、项目功能点

后端接口,使用node写的,使用了网易云音乐API:

api
封装的api文件

//env是基础地址js文件
import config from './env'
export default (url,method="GET",data={})=>{
    return new Promise((resolve,reject)=>{
        wx.request({
          url: config.dev.baseUrl + url,
          method,
          data,
          success(res){
            // console.log(res.data);
            if(res.statusCode == 200){
              resolve(res.data)
            }else{
              wx.showToast({
                title: '请求失败,请联系管理员',
              })
              reject('请求失败,请联系管理员')
            }
          },
          fail(error){
            wx.showToast({
              title: '请求失败,请联系管理员',
            })
            reject('请求失败,请联系管理员')
          }
        })
    })
  }
import request from './request'
module.exports = {
  // 获取banner
  getBanner:()=> request('/banner','get',{type:'2'}),
  // 推荐歌单
  getrecommendMusic:()=> request('/personalized?limit=6','get',),
  // 排行榜
  getTopMusic:(idx)=>request(`/top/list?idx=${idx}`,'get'),

  // 歌曲详情
  getMusicDetail:(ids)=>request(`/song/detail?ids=${ids}`),

  // 歌曲音频路径
  getMusicUrl:(id)=>request(`/song/url?id=${id}`,'POST'),

  // 热搜数据 /search/hot/detail
  getHotMusicData:()=>request('/search/hot/detail'),

  // 搜索歌曲 /search
  getSearchMusic:(keywords,limit)=>request(`/search?keywords=${keywords}&limit=${limit}`),
  

  //搜索歌曲关键字  /search/default
  getSearchDefault:()=>request('/search/default'),

  // 登录  网易云真实账号密码
  login:(phone,password)=>request(`/login/cellphone?phone=${phone}&password=${password}`)

}

主页面:

在这里插入图片描述

  1. banner,滑动菜单栏采用微信的API(swiperscroll-view)进行开发
  2. 滑动到底部重新获取后续的歌曲,使用onReachBottom周期函数来监听页面到达底部,歌曲使用slice函数进行分页操作。
this.setData({
    topList:hotMusicList.playlist,
    todayMusic:hotMusicList.playlist.tracks.slice(0,size*page)
  })
  1. 点击歌曲,进入播放页,传参歌曲id
/ 获取歌曲详情
  goMusicDetail(e){
    let ids = e.currentTarget.dataset.id
    wx.redirectTo({
      url:`../play/play?ids=${ids}`
    })
  },


播放页:

在这里插入图片描述

  1. 进度条使用微信组件slidervalue表示现在进度(0—100)
  <view class="progress">
    <slider bindchange='sliderChange' activeColor='blue' block-size="12" value='{{ProValue}}' />
  </view>
  1. 进度条value转换成0-100的数值(歌曲当前时间/歌曲总时长*100)
 let value = (music.currentTime/music.duration)*100
  1. 歌曲播放当前时间与总时长格式转换00:00格式
// 转换时间格式,将秒转换成00:00格式
 s_to_hs(s){
    //计算分钟
    //算法:将秒数除以60,然后下舍入,既得到分钟数
    let h = Math.floor(s/60);
    //计算秒
    //算法:取得秒%60的余数,既得到秒数
    s=Math.trunc(s%60);
    //将变量转换为字符串
    h+='';
    s+='';
    //如果只有一位数,前面增加一个0
    h  =   (h.length==1)?'0'+h:h;
    s  =   (s.length==1)?'0'+s:s;
    return h+':'+s;
},
  1. 歌曲进度条随歌曲播放,实时滚动,使用定时器,每秒改变data的数值

timer(){
  // 定时器
 setTimeout(() => {
  music.currentTime
  music.onTimeUpdate(() => {
    let startTime = this.s_to_hs(music.currentTime)
    let endTime = this.s_to_hs(music.duration)
    let value = (music.currentTime/music.duration)*100
    this.setData({
      PlayStartTime:startTime,
      PlayEndTime:endTime,
      ProValue:value
    })
  })
}, 1000)
},
  1. ios静音下可以播放音频
  // ios静音模式下可以播放音频
      wx.setInnerAudioOption({
        obeyMuteSwitch: false,
            success: function (e) {
            console.log(e)
            console.log('play success')
        },
        fail: function (e) {
            console.log(e)
            console.log('play fail')
        }
  1. 播放音频,返回主页面通过按钮也可以控制播放与暂停,将音频实例Music挂载到APP上面
    bar
music(){
  music = wx.createInnerAudioContext();
      if (wx.setInnerAudioOption) {
        wx.setInnerAudioOption({
          obeyMuteSwitch: false,
          autoplay: true
        })
      }else {
        music.obeyMuteSwitch = false;
        music.autoplay = true;
      }
      music.src = this.data.musicUrl.url;
      app.music = music
      music.onPlay(()=>{
        console.log('音乐播放');
        this.setData({
          isPlay:true
        })

      })
      music.onStop(()=>{
        console.log('音乐停止');
   

      })
      music.onPause(()=>{
        console.log('音乐暂停');
        this.setData({
          isPlay:false
        })
      })
      music.onError((res)=>{
        console.log(music);
        console.log(res.errMsg);
        console.log(res.errCode);
      })

      music.onWaiting(()=>{
        console.log('音频加载中...');
      })

},

挂载APP实例上面,通过

 app.music = music
 app.music.play();//播放
 app.music.pause();//暂停
  1. 拖动进度条,拖动slider后获取当前value,反向转换成秒数,将music.currentTime修改成当前值
  // 拖动进度条
  sliderChange(e){
let val = e.detail.value
// console.log(music.duration);
let second = music.duration * val/100
this.setData({
  PlayStartTime: this.s_to_hs(second)  
})
music.currentTime = second;
this.timer();
  },
  1. 播放音频封面图片旋转,暂停音乐停止旋转,使用了animation-play-state动画属性,使用监听音频函数
    music.onPlaymusic.onPause来检测播放与暂停,改变animation-play-statepausedrunning的值
<view class="imgUrl">
    <image src="{{picUrl}}" mode="" class="{{isPlay? 'rotateImg':''}}" style="animation-play-state:paused" />
  </view>
.imgUrl image{
  width: 88%;
  height: 88%;
  border-radius: 50%;
  align-self: center;
  animation: rotateImg 10s linear infinite;
}
.rotateImg{
  animation-play-state:running !important
}
@keyframes rotateImg {
  from {
      transform: rotate(0deg);
  }
  to {
      transform: rotate(360deg);
  }


搜索页:

search

  1. 热门信息获取,wx:for循环遍历,搜索输入歌曲名回车之后,wx:if隐藏热门信息,展示歌曲列表
<view class="hotMusicData" wx:if="{{isShow}}">
  <text>热搜榜</text>
  <view class="hotMusic" wx:for="{{hotMusicData}}" wx:for-index="hotIndex" wx:key="key">
    <text class="hotIndex">{{hotIndex+1}}</text>
    <view class="hotMusic_content">
      <text>{{item.searchWord}}\n</text>
      <text>{{item.content}}</text>
    </view>
    <text>{{item.score}}</text>
  </view>
</view>


排行榜

在这里插入图片描述

排行榜滑块使用微信组件scroll-view

四、项目难处

项目初期看到尚硅谷的网易云微信小程序的项目,拿到了node的api后端接口,查看微信开发者文档,参考网易云音乐的页面写完了静态页面,封装api接口,统一管理所有api接口地址

  1. 退出播放页面返回主页面,下面出现播放暂停小控件,也能够控制音乐播放与暂停,之前思路是跟vue一样使用插槽slot,但是后面实现起来各种bug,后面换的思路是让music的音频实例让所有组件能够看到,想到了APP跟组件,直接挂载到app上面,来控制音频的播放与暂停。
  2. 播放页面进度条,播放暂停,时间显示功能,在进度条选择上面最开始选择的是progress组件,不过使用定时器不断改变value值,进度条progress会反复从开头滑动,最后选择了slider
  3. 每次通过点击音乐进入播放页面需要销毁上一个music实例,不然会同时播放几首歌曲,不过销毁实例时候需要判断是不是通过点击歌曲list进来的,通过主页面小控件进入的不会停止音乐。

五、项目不足

初次学习写微信小程序,很多东西写的很乱,差哪些页面就去写哪些页面,项目初期没有完整的规划,项目结构也不清晰,功能点也是按照网易云现有功能有啥就写啥,js的一些代码冗余性有点高,通用函数没有做到封装,整体看起来就是有点乱,一些功能点没有写出来,就只是还原的播放器的部分功能,以后还要多多学习。

六、项目地址

网易云微信小程序
https://gitee.com/yuan_henry/wechat-app

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/559607.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

05 JDBC基础

什么是持久化 将内存中的数据永久保存在磁盘中,方便以后使用 JDBC是什么 java数据库连接 用于执行sql语句的java API java官方提供接口,各大厂商提供实现类,程序员使用实现类的jar包 JDBC的开发流程 添加包: mysql-connector-java-5.1.48.jar lombok.jar 口诀:贾连欲…

Linux文件内管理命令

目录 Linux文件内管理命令 创建文件 目录 普通文件 链接文件 删除文件 删除文件 删除目录 查看文件 目录 普通文件 编辑普通文件 在命令行进行文本内容处理 查找内容 复制文件 移动文件 命令详解 mkdir 作用 语法格式 touch 作用 语法格式 选项 ​编辑…

STM32——SDIO的学习(驱动SD卡)(理论篇)

目录 一、SD卡简介 1.1历史 1.2 tf卡和SD卡的区别 1.3 mmc&#xff0c;emmc&#xff0c;nand&#xff0c;flash的关系 1.4 SD卡的规格等级 1.4.1按容量分 1.4.2 class等级 1.4.3 UHS总线模式 1.4.4 UHS速度等级 1.4.5 VSC视频速度等级 二、SD卡的内部结构 三、SDIO…

MapReduce【Shuffle-Combiner】

概述 Conbiner在MapReduce的Shuffle阶段起作用&#xff0c;它负责局部数据的聚合&#xff0c;我们可以看到&#xff0c;对于大数据量&#xff0c;如果没有Combiner&#xff0c;将会在磁盘上写入多个文件等待ReduceTask来拉取&#xff0c;但是如果有Combiner组件&#xff0c;我们…

什么是Reactive服务架构

介绍&#xff1a; 在java web开发领域&#xff0c;区别于传统的的同步服务架构&#xff08;底层实现基于同步阻塞IO模型&#xff09;&#xff0c;异步服务这个“新词”&#xff08;bushi&#xff09;在不断被提及和重视&#xff0c;不少公司的研发部门也开始在尝试对自己的业务…

【JMM】并发编程Bug的源头——可见性/有序性/原子性问题

本文目录(&#xffe3;∇&#xffe3;)/ 可见性问题 有序性问题 为什么会进行指令重排序/乱序执行&#xff1f; 乱序存在的条件 this对象的溢出 原子性问题 如何保证原子性&#xff1f; synchronized 原理简介 加锁的方式 那么问题来了&#xff0c;JVM是如何知道当前…

2022年中国标准创新贡献奖获奖名单公示,海尔再添两项标准创新奖

01 2022年中国标准创新贡献奖 获奖名单公示 海尔再添两项标准创新奖 近日&#xff0c;2022年中国标准创新贡献奖获奖名单公示。其中&#xff0c;海尔GB/T 28219—2018《智能家用电器通用技术要求》、T/CAS 311.1—2018《电器电子产品绿色供应链管理第1部分&#xff1a;通则》…

前端实现拖拽效果改变元素顺序

文章目录 前言一、实现效果二、拖拽API1.代码2.遇见问题 总结 前言 在一次工作中&#xff0c;前端要实现通过鼠标实现拖拽改变顺序的功能&#xff0c;之前没有接触过拖拽这一块所以刚开始一筹莫展&#xff0c;幸运的是在查阅学习中实现了前端拖拽功能。 一、实现效果 二、拖拽…

月薪从10k到30k,一个普通测试工程师的3年涨薪之路...

“要涨薪&#xff0c;先跳槽”各个行业都存在这一共识&#xff0c;但是任何行业也都没有像程序员这样更为适用且好用的了。 前不久&#xff0c;就有网友分享了自己作为一个普通的自动化测试工程师的三年真实涨薪经历。但看看这个三年涨薪之路&#xff0c;好像并不普通啊&#…

2022年深圳杯数学建模D题复杂水平井三维轨道设计解题全过程文档及程序

2022年深圳杯数学建模 D题 复杂水平井三维轨道设计 原题再现&#xff1a; 在油气田开采过程中&#xff0c;井眼轨迹直接影响着整个钻井整体效率。对于复杂水平井&#xff0c;较差的井眼轨迹很可能会造成卡钻或施加钻压困难等重大事故的发生。因而&#xff0c;在施工之前分析影…

python爬虫-获取某某在线翻译的查询结果,爬取json文件并解析

文章目录 从基础步骤下手正确获取response数据关于url获取方式关于post方法的参数关于payload参数填入运行效果解析json数据到文件中完整代码运行结果 从基础步骤下手 # 指定url # 发出请求&#xff0c;get或post # 获取响应 # 把目标文件转存为字符串形式 # 持久性保存正确获…

从零开始的机械臂yolov5抓取gazebo仿真(六)

项目构造简述 前段时间博主装20.04系统不小心把efi启动给删了&#xff0c;导致18.04系统崩了&#xff0c;所以只能简单讲一下这个项目的设计思路以及以grasp.py代码为例进行简单解析。 yolov5_ros功能包 首先&#xff0c;说一下yolov5_ros功能包&#xff0c;该功能包的作用就…

使用 CameraX 在 Jetpack Compose 中构建相机 Android 应用程序

使用 CameraX 在 Jetpack Compose 中构建相机 Android 应用程序 CameraX 是一个 Jetpack 库&#xff0c;旨在帮助简化相机应用程序的开发。 [camerax官方文档] https://developer.android.com/training/camerax CameraX的几个用例&#xff1a; Image CaptureVideo CapturePrev…

【多线程】什么是线程死锁?形成条件是什么?如何避免?

文章目录 一、什么是线程死锁二、线程死锁三、形成死锁的四个必要条件是什么四、如何避免线程死锁 一、什么是线程死锁 死锁是指两个或两个以上的进程&#xff08;线程&#xff09;在执行过程中&#xff0c;由于竞争资源或者由于彼此通信而造成的一种阻塞的现象&#xff0c;若…

Unity 天空盒

在 Unity 中&#xff0c;天空盒是使用天空盒着色器的一种材质。 创建天空盒材质 1.从菜单栏中&#xff0c;单击 Assets > Create > Material。 2.在 Shader 下拉选单中&#xff0c;单击 Skybox&#xff0c;然后单击要使用的天空盒着色器。 有Skybox/6 Sided、Skybox/…

人民大学与加拿大女王金融硕士项目——在现在憧憬美好的未来

未来是一个虚无缥缈的词汇&#xff0c;抓不住也看不到。未来里有着我们无限的希望&#xff0c;也有着美好的憧憬。未来究竟是怎样的呢&#xff0c;有人说现在的样子里藏着未来的模样。在职的你有没有为未来编织一副美丽的画卷呢&#xff1f;未来很远&#xff0c;远到只能靠想象…

MySQL小记——约束、多表查询

目录 约束 常见约束 主键约束 非空约束 唯一约束 自增长约束 非负约束 外键约束之一对多 外键约束之多对多 多表查询 内连接 外连接 左外连接 右外连接 子查询 自查询 case when语句 约束 在MySQL中&#xff0c;约束是对字段规则的一种限制。 常见约束 1.主…

Linux安装并使用seatunnel2.3.1

SeaTunnel是一个非常易用的超高性能分布式数据集成平台&#xff0c;支持海量数据的实时同步。 下载安装包 设置版本 export version"2.3.1" 通过命令下载 wget "https://archive.apache.org/dist/incubator/seatunnel/${version}/apache-seatunnel-incubat…

Linux/Ubuntu系统运行Python+Yolov5物体识别

程序示例精选 Linux/Ubuntu系统运行PythonYolov5物体识别 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对<<Linux/Ubuntu系统运行PythonYolov5物体识别>>编写代码&#xff0c;代码…

汽车最强大脑ECU和单片机是什么关系

摘要&#xff1a; 有效解决线路信息传递所带来的复杂化问题 ECU的定义 ECU原来指的是engine control unit&#xff0c;即发动机控制单元&#xff0c;特指电喷发动机的电子控制系统。但是随着汽车电子的迅速发展&#xff0c;ECU的定义也发生了巨大的变化&#xff0c;变成了elec…