背景和需要剖析
随着社会的在新时代下的飞跃发展,尤其是奥运会和冬奥会的胜利举办,全民健身的热潮衰亡,在平时缓和的工作,学习之余,器重身材,器重身材,器重 衰弱的需要越来越强烈,那么设计一款针对宽广静止爱好者的小程序,使静止爱好者和体育场馆之间能无效的连接,正当的布局工夫和场地,节俭单方来往老本的 需要痛点是成立的。
好的场馆预约零碎包含场馆动静,静止常识,羽毛球场地预约,足球场地预约,篮球场地预约,健身房预约,乒乓球场地预约,游泳场地预约,网球场地预约等,能够依照业者的理论状况进行取舍或者削减场馆类型,既实用于大型综合性文体核心,也适宜单一性静止场馆(如羽毛球馆,健身房,乒乓球馆等)。
该零碎基于MVC架构,采纳基于微信小程序平台开发,校园用户操作轻松快捷:无需下载安装APP。
性能合成
数据字典
须要克服的技术难点
本预约小程序采纳腾讯云开发技术,云开发提供了一个 JSON 数据库,顾名思义,数据库中的每条记录都是一个 JSON 格局的对象。
一个数据库能够有多个汇合(相当于关系型数据中的表),汇合可看做一个 JSON 数组,数组中的每个对象就是一条记录,记录的格局是 JSON 对象。
其次要个性:
安全性:对于数据库而言,数据安全是第一位的;
易用性:与小程序的特色相似,“开箱即用,用完即走”,简略上手,免运维;
低成本:按量免费,精细化老本管制;
高性能:Nosql,反对高并发读写;
灵活性:无固定的数据库表模式(no-schema),反对弹性伸缩;
在云开发控制台有个高级操作,这里能够执行开发者输出的脚本,比方清空集合,依据某个条件删除汇合内局部数据,查问汇合等等
1. 清空操作db.collection('t_user') .where({ _id: _.exists(true) }) .remove()2. 删除操作db.collection('t_user') .where({ USER_ENROLL: 1990 }) .remove()3. 查问操作db.collection('t_user') .where({ USER_NAME: '覃建平' }) .get()db.collection('t_user') .where({ USER_INVITE_ID: '' }) .field({ USER_INVITE_ID:true }) .skip(0) .limit(10) .get()4. 去掉某个字段db.collection('t_user').where({_id:_.neq(1)}) .update({ data: { USER_VIP_MONEY:_.remove(), USER_VIP_RETURN_MONEY:_.remove(), USER_VIP_LEAVE_MONEY:_.remove(), } })5 更新或者新增某个字段db.collection('t_user').where({_id:_.neq(1)}) .update({ data: { USER_VIP_MONEY: 1111, } }6 简单的多条件查问 /** 获得用户分页列表 */ async getUserList(userId, { search, // 搜寻条件 sortType, // 搜寻菜单 sortVal, // 搜寻菜单 orderBy, // 排序 whereEx, //附加查问条件 page, size, oldTotal = 0 }) { orderBy = orderBy || { USER_LOGIN_TIME: 'desc' }; let fields = FILEDS_USER_BASE; let where = {}; where.and = { USER_OPEN_SET: ['>', 0], USER_STATUS: [ ['>=', UserModel.STATUS.COMM], ['<=', UserModel.STATUS.VIP] ], _pid: this.getProjectId() //简单的查问在此处标注PID }; if (util.isDefined(search) && search) { where.or = [{ USER_NAME: ['like', search] }, { USER_ITEM: ['like', search] }, { USER_COMPANY: ['like', search] }, { USER_TRADE: ['like', search] }, { USER_TRADE_EX: ['like', search] }, ]; } else if (sortType && util.isDefined(sortVal)) { let user = {}; // 搜寻菜单 switch (sortType) { case 'companyDef': // 单位性质 where.and.USER_COMPANY_DEF = sortVal; break; case 'trade': // 行业 where.and.USER_TRADE = ['like', sortVal] break; case 'workStatus': //工作状态 where.and.USER_WORK_STATUS = sortVal; break; case 'same_enroll': //同级 user = await UserModel.getOne({ USER_MINI_OPENID: userId }); if (!user) break; where.and.USER_ENROLL = user.USER_ENROLL; break; case 'same_item': //同班 user = await UserModel.getOne({ USER_MINI_OPENID: userId }); if (!user) break; where.and.USER_ITEM = user.USER_ITEM; break; case 'same_trade': //同行 user = await UserModel.getOne({ USER_MINI_OPENID: userId }); if (!user) break; let trade = user.USER_TRADE; if (trade.includes('-')) trade = trade.split('-')[0]; where.and.USER_TRADE = ['like', trade]; break; case 'same_city': //同城 user = await UserModel.getOne({ USER_MINI_OPENID: userId }); if (!user) break; where.and.USER_CITY = user.USER_CITY; break; case 'enroll': //按退学年份分类 switch (sortVal) { case 1940: where.and.USER_ENROLL = ['<', 1950]; break; case 1950: where.and.USER_ENROLL = [ ['>=', 1950], ['<=', 1959] ]; break; case 1960: where.and.USER_ENROLL = [ ['>=', 1960], ['<=', 1969] ]; break; case 1970: where.and.USER_ENROLL = [ ['>=', 1970], ['<=', 1979] ]; break; case 1980: where.and.USER_ENROLL = [ ['>=', 1980], ['<=', 1989] ]; break; case 1990: where.and.USER_ENROLL = [ ['>=', 1990], ['<=', 1999] ]; break; case 2000: where.and.USER_ENROLL = [ ['>=', 2000], ['<=', 2009] ]; break; case 2010: where.and.USER_ENROLL = ['>=', 2010]; break; } break; case 'sort': // 排序 if (sortVal == 'new') { //最新 orderBy = { 'USER_LOGIN_TIME': 'desc' }; } if (sortVal == 'last') { //最近 orderBy = { 'USER_LOGIN_TIME': 'desc', 'USER_ADD_TIME': 'desc' }; } if (sortVal == 'enroll') { //退学 orderBy = { 'USER_ENROLL': 'asc', 'USER_LOGIN_TIME': 'desc' }; } if (sortVal == 'info') { orderBy = { 'USER_INFO_CNT': 'desc', 'USER_LOGIN_TIME': 'desc' }; } if (sortVal == 'album') { orderBy = { 'USER_ALBUM_CNT': 'desc', 'USER_LOGIN_TIME': 'desc' }; } if (sortVal == 'meet') { orderBy = { 'USER_MEET_CNT': 'desc', 'USER_LOGIN_TIME': 'desc' }; } if (sortVal == 'login_cnt') { orderBy = { 'USER_LOGIN_CNT': 'desc', 'USER_LOGIN_TIME': 'desc' }; } break; } } let result = await UserModel.getList(where, fields, orderBy, page, size, true, oldTotal, false); return result; }