【微信小程序-云开发】实现爆款木鱼功德小程序(附带排行榜)

1,366 阅读2分钟

一、简介

image.png

最近抖音视频中一款敲木鱼的应用超级火,突发奇想如何用小程序去实现呢?接下来就一起看看如何从0到1实现一款木鱼小程序(技术菜轻喷)。

效果图:

image.png image.png image.png

预览:

image.png

二、基本架构

流程图

活动图.png

小程序框架

小程序采用uniapp,具体项目集成方式就不多介绍了。查看官方文档

云函数

云函数和云数据库采用的是阿里云,具体也不展开讲了。查看官方文档

三、代码实现

1、用户表设计

索引名称备注
_id唯一索引
openid微信唯一标识
user_id系统定义的用户ID
user_name用户姓名
user_avatar用户头像
clicks用户点击次数记录

2、页面交互实现

页面样式具体就不详细展开了,相比木鱼敲击动画大家应该都能自己设计,主要是介绍几个关键点。

木鱼点击音效

//uniapp 音频播放api
const innerAudioContext = uni.createInnerAudioContext();
innerAudioContext.autoplay = true;
innerAudioContext.src = "本地音频文件";
innerAudioContext.onPlay(() => {
    console.log("开始播放");
});

排行榜下拉刷新和上拉加载

前端采用的是 mescroll.js(uni版本)

//各种配置和事件具体看上面文档
<mescroll-uni 
ref="mescrollRef" 
@init="mescrollInit" 
@down="downCallback" 
@up="upCallback" 
:down="downOption" 
:up="upOption" >
    // 自定义组件
 </mescroll-uni>

3、云函数

用户登录和注册

用户授权后拿到用户的微信基本信息,通过code获取oppenId,更具openId判断是否为新用户区分登录和注册并返回用户信息。

'use strict';
const appid = ''
const secret = ''
//链接数据库
const db = uniCloud.database()
exports.main = async (event, context) => {
//接收客户端发送的code
    const code = event.code
    const collection = db.collection('users')
    //用前端传过来的code得到openid
    const URL = `https://api.weixin.qq.com/sns/jscode2session?appid=${appid}&secret=${secret}&js_code=${code}&grant_type=authorization_code`
    const requestOptions = {
        method: 'GET',
        dataType: 'json'
    }
    const res = await uniCloud.httpclient.request(URL,requestOptions)
    const { data: { openid } } = res
    //先查询此openid注册过没
    const userdata = await collection.where({
        openid: wxopenid,
    }).count()
    //没注册过就执行注册
    if (userdata.total == 0) {
    //注册时数据
    const params = {}
    const users = await collection.add(params)
    const userdata = await collection.where({
        openid:wxopenid,
    }).get()
    //返回当前openid的用户信息
        return userdata
    } else {
    //有的话就执行登录,并且返回当前openid用户信息
        return useronedata
    }
}

查询用户信息获取

'use strict';
const db = uniCloud.database()
const collection = db.collection('users')
exports.main = async (event, context) => {
    //event为客户端上传的参数
    if(event._id){
        const userdata = await collection.where({
            _id:event._id,
	}).get()
            //返回数据给客户端
            return userdata
	}else{
            //返回空
            return {}
	}
};

查询用户点击次数

'use strict';
const db = uniCloud.database()
exports.main = async (event, context) => {
    //event为客户端上传的参数
    const collection = db.collection('users')
    //客户端分页参数
    const {currentPage,pageSize} = event
    //orderBy:根据(clicks)点击次数排序
    //limit:指定查询结果集数量上限
    //skip:指定查询返回结果时从指定序列后的结果开始返回,常用于分页
    const data = await collection.orderBy('clicks','desc').skip((currentPage - 1) * pageSize).limit(pageSize).get().then(res => {
	  return res
    }).catch(err => {
	  return err
    })
    return data
};

增加点击次数

'use strict';
const db = uniCloud.database()
exports.main = async (event, context) => {
    //event为客户端上传的参数
    const dbCmd = db.command 
    const collection = db.collection('users')
    let userss = await collection.where({
        _id:event._id,
    }).update({
        //自增1
        clicks:dbCmd.inc(1)
    })
    //返回数据给客户端
    return event
};