爆文详情页制作

从首页中数据列表打开相应详情页面的方法:

给数据列表中每个数据项加一个点击事件,同时将当前数据项的id暂时记录在本地,然后跳转到详情页面detail

  goopen: function (e) {
//获取当前内容的标识id,保存,方便进入查询
var id = e.currentTarget.id
wx.setStorageSync('id', id)
wx.navigateTo({
url: '../detail/detail',
});
},

在detail页面中的onLoad函数中对当前本地记录的爆文id进行查询,获取爆文详情数据

//取出标识id,查询
var id = wx.getStorageSync('id')
// 查询数据,初始化数据和判断值wy
db.collection('bao').where({
_id: id
}).get()

爆文转发功能实现

使用onShareAppMessage函数,title转发标题,path当前页面地址,path中页面路径后我们添加爆文的id为页面携带的参数,使得转发唯一

  //分享
onShareAppMessage: function () {
var detailId = this.data.detail._id
var id = wx.getStorageSync('id')
return {
title: '我要点爆',
desc: '帮我点爆',
path: '/pages/detail/detail?id=' + id + "1",
}
}

app.json中增加详情页detail路径,编译创建详情页

<!--pages/detail/detail.wxml-->
<block wx:if="{{detail.text}}">
<view class="the_top">
<view class="top_left">
<text space="ensp">性 别:</text>
<text>情绪颜色:</text>
<text>点爆类型:</text>
<text>点爆方式:</text>
<text>点爆时间:</text>
</view>
<view class="top_right">
<text>{{detail.gender}}</text>
<text>{{detail.wmood}}</text>
<text>文爆</text>
<text>{{detail.wway}}</text>
<text>{{detail.time}}</text>
</view>
</view>
<view class="the_mid">
<scroll-view scroll-y="true" scroll-x="false" scroll-with-animation="true">
<view>
<text>{{detail.text}}</text>
</view>
<block wx:if="{{detail.baofilename}}">
<view class="yuimage">
<image src="/images/yuyin4.png" bindtap="playtwo"></image>
</view>
</block>
</scroll-view>
</view>
<view class="the_button">
<button bindtap="boost">{{boostText}}</button>
</view>
<view class="the_bottom">
<view class="bottom_one">
<image src="/images/re.png"></image>
<text>{{temperature}}</text>
</view>
<view class="bottom_two" bindtap="collect">
<image src="{{collectimage}}"></image>
<text>{{collectText}}</text>
</view>
</view>
</block>
<block wx:if="{{detail.filename}}">
<view class="the_top">
<view class="top_left">
<text space="ensp">性 别:</text>
<text>情绪颜色:</text>
<text>点爆类型:</text>
<text>点爆方式:</text>
<text>点爆时间:</text>
</view>
<view class="top_right">
<text>{{detail.gender}}</text>
<text>{{detail.ymood}}</text>
<text>音爆</text>
<text>{{detail.yway}}</text>
<text>{{detail.time}}</text>
</view>
</view>
<view class="the_mid">
<view class="yuyin">
<image src="/images/yuyin3.png" class="image1 {{im1?'bb':''}}" bindtap="playone"></image>
<block wx:if="{{detail.baofilename}}">
<image src="/images/yuyin4.png" class="image2 {{im2?'bb':''}}" bindtap="playtwo"></image>
</block>
</view>
</view>
<view class="the_button">
<button bindtap="boost">{{boostText}}</button>
</view>
<view class="the_bottom">
<view class="bottom_one">
<image src="/images/re.png"></image>
<text>{{temperature}}</text>
</view>
<view class="bottom_two" bindtap="collect">
<image src="{{collectimage}}"></image>
<text>{{collectText}}</text>
</view>
</view>
</block>

detail.js完整代码

const db = wx.cloud.database();
var _innerAudioContext;
Page({
data: {
detail: {},//存储数据
userInfo: {},
temperature: 0,//热度
boost: true,//判断是助爆还是取消助爆
boostText: '助爆',//控制助爆按钮
wy: 1,//判断是文爆还是音爆,为相应数据库更新
collectimage: '/images/shoucang.png',//收藏图标
collectText: '收藏',//判断收藏文字变化
fileIDd: '',//爆炸之音
fileIDy: '',//语音
theplay: true,//判断是否在播放声音,
im1: false,//控制显示语音播放样式
im2: false,
boostNumber: 0,
},
//助爆
boost: function () {
//向助爆表中增加,传入这两个值方便保存,和查找删除
var detailId = this.data.detail._id
var openId = wx.getStorageSync('openId')
if (this.data.boost) {
//调用云函数,修改热度数量,向云函数传值,对bao数据库更新
wx.cloud.callFunction({
name: 'updateBoost',
data: {
id: this.data.detail._id,
temperature: this.data.temperature,
boost: this.data.boost,
detailId: detailId,
openId: openId
},
success: res => {
var detailId = this.data.detail._id
db.collection('boost').add({
data: {
detailId: detailId
},
success: function () {
console.log('增加成功')
},
fail: function (e) {
console.error(e)
}
})
this.setData({
boost: false,
boostText: '已助爆',
temperature: this.data.temperature + 10
})
wx.showToast({
title: '助爆成功',
})
}
})
} else {
//调用云函数,修改热度数量,向云函数传值
wx.cloud.callFunction({
name: 'updateBoost',
data: {
id: this.data.detail._id,
temperature: this.data.temperature,
boost: this.data.boost,
detailId: detailId,
openId: openId
},
success: res => {
this.setData({
boost: true,
boostText: '助爆',
temperature: this.data.temperature - 10
})
wx.showToast({
title: '已取消助爆',
})
}
})
}
},
//收藏按钮
collect: function () {
//在异步success中不能用this要用var that
var that = this
var detailId = this.data.detail._id
//变换收藏
if (this.data.collectText == '收藏') {
var img = '/images/usercang.png'
var detailId = this.data.detail._id
db.collection('collect').add({
data: {
detailId: detailId
},
success: function () {
that.setData({
collectimage: img,
collectText: '已收藏'
})
console.log('收藏成功')
},
fail: function (e) {
console.log(e)
}
})
} else {
var img = '/images/shoucang.png'
wx.cloud.callFunction({
name: 'removeCollect',
data: {
id: this.data.detail._id,
openId: wx.getStorageSync('openId')
},
success: res => {
that.setData({
collectimage: img,
collectText: '收藏'
})
console.log('取消收藏')
}
})
}
},
//第一个语音按钮播放
playone: function () {
if (this.data.theplay) {
this.setData({
theplay: false,
im1: true,
})
const innerAudioContext = wx.createInnerAudioContext()
_innerAudioContext = innerAudioContext
innerAudioContext.autoplay = true
innerAudioContext.src = this.data.detail.fileIDy
innerAudioContext.onPlay(() => {
console.log('开始播放')
}),
innerAudioContext.onEnded(() => {
this.setData({
theplay: true,
im1: false,
})
})
innerAudioContext.onError((res) => {
console.log(res.errMsg)
})
}
},
//第二个语音按钮播放
playtwo: function () {
if (this.data.theplay) {
this.setData({
theplay: false,
im2: true,
})
const innerAudioContext = wx.createInnerAudioContext()
_innerAudioContext = innerAudioContext
innerAudioContext.autoplay = true
innerAudioContext.src = this.data.detail.fileIDd
innerAudioContext.onPlay(() => {
console.log('开始播放')
}),
innerAudioContext.onEnded(() => {
this.setData({
theplay: true,
im2: false,
})
})
innerAudioContext.onError((res) => {
console.log(res.errMsg)
console.log(res.errCode)
})
}
},
//如果页面被卸载时被执行,关掉所有正在播放的语音
onUnload: function () {
if (_innerAudioContext){
_innerAudioContext.stop();
}
},
//查询出点爆数据,并初始化各个需要用的参数
onLoad: function () {
wx.showLoading({
title: '加载中',
mask: true
})
var that = this
//取出标识id,查询
var id = wx.getStorageSync('id')
// 查询数据,初始化数据和判断值wy
db.collection('bao').where({
_id: id
}).get({
success: res => {
var wy = 1
if (res.data[0].text) {
wy = 1
} else {
wy = 2
}
that.setData({
detail: res.data[0],
temperature: res.data[0].temperature,
wy: wy
})
//查询当前文章是不是当前用户已经收藏的,如果是变换收藏图标
db.collection('collect').where({
_openid: wx.getStorageSync('openId'),
detailId: this.data.detail._id
}).get({
success(res) {
//如果返回值存在且有数据
if (res.data && res.data.length > 0) {
var img = '/images/usercang.png'
that.setData({
collectimage: img,
collectText: '已收藏'
})
}
}
})
//查询当前文章是不是当前用户已经助爆
db.collection('boost').where({
_openid: wx.getStorageSync('openId'),
detailId: this.data.detail._id
}).get({
success(res) {
//结束加载按钮
wx.hideLoading()
//如果返回值存在且有数据
if (res.data && res.data.length > 0) {
that.setData({
boost: false,
boostText: '已助爆'
})
}
}
})
}
});
},
//分享
onShareAppMessage: function () {
var detailId = this.data.detail._id
var id = wx.getStorageSync('id')
return {
title: '我要点爆',
desc: '帮我点爆',
path: '/pages/detail/detail?id=' + id + "1",
}
}
})

新建助爆记录集合boost和收藏记录集合collect

两个集合的结果如下:

字段名 数据类型 主键 非空 描述
_id String ID
_openid String 用户唯一标识
time String 用户签到时间

新建助爆时修改热度值的云函数updateBoost,用于修改爆文热度和删除爆文

// 云函数入口文件
const cloud = require('wx-server-sdk')
cloud.init()
//声明数据库
const db = cloud.database()
// 云函数入口函数
exports.main = async (event, context) => {
//取得传过来的参数
var temperature = event.temperature,
id = event.id,
boost = event.boost,
detailId = event.detailId,
openId = openId;
if (boost) {
temperature = temperature + 10
} else {
temperature = temperature - 10
try {
db.collection('boost').where({
openId: openId,
detailId: detailId,
}).remove()
} catch (e) {
console.error(e)
}
}
try {
return await db.collection('bao').where({
_id: id
}).update({
data: {
temperature: temperature
},
success: res => {
console.log('云函数成功')
},
fail: e => {
console.error(e)
}
})
} catch (e) {
console.error(e)
}
}

新建收藏取消收藏的云函数removeCollect,用于删除收藏集合中的数据

// 云函数入口文件
const cloud = require('wx-server-sdk')
cloud.init()
//声明数据库
const db = cloud.database()
// 云函数入口函数
exports.main = async (event, context) => {
//取得传过来的参数
var openId = event.openId,
id = event.id;
try {
return await db.collection('collect').where({
_openid: openId,
detailId: id
}).remove()
} catch (e) {
console.error(e)
}
}

运行结果

至此,“我要点爆”微信小程序云开发实例项目的主要功能和所用知识点就都讲解完了,下面的我的页面的签到、收藏、助爆、封存和点爆记录就由大家自己来实现吧!

项目源码:https://github.com/xiedong2016/dbx

第六章 “我要点爆”微信小程序云开发实例之爆文详情页制作的更多相关文章

  1. 第五章 “我要点爆”微信小程序云开发实例之从云端获取数据制作首页

    下面我们来实现从云端获取数据,完成首页世界页面index的制作,首页分为4个数据列表导航页面,页面具体内容如下: 推荐:为用户推荐最新的点爆信息,它包含文本点爆内容和语音点爆内容. 文爆:筛选出文字点 ...

  2. “我要点爆”微信小程序云开发实例

    使用云开发进行微信小程序“我要点爆”的制作 下一章:“我要点爆”微信小程序云开发之项目建立与我的页面功能实现 接下来我将对“我要点爆”微信小程序进行完整的开源介绍 小程序名称: 我要点爆 查看方式:从 ...

  3. 第三章 “我要点爆”微信小程序云开发之点爆方式页面和爆炸之音页面制作

    点爆方式选择页面制作 在app.json中配置页面路径增加selectbao点爆方式选择,编译创建页面文件,点爆方式选择页面通过单选按钮组选择跳转到相应的点爆页面. <view class=&q ...

  4. 第一章 “我要点爆”微信小程序云开发之项目建立与我的页面功能实现

    第一章 “我要点爆”微信小程序云开发之项目建立与我的页面功能实现 开发环境搭建 使用自己的AppID新建小程序项目,后端服务选择小程序·云开发,点击新建,完成项目新建. 新建成功后跳转到开发者工具界面 ...

  5. 第四章 “我要点爆”微信小程序云开发之疯狂点击与糖果点爆页面制作

    疯狂点击点爆方式页面制作 疯狂点击为用户提供一个60秒的按钮点击时间,同时点击过程中有背景音乐,系统根据用户点击按钮的此时来进行热度值的计算. <view class="the_hea ...

  6. 技本功丨收藏!斜杠青年与你共探微信小程序云开发(下篇)

    2019年2月26日,人们为了一个杯子疯了一天. 星巴克猫爪杯,一场已经与猫无关了的“圣杯战争“.网上的倒卖价格,已炒至近千元! 求而不得,舍而不能,得而不惜.这是人最大的悲哀... 所以,请珍惜以下 ...

  7. 微信小程序云开发-从0打造云音乐全栈小程序

    第1章 首门小程序“云开发”课程,你值得学习本章主要介绍什么是小程序云开发以及学习云开发的重要性,并介绍项目的整体架构,真机演示项目功能,详细介绍整体课程安排.课程适用人群以及需要掌握的前置知识.通过 ...

  8. 微信小程序-云开发(手记)

    微信小程序-云开发(手记) 1.创建data.json文件 注意以下几点要求: 入门示例: init方法的env:默认环境配置,传入字符串形式的环境 ID(理解为数据库)可以指定所有服务的默认环境(意 ...

  9. 微信小程序云开发不完全指北

    微信小程序云开发不完全指北 首先必须说明云开发的"云"并不是类似云玩家里的云的意思,而是微信小程序真的提供了云开发的接口以及一个简单的提供存储.数据库服务的虚拟后台(对于一些轻量小 ...

随机推荐

  1. 顽石系列:Java技术面试

    顽石系列:Java技术面试 JDBC相关 1.Statement与PreparedStatement的区 别,什什么是SQL注⼊入,如何防⽌止SQL注⼊? PreparedStatement支持动态设 ...

  2. echarts如何显示在页面上

    echarts如何显示在页面上 1.引入echarts的相关.js文件 <script src="js/echarts.min.js"></script> ...

  3. zabbix监控系统性能采集指标

                  监控项目                        详细内容                                                       ...

  4. 最近采集写的一个超简单实用的HTML解析类

    1. [文件] HtmlDom.php <?php$oldSetting = libxml_use_internal_errors( true ); libxml_clear_errors(); ...

  5. CSS3咖啡制作全过程动画

    CSS3咖啡制作全过程动画是一款利用纯CSS3实现的咖啡制作全过程动画特效,从把咖啡豆导入杯子,到把咖啡煮好,整个动画还比较流畅. 源码:http://www.huiyi8.com/sc/8788.h ...

  6. NOIP 2016【蚯蚓】

    好吧,我承认我是个智障-- 这道题一眼看上去就是个堆,然而实际上有单调性. 注意到,如果 \(q = 0\) 的话,将蚯蚓的左右两边分开丢进两个队列中,则两个队列都是单调不增的,因为每次取出的蚯蚓长度 ...

  7. ACM学习历程—HDU 4287 Intelligent IME(字典树 || map)

    Description We all use cell phone today. And we must be familiar with the intelligent English input ...

  8. TFS 备注

    1,更改任何文件, 先checkout, 再继续更改. 2. 更新sln时, 一定要更新include文件 3. 每次提交代码放到shelf上, 自己本地建立2个workspace, 来进行coder ...

  9. 用位运算实现四则运算之加减乘除(用位运算求一个数的1/3) via Hackbuteer1

    转自:http://blog.csdn.net/hackbuteer1/article/details/7390093 ^: 按位异或:&:按位与: | :按位或 计算机系统中,数值一律用补码 ...

  10. Python list的定义和删改

    需要用到list.取回参数 .  sys.argv返回的是个元组. 最后发现用for循环好像没用. a=0 for i in sys.argv[1:]: qh[a]=sys.argv[a] a=a+1 ...