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

开发背景调研

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

功能规划

  • 分类题库:按照学科(数学、语文、英语等)和知识点进行分类,方便用户选择。
  • 随机抽题:用户可以选择特定学科,系统随机生成题目。
  • 答题竞赛: 模拟真实竞赛或考试环境,可以设置每场的时间。
  • 解析详解:每道题目提供详细的解答和解析,帮助用户理解解题思路。
  • 排行榜:展示用户的积分排名,促进比赛竞争。
  • 后台-题库管理:支持直接录入,或者通过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.xdnf.cn/news/1544018.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

①大缓存ModbusRTU485数据集中采集器寄存器线圈重映射从站并发采集Modbus 串口RS485 转 RS485

大缓存ModbusRTU485数据集中采集器寄存器线圈重映射从站并发采集https://item.taobao.com/item.htm?ftt&id811821574300 产品型号: 一分一路 MS-A1-C011 一分2路 MS-A1-C021 一分4路 MS-A1-C041 一分7路 MS-A1-C071 一般技术规格 1.串口 MS-A1…

扩大产品库存怎么破?手把手教你,全开源哦!

要在产品上扩大库存?!这太常见了,短视频时代,有大量东西要储存:视频、音频、文件等。 提到外扩,就不得不提到编写各种驱动,还有Flash替换。。。又是落发时刻啊! 来吧!也…

【鸿蒙HarmonyOS NEXT】用户首选项Preference存储数据

【鸿蒙HarmonyOS NEXT】数据存储之用户首选项Preference 一、环境说明二、Preference运作机制三、示例代码加以说明四、小结 一、环境说明 DevEco Studio 版本: API版本:以12为主 二、Preference运作机制 应用场景: 用户首选项为应用提…

从零开始之AI面试小程序

从零开始之AI面试小程序 文章目录 从零开始之AI面试小程序前言一、工具列表二、部署流程1. VMWare安装2. Centos安装3. Centos环境配置3.1. 更改子网IP3.2. 配置静态IP地址 4. Docker和Docker Compose安装5. Docker镜像加速源配置6. 部署中间件6.1. MySQL部署6.2. Redis部署 7.…

专属文生图助手——SD3+ComfyUI文生图部署步骤

SD3ComfyUI文生图部署步骤 我们使用DAMODEL来实现文生图的部署。 根据提供的操作步骤与代码段落,本文旨在介绍如何下载并部署 Stable Diffusion 3 模型,并通过 ComfyUI 架构实现基于 Web 界面的图像生成应用。本文将剖析各个步骤,并详细解释…

AOT源码解析4.1-model主体解析

1 输入数据 VOS的数据集处理操作可见数据集操作,这里是进行数据集提取完毕后的操作。 图2:如图所示,使用datasets提取出数据之后,在模型训练阶段对数据做图中操作。即:将batch_size大小的ref_imgs、prev_imgs&#x…

IDEA 关闭自动补全功能(最新版本)

文章目录 一、前言二、关闭自动补全三、最终效果 一、前言 在最新的 IDEA 中发布了自动补全功能,当你输入代码时,IDEA 会自动显示你可能想输入的代码,减少手动输入的工作量,它会根据上下文提供正确的选项,提高代码的准…

基于C#+SQL Server(CS界面)学生选课及成绩查询管理系统

学生选课及成绩查询管理系统的设计与开发 1、项目背景 学生选课及成绩查询系统是一个学校不可缺少的部分,传统的人工管理档案的方式存在着很多的缺点,如:效率低、保密性差等,所以开发一套综合教务系统管理软件很有必要&#xff…

对onlyoffice进行定制化开发

基于onlyoffice8.0源码,进行二次开发,可实现包括但不限于以下的功能 1、内容控件的插入 2、内容空间的批量替换 3、插入文本 4、插入图片 5、添加,去除水印 6、修改同时在线人数限制 7、内容域的删除 8、页面UI的定制化 9、新增插件开发 10、…

华为全联接大会HUAWEI Connect 2024印象(四):上海大学的脑机接口演示

在HC上,除了华为自己的技术展示,也包括一些合作伙伴的展示。一个印象比较深的是上海大学的韶脑传感脑机接口。 上海大学现场准备了一个可以被脑机接口控制的电动轮椅供参观者现场体验。体验者需要先戴上一个头套,上面有各种传感器。据上海大…

STL队列

一、队列的介绍 队列是一种操作(或者说运算)受到限制的特殊线性表。其插入操作限定在表的一端进行,称为入队;其删除操作则限定在表的另一端进行,称为出队。插入一端称为队尾(rear);删…

鸿蒙 OS 开发单词打卡 APP 项目实战 20240922 笔记和源码分享

配套有完整的录播课, 需要的私信. 零基础入门级别, 有点前端基础都能学会. 效果截图: 代码截图: 页面完整代码: import { AnswerStatus } from ../enums/AnswerStatus import { PracticeStatus } from ../enums/PracticeStatus import { getRandomQuestions, Question …

❤Node11-登录人token信息接口

❤Node11-登录人token信息接口​ 上一章我们已经从登录部分拿到了用户的登录jwt返回的token信息,接下来我们就通过token来换取用户信息 这里我们可以将其理解为一种加密以及解密的思想来思考这个jwt和token的关系,token就是一个加密的字符串&#xff0c…

python 斑马打印模板

打印代码逻辑如下; 包括样式、表格 import win32printdef print_zpl_from_usb_printer(printer_name, zpl_content):# 打开打印机hPrinter win32print.OpenPrinter(printer_name)if hPrinter is None:print(f"Failed to open printer: {printer_name}")…

Spring Cloud Alibaba-(6)Spring Cloud Gateway【网关】

Spring Cloud Alibaba-(1)搭建项目环境 Spring Cloud Alibaba-(2)Nacos【服务注册与发现、配置管理】 Spring Cloud Alibaba-(3)OpenFeign【服务调用】 Spring Cloud Alibaba-(4)Sen…

商标管理软件如何助力企业实现商标数字化管理?

商标作为企业的无形资产和品牌形象的核心,其管理方式的数字化升级已成为企业不可回避的课题。启服云商标管理软件凭借其强大的功能和灵活的解决方案,正帮助企业商标管理向数字化、智能化方向迈进,为企业品牌保护和市场拓展提供了强有力的支撑…

apache paimon简介(官翻)

介绍 如下架构所示: 读/写操作: Paimon 支持多样化的数据读写方式,并支持 OLAP 查询。 读取: 支持从历史快照(批处理模式)中消费数据,从最新偏移量(流处理模式)中读取数据,或以混合方式读取增量快照。写入: 支持从数据库变更日志(CDC)进行流式同步,从离线数据中…

QT菜单栏设计(二级菜单栏)

目的:创建一级菜单栏,添加对应选项,并向一级菜单栏中添加二级菜单栏选项。 #include "mainwindow.h" #include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindo…

科研绘图系列:R语言堆积图(stacked barplot)

文章目录 介绍加载R包导入数据数据预处理画图导出数据系统信息介绍 微生物堆积图是一种数据可视化工具,通常用于展示微生物群落中不同物种的相对丰度。这种图表通过将每个样本中的微生物按照其分类学等级(如门、属等)进行分类,并以不同颜色的块状图表示,每个块的大小代表…

基于SSM+Android的签到系统

目录 前言 功能设计 系统实现 获取源码 博主主页:百成Java 往期系列:Spring Boot、SSM、JavaWeb、python、小程序 前言 随着Internet的发展,人们的日常生活已经离不开网络。未来人们的生活与工作将变得越来越数字化,网络化和…