微信小程序刷题逻辑实现:技术揭秘与实践分享

页面展示:

在这里插入图片描述

概述

在当今数字化学习的浪潮中,微信小程序以其便捷性和实用性,成为了众多学习者刷题备考的得力工具。今天,我们就来深入剖析一个微信小程序刷题功能的实现逻辑,从代码层面揭开其神秘面纱。

小程序界面布局

1. 自定义顶部导航

在小程序的顶部,我们设置了一个自定义导航栏,方便用户进行页面跳转。代码如下:

<!--自定义顶部导航 start-->
<view class="top-nav"><t-icon bind:click="toLastPage" class="icon" name="chevron-left" size="50rpx" />
</view>
<!--自定义顶部导航 end-->

这里使用了 t-icon 组件,当用户点击向左箭头图标时,会触发 toLastPage 方法,实现返回上一页的功能。

2. 顶部信息展示

顶部区域还展示了题库名称和当前题目的类型:

<!--顶部 start-->
<view class="top"><view class="left"><view class="title">{{questionBankName}}</view></view><view class="right">{{questionList[currentIndex].questionType}}</view>
</view>
<!--顶部 end-->

通过 questionBankName 显示题库名称,questionList[currentIndex].questionType 显示当前题目的类型。

3. 题目内容展示

这是刷题的核心区域,显示题目内容和选项:

<!--题目内容 start-->
<view class="content"><view class="title">{{questionList[currentIndex].questionContent}}</view><view class="option-list"><view class="option   {{questionList[currentIndex].isDone ? (questionList[currentIndex].selectedOptionValue === questionList[currentIndex].questionAnswer ? (index === selectedOption ? 'option-right' : '') : (index === selectedOption ? 'option-wrong' : '')) : ''}}" wx:for="{{questionList[currentIndex].questionOptionsJSON}}" wx:key="*this" bindtap="handleOptionClick" data-index="{{index}}">{{item}}</view></view>
</view>
<!--题目内容 end-->

这里使用 wx:for 指令遍历题目选项,用户点击选项时会触发 handleOptionClick 方法。同时,根据题目是否已做以及答案是否正确,动态添加不同的样式类,如 option-rightoption-wrong

4. 底部功能栏

底部功能栏提供了一些常用操作,如上下题切换、标记题目等:

<!--底部 start-->
<view class="bottom"><view class="function-list"><view class="function-item" wx:for="{{ bottomFunctionList }}" wx:for-item="item" wx:for-index="id" wx:key="id"><van-icon bindtap="{{item.tap}}" class="icon" name="{{item.icon}}" /><view class="text">{{item.text}}</view></view></view>
</view>
<!--底部 end-->

使用 wx:for 遍历 bottomFunctionList 数组,根据数组中的配置显示不同的图标和文字,点击图标会触发相应的方法。

5. 选项卡弹出框

选项卡弹出框用于快速切换题目:

<!--选项卡弹出框 start-->
<t-popup visible="{{bottomChoiceShow}}" placement="bottom"><view class="prop-choice"><view class="prop-top"><van-icon bindtap="bottom_choice_close" class="icon" name="arrow-down" /><view class="title">选题卡</view></view><view class="prop-content"><view class="button-list"><t-button  bindtap="choice_quetion" data-id="{{id}}" wx:for="{{ questionList }}" wx:for-item="item" wx:for-index="id" wx:key="id" class="button" theme="{{item.isDone?(item.selectedFlag?'primary':'danger'):'light'}}" size="small">{{id+1}}</t-button></view></view></view>
</t-popup>
<!--选项卡弹出框 end-->

点击相应按钮可打开或关闭弹出框,点击题目按钮会切换到对应的题目。

小程序逻辑实现

1. 数据初始化

onLoad 方法中,我们进行了数据的初始化操作:

onLoad(options1) {//初始化数据this.setData({bottomFunctionList: bottomFunctionList_data, //底部功能userId: wx.getStorageSync('userId'), //获取用户idquestionBankId: wx.getStorageSync('questionBankId'), //题库idquestionBankName: wx.getStorageSync('questionBankName'), //题库名称})//mock数据if (mock_flag) {const questionListWithStatus = questionList_mock.map(question => ({...question,questionOptionsJSON: JSON.parse(question.questionOptions), //序列化选项isDone: false, //是否做过selectedOptionValue: null, //选择的答案selectedFlag: '', //对错}));this.setData({questionList: questionListWithStatus,});}//网络请求if (!mock_flag) {this.http_question_findAllByQuestionBankId() //题目列表}
}

这里从本地存储中获取用户和题库信息,根据 mock_flag 的值决定是使用模拟数据还是进行网络请求获取题目列表。

2. 题目操作逻辑

  • 上下题切换:通过 bottom_prebottom_next 方法实现上下题的切换:
// 上一题
bottom_pre() {if (this.data.currentIndex > 0) {this.setData({currentIndex: this.data.currentIndex - 1});}
}
// 下一题
bottom_next() {if (this.data.currentIndex < this.data.questionList.length - 1) {this.setData({currentIndex: this.data.currentIndex + 1});}
}
  • 选项点击处理:用户点击选项时,会触发 handleOptionClick 方法,该方法会记录用户选择的选项,并调用 submitAnswer 方法提交答案:
//当前点击的选项
handleOptionClick(e) {this.setData({selectedOption:e.currentTarget.dataset.index})//设置选中的选项this.data.questionList[this.data.currentIndex].selectedOptionValue = this.data.questionList[this.data.currentIndex].questionOptionsJSON[e.currentTarget.dataset.index]//提交答案this.submitAnswer()
}
  • 答案提交与判断submitAnswer 方法会判断用户是否选择了选项,若选择了则标记题目为已做,并判断答案的对错:
//提交答案
submitAnswer() {if (this.data.selectedOption !== null) {//标记题目为已做this.markQuestionAsDone()//判断对错if (this.data.questionList[this.data.currentIndex].selectedOptionValue === this.data.questionList[this.data.currentIndex].questionAnswer) {//设置对错为对this.data.questionList[this.data.currentIndex].selectedFlag=trueif (!mock_flag) {//积分+1}} else {if (!mock_flag) {//加入错题集,增加次数this.http_userWrongQuestion_add()}}} else {wx.showToast({title: '请先选择一个选项',icon: 'none'});}
}

3. 网络请求

  • 获取题目列表:通过 http_question_findAllByQuestionBankId 方法根据题库 ID 获取所有题目:
//根据题库id查询所有题目
http_question_findAllByQuestionBankId() {getRequest(baseUrl + "/front/question/findAllByQuestionBankId", {questionBankId: this.data.questionBankId}).then(res => {if (res.code == 200) {const questionList = res.data.map(question => ({...question,questionOptionsJSON: JSON.parse(question.questionOptions), //序列化选项isDone: false, //是否做过selectedOptionValue: null, //选择的答案selectedFlag: '', //对错}));this.setData({questionList: questionList,})}})
}
  • 加入错题集:通过 http_userWrongQuestion_add 方法将错题加入错题集:
//加入错题集,增加次数
http_userWrongQuestion_add() {postRequest(baseUrl + "/front/userWrongQuestion/add", {userId: this.data.userId,questionId: this.data.questionList[this.data.currentIndex].questionId}).then(res => {if (res.code == 200) {}})
}

总结

通过以上代码和逻辑的实现,我们完成了一个简单的微信小程序刷题功能。从界面布局到数据初始化,再到题目操作和网络请求,每个环节都紧密配合,为用户提供了一个流畅的刷题体验。希望这篇文章能帮助你更好地理解微信小程序刷题逻辑的实现,如果你有相关需求,不妨参考这些代码进行开发。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/33820.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android UI 组件系列(二):Button 进阶用法

引言 在上一篇博客中&#xff0c;我们介绍了 Button 的基本用法和常见属性&#xff0c;掌握了 Button 的基础知识。然而&#xff0c;在实际开发中&#xff0c;Button 远不止于简单的点击功能&#xff0c;它还可以支持不同的变体、丰富的自定义样式&#xff0c;以及更灵活的状态…

【云馨AI-大模型】RAGFlow功能预览:Dify接入外部知识库RAGFlow指南

介绍 Dify介绍 开源的 LLM 应用开发平台。提供从 Agent 构建到 AI workflow 编排、RAG 检索、模型管理等能力&#xff0c;轻松构建和运营生成式 AI 原生应用。比 LangChain 更易用。官网&#xff1a;https://dify.ai/zh RAGFlow介绍 RAGFlow 是一款基于深度文档理解构建的…

Redis超高并发分key实现

Redis扛并发的能力是非常强的&#xff0c;所以高并发场景下经常会使用Redis&#xff0c;但是Redis单分片的写入瓶颈在2w左右&#xff0c;读瓶颈在10w左右&#xff0c;如果在超高并发下即使是集群部署Redis&#xff0c;单分片的Redis也是有可能扛不住的&#xff0c;如下图所示&a…

缓存使用的具体场景有哪些?缓存的一致性问题如何解决?缓存使用常见问题有哪些?

缓存使用场景、一致性及常见问题解析 一、缓存的核心使用场景 1. 高频读、低频写场景 典型场景&#xff1a;商品详情页、新闻资讯、用户基本信息。特点&#xff1a;数据更新频率低&#xff0c;但访问量极高。策略&#xff1a; Cache-Aside&#xff08;旁路缓存&#xff09;&a…

HTML5(Web前端开发笔记第一期)

p.s.这是萌新自己自学总结的笔记&#xff0c;如果想学习得更透彻的话还是请去看大佬的讲解 目录 三件套标签标题标签段落标签文本格式化标签图像标签超链接标签锚点链接默认链接地址 音频标签视频标签 HTML基本骨架综合案例->个人简介列表表格表单input标签单选框radio上传…

ubuntu22.04 关于挂在设备为nfts文件格式无法创建软连接的问题

最近遇到情况&#xff0c;解压工程报错&#xff0c;无法创建软连接 但是盘内还有130G空间&#xff0c;明显不是空间问题&#xff0c;查找之后发现是移动硬盘的文件格式是NTFS&#xff0c;在ubuntu上不好兼容&#xff0c;于是报错。 开贴记录解决方案。 1.确定文件格式 使用命…

深度解读DeepSeek部署使用安全(48页PPT)(文末有下载方式)

深度解读DeepSeek&#xff1a;部署、使用与安全 详细资料请看本解读文章的最后内容。 引言 DeepSeek作为一款先进的人工智能模型&#xff0c;其部署、使用与安全性是用户最为关注的三大核心问题。本文将从本地化部署、使用方法与技巧、以及安全性三个方面&#xff0c;对Deep…

RK3568 Android13 源码编译

提示&#xff1a;RK3568 Android13 源码编译 脚本&#xff0c;源码编译管理方式优化 文章目录 获取源码设置屏幕配置确认屏幕修改源码的设备树 修改线程数整体编译Android固件配置JDK java 环境 source javaenv.sh使能编译 build/envsetup.sh lunch topeet_rk3568-userdebug整体…

【CentOS】搭建Radius服务器

目录 背景简介&#xff1a;Radius是什么&#xff1f;Radius服务器验证原理搭建Radius服务器环境信息yum在线安装配置FreeRADIUS相关文件clients.conf文件users文件重启服务 验证 参考链接 背景 在项目中需要用到Radius服务器作为数据库代理用户的外部验证服务器&#xff0c;做…

ToB公司找客户专用|大数据获客系统

对于ToB公司而言&#xff0c;找到并吸引合适的潜在客户并非易事。传统的获客手段如参加行业展会、电话推销以及直接拜访等&#xff0c;虽然在过去取得了一定成效&#xff0c;但如今却暴露出诸多问题。首先&#xff0c;这些方法往往成本高昂&#xff0c;无论是时间还是金钱上的投…

Linux 文件权限类

目录 文件属性 从左到右的10个字符表示 rwx作用文件和目录的不同解释 图标&#xff1a; 案例实操 chmod 改变权限 基本语法 经验技巧 案例实操 拓展&#xff1a;可以通过一个命令查看用户列表 chown改变所有者 基本语法 选项说明 案例实操 chgrp 改变所属组 基…

DeepSeek技术解析:MoE架构实现与代码实战

以下是一篇结合DeepSeek技术解析与代码示例的技术文章&#xff0c;重点展示其核心算法实现与落地应用&#xff1a; DeepSeek技术解析&#xff1a;MoE架构实现与代码实战 作为中国AI领域的创新代表&#xff0c;DeepSeek在混合专家模型&#xff08;Mixture of Experts, MoE&…

vue3:八、登录界面实现-页面初始搭建、基础实现

一、初始工作 1、创建登录文件 在src/views中创建文件LoginView.vue文件 2、创建路由 在router/index.js中增加登录的信息 代码 import { createRouter, createWebHistory } from vue-router import HomeView from ../views/HomeView.vue const router createRouter({hist…

dify+mysql的诗词助手

目录 数据库表结构&#xff1a; 数据库查询的http服务搭建&#xff1a; 流程引擎搭建&#xff1a; 开始&#xff0c; HTTP查询数据库&#xff0c; LLM数据分析&#xff0c; 直接回复&#xff0c; 效果测试&#xff1a; 下载链接&#xff1a; 数据库表结构&#xff1a;…

jenkins 配置邮件问题整理

版本&#xff1a;Jenkins 2.492.1 插件&#xff1a; A.jenkins自带的&#xff0c; B.安装功能强大的插件 配置流程&#xff1a; 1. jenkins->系统配置->Jenkins Location 此处的”系统管理员邮件地址“&#xff0c;是配置之后发件人的email。 2.配置系统自带的邮件A…

谷歌Chrome或微软Edge浏览器修改网页任意内容

在谷歌或微软浏览器按F12&#xff0c;打开开发者工具&#xff0c;切换到console选项卡&#xff1a; 在下面的输入行输入下面的命令回车&#xff1a; document.body.contentEditable"true"效果如下&#xff1a;

blender使用初体验(甜甜圈教程)

使用blender 建模了甜甜圈&#xff0c;时间空闲了&#xff0c;但愿能创建点好玩的吸引人的东西

Adobe Firefly 技术浅析(三):GANs 的改进

生成式对抗网络(GANs)在图像生成领域取得了显著的进展,但原始的 GANs 在训练稳定性、生成质量以及多样性方面存在一些挑战。Adobe Firefly 在其图像生成技术中采用了多种改进的 GANs 方法,以提高生成图像的质量和多样性。 1. 条件生成式对抗网络(cGANs) 1.1 基本原理 …

go GRPC学习笔记

本博文源于笔者正在学习的gprc&#xff0c;相关配套书籍素材来源是《Go编程进阶实战》&#xff0c;博文内容主要包含了RPC模式讲解&#xff0c;RPC通过htttp访问、拦截器、提高服务端与客户端容错的内容配置 在此之前需要下载protoc&#xff0c;这里不做下载过程 1、RPC模式 …

CentOS 系统安装 docker 以及常用插件

博主用的的是WindTerm软件链接的服务器&#xff0c;因为好用 1.链接上服务器登入后&#xff0c;在/root/目录下 2.执行以下命令安装docker sudo yum install -y yum-utilssudo yum-config-manager \--add-repo \https://download.docker.com/linux/centos/docker-ce.reposudo…