简单的仿网易云音乐小程序(一)

移动应用开发——uni-app框架 仿网易云音乐播放器学习心得 1.什么是 uni-appuni-app 是一个使用vue的语法 + 微信小程序的标签和API的跨平台前端框架,开发者编写一套代码,可编译到iOS、Android、H5、小程序等多个平台,几乎覆盖所有流量端。uni-app 具有跨端数量更多、性能体验更优秀、学习成本低、开发成本低等几大关键优势。uniapp框架的跨平台特性非常优秀,可以让我们在一次开发中同时支持多个平台,包括微信小程序、支付宝小程序、百度小程序、H5、App等。这大大提高了开发效率。 阅读详情


前言

今天我们开始学习简单的仿网易云音乐小程序,该小程序由Github提供,并具有网络请求和音乐播放等经典基础功能。


思维图

在这里插入图片描述
在上述的思维图中,每当点击歌曲列表中的歌曲时,均会跳转到音乐播放界面。


注意事项

由于该小程序使用到了网络请求功能,故需要在开发者工具中进行设置。如果不设置,会出现以下情况。
在这里插入图片描述

虚拟机调试

如果仅仅只是想在虚拟机上进行网络请求功能的调试,要解决上述问题很简单。

  1. 打开开发者工具中右上角的详情页面。
    在这里插入图片描述
  2. 将本地设置中的红箭头指视处打勾
    在这里插入图片描述

真机调试

当你想使用真机进行调试时,上述办法就行不通了,需要到微信小程序的官网上进行设置。

  1. 登陆小程序官网,进入到管理页面,并点击开发选项卡。
    在这里插入图片描述
  2. 在开发页面中点开开发设置,找到服务器域名模块,添加上网络请求的地址即可。
    在这里插入图片描述

主页面

搜索框

搜索框位于页面的顶部,当用户点击时,自动跳转到等待搜索页面。故很容易想到这是一个导航跳转功能。

<navigator class='topsearchLeft' url='../search/search'>
     <view class='iconfont icon-sousuo sousuo'></view>
     <text>搜索</text>
</navigator>

上述代码中,设置了一个导航组件,当点击该组件时,跳转到url对应的页面中。

歌单列表

歌单列表用到了我们之前尚未学习过的新只是,即导入wxml的模版文件。使用模版文件也很好理解,因为歌单列表会重复的使用,当将该页面独立为一个模版组件后,调用起来将会非常的方便,也省略了很多冗余的代码。

<!-- 从文件中导入模版wxml -->
<import src="./template/boutiqueItem" />
<view class='BoutiqueList'>
  <!-- block 并不是一个组件,它仅仅是一个包装元素,不会在页面中做任何渲染,只接受控制属性。 -->
  <!-- for循环遍历音乐数据 -->
  <block wx:for="{{musicList}}" wx:key="index">
    <!-- 将每一项数据输送给模版进行页面的渲染 -->
    <!-- 使用名字为ListItem的模版 -->
    <template is="ListItem" data="{{item}}" />
  </block>
</view>

这个模版在后续代码中均有使用,故我们在这进行学习

歌单模版

本小程序使用的歌单模版为一个单个的wxml文件,其他的wxml可以使用相对路径的方法对其进行调用。
在这里插入图片描述
模版文件存放在template文件夹下,WXML提供模板template,可以在模板中定义代码片段,然后在不同的地方调用。该模版内容没有特别新奇的地方,故没有特别添加上注释

<wxs src="../../../utils/filter.wxs" module="filter" />
<template name="ListItem">
  <!-- 这里的item是调用该template输出的data值 -->
  <view class='musicItem' bindtap='getdetail' data-id='{{item.id}}'>
    <view class='musicItem_left'>
      <image class='musicItemImg' src='{{item.coverImgUrl}}' alt='' lazy-load="true" mode="scaleToFill"></image>
      <view class='playCount_box'>
        <view class='iconfont icon-ttpod playCount_icon'></view>
        <!-- 使用wxs中的内容 -->
        <text class='playCount'>{{filter.over10000(item.playCount)}}</text>
      </view>
    </view>
    <view class='musicItem_right'>
      <text class='musicItem_name'>{{item.name}}</text>
      <text class='musicItem_nickname'>by {{item.creator.nickname}}</text>
      <view class='musicItem_tag'>
        <text class='musicItem_tag_b'>{{item.tags[0]}}</text>
        <text class='musicItem_copywriter'>{{item.copywriter}}</text>
      </view>
    </view>
  </view>
</template>

唯一值得留意的是上述代码的第一行。WXS(WeiXin Script)是小程序的一套脚本语言,结合 WXML,可以构建出页面的结构。其中的module为该标签的模块名。此外,getdetail为点击每个item的响应函数

// 跳转到musiclist页面
// 在musiclist页面中的load函数,可以获取到该跳转传入的id
getdetail: function(options) {
   wx.navigateTo({
     url: '../../../../musicList/musicList?musicListID=' + options.currentTarget.dataset.id
   })
 }

wxs filter

接下来我们看看这个wxs这个被命名为filter的组件在做些什么(直观上来看,它是作为一个数据的过滤器)

// 超出1万和1亿的过滤器
var over10000 = function (num) {
  if (num < 10000) {
    return num;
  } else if (num >= 100000000) {
    return parseInt(num / 100000000) + "亿";
  } else {
    return parseInt(num / 10000) + "万";
  }
}
module.exports = {
  over10000: over10000,
}

我们贴出了上述代码中仅使用到的内容,即通过num来返回不通格式的数据,以免数据太多,显示太难看。

页面逻辑

最后我们来看看主页面的页面逻辑。

  1. 导入网络请求的api
  2. 初始化网络请求的函数
  3. 当页面加载时调用网络请求的函数
  4. 当滑动到页面底部时,再次发动请求
// 1
import api from '../../utils/api.js';
// 2
getBoutiqueList() {
   // 调用api中的函数
   api.getBoutiqueList({
     // 配置每次请求数据的条数
     data: {
       limit: this.data.limit
     },
     // 请求成功,返回音乐列表
     success: resp => {
       this.setData({
         musicList: resp.data.playlists
       })
     }
   })
 },
// 3
 // 生命周期函数--监听页面加载
 onLoad(e) {
   this.getBoutiqueList()
 },
// 4
// 页面上拉触底事件的处理函数
onReachBottom: function() {
  this.setData({
    limit: this.data.limit + 10
  })
  this.getBoutiqueList()
},

等待搜索页面

搜索框

页面顶部的搜索框的页面代码如下

 <view class='topSearch'>
   <!-- 构建一个表单组件,reset绑定的响应函数为clearValue -->
   <form bindreset="clearValue" class='inputform'>
     <!-- 构建输入控件
     placeholder-class: 指定 placeholder 的样式类
     confirm-type: 设置键盘右下角按钮的文字,仅在type='text'时生效
     bindconfirm: 点击按钮后的响应函数
     bindinput: 输入时触发 -->
     <input class='inputB' placeholder-class="holderInput" placeholder="输入您想要搜索的内容" auto-focus confirm-type="search" bindconfirm="startSearch" bindinput="inputC" value="{{keywords}}"></input>
     <view class='iconfont icon-sousuo sousuo'></view>
     <!-- 小叉叉按钮,用来清楚输入框的值 -->
     <!-- 有值就显示,无值就不显示 -->
     <button class='iconfont icon-shanchu clearBtn' formType="reset" wx:if="{{haveValue}}"></button>
   </form>
   <!-- 取消按钮,响应函数为back -->
   <view class='cansBtn' bindtap='back'>取消</view>
 </view>

其实搜索框就是一个添加了多个样式和功能的输入框。接下来,我们依次看看响应函数。

clearValue

// 清除vlaue
clearValue() {
  this.setData({
    haveValue: false,
    showHotsearch: true
  })
},

该响应函数很简单,就是将haveValue标志为设置为false,表示输入框没有值;将showHotsearch设置为true,表示不显示搜索内容,只显示热门搜索。

startSearch

首先给出响应函数

// 搜索框输入后按搜索按钮时的搜索,参数都应是默认值
startSearch(opt) {
  let keywords = '';
  // 如果输入框没有值
  if (!opt.detail.value){
    keywords = 'hello word'//opt.currentTarget.dataset.value
  }else{
    keywords = opt.detail.value
  }
  // 搜索前先清空每个数组
  this.setData({
    haveValue: true,
    keywords: keywords,
    songArr: [],   //歌曲
    musicListArr: [],   //歌单
    singerArr: [],   //歌手
    videoArr: [], //视频
  })
  // 执行搜索函数
  this.search();
},

我们看到,这个响应函数首先是对数据做了一个清洗和出事话,然后在执行搜索函数

// 实际进行搜索的函数
search() {
 // 调用api中对函数
 api.searchStart({
   // 需要对参数为,
   // 关键字,返回内容对条数,搜索的类型
   data: {
     keywords: this.data.keywords,
     limit: this.data.limit,
     type: this.data.searchType,
   },
   // 搜索到结果后的回调
   success: resp => {
     // 使用搜索的类型来判断内容
     switch (this.data.searchType) {
       // 歌曲列表
       case 1:
         this.setData({
           songArr: resp.data.result.songs,
           showHotsearch: false
         })
         break;
       // 歌单列表
       case 1000:
         this.setData({
           musicListArr: resp.data.result.playlists,
           showHotsearch: false
         })
         break;
       // 歌手列表
       case 100:
         this.setData({
           singerArr: resp.data.result.artists,
           showHotsearch: false
         })
         break;
       // 视频列表
       case 1004:
         this.setData({
           videoArr: resp.data.result.mvs,
           showHotsearch: false
         })
         break;
     }
   }
 })
},

基本没什么好说的,就是调用网络请求,然后通过类型类判断更新的数据。当数据得到更新后,页面自然也就发生了变化

inputC

就是一个在输入过程的监控

// 输入中
inputC(opt) {
  // 判断输入的数据长度是否大于0
  // 并用此来设置标志位
  if (opt.detail.value.length) {
    this.setData({
      haveValue: true
    })
  } else {
    this.setData({
      haveValue: false,
      showHotsearch: true
    })
  }
},

back

这个就更简单了,返回上一级

  // 返回上一页
  back() {
    wx.navigateBack()
  },

热门搜索标签

当未发生搜索行为,即showHotsearch为true时,页面显示的是热门搜索标签

<!-- 用showHotsearch来判断当前该展示搜索结构还是展示热门搜素标签 -->
 <view class='searchBottom' wx:if="{{showHotsearch}}">
   <view class='hotsearchtitle'>热门搜索</view>
   <!-- 遍历热门搜索数据,并渲染到页面 -->
   <block wx:for="{{hotsearch}}" wx:key="index">
     <text class='hotsearchitem' bindtap='startSearch' data-value='{{item.name}}'>{{item.name}}</text>
   </block>
 </view>

当搜索行为完成后,将会显示单曲,歌单,歌手或视频的页面,这四个界面可通过点击来进行切换。

定义切换组件

<view class='searchNav'>
	<!-- 页面内容上端,搜索框下端的内容切换组件 -->
	<!-- 响应函数均为changeNav -->
	<text bindtap='changeNav' data-type='1'>单曲</text>
	<text bindtap='changeNav' data-type='1000'>歌单</text>
	<text bindtap='changeNav' data-type='100'>歌手</text>
	<text bindtap='changeNav' data-type='1004'>视频</text>
	<view class='navLine' style='transform:translateX({{navLinePosition}})'></view>
</view>

切换组件的响应函数,因为大都一样,故只给出一小段

 // nav点击
changeNav(opt) {
  // 根据点击到的组件的类型进行数据的更新
  switch (opt.currentTarget.dataset.type) {
    case '1':
      // 主要就是更新下划线
      // 搜索类型
      // 下划线的位置
      this.setData({
        navLinePosition: '53rpx',
        searchType: 1,
        positionLeft: 0
      })
      // 重新执行搜索
      if (!this.data.songArr.length) {
        this.search();
      }
      break;

使用数据渲染不同页面

这里就是简单的遍历不同的数据,然后对页面进行渲染。

<view class='songBox centeritem' style='height:{{innerHeight}}rpx'>
  <block wx:for="{{songArr}}" wx:key="index">
    <template is="songList" data="{{item}}" />
  </block>
</view>

可以看到,这里也适用了模版。具体来说,单曲,歌手,歌曲列表,视频列表都用了不同的模版,但是都大同小异。值得一看的是模版中的点击响应函数,在此用点击播放歌曲为例

//跳转到播放页
playSong(opt) {
  // 获取歌曲细节信息
  api.getSongDetai({
    data: {
      ids: opt.currentTarget.dataset.itemid
    },
    success: resp => {
      app.globalData.musicListArr = resp.data.songs;
      // 跳转到歌曲播放界面
      wx.navigateTo({
        url: '../audioPage/audioPage?musicindex=0&duration=' + opt.currentTarget.dataset.duration,
      })
    }
  })
},

小结

这篇博文中,主要对主页面和搜索界面进行了学习。其中最值得注意的就是网络请求的使用和模版的使用。接下来,我们将学习其他页面,并学习这篇文章中跳过的api的源码部分。

仿网易云音乐(微信小程序版) 项目部分截图(Gif) 前言 前一阵子学习了微信小程序,为了巩固所学的知识和提高实战经验,决定自己手撸一款小程序。因为听歌一直在用网易云音乐,所以突发奇想就做一款仿网易云音乐的小程序吧!开发中遇到了很多在学习中没有遇到过的坑,也很感谢在我改不出BUG时给予帮助的老师同学!本着学习和分享的目的,写下以下的文字,希望能给初学小程序的你带来一点帮助,大佬轻点喷。 关于项目的使用 本文的最后我贴出了项目的源码地址,需要的可以去GitHub上clone。完成后直接在微信开发者工具上打开就能使用。 开发前准备 阅读详情

相关推荐

微信小程序仿网易云音乐(使用云开发,提供源码)

源码 文章目录前言一、实现页面(1)云村首页(2)云村中的云圈(3)歌曲搜索功能(4)达人页面(5)手机型号自适应性二、源码文件打开方式(1)修改_openid(2)打开云数据库并导入数据三、总结(1)通过数据库查询实现路由切换菜单栏(2)navigator跳转页面(3)点击实现页面跳转并传参(4)实现弹幕,视频的播放(5)对数据库的查询(6)swiper轮播图(7)简单的移动(8)css实现左侧边栏(9)瞄点实现分类菜单栏(10)点击隐藏出现 前言 一、实现页面 (1)云村首页 (2)云村中的云圈

yingshuangtu的博客 7036

音乐小程序项目

音乐播放列表和音乐状态数据:pages/index/index.jsid: 1, title: '钢琴协奏曲', singer: '肖邦',}…}],play: {…},

m0_67806453的博客 1406

仿网易云音乐的小程序项目(粗糙版)

前言 本项目是参考尚硅谷的【2021版微信小程序开发】视频跟学而成,数据为真实的网易云音乐数据,接口参考至下方链接,并非所有界面都可使用,参照视频学习 只完成了 : 每日推荐的歌曲,歌单,视频页面,账号登陆的展示数据信息功能 歌曲和视频的播放切换,进度条实时跟进功能 视频区下拉刷新,搜索歌曲功能 开发完成后最大的感受就是一定要会看,会查微信小程序的官方API文档,出bug时首先检查语法是否正确(刚入门比较容易犯拼写错误),根据控制台给错的错误信息定位到相应文件,进行逻辑检查,注意后端返回的数据类型和和

takeingloop的博客 2652

仿网易云音乐的YY音乐微信小程序源码

https://zijieyunpan.cn/E3aL2UYiZX9

linxiaoming6的博客 193

基于网易云音乐API的微信小程序——网愈芸音乐

网愈芸音乐一.项目说明二.项目环境准备三.项目初始化 一.项目说明 前段时间,网抑云的梗被许多人说道,但是作为一个网易云音乐的资深使用用户,我个人觉得网易云这一款小小的音乐软件也能治愈着我们芸芸众生中的每一个平凡人。 因此,想着做一个听歌的网愈芸音乐小程序,另外还打算用上云开发来实现**“治愈芸芸众生”**的功能。 二.项目环境准备 开发工具:微信开发者工具 界面UI组件库用到的是Vant Weapp:Vant Weapp 网易云开发接口文档:网易云开发接口文档 接口的基地址为:baseURL 文档中的地

Aurora_1970s的博客 1万+

打造微信小程序仿网易云音乐

本文还有配套的精品资源,点击获取 简介:该微信小程序开发项目旨在模仿网易云音乐,提供完整的源代码和界面截图,供开发者学习和参考。项目展示了如何在微信平台上创建具有音乐播放功能的小程序,包括用户界面设计和音乐播放功能的实现。学习者可以通过这些资源,掌握微信小程序的UI设计原则和开发技术,包括WXML、WXSS、JavaScript及API调用。 1. 微信小程序开发项目...

weixin_29092787的博客 1265

微信小程序实战教程:模仿—网易云音乐(一)

初窥 todo: 添加音乐到收藏(最近)列表 歌词滚动 从一个hello world开始微信开发者工具生成 目录如下:. |-- app.js |-- app.json |-- app.wxss |-- pages | |-- index # 主页 | | |-- index.js | | |-- index.json | | |-- index.wxm

APPx应用魔方 4万+

微信小程序实战项目:仿网易云音乐完整Demo

微信小程序采用逻辑层-视图层分离的双线程架构,通过 Native 进行通信中转。逻辑层运行在 JSCore 环境中,负责数据处理与业务逻辑;视图层基于 WebView 渲染,解析 WXML 与 WXSS 构建 UI。两者通过Native 桥接进行 JSON 数据同步,避免直接操作 DOM,提升渲染效率。// 示例:页面间通信的基本模式(简化)Page({data: { title: '首页' },onLoad() {// 数据变更需通过 setData 触发视图更新。

weixin_31860973的博客 1355

仿网易云音乐项目总结 (vue全家桶)

仿网易云音乐项目总结 1、前言 这个项目是我5月份做的项目了,之前一直没心也没空总结,趁现在暑期比较闲,写篇博客记录一下! 本项目基于vue全家桶+elementui开发的前端项目。主要实现了页面基本样式,播放,歌词,歌单,专辑,歌手,视频,搜索,登录,注册,收藏,评论,下载,分类等功能,基本把我平时用到的功能都实现了。之前学习vue都是一直跟着视频敲的,所以出于学习和练手的目的,做了这个项目,这也是我真正意义上的第一个独立的项目哈哈哈。欢迎大家一起讨论学习! 2、项目效果展示 图片展示

whoami138的博客 5444

微信小程序之仿网易云音乐

微信小程序之仿网易云音乐,与真正的网易云音乐还是有点差距,仅供参考

类似网易云音乐的YY音乐微信小程序源码.zip

这是一款类似网易云手机端的小程序源码 名为YY音乐小程序,首页有每日推荐歌曲、歌单和热歌排行榜,功能不是特别多 但是还是比较简洁美观的,省去了现在网易云音乐花里花哨的页面,也算是比较不错的

微信小程序之简易网易云音乐

(一)主要界面截图: 主页界面,主要通过HTML以及css代码 搜索界面,调用网易云音乐api接口,通过 完成 搜索关键字,给出歌曲提示,点击可以播放 ...

qq_38830964的博客 1万+

Allegro17.2 出gerber文件详细流程 - 干货

Allegro17.2 出gerber文件详细流程 - 干货

u010614434的博客 1万+

仿网易云音乐小程序

仿网易云音乐小程序,调用网易云API真实接口,实现了音乐播放,音乐切换,歌词显示,搜索音乐,视频播放,用户登录退出等功能。

qq_48701993的博客 2867

道闸不自动落杆故障排查:从传感器原理到控制器调试全解析

在工业自动化和物联网系统中,传感器与控制器构成的闭环控制是保障设备可靠运行的核心。其基本原理是通过传感器采集环境状态,控制器依据预设逻辑做出决策并驱动执行器动作。这一技术价值在于实现了无人值守下的安全、高效自动化,广泛应用于智能交通、安防和智能楼宇等领域。以停车场道闸系统为例,其自动落杆功能高度依赖地感线圈与防砸雷达的协同。地感线圈作为触发单元,负责感知车辆接近;而防砸雷达则作为持续监测的安全单元,通过微波探测防砸区域内是否有障碍物,其信号是控制器执行落杆决策的关键依据。当系统出现车辆通过后闸杆不落的典型故

weixin_29190651的博客 312

Pinocchio 安装教程|机器人学的必备库

安装pinocchio,不要安装pip3 install pinocchio!

darcsdn 1662

微信小程序开发实战-打造网易云音乐

微信小程序开发手册:https://developers.weixin.qq.com/miniprogram/dev/api/ 源码:https://gitee.com/zouchengxin/music.163.com 框架:weui框架(网址:https://weui.io/)具体如何使用自行百度或谷歌 录制效果: ### 说明: 本...

qq_40077167的博客 2万+

永磁同步电机矢量控制(十一)——基于损耗模型的PMSM效率优化策略

本文深入探讨了永磁同步电机(PMSM)基于损耗模型的效率优化策略,详细分析了铜损和铁损的构成与建模方法,并提出了最小损耗控制策略的实现方案。通过与传统MTPA控制的对比,展示了在不同工况下的效率提升效果,同时讨论了工程实现中的关键问题与解决方案,为PMSM的高效运行提供了理论支持和实践指导。

7z8x2c4v6b9的博客 231

微信小程序之网易云音乐的实现-云音乐

微信小程序之网易云音乐的实现-云音乐-基本功能都实现了,音乐的上一首下一首播放等,顺便把进度条的拖动播放写了下主页的每日推荐界面写了 ,登录通过账号密码登录(你也可以自己加一个验证码或者邮箱登录)基于iPhone6(375*667分辨率)开发,后面一些计算都是通过获取当前屏幕下的尺寸来计算的,但是不保证在其他分辨率下是否完好(我已经尽力了~)下载地址更改自己的API地址虽然目前我这服务器的可以用,但是服务器会有过期的一天项目使用 ............

动感超人的博客 4599

基于dify平台批量分析excel格式信息

如何以表格形式批量输入一些信息,然后让大模型以对话应用形式逐条进行推理分析?请逐行分析以下数据,给出推理结果:{{input}}这里提供一个分步解决方案,结合。

knightissocool的博客 8011

小白学电路之cadance搭建buffer电路

Buffer(缓冲器)是一种放大器或驱动电路,主要用于隔离输入和输出,以防止负载对前级电路造成干扰或影响。本文作者在电路方面是小白水平,目前正在学习,有不足之处欢迎指正。3.创建新的cellview,对此buffer进行仿真验证。2.创建buffer的symbol。电路中的V2的详细参数。

weixin_58051657的博客 1989

码农武:网易云音乐微信小程序开发流程

注册成为微信小程序开发者 微信公众平台 下载微信开发者工具 新建项目: 项目目录了 componen(资源附整套项目源码,代理服务器)

码农武的博客 2678

Android11原生设置屏幕亮由Gamma变化改为线性变化

从Android9 开始屏幕亮度调解变成非线性变化,这样的话就会出现 之前亮度变化很小,到后面时变化亮度很快; 修改为线性变化,只需要修改 ./frameworks/base/packages/SettingsLib/src/com/android/settingslib/display/BrightnessUtils.java /* * Copyright (C) 2018 The Android Open Source Project * * Licensed under the Apache L

Android 4926

微信小程序网易云音乐设计与实现 毕业设计-附源码261620

微信小程序的网易云音乐系统主要是对系统所要实现的功能进行详细考虑,确定所要实现的功能后进行界面的设计,在这中间还要考虑如何可以更好的将功能及页面进行很好的结合,方便用户可以很容易明了的找到自己所需要的信息,还有系统平台后期的可操作性,通过对信息内容的详细了解进行技术的开发。 微信小程序的网易云音乐系统的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与微信小程序的网易云音乐系统管理的实际需求相结合,讨论了基于微信小程序的网易云音乐系统管理的使用。

yuyuxun的博客 6573

PCIe 6.0 – 关于 PCI Express Gen6 您需要知道的一切

幸运的是,PCIe 6.0 FEC 足够轻,对延迟的影响最小。在电气层上,PCIe 6.0 使用 PAM4 信号(“四级脉冲幅度调制”),每个时钟周期将 2 位组合为 4 个幅度级别(00、01、10、11),与 PCIe 5.0 和前几代相比,它使用 NRZ 调制,每个时钟周期 1 位和两个幅度级别 (0, 1)。虽然 PAM4 信号更容易出错,但由于调制技术的性质,与 PCIe 5.0 相比,通道损耗不受影响,因此 PCB 上 PCIe 6.0 信号的范围将与 PCIe 5.0 相同。

qq_43416206的博客 3433

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

上一篇: 腾讯位置服务示例小程序(总结)
下一篇: 简单的仿网易云音乐小程序(二)
时闻折竹
博客等级 码龄11年 64粉丝 79原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值