摘要:項(xiàng)目主要是微信小程序也用到了等。前端部分主要是歌曲播放控制和交互部分的代碼,更多關(guān)于小程序的內(nèi)容可見微信小程序開發(fā)文檔小程序框架結(jié)構(gòu)微信小程序的入口是根目錄下的它們分別描述的小程序的主題邏輯和公共配置部分。
剛進(jìn)公司不久,因?yàn)楣静块T年后業(yè)務(wù)拓展的關(guān)系,可能在年后會被分配到公司的微信公眾號組做小程序相關(guān)的開發(fā)工作,因此寫了個(gè)微信小程序wx-audio踩坑。目前還有一些功能沒有寫完:如返回多首歌曲、控制播放時(shí)間等,可能在年后繼續(xù)完成。
項(xiàng)目主要是微信小程序、也用到了node、express等。
時(shí)間來不及了,快上車!
先上一個(gè)運(yùn)行效果吧!
搭建node中間層最近對搭建node中間層也有一定的思考,可見我最近剛寫的文章:NodeJS搭建中間層
之所以選擇NodeJS搭建中間層服務(wù),主要是為了格式化參數(shù)、合并請求、節(jié)省性能方面所考慮的,現(xiàn)今大公司基本都采用node作為微服務(wù)的方式進(jìn)行項(xiàng)目搭建。具體原因分析可自行谷歌或百度。
首先在node層對后端發(fā)起http請求:
// http.js var formatURL = require("./formatURL.js"); var http = require("http"); const POSThttp = function(request) { return new Promise((resolve, reject) => { let body = ""; // http模塊拿到真實(shí)后臺api的數(shù)據(jù) http.get(formatURL(request.body.musicname), function(res) { res.on("data", (data) => { body += data; }).on("end", () => { // 格式化 const { name, audio: musicUrl, page, album: { name: musicName, picUrl, }, artists: [{ name: singer, }], } = JSON.parse(body).result.songs[0]; const reply = { name, picUrl, musicUrl, page, singer, }; resolve(reply); }); }); }); }; module.exports = POSThttp;
然后與客戶端的交互:
var express = require("express"); var POSThttp = require("./POSThttp.js"); var bodyParser = require("body-parser"); // 使用body-parser解析post請求的參數(shù),如果沒有,req.body為undefined。 var app = express(); app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: true })); app.post("/", (req, res) => { POSThttp(req).then((data) => { res.send(data); }).catch((err) => { res.send(err); }); }); app.listen(3000, () => { console.log("open wx-audio server successful!") });前端部分
主要是歌曲播放控制和交互部分的代碼,更多關(guān)于小程序的內(nèi)容可見微信小程序 - 開發(fā)文檔:
小程序框架結(jié)構(gòu)
微信小程序的入口是根目錄下的app.js、app.json、app.wxss它們分別描述的小程序的主題邏輯和公共配置部分。
在pages/目錄下,每個(gè)文件夾就是一個(gè)頁面。分別包括js文件、wxml文件、wxss文件。它們分別描述數(shù)據(jù)邏輯、靜態(tài)頁面模板和頁面樣式。
數(shù)據(jù)邏輯控制
微信小程序采用類似于React的state控制頁面數(shù)據(jù)邏輯,我們不能使用this.data直接改變狀態(tài),而是類似于React`,使用this.setData()改變頁面數(shù)據(jù)邏輯。
在本項(xiàng)目中定義的如下數(shù)據(jù)邏輯
data: { name: "", // 歌曲名稱 musicUrl: "", // 歌曲鏈接地址 picUrl: "", // 專輯圖片地址 page: "", // 網(wǎng)易云音樂的歌曲鏈接 singer: "", //歌手名稱 input: "", // 輸入框的內(nèi)容 transform: "", // 旋轉(zhuǎn)動畫屬性 rotateFlag: false, // 控制專輯圖片旋轉(zhuǎn) }
生命周期函數(shù)
微信小程序組件有自己的生命周期函數(shù),也是類似于React,每次通過觸發(fā)一個(gè)鉤子函數(shù)改變狀態(tài)。如:onLoad、onReady函數(shù)等。
詳情可見:微信小程序-API
中間的轉(zhuǎn)盤部分
微信小程序并不支持css3自定義的動畫,因此我采用JS實(shí)現(xiàn)的:
// 專輯圖片旋轉(zhuǎn)函數(shù) myRotate: function() { rotate++; let transform = `transform:rotate(${rotate}deg);`; this.setData({ transform, }); const animation = setTimeout(() => { this.myRotate(); }, 30); if (!this.data.rotateFlag) { clearTimeout(animation); }; }, // 控制專輯圖片旋轉(zhuǎn) toggleRotate: function() { if (this.data.rotateFlag) { this.pauseMusic(); this.audioCtx.pause(); } else { this.playMusic(); this.audioCtx.play(); } }, // 播放音樂 playMusic: function() { this.setData({ rotateFlag: true, }); this.myRotate(); }, // 暫停播放音樂 pauseMusic: function() { this.setData({ rotateFlag: false, }); },
交互部分
微信小程序采用特有的wx.request發(fā)送http請求,基本用法類似于$.ajax(),傳入回調(diào)函數(shù)。
wx.request({ method: "POST", url: "http://127.0.0.1:3000", //訪問node端后臺借口 header: { "content-type": "application/x-www-form-urlencoded" }, data: { musicname: musicname, }, success: (res) => { const { name, picUrl, musicUrl, page, singer, } = res.data; this.setData({ name, picUrl, musicUrl, page, singer, }); console.log(this.data); }, error: () => { console.log("err"); } });
最后上源碼:wx-audio,歡迎star、歡迎fork、歡迎PR。
最后祝大家雞年大吉吧!
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/81327.html
摘要:自適應(yīng)的橢圓背景知識屬性的基本用法使用樣式畫各種圖形前端掘金下面是一些我在中經(jīng)常用到的圖案,還有一些是在看到的。像圖手把手教你使用前端掘金使用教程一是什么是目前世界上最先進(jìn)的分布式版本控制系統(tǒng)。 如何在 Vue.js 中使用第三方庫 - 前端 - 掘金在諸多 Vue.js 應(yīng)用中, Lodash, Moment, Axios, Async等都是一些非常有用的 JavaScript 庫....
摘要:自適應(yīng)的橢圓背景知識屬性的基本用法使用樣式畫各種圖形前端掘金下面是一些我在中經(jīng)常用到的圖案,還有一些是在看到的。像圖手把手教你使用前端掘金使用教程一是什么是目前世界上最先進(jìn)的分布式版本控制系統(tǒng)。 如何在 Vue.js 中使用第三方庫 - 前端 - 掘金在諸多 Vue.js 應(yīng)用中, Lodash, Moment, Axios, Async等都是一些非常有用的 JavaScript 庫....
摘要:為了提高自己,最近在學(xué)習(xí)微信小程序,選題是仿網(wǎng)易云音樂。查文檔發(fā)現(xiàn),小程序中圖片加載完成后,有一個(gè)加載完成事件。前者在微信客戶端版本就不開始維護(hù)了,后者低版本需做兼容處理。目前還有一些功能暫未實(shí)現(xiàn),會在以后繼續(xù)完善項(xiàng)目,繼續(xù)學(xué)習(xí)。 為了提高自己,最近在學(xué)習(xí)微信小程序,選題是仿網(wǎng)易云音樂。期間踩過了大把的坑,bug出現(xiàn)的難受和解決bug歡喜,一直是伴隨我階段性學(xué)習(xí)這個(gè)項(xiàng)目的心情。初步完成...
摘要:后兩個(gè)屬性可選。屬性定義了項(xiàng)目的縮小比例,默認(rèn)為,即如果空間不足,該項(xiàng)目將縮小。屬性定義了在分配多余空間之前,項(xiàng)目占據(jù)的主軸空間。它的默認(rèn)值為,即項(xiàng)目的本來大小。結(jié)合的異步組件和的代碼分割功能,輕松實(shí)現(xiàn)路由組件的懶加載。 項(xiàng)目總結(jié) 這是我第二個(gè)用 Vue 實(shí)現(xiàn)的項(xiàng)目,下面內(nèi)容包括了在實(shí)現(xiàn)過程中所記錄的知識點(diǎn)以及一些小技巧 項(xiàng)目演示地址:https://music-vue.n-y.io源...
摘要:如果你做其他的動畫,或者動畫之類的,一定知道幀這個(gè)東西。這個(gè)是動畫的一個(gè)過程,電腦是根據(jù)幀,然后渲染得到的一個(gè)連續(xù)的動畫。規(guī)定完成動畫所花費(fèi)的時(shí)間,以秒或毫秒計(jì)。就是播放一次停在最后一幀播放次數(shù)和播放完成之后保留的最后的轉(zhuǎn)態(tài)?! ≡瓉淼臅r(shí)候?qū)戇^一個(gè)小程序,里面有一個(gè)播放背景音樂的按鈕(也是一個(gè)圓形的圖片),它是一直在旋轉(zhuǎn)的,當(dāng)我們點(diǎn)擊這個(gè)按鈕的可以暫?;蛘卟シ疟尘耙魳贰.?dāng)初的這個(gè)動畫,是同事...
閱讀 3310·2021-09-30 09:54
閱讀 3808·2021-09-22 15:01
閱讀 3116·2021-08-27 16:19
閱讀 2580·2019-08-29 18:39
閱讀 2167·2019-08-29 14:09
閱讀 636·2019-08-26 10:23
閱讀 1345·2019-08-23 12:01
閱讀 1876·2019-08-22 13:57