基于微信小程序的运动场馆预约小程序开发笔记

发布于 4 年前作者 kangxiulan2569 次浏览最后编辑 4 年前来自 share

背景和需求分析

 

  随着社会的在新时代下的飞跃发展,尤其是奥运会和冬奥会的成功举办,全民健身的热潮兴起,在平时紧张的工作,学习之余,重视身体,重视身材,重视

健康的需求越来越强烈,那么设计一款针对广大运动爱好者的小程序,使运动爱好者和体育场馆之间能有效的衔接,合理的规划时间和场地,节省双方来往成本的

需求痛点是成立的。 

  好的场馆预约系统包括场馆动态,运动常识,羽毛球场地预约,足球场地预约,篮球场地预约,健身房预约,乒乓球场地预约,游泳场地预约,网球场地预约等,可以按照业者的实际情况进行取舍或者增添场馆类型,既适用于大型综合性文体中心,也适合单一性运动场馆(如羽毛球馆,健身房,乒乓球馆等)。

  该系统基于MVC架构,采用基于微信小程序平台开发,校园用户操作轻松快捷:无需下载安装APP。

 

功能分解

 WXOPEN Club 内容图片

 

 

 

 

数据字典

 WXOPEN Club 内容图片

 界面设计  

 

WXOPEN Club 内容图片WXOPEN Club 内容图片WXOPEN Club 内容图片WXOPEN Club 内容图片

 

 WXOPEN Club 内容图片WXOPEN Club 内容图片WXOPEN Club 内容图片

后台界面设计 

 

WXOPEN Club 内容图片WXOPEN Club 内容图片WXOPEN Club 内容图片WXOPEN Club 内容图片

WXOPEN Club 内容图片WXOPEN Club 内容图片

需要克服的技术难点

本预约小程序采用腾讯云开发技术,云开发提供了一个 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;
    }
0 回复
暂无回复