diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 0000000..115cc02 --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,31 @@ +/* + * Eslint config file + * Documentation: https://eslint.org/docs/user-guide/configuring/ + * Install the Eslint extension before using this feature. + */ +module.exports = { + env: { + es6: true, + browser: true, + node: true, + }, + ecmaFeatures: { + modules: true, + }, + parserOptions: { + ecmaVersion: 2018, + sourceType: 'module', + }, + globals: { + wx: true, + App: true, + Page: true, + getCurrentPages: true, + getApp: true, + Component: true, + requirePlugin: true, + requireMiniProgram: true, + }, + // extends: 'eslint:recommended', + rules: {}, +} diff --git a/README.md b/README.md index e659935..95b399c 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,4 @@ -# music - +# mymusic +![截图1](1.png) +![截图2](2.png) +![截图3](3.png) diff --git a/app.js b/app.js new file mode 100644 index 0000000..1ed57c4 --- /dev/null +++ b/app.js @@ -0,0 +1,19 @@ +// app.js +App({ + onLaunch() { + // 展示本地存储能力 + const logs = wx.getStorageSync('logs') || [] + logs.unshift(Date.now()) + wx.setStorageSync('logs', logs) + + // 登录 + wx.login({ + success: res => { + // 发送 res.code 到后台换取 openId, sessionKey, unionId + } + }) + }, + globalData: { + userInfo: null + } +}) diff --git a/app.json b/app.json new file mode 100644 index 0000000..f89eb6a --- /dev/null +++ b/app.json @@ -0,0 +1,15 @@ +{ + "pages": [ + "pages/index/index", + "pages/logs/logs", + "pages/test/test" + ], + "window": { + "backgroundTextStyle": "light", + "navigationBarBackgroundColor": "#fff", + "navigationBarTitleText": "Weixin", + "navigationBarTextStyle": "black" + }, + "style": "v2", + "sitemapLocation": "sitemap.json" +} \ No newline at end of file diff --git a/app.wxss b/app.wxss new file mode 100644 index 0000000..06c6fc9 --- /dev/null +++ b/app.wxss @@ -0,0 +1,10 @@ +/**app.wxss**/ +.container { + height: 100%; + display: flex; + flex-direction: column; + align-items: center; + justify-content: space-between; + padding: 200rpx 0; + box-sizing: border-box; +} diff --git a/image/01.png b/image/01.png new file mode 100644 index 0000000..0939fe6 Binary files /dev/null and b/image/01.png differ diff --git a/image/02.png b/image/02.png new file mode 100644 index 0000000..ab554db Binary files /dev/null and b/image/02.png differ diff --git a/image/02stop.png b/image/02stop.png new file mode 100644 index 0000000..be984cd Binary files /dev/null and b/image/02stop.png differ diff --git a/image/03.png b/image/03.png new file mode 100644 index 0000000..9402bfa Binary files /dev/null and b/image/03.png differ diff --git a/image/04.png b/image/04.png new file mode 100644 index 0000000..c446705 Binary files /dev/null and b/image/04.png differ diff --git a/image/05.png b/image/05.png new file mode 100644 index 0000000..6dfd030 Binary files /dev/null and b/image/05.png differ diff --git a/image/06.png b/image/06.png new file mode 100644 index 0000000..51340c3 Binary files /dev/null and b/image/06.png differ diff --git a/image/banner.jpg b/image/banner.jpg new file mode 100644 index 0000000..51b93a3 Binary files /dev/null and b/image/banner.jpg differ diff --git a/image/cover.jpg b/image/cover.jpg new file mode 100644 index 0000000..ceaac4a Binary files /dev/null and b/image/cover.jpg differ diff --git a/image/test.jpg b/image/test.jpg new file mode 100644 index 0000000..ceaac4a Binary files /dev/null and b/image/test.jpg differ diff --git a/pages/index/index.js b/pages/index/index.js new file mode 100644 index 0000000..f84270d --- /dev/null +++ b/pages/index/index.js @@ -0,0 +1,140 @@ +// index.js +// 获取应用实例 +const app = getApp() + +Page({ + data: { + item:0, + tab:0, + state:'paused', + playIndex:0, + play:{ + currenTime:'00:00', + duration:'00:00', + percent:0, + title:'', + singer:'', + coverImgUrl:'/image/cover.jpg', + }, + playlist:[{ + id:1,title:'钢琴协奏曲',singer:'肖邦', + src:'http://localhost:3000/1.mp3',coverImgUrl:'/image/cover.jpg' + },{ + id:2,title:'奏鸣曲',singer:'莫扎特', + src:'http://localhost:3000/1.mp3',coverImgUrl:'/image/cover.jpg' + },{ + id:3,title:'欢乐颂',singer:'贝多芬', + src:'http://localhost:3000/2.mp3',coverImgUrl:'/image/cover.jpg' + },{ + id:4,title:'爱之梦',singer:'李斯特', + src:'h',coverImgUrl:'/image/cover.jpg' + }] + }, + changeItem:function(e){ + this.setData({ + item:e.target.dataset.item + }) + }, + changeTab:function(e){ + this.setData({ + tab:e.detail.current + }) + }, + // 事件处理函数 + bindViewTap() { + wx.navigateTo({ + url: '../logs/logs' + }) + }, + audioCtx:null, + onReady:function() { +   this.audioCtx=wx.createInnerAudioContext() +   var that=this +   this.audioCtx.onError(function(){ +     console.log('播放失败:'+that.audioCtx.src) +   }) +   this.audioCtx.onEnded(function(){ +     that.next() +   }) +   this.audioCtx.onPlay(function(){}) +   this.audioCtx.onTimeUpdate(function(){ +     that.setData({ +       'play.duration':formatTime(that.audioCtx.duration), +       'play.currentTime':formatTime(that.audioCtx.currentTime), +       'play.percent':that.audioCtx.currentTime / +       that.audioCtx.duration*100 +     }) +   }) +   this.setMusic(0) +   function formatTime(time){ +     var minute=Math.floor(time/60)%60; +     var second=Math.floor(time)%60 +     return(minute<10?'0'+minute:minute)+';'+(second<10?'0'+second:second) +   } + }, + sliderChange:function(e){ + var second=e.detail.value*this.audioCtx.duration/100 + this.audioCtx.seek(second) + }, + setMusic:function(index){ + var music=this.data.playlist[index] + this.audioCtx.src=music.src + this.setData({ + playIndex:index, + 'play.title':music.title, + 'play.singer':music.singer, + 'play.coverImgUrl':music.coverImgUrl, + 'play.currentTime':'00:00', + 'play.duration':0 + }) + }, + onLoad() { + if (wx.getUserProfile) { + this.setData({ + canIUseGetUserProfile: true + }) + } + }, + getUserProfile(e) { + // 推荐使用wx.getUserProfile获取用户信息,开发者每次通过该接口获取用户个人信息均需用户确认,开发者妥善保管用户快速填写的头像昵称,避免重复弹窗 + wx.getUserProfile({ + desc: '展示用户信息', // 声明获取用户个人信息后的用途,后续会展示在弹窗中,请谨慎填写 + success: (res) => { + console.log(res) + this.setData({ + userInfo: res.userInfo, + hasUserInfo: true + }) + } + }) + }, + + play:function(){ + this.audioCtx.play() + this.setData({state:'running'}) + }, + pause:function(){ + this.audioCtx.pause() + this.setData({state:'paused'}) + }, + next:function(){ + var index=this.data.playIndex >= this.data.playlist.length - 1 ? + 0:this.data.playIndex + 1 + this.setMusic(index) + if (this.data.state==='running'){ + this.play() + } + }, + change:function(e){ + this.setMusic(e.currentTarget.dataset.index) + this.play() + }, + getUserInfo(e) { + // 不推荐使用getUserInfo获取用户信息,预计自2021年4月13日起,getUserInfo将不再弹出弹窗,并直接返回匿名的用户个人信息 + console.log(e) + this.setData({ + userInfo: e.detail.userInfo, + hasUserInfo: true + }) + } +}) diff --git a/pages/index/index.json b/pages/index/index.json new file mode 100644 index 0000000..bc7665f --- /dev/null +++ b/pages/index/index.json @@ -0,0 +1,5 @@ +{ + "navigationBarBackgroundColor": "#fff", + "navigationBarTitleText": "音乐", + "navigationBarTextStyle": "black" +} \ No newline at end of file diff --git a/pages/index/index.wxml b/pages/index/index.wxml new file mode 100644 index 0000000..808cbec --- /dev/null +++ b/pages/index/index.wxml @@ -0,0 +1,37 @@ + + 音乐推荐 + 播放器 + 播放列表 + + + + + + + + + + + + + + + + + + + + {{play.title}} + {{play.singer}} + + + + + + + + + + + + diff --git a/pages/index/index.wxss b/pages/index/index.wxss new file mode 100644 index 0000000..3a0765c --- /dev/null +++ b/pages/index/index.wxss @@ -0,0 +1,177 @@ +page{ + display: flex; + flex-direction: column; + background: #17181a; + color: #ccc; + height: 100%; +} +.tab{ + display: flex; +} +.tab-item.active{ + color: #c25b5b; + border-bottom-color:#c25b5b; +} +.tab-item{ + flex: 1; + font-size: 10pt; + text-align: center; + line-height: 72px; + border-bottom:6rpx solid #eee; +} +.content-info-portal{ + display: flex; + margin-bottom: 15px; +} +.content-info-portal>view{ + flex: 1; + font-size: 11pt; + text-align: center; +} +.content-info-portal image{ + width: 120rpx; + height: 120rpx; + display: block; + margin: 20rpx auto; +} + +.content{ + flex: 1; +} +.content-play{ + text-align: center; + display: flex; + height: 100%; + flex-direction: column; + justify-content: space-around; +} +.content-play-info>view{ + color: #888; + font-size: 11pt; +} +@keyframes rotateImage{ + from{ + transform: rotate(0deg); + } + to{ + transform: rotate(360deg); + } +} +.content >swiper{ + height: 100%; +} +.content-play-cover image{ + animation: rotateImage 10s linear infinite; + width: 400rpx; + height: 400rpx; + border-radius: 50%; + border: 1px solid #333; +} +.content-play-progress{ + display: flex; + align-items: center; + margin: 0 35rpx; + font-size: 9pt; + text-align: center; +} +.content-play-progress>view{ + flex: 1; +} +.content-info{ + height: 100%; +} +.content-info-slide{ + height: 302rpx; + margin-bottom:20px ; +} +.content-info-slide image{ + width: 100%; + height: 100%; +} +.content-info-list{ + font-size: 11pt; + margin-bottom: 20rpx; +} +.content-info-list > .list-title{ + margin: 20rpx 35rpx; +} +.content-info-list >.list-inner{ + display: flex; + flex-wrap: wrap; + margin: 0 20rpx; +} +.content-info-list >.list-inner>.list-item{ + flex: 1; +} +.content-info-list >.list-inner>.list-item>image{ + display: block; + width: 200rpx; + height: 200rpx; + margin: 0 auto; + border-radius: 10rpx; + border: 1rpx solid #555; +} +.content-info-list>.list-inner>.list-item>view{ + width: 200rpx; + margin: 10rpx auto; + font-size: 10pt; +} +.player{ + background: #222; + border-top: 1px solid #252525; + height: 112rpx; + display: flex; + align-items: center; + background: #222; + border-top:1px solid #252525; +} +.player-cover{ + width: 80rpx; + height: 80rpx; + margin-left: 15rpx; + border-radius: 8rpx; + border:1px solid #333; +} +.player-info{ + flex: 1; + font-size: 10pt; + line-height: 38rpx; + margin-left:20rpx; + padding-bottom:8rpx; +} +.player-info-singer{ + color: #888; +} +.player-controls image{ + width: 80rpx; + height: 80rpx; + margin-right:15rpx; +} + +.playlist-item{ + display: flex; + align-items: center; + border-bottom: 1rpx solid #333; +} +.playlist-cover{ + width: 80rpx; + height: 80rpx; + margin-left: 15rpx; + border-radius: 8rpx; + border: 1rpx solid #333; +} +.playlist-info{ + flex: 1; + font-size: 10pt; + line-height: 38rpx; + margin-left: 20rpx; + padding-bottom: 8rpx; +} +.playlist-info-singer{ + color: #888; +} +.playlist-controls{ + font-size: 10pt; + margin-right: 20rpx; + color: #c25b5b; +} \ No newline at end of file diff --git a/pages/index/info.wxml b/pages/index/info.wxml new file mode 100644 index 0000000..92159c5 --- /dev/null +++ b/pages/index/info.wxml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + 私人FM + + + + 每日歌曲推荐 + + + + 云音乐新歌榜 + + + + 推荐歌曲 + + + 紫罗兰 + + + 五月之歌 + + + 菩提树 + + + 欢乐颂 + + + 安魂曲 + + + 摇篮曲 + + + + \ No newline at end of file diff --git a/pages/index/play.wxml b/pages/index/play.wxml new file mode 100644 index 0000000..4231d25 --- /dev/null +++ b/pages/index/play.wxml @@ -0,0 +1,21 @@ + + + +   {{play.title}} +    +     ——{{play.singer}}—— +    + + + +   + +    + +   {{play.currenTime}} +    + +    +   {{play.duration}} + + \ No newline at end of file diff --git a/pages/index/playlist.wxml b/pages/index/playlist.wxml new file mode 100644 index 0000000..3ec03f9 --- /dev/null +++ b/pages/index/playlist.wxml @@ -0,0 +1,12 @@ + + + + + {{item.title}} + {{item.singer}} + + + 正在播放 + + + \ No newline at end of file diff --git a/pages/logs/logs.js b/pages/logs/logs.js new file mode 100644 index 0000000..85f6aac --- /dev/null +++ b/pages/logs/logs.js @@ -0,0 +1,18 @@ +// logs.js +const util = require('../../utils/util.js') + +Page({ + data: { + logs: [] + }, + onLoad() { + this.setData({ + logs: (wx.getStorageSync('logs') || []).map(log => { + return { + date: util.formatTime(new Date(log)), + timeStamp: log + } + }) + }) + } +}) diff --git a/pages/logs/logs.json b/pages/logs/logs.json new file mode 100644 index 0000000..3ee76c1 --- /dev/null +++ b/pages/logs/logs.json @@ -0,0 +1,4 @@ +{ + "navigationBarTitleText": "查看启动日志", + "usingComponents": {} +} \ No newline at end of file diff --git a/pages/logs/logs.wxml b/pages/logs/logs.wxml new file mode 100644 index 0000000..0b6b645 --- /dev/null +++ b/pages/logs/logs.wxml @@ -0,0 +1,6 @@ + + + + {{index + 1}}. {{log.date}} + + diff --git a/pages/logs/logs.wxss b/pages/logs/logs.wxss new file mode 100644 index 0000000..94d4b88 --- /dev/null +++ b/pages/logs/logs.wxss @@ -0,0 +1,8 @@ +.log-list { + display: flex; + flex-direction: column; + padding: 40rpx; +} +.log-item { + margin: 10rpx; +} diff --git a/pages/test/test.js b/pages/test/test.js new file mode 100644 index 0000000..fda84ea --- /dev/null +++ b/pages/test/test.js @@ -0,0 +1,77 @@ +// pages/test.js +Page({ + + /** + * 页面的初始数据 + */ + data: { + + }, + + /** + * 生命周期函数--监听页面加载 + */ + onLoad(options) { + + }, + + /** + * 生命周期函数--监听页面初次渲染完成 + */ + onReady:function() { + var audioCtx=wx.createInnerAudioContext() + audioCtx.src='http://localhoost:3000/1.mp3' + audioCtx.onPlay(function(){ + console.log('开始播放') + }) + audioCtx.onError(function(res){ + console.log(res.errMsg) + console.log(res.errCode) + }) + audioCtx.play() + }, +sliderChanging:function(e){ + console.log(e.detail.value) +}, + /** + * 生命周期函数--监听页面显示 + */ + onShow() { + + }, + + /** + * 生命周期函数--监听页面隐藏 + */ + onHide() { + + }, + + /** + * 生命周期函数--监听页面卸载 + */ + onUnload() { + + }, + + /** + * 页面相关事件处理函数--监听用户下拉动作 + */ + onPullDownRefresh() { + + }, + + /** + * 页面上拉触底事件的处理函数 + */ + onReachBottom() { + + }, + + /** + * 用户点击右上角分享 + */ + onShareAppMessage() { + + } +}) \ No newline at end of file diff --git a/pages/test/test.json b/pages/test/test.json new file mode 100644 index 0000000..8835af0 --- /dev/null +++ b/pages/test/test.json @@ -0,0 +1,3 @@ +{ + "usingComponents": {} +} \ No newline at end of file diff --git a/pages/test/test.wxml b/pages/test/test.wxml new file mode 100644 index 0000000..e20964d --- /dev/null +++ b/pages/test/test.wxml @@ -0,0 +1,3 @@ + +pages/test.wxml + diff --git a/pages/test/test.wxss b/pages/test/test.wxss new file mode 100644 index 0000000..3ee2480 --- /dev/null +++ b/pages/test/test.wxss @@ -0,0 +1 @@ +/* pages/test/test.wxss */ \ No newline at end of file diff --git a/project.config.json b/project.config.json new file mode 100644 index 0000000..2882274 --- /dev/null +++ b/project.config.json @@ -0,0 +1,52 @@ +{ + "description": "项目配置文件", + "packOptions": { + "ignore": [], + "include": [] + }, + "setting": { + "bundle": false, + "userConfirmedBundleSwitch": false, + "urlCheck": true, + "scopeDataCheck": false, + "coverView": true, + "es6": true, + "postcss": true, + "compileHotReLoad": false, + "lazyloadPlaceholderEnable": false, + "preloadBackgroundData": false, + "minified": true, + "autoAudits": false, + "newFeature": false, + "uglifyFileName": false, + "uploadWithSourceMap": true, + "useIsolateContext": true, + "nodeModules": false, + "enhance": true, + "useMultiFrameRuntime": true, + "useApiHook": true, + "useApiHostProcess": true, + "showShadowRootInWxmlPanel": true, + "packNpmManually": false, + "enableEngineNative": false, + "packNpmRelationList": [], + "minifyWXSS": true, + "showES6CompileOption": false, + "minifyWXML": true, + "babelSetting": { + "ignore": [], + "disablePlugins": [], + "outputPath": "" + }, + "condition": false + }, + "compileType": "miniprogram", + "libVersion": "2.19.4", + "appid": "wx0675a52eafd1d039", + "projectname": "miniprogram-92", + "condition": {}, + "editorSetting": { + "tabIndent": "insertSpaces", + "tabSize": 2 + } +} \ No newline at end of file diff --git a/project.private.config.json b/project.private.config.json new file mode 100644 index 0000000..dd50eb3 --- /dev/null +++ b/project.private.config.json @@ -0,0 +1,7 @@ +{ + "description": "项目私有配置文件。此文件中的内容将覆盖 project.config.json 中的相同字段。项目的改动优先同步到此文件中。详见文档:https://developers.weixin.qq.com/miniprogram/dev/devtools/projectconfig.html", + "projectname": "music", + "setting": { + "compileHotReLoad": true + } +} \ No newline at end of file diff --git a/sitemap.json b/sitemap.json new file mode 100644 index 0000000..ca02add --- /dev/null +++ b/sitemap.json @@ -0,0 +1,7 @@ +{ + "desc": "关于本文件的更多信息,请参考文档 https://developers.weixin.qq.com/miniprogram/dev/framework/sitemap.html", + "rules": [{ + "action": "allow", + "page": "*" + }] +} \ No newline at end of file diff --git a/utils/util.js b/utils/util.js new file mode 100644 index 0000000..764bc2c --- /dev/null +++ b/utils/util.js @@ -0,0 +1,19 @@ +const formatTime = date => { + const year = date.getFullYear() + const month = date.getMonth() + 1 + const day = date.getDate() + const hour = date.getHours() + const minute = date.getMinutes() + const second = date.getSeconds() + + return `${[year, month, day].map(formatNumber).join('/')} ${[hour, minute, second].map(formatNumber).join(':')}` +} + +const formatNumber = n => { + n = n.toString() + return n[1] ? n : `0${n}` +} + +module.exports = { + formatTime +}