小太阳云存储无法获取外链_用小程序云开发打造运动圈小程序丨实战

还在为组队约球难同步犯愁?本文教你用小程序·云开发打造运动圈小程序(以乒乓球为例),实现球友间高效互动,一起运动起来吧!

导语

以建立一个信息共享与交流平台为目标,我与好友一起完成了这个乒乓圈小程序的开发。

我们主要借助了小程序·云开发的云函数、云数据库等能力来完成有关于数据和后台的操作,从而免去了租赁服务器等繁杂的开发事项。

下面我就来分享下开发过程中如何进行数据库的设计、云函数实现数据获取和触发器的功能,以及简单的两个页面设计。

界面展示

界面展示

e53f51bba60caaf3440db153d234af3f.png b56d31b922934e80c7e6884293201368.png 5b8179668f7b3652e07e01125526f3e1.png e8a3a22810daf10283ceac41ce8af2bc.png

<<  滑动查看下一张图片  >>

页面流程大致分为:

- 引导页

- 首页

- 同城圈

- 打卡

- 榜单

- 圈友页

- 同城圈友

- 留言列表

- 个人页

- 个人资料

数据库

从以上的功能出发我的数据库设计思路如此 对象有以下几个:

  • 个人基础信息

  • 个人详细信息(乒乓球相关)

  • 球馆

  • 对话

  • 留言信息

对象属性的类型选择

小程序提供的数据库是基于mangoDB的面向对象数据库,区别于一般的关系数据库如:mysql等。

对象结构如下所示:

个人基础信息:

openId:{type:String}//openId主键

name:{type:String}//名字,默认为微信名

avatarUrl:{type:String}//头像,默认微信头像

context:{type:String,default:"这个人很懒什么都没留下"}//个人简介

//以下几项应为流水数据应当对放一张表,在此为图简便放入基础信息表

intergal:{type:Number,default:0}//积分 用来排名和升级

level:{type:String,default:"新人"}//等级

sign:{type:Array,default:[]}//记录打卡签到的日期

month:{type:Number}//记录上次打卡签到的月份,用于每月清空签到表

个人详情(乒乓球相关):

openId:{type:String}//openId主键

years:{type:String}//球龄

phone:{type:Array}//电话

bat:{type:String}//球拍

board:{type:String}//底板

context:{type:String}//正面胶皮

intergal:{type:Number,default:0}//反面胶皮

球馆:

id:{type:String}//主键,由数据库自动生成

address:{type:String}//地址

arena:{type:String}//所在区域,例如球馆名

persons:{type:Array}//球馆的活动者,需求更改数据库中的字段为circle

city:{type:String}//球馆所在的城市

img:{type:String}//球馆图片地址

latitude:{type:Number}//经度

longitude{type:Number}//纬度

table:{type:Number}//球桌数

time:{type:String}//开放时间

对话:

message:{type:Array,default:[]}//留言内容数组,存储留言的id

my_id:{type:String}//创建者的openId

other_id:{type:String}//接收者的openId

留言信息:

id:{type:String}//主键,由数据库自动生成

msg:{type:String}//留言内容

my_id:{type:String}//创建者的openId

other_id:{type:String}//接收者的openId

time:{type:Date}//时间戳

云函数读取数据库和部分前端实现

1. 引导页

2e1fb30edbd8a30984dd122105b02506.gif

当第一次登陆进去就是如上所示,登陆进去后通过 openId 进行云函数获取数据库中个人信息,如果没有则默认进行注册流程。默认昵称为微信昵称(可在个人页更改),头像为微信头像(暂不提供更改),余下都为默认值。引导页 js

以上流程可分为以下几步。

1. 进行 onLoad (页面加载完成)生命周期,判断是否有缓存

首先调用 wx.getStorage 查询收缓存的登陆信息,如果获取成功,跳过引导页,将当前登陆状态的标识符(默认false)改为 true 。通过 setTimeout 来控制提示信息和超时检测。

2. 未缓存,进入登陆注册功能

如果获取缓存中登陆状态。先获取授权信息 getUserInfo 判断获取到的用户信息存在且为登录。

the_first 判断是否是第一次进入要进行注册流程(保险作用)。

调用云函数 getPersonhInfo ——获取用户信息,如果获取成功,结果集不为空,就将信息存储到全局状态 app.globalData 中,接着调用云函数 getpingpang_info 获取个人详细信息一样放入全局状态中,然后写入缓存信息 wx.setStorage({key:'login',data:true})以便下次不用检验,最后通过 wx.switchTab({url:'../home/home',}) 来跳转到首页。

如果上一步未获取成功,判断为第一次登入,进入注册流程 先获取用户的昵称后头像,调用云函数 pingpang_init后台进行注册,并将初始值放入全局状态中,跳转到首页。

2.签到功能

签到的存储是在个人信息的一个字段 sign 中,以数组的形式存储,当点击签到时,先判断此次签到的月份与上次签到的月份(person的month字段)是否相同,不同则将 sign 数据置为空并且将 month 字段更新为当前月份,接着存储签到的日期的的 day。

e3880a7ce55c7dbac48d9f360d857785.gif

云函数

// 云函数入口文件

const cloud = require('wx-server-sdk')

cloud.init()

const db = cloud.database();

const personInfo = db.collection("pingpang_personinfo")

// 云函数入口函数

exports.main = async(event, context) => {

let data = personInfo.where({

openId: event.openId || event.userInfo.openId

})

let info = await data.get()//先获取

let sign = info.data[0].sign || [] //放入新数组

//判断是否到了新的月份

if (info.data[0].month != new Date().getMonth()) {

sign = [];

var month = new Date().getMonth()

}

//替换数组

return await cloud.callFunction({

name: "setPersonInfo",

data: {

personInfo: {

//event.date是为了方便写管理调试用的一次性放日期数组

sign: sign.concat(event.date || [new Date().getDate()]),

month:month

}

}

})

}

3.排行榜单

榜单十分简单,有多种做法,如将同城所有人查询出来按照积分排序,并取一定数量的用户来输出排行榜,或是以城市排行榜为对象,创建一张表,表中存储的对象的属性大致如下所示 亦或是以每个城市为一张表,存储积分达到排行榜对象。

三种方法各有利弊,最终综合所有情况,我选择在大量的用户的城市,做单独一张表来存储,剩余小型城市则存储在剩余的总表中,该方法唯一的缺点就是判断处理的麻烦,当一个城市用户变多时,需要在数据库中添加一张新表,这需要手动来解决,变更后台的处理判断,可以使用策略模式来解决。

4c862d3a19a948801d3985fc1f599cd2.gif

4. 留言功能

留言功能,是这个小程序的主要功能之一,目的是为了向兴趣相同的乒乓爱好者有一个初始的交流平台。创建留言需要在圈友(同城的)中找到相应的用户,然后点击头像,弹出详情,接着点击留言按钮,会跳转到留言对话页。

在点击留言时查询之前是否存在对话兑现,存在即读取,不存在就跳转到空白页,如果发送了留言,则创建对象。这样可以解决以上的缺点。但是还是存在一个问题就是未使用 socket 无法达成实时通信。

28bf38b490e2e8a87e768e3feaa1c98d.gif

云函数

本部分云函数功能大致为:首先,结构参数,message(留言对象,包含之后的几个参数)myidotherid 和 msg(留言内容)。接着判断 my_id 是否存在,不存在就用当前用户的 openid 。然后是向留言表添加一条新数据messagedb.add最后获取对话对象并向对话中的留言数组中添加留言内容。

5. 个人模块

f1a417ba6492fb94328db2e9eeef0b03.gif

总结

良好沟通的重要性

在和朋友一起开发小程序的过程中注意到了以下的问题,及时沟通是最重要的,在我们开发的过程中,因为没有良好的沟通,导致前后端的功能开发对接不完美,部分功能分配不好,有些功能可以通过前端或后端单独解决,却因为没有沟通完善,导致双方都做了或者双方都没做的情况发生。

个人思考:程序的结构

程序的结构大致分为前端页面、后端服务器和数据库三个组成部分。在小程序这种 MVVM 结构中前端占有了很重要的一部分。

d456bdff06aaef7458f5ee80494bc473.png

前后端和数据库的比例大致为 n:1:1 的关系,所以当用户量大的程序,多数操作应当放在前端中处理,这是现在 mvvm 被称为主流的原因,后台主要统筹管理总体数据或者对重要的流水数据处理,并且需要提供大量的 api 供前端获取数据,这样能大量缓解数据库的压力。

获取源码

 更多精彩 

点击下方图片即可阅读

5ad4c5a531e9086594c97277b3480480.png 4cb3fed64da903953b1c49a12894a004.png ef499d61201919655260f4180df050cb.png

欢迎分享云开发实战经验与技术故事或加入技术交流群~

2e831fe8753c65367663df70e6042c46.png

云开发

Tencent CloudBase

      点击在看让更多人发现精彩81b0897a735a4b0ad3e3bfe110920789.png

03d667c88b08ff171399bbc7250ac412.gif  点这里获取源码
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值