基于微信小程序的竞赛答题小程序开发笔记(一)

server/2024/9/25 2:08:50/

开发背景调研

中小学学科答题小程序,适合各中小学校方,老师或者家长。通过互动和参与式学习,小程序能够通过游戏化元素提升学习的积极性和参与度,从而提升学习效率,促进学生自主学习

功能规划

  • 分类题库:按照学科(数学、语文、英语等)和知识点进行分类,方便用户选择。
  • 随机抽题:用户可以选择特定学科,系统随机生成题目。
  • 答题竞赛: 模拟真实竞赛或考试环境,可以设置每场的时间。
  • 解析详解:每道题目提供详细的解答和解析,帮助用户理解解题思路。
  • 排行榜:展示用户的积分排名,促进比赛竞争。
  • 后台-题库管理:支持直接录入,或者通过Excel导入题库(每次5000条)
  • 后台-答题参数设置:可以设置竞赛开始状态,每次答题数目,每次答题时长限制,每天可参与答题竞赛次数等参数

概要设计

在这里插入图片描述

数据库设计

AnswerModel.DB_STRUCTURE = {_pid: 'string|true',ANSWER_ID: 'string|true',ANSWER_USER_ID: 'string|true',ANSWER_TYPE: 'int|true|default=0|comment=类型 0=测试,1=正式',ANSWER_CATE_ID: 'string|true|default=0|comment=分类',ANSWER_CATE_NAME: 'string|false|comment=分类冗余', ANSWER_DAY: 'string|true',ANSWER_START: 'int|true|default=0',ANSWER_END: 'int|true|default=0',ANSWER_DURATION: 'string|false',ANSWER_PER: 'int|true|default=0',ANSWER_SCORE: 'int|true|default=0',ANSWER_CNT: 'int|true|default=0',ANSWER_SUCC_CNT: 'int|true|default=0',ANSWER_LIST: 'array|true|default=[]',ANSWER_ADD_TIME: 'int|true',ANSWER_EDIT_TIME: 'int|true',ANSWER_ADD_IP: 'string|false',ANSWER_EDIT_IP: 'string|false',
};QuestionModel.DB_STRUCTURE = {_pid: 'string|true',QUESTION_ID: 'string|true',QUESTION_TITLE: 'string|true|comment=题目',QUESTION_STATUS: 'int|true|default=1|comment=状态 0=未启用,1=使用中',QUESTION_CATE_ID: 'string|true|default=0|comment=分类',QUESTION_CATE_NAME: 'string|false|comment=分类冗余', QUESTION_ORDER: 'int|true|default=9999',QUESTION_FORMS: 'array|true|default=[]',QUESTION_OBJ: 'object|true|default={}', QUESTION_ADD_TIME: 'int|true',QUESTION_EDIT_TIME: 'int|true',QUESTION_ADD_IP: 'string|false',QUESTION_EDIT_IP: 'string|false',
};

难点与实现

class QuestionService extends BaseProjectService {async getAnswerDetail(id) {return await AnswerModel.getOne(id);}async delAnswer(userId, id) {return await AnswerModel.del({ ANSWER_USER_ID: userId, _id: id });}// 得分统计async statAnswer(userId) { let where = {ANSWER_USER_ID: userId,ANSWER_TYPE: 1}let cnt = await AnswerModel.count(where);let score = await AnswerModel.sum(where, 'ANSWER_SCORE');let data = {USER_ANSWER_CNT: cnt,USER_ANSWER_SCORE: score}await UserModel.edit({ USER_MINI_OPENID: userId }, data);}// 每日可答题次数校验async isAnswerTimes(userId, cateId) {let dayCnt = 100;let setup = await setupUtil.get('answer');if (setup) {setup = dataUtil.dbForms2Obj(setup);dayCnt = Number(setup.daycnt);if (setup.open != true) {return '竞赛尚未开始!';}}let where = {ANSWER_CATE_ID: String(cateId),ANSWER_USER_ID: userId,ANSWER_TYPE: 1,ANSWER_DAY: timeUtil.time('Y-M-D')}let cnt = await AnswerModel.count(where);if (cnt >= dayCnt) {return '每日竞赛答题最多' + dayCnt + '次,请明日再来!';}return '';}async saveMyAnswer(userId,) { }// 随机N条记录,生成本次题库async genQuestion(userId, type, cateId) { return { questionList: [], maxTime:10 };}async getMyAnswerList(userId, {search, // 搜索条件sortType, // 搜索菜单sortVal, // 搜索菜单orderBy, // 排序 page,size,isTotal = true,oldTotal}) {orderBy = orderBy || {'ANSWER_ADD_TIME': 'desc'};let fields = 'ANSWER_SCORE,ANSWER_CATE_NAME,ANSWER_TYPE,ANSWER_ADD_TIME,ANSWER_CNT,ANSWER_PER,ANSWER_SUCC_CNT,ANSWER_DURATION,ANSWER_START,ANSWER_END';let where = {};where.and = {ANSWER_USER_ID: userId,_pid: this.getProjectId() //复杂的查询在此处标注PID};if (util.isDefined(search) && search) {where.or = [];} else if (sortType && util.isDefined(sortVal)) {// 搜索菜单switch (sortType) {case 'type': {where.and.ANSWER_TYPE = Number(sortVal);break;}case 'cateId': {where.and.ANSWER_CATE_ID = String(sortVal);break;}case 'sort': {orderBy = this.fmtOrderBySort(sortVal, 'ANSWER_ADD_TIME');break;}}}return await AnswerModel.getList(where, fields, orderBy, page, size, isTotal, oldTotal);}async getScoreRankList({search, // 搜索条件sortType, // 搜索菜单sortVal, // 搜索菜单orderBy, // 排序 page,size,isTotal = true,oldTotal}) {orderBy = {'USER_ANSWER_SCORE': 'desc'};let fields = 'USER_NAME,USER_ANSWER_SCORE';let where = {};where.and = {_pid: this.getProjectId() //复杂的查询在此处标注PID};if (util.isDefined(search) && search) {where.or = [];} else if (sortType && util.isDefined(sortVal)) {// 搜索菜单switch (sortType) {case 'sort': {orderBy = this.fmtOrderBySort(sortVal, 'ANSWER_ADD_TIME');break;}}}return await UserModel.getList(where, fields, orderBy, page, size, isTotal, oldTotal);}}

UI设计

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

后台管理系统设计

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

git代码

git代码网址


http://www.ppmy.cn/server/121597.html

相关文章

单片机学到什么程度才可以去工作?

说实话,10几年前,我自学单片机转行的时候,也是一头雾水,也是一边苦苦挣扎,一边迷茫的状态。 硬件、软件、编程...样样都需要学,连从哪儿开始都不知道,每次看到那些密密麻麻的电路图和代码&#…

菱形继承的类对父类的初始化、组合、多态、多态的原理等的介绍

文章目录 前言一、菱形继承的类对父类的初始化二、组合三、 多态1. 构成多态2. 虚函数3. 虚函数的重写4. 虚函数重写的两个例外1. 协变2. 析构函数的重写 5. C11 final 和 override1. final2. override 6. 设计不想被继承的类7. 重载、覆盖(重写)、 隐藏…

计算机复习9.23

关系:一张扁平的二维表,关系应该具备每个分量都不可分的数据(1NF) 候选码:某个属性组可以唯一标识一个元组,而其子集不能,候选码中的属性叫主属性 主码:从候选码中选取一个称为主码 全码:所有…

C#设计模式之访问者模式

总目录 前言 在软件构建过程中,由于需求的改变,某些类层次结构中常常需要增加新的行为,如果直接在基类中做这样的更改,将会给子类带来很繁重的变更负担,甚至破坏原有设计。如何在不更改类层次结构的前提下&#xff0c…

数据脱敏-快速使用

1.数据脱敏定义 数据脱敏百度百科中是这样定义的: 数据脱敏,指对某些敏感信息通过脱敏规则进行数据的变形,实现敏感隐私数据的可靠保护。 因为在真正的生产环境中,很多数据是不能直接返回,但是我们工作的时候可能经常性的需要返回一些用户信…

LabVIEW提高开发效率技巧----VI服务器和动态调用

VI服务器(VI Server)和动态调用是LabVIEW中的两个重要功能,可以有效提升程序的灵活性、模块化和可扩展性。通过这两者的结合,开发者可以在运行时动态加载和调用VI(虚拟仪器),实现更为复杂的应用…

【速成Redis】04 Redis 概念扫盲:事务、持久化、主从复制、哨兵模式

前言: 前三篇如下: 【速成Redis】01 Redis简介及windows上如何安装redis-CSDN博客 【速成Redis】02 Redis 五大基本数据类型常用命令-CSDN博客 【速成Redis】03 Redis 五大高级数据结构介绍及其常用命令 | 消息队列、地理空间、HyperLogLog、BitMap、…

项目实战 (15)--- 代码区块重构及相关技术落地

目录 背景 思想与技术方案 概述 路由及socket 封装模式 技术描述 方案 1 方案2 各类连接资源管理封装 vector db connection cache management web socket 管理 service 封装 代码实现 service 层 router层 resource层 小结 背景 到目前为止,视频搜索系统功…