微信小程序:解决url的报错,flex,盒子模型,音乐播放,复用common.wxss【诗书画唱】

目录:
例子1:根据期刊的类型调用movie,essay,music组件。实现movie,essay,music组件都复用common.wxss的样式

essay
为了避免我们认为Boolean类型的变量hidden的hidden是不可重命名的变量,我下面把Boolean类型的变量hidden重命名为hn(常常通过true或false来控制多个组件的显示和隐藏等等)
根据type来判断(常常组件中使用属性的值,三元表达式等等进行判断)
例子2:实现music组件的样式:

弹性盒子的个人理解和对应的教程视频等等
display
flex:1等的使用,flex:0,flex:2,flex:0.5的效果

例子3:实现music组件的音乐播放


一开始,点击事件等绑定的函数方法的内容,可以先用打印语句代替,先测试下方法是否可以被触发
一开始可以写死数据,后面可以通过变量的添加和控制等等来把数据写活,变成动态数据
不得不承认,serData挺好用的,挺常用的,可以控制变量,进行变量的值的刷新(也就是组件的刷新)
properties或data,setData,父组件传值给子组件(在父组件中,给子组件的属性赋值等等)等等都可以把数据写活
个人理解:很多时候用了解构后,变量自动被赋予对应的值,就可以直接用解构出来的变量,但是下面因导入的config.js文件中一些关键字(default等等),而解构不出来,所以下面不可以用解构
例子4:按照例子1到例子3实现的代码
具体代码如下
components/classic/essay/index.wxml
components/classic/essay/index.wxss
components/classic/music/index.js
components/classic/music/index.wxml
components/classic/music/index.wxss
components/classic/classic_beh.js
common.wxss
pages/classic/index.wxml
"requiredBackgroundModes": ["audio"],
config.js
运行效果
讲义

例子1:根据期刊的类型调用movie,essay,music组件。实现movie,essay,music组件都复用common.wxss的样式

essay


下面就开始实现“根据期刊的类型调用movie,essay,music组件”的功能




根据数据库的type的值来判断当前期刊要显示的那种类型的组件


为了避免我们认为Boolean类型的变量hidden的hidden是不可重命名的变量,我下面把Boolean类型的变量hidden重命名为hn(常常通过true或false来控制多个组件的显示和隐藏等等)






根据type来判断(常常组件中使用属性的值,三元表达式等等进行判断)

例子2:实现music组件的样式:

组件中,常常用上三元表达式,组件文件夹中的js文件等中的properties或data中的等等

弹性盒子的个人理解和对应的教程视频等等


如果想要整个设置为弹性盒子的块状,就用display:flex

flex:1等的使用,flex:0,flex:2,flex:0.5的效果





display





例子3:实现music组件的音乐播放


升级后台




下面的内容也可以参考官网的开发者文档

一开始,点击事件等绑定的函数方法的内容,可以先用打印语句代替,先测试下方法是否可以被触发



一开始可以写死数据,后面可以通过变量的添加和控制等等来把数据写活,变成动态数据

不得不承认,serData挺好用的,挺常用的,可以控制变量,进行变量的值的刷新(也就是组件的刷新)

下面还要进行修改

properties或data,setData,父组件传值给子组件(在父组件中,给子组件的属性赋值等等)等等都可以把数据写活



个人理解:很多时候用了解构后,变量自动被赋予对应的值,就可以直接用解构出来的变量,但是下面因导入的config.js文件中一些关键字(default等等),而解构不出来,所以下面不可以用解构



例子4:按照例子1到例子3实现的代码
个人修复的bug
Q:为什么音乐播放不了,会路径报错?GET http://127.0.0.1:9001/public/music/http://music.163.com/song/media/outer/url?id=393926.mp3 net::ERR_EMPTY_RESPONSE(env: Windows,mp,1.05.2105170; lib: 2.17.0)

A:
首先我排除错误的方法就是写console.log的打印语句,同时发现
http://m10.music.126.net/20210617171232/200b492b79e7938a13133a005d07bb6d/ymusic/67d4/380d/3414/2d73b6bc1059ac4276887d82806bbaff.mp3访问得了,那么可能是路径错了,那么我猜想是不是数据库的url的问题?是不是后台中项目的src根目录下的index.js的内容错了?
我打印了以下内容
结果:

后来查看数据库

就明白了:
改下后台和数据库即可(记得清空缓存后运行项目)

关键是if(req.url.search('/public/') === -1) {}部分




具体代码如下

<!--components/classic/essay/index.wxml-->
<view class="container" hidden="{{hn}}">
<image src="{{base_img + img}}" class="img"/>
<image src="./images/essay@tag.png" class="tag"/>
<text class="content">{{content}}</text>
</view>

/* components/classic/essay/index.wxss */
@import '../common.wxss'



// components/classic/music/index.js
import classicBeh from '../classic_beh.js'
import config from '../../../config.js'
//获取音频管理器对象 START
const mMgr = wx.getBackgroundAudioManager()
//获取音频管理器对象 END
Component({
behaviors: [classicBeh],
/**
* 组件的属性列表
*/
properties: {
src: String,
title: String,
},
/**
* 组件的初始数据
*/
data: {
pauseSrc: 'images/player@pause.png',
playSrc: 'images/player@play.png',
playing: false,//是否播放音乐
},
/**
* 组件的方法列表
*/
methods: {
onPlay () {
//如果需要播放音乐,只需要设置mMgr的src和title属性
// mMgr.src ='http://m10.music.126.net/20210617171232/200b492b79e7938a13133a005d07bb6d/ymusic/67d4/380d/3414/2d73b6bc1059ac4276887d82806bbaff.mp3'
/*如果你的MySQL数据库中的classic表的url例对应的内容是
http://music.163.com/song/media/outer/url?id=393926.mp3,
那么就用mMgr.src =this.properties.src。
如果你的MySQL数据库中的classic表的url例对应的内容是fhg.mp3之类的
后台的public\music之类目录下有的文件的文件名,那么就用
mMgr.src = config.music_url + this.properties.src
(这里目前我还是用自己后台的内容!)*/
mMgr.src = config.music_url + this.properties.src
// mMgr.src =this.properties.src
console.log(mMgr.src)
console.log(config.music_url)
console.log(this.properties.src)
mMgr.title = this.properties.title
//更新播放状态
this.setData({
playing: true
})
}
}
})

<!--components/classic/music/index.wxml-->
<view class="container" hidden="{{hn}}">
<image src="{{base_img + img}}" class="img"/>
<image src="{{playing ? pauseSrc : playSrc}}" class="player" bind:tap="onPlay"/>
<image src="./images/music@tag.png" class="tag"/>
<text class="content">{{content}}</text>
</view>

/* components/classic/music/index.wxss */
/* @import '../common.wxss' */
/* components/classic/music/index.wxss */
.container {
display: flex;
flex-direction: column;
align-items: center;
}
.img {
width: 422rpx;
height: 422rpx;
margin-top: 60rpx;
border-radius: 50%;
}
.player {
width: 120rpx;
height: 120rpx;
position: relative;
bottom: 270rpx;
}
.tag {
width: 44rpx;
height: 128rpx;
position: relative;
bottom: 160rpx;
right: 310rpx;
}

//components/classic/classic_beh.js
import config from '../../config'
export default Behavior({
properties: {
img: String,
content: String,
//控制子组件是否显示的部分 START
hn: Boolean
//控制子组件是否显示的部分 END
}
//music等子组件要共用的base_img部分 START
,
data: {
base_img: config.img_url
}
//music等子组件要共用的base_img部分 END
})

common.wxss
/*公共的样式文件:essay和movie样用的样式*/
.container {
display: flex;
flex-direction: column;
align-items: center;
}
.tag{
width: 46rpx;
height: 142rpx;
position: relative;
right: 310rpx;
bottom: 58rpx;
}
.img {
width: 750rpx;
height: 500rpx;
}
.content {
font-size: 36rpx;
max-width: 550rpx;
}


<!--pages/classic/index.wxml-->
<view class="container">
<view class="header">
<cmp-epsoide class="epsoide" index="{{classicData.index}}"></cmp-epsoide>
<!-- 下面的话就是调用了点赞的组件: -->
<!-- <cmp-like count="{{classicData.fav_nums}}" like="{{classicData.like_status}}"
bind:myLike="onLike"></cmp-like> -->
<!-- 关于更新缓存的fav_num,like_status等的绑定 START -->
<cmp-like class="like" count="{{fav_nums}}"
like="{{like_status}}" bind:myLike="onLike"></cmp-like>
<!-- 关于更新缓存的fav_num,like_status等的绑定 END -->
</view>
<!-- <cmp-movie wx:if="{{classicData.image}}" content="{{classicData.content}}"
img="{{classicData.image}}"></cmp-movie> -->
<!-- 3个子组件部分 START -->
<cmp-movie wx:if="{{classicData.image}}" content="{{classicData.content}}"
img="{{classicData.image}}" hn="{{classicData.type != 100}}"></cmp-movie>
<cmp-essay wx:if="{{classicData.image}}" content="{{classicData.content}}"
img="{{classicData.image}}" hn="{{classicData.type != 300}}"></cmp-essay>
<cmp-music wx:if="{{classicData.image}}" content="{{classicData.content}}"
img="{{classicData.image}}" hn="{{classicData.type != 200}}"
src="{{classicData.url}}" title="{{classicData.title}}"></cmp-music>
<!-- 3个子组件部分 END -->
<cmp-navi class="navi" title="{{classicData.title}}" isFirst="{{isFirst}}"
isLatest="{{isLatest}}" bind:myLeft="onNext"
bind:myRight="onPrev"></cmp-navi>
</view>

{
"entryPagePath": "pages/classic/index",
"pages": [
"pages/classic/index"
],
"requiredBackgroundModes": ["audio"],
"window": {
"navigationBarBackgroundColor": "#fff",
"navigationBarTextStyle": "black",
"navigationBarTitleText": "听雨轩",
"backgroundColor": "#eeeeee",
"backgroundTextStyle": "light",
"enablePullDownRefresh": false
},
"sitemapLocation": "sitemap.json"
}

//config.js
//用来存放常量的文件
export default {
base_url: 'http://127.0.0.1:9001/',
img_url: 'http://127.0.0.1:9001/public/images/',
music_url: 'http://127.0.0.1:9001/public/music/'
}
运行效果






讲义

准备:后台代码处理
一、创建新项目和页面
二、app.json配置导航栏
三、定义和使用点赞组件
"四、classic在生命周期函数中请求后台数据
设置-项目设置-勾选不校验..."
五、封装Http工具类。
六、将classic页面的数据传递到like组件中(父组件传数据到子组件)
七、实现movie组件
八、like组件传递数据到classic页面(子传父实现自定义事件)
"九、epsoide组件(组件的生命周期函数以及data和properties定义数据的区别)
data和properties会被合并成同一个对象,如果有同名属性,会使用properties中定义的属性
期刊号补零(observer函数)"
"十、初步完成导航组件
获取数据:title,isFirst和isLatest
自定义导航事件onLeft,onRight
禁用左翻页和右翻页"
十一、初步实现music组件和essay组件
十二、提取组件的公共部分(组件的行为Behavior实现多继承)
"十三、初步实现期刊切换前一期效果(后台getClassic实现)
classic页面的onPrev"
"十四、根据index判断是第一期还是最后一期
classicModel中的isFirst和isLatest方法,缓存(Storage)最新期刊号_setLatest方法"
"十五、实现期刊切换后一期效果
classic页面的onNext
classicModel中的getNext和getPrev代码重构
classic页面的onPrev和onNext代码重构"
十六、期刊数据数据缓存实现,(model中的回调函数处理bug和大图片显示bug)
十七、缓存数据以后无法显示更新后的点赞次数和状态(后台代码getClassic扩展)
"十八、根据期刊类型使用组件movie,essay和music组件
组件的自定义属性控制组件是否显示"
"十九、movie,essay和music组件样式代码的复用
@import复用样式文件common.wxss"
二十、music组件样式
"二十一、实现播放音乐
后台提供音频服务功能(修改中间件代码乱码处理逻辑)
wx.getBackgroundAudioManager()
app.json中添加配置项目:""requiredBackgroundModes"": [""audio""],"