• 微信小程序在线考试项目开发-注册登录功能


    小程序在线考试项目介绍:

    技术选型:轻量、可靠的小程序 UI 组件库Vant2:Vant Weapp

    项目功能:

    • 用户授权认证
    • 用户身份信息登记登录,身份信息查看,身份登记之后才能进行在线考试
    • 管理员模拟考试列表:
    1. 考试状态数据列表检索(待完成、评分中、已完成)
    • 考试过程:
    1. 选择要参加的考试类型
    2. 对多种类型的题目进行包括对单选题、多选题、判断题、填空题、问答题依次作答
    • 对于已完成的评分的考题进行查看:答题卡记录
    • 微信服务通知:根据当前用户绑定的微信账号身份(手机号、岗位、所属公司),所在公司有新发布的考题时,推送提醒,点击进入小程序答题页面

    实现效果: 

     

     

     

     

    小程序在线考试

    目录

    实现效果: 

    小程序在线考试

    1.安装Vant Weapp

    通过npm 安装

     2.个人中心页面实现


    1.安装Vant Weapp

    • 通过npm 安装

    npm i @vant/weapp -S --production
    • 通过 yarn 安装 
    yarn add @vant/weapp --production
    • 安装 0.x 版本
    npm i vant-weapp -S --production 

    使用vant组件:

    1. {
    2. "usingComponents": {
    3. "van-field": "@vant/weapp/field/index",
    4. "van-icon": "@vant/weapp/icon/index",
    5. "van-popup": "@vant/weapp/popup/index",
    6. "van-button": "@vant/weapp/button/index",
    7. "van-toast": "@vant/weapp/toast/index"
    8. },
    9. "navigationBarTitleText":"考试系统"
    10. }


     2.个人中心页面实现

    myCenter.wxml

    1. <view class="mycenter">
    2. <view class="textCenter">{{isDisabled==false?'您当前账号的身份信息':'请先登记您的身份信息'}}view>
    3. <view class="centerbox">
    4. <form bindsubmit="saveData">
    5. <view class="userName">
    6. <text class="nameText">员工姓名text>
    7. <van-field class="fieldName" value="{{ name }}" placeholder="请输入您的真实姓名" border="{{ false }}"
    8. bind:blur ="userNameInput" readonly="{{isDisabled==false?true:false}}"/>
    9. view>
    10. <view class="userName">
    11. <text class="nameText" style="padding-left:36rpx">手机号text>
    12. <van-field class="fieldName" value="{{ phone }}" placeholder="请输入您的手机号" border="{{ false }}"
    13. bind:blur ="userPhoneInput" readonly="{{isDisabled==false?true:false}}"/>
    14. view>
    15. <view class="userName">
    16. <text class="nameText">所属公司text>
    17. <van-field wx:if="{{isDisabled==false}}" class="fieldName" value="{{ company }}" placeholder="请选择您所属的公司"
    18. readonly border="{{ false }}">
    19. van-field>
    20. <van-field wx:else class="fieldName" value="{{ company }}" placeholder="请选择您所属的公司"
    21. readonly border="{{ false }}" right-icon="arrow-down"
    22. bind:click-input="handleDown">
    23. van-field>
    24. view>
    25. <van-button class="loginBtn" type="info" round block formType="submit" wx:if="{{isDisabled}}">确 定van-button>
    26. form>
    27. view>
    28. <van-popup show="{{ showPopup }}" custom-style="height: 40%" round position="bottom" closeable bind:close="closePopup">
    29. <view class="popuoContent">
    30. <view class="popup-li" wx:for="{{companyList}}" wx:key="id" data-item="{{item}}" bindtap="handleCompany">{{item.name}}view>
    31. view>
    32. van-popup>
    33. <van-toast id="van-toast" />
    34. view>

    myCenter.js重要代码

    引入Toast组件:

    • 页面一定再次引入引入,不引入 会不生效
    • myCenter.wxml页面记得加上
    import Toast from '@vant/weapp/toast/toast';

    注意事项: 

    • 点击 确定按钮调用saveData()方法;
    • 选择公司列表利用van-popup弹窗实现;
    • 用户授权后检索是否登记过信息,如果登记过则跳转到考试列表页进行答题考试,显示tabbar;如果没有登记过则不显示tabbar,需要就进行用户信息登记,登记之后跳转考试列表页进行答题考试;
    • 当切换tabbar时候,进入该页面获取用户信息进行信息回显;确定按钮不显示,用户信息也不能在修改;

    1. var app = getApp();
    2. import Toast from '@vant/weapp/toast/toast';
    3. import {
    4. getCompanySelectListOfApp ,//获取公司下拉列表
    5. examLogin,//考试身份登记信息
    6. examUserInfo,//检索登记
    7. getWxUserDetail
    8. } from "../api/index";
    9. Page({
    10. /**
    11. * 页面的初始数据
    12. */
    13. data: {
    14. isShow:false,
    15. showPopup:false,
    16. name:'',
    17. phone:'',
    18. company:'',
    19. // companyValue:'',
    20. companyList:[],//公司列表
    21. companyId:"",
    22. isDisabled:true,//是否登记
    23. },
    24. handleDown(){
    25. this.setData({
    26. showPopup:true
    27. })
    28. },
    29. onConfirm(){
    30. this.setData({
    31. showPopup:false
    32. })
    33. },
    34. closePopup(){
    35. this.setData({
    36. showPopup:false
    37. })
    38. },
    39. handleCompany(e){
    40. const {id,name} = e.currentTarget.dataset.item;
    41. this.setData({
    42. company:name,
    43. companyId:id,
    44. showPopup:false
    45. })
    46. },
    47. userNameInput(e){
    48. this.setData({name:e.detail.value})
    49. },
    50. userPhoneInput(e){
    51. this.setData({phone:e.detail.value})
    52. },
    53. saveData(){
    54. if(this.data.name==""){
    55. Toast("请输入员工姓名");
    56. return;
    57. }else if(this.data.phone==""){
    58. Toast("请输入手机号");
    59. return;
    60. }else if(this.data.company==""){
    61. Toast("请选择所属公司");
    62. return;
    63. }
    64. let params ={
    65. openId:wx.getStorageSync('openId'),
    66. realName:this.data.name,
    67. phone:this.data.phone,
    68. companyId:this.data.companyId
    69. }
    70. console.log(params,"params")
    71. examLogin(params).then(res=>{
    72. if(res.code == 200){
    73. wx.showToast({
    74. title: '登录成功',
    75. icon: 'success',
    76. duration: 2000,
    77. success:function(){
    78. wx.showTabBar({
    79. fail: function() {
    80. setTimeout(function() {
    81. wx.showTabBar()
    82. }, 500)
    83. }
    84. });
    85. setTimeout(()=>{
    86. wx.switchTab({
    87. url: "/pages/examList/index",
    88. });
    89. }, 500)
    90. }
    91. })
    92. }
    93. })
    94. },
    95. // 获取公司下拉列表
    96. getCompanySelectList(){
    97. getCompanySelectListOfApp().then(res=>{
    98. console.log(res)
    99. if(res.code == 200){
    100. this.setData({
    101. companyList:res.data,
    102. })
    103. }
    104. })
    105. },
    106. //检索是否登记
    107. handleExamUserInfo(){
    108. examUserInfo({openId:wx.getStorageSync('openId')}).then(res=>{
    109. // 如果登记了跳转考试页
    110. if(res.code==200){
    111. this.setData({isDisabled:false})
    112. wx.switchTab({
    113. url: '/pages/examList/index',
    114. })
    115. wx.showTabBar({
    116. fail: function() {
    117. setTimeout(function() {
    118. wx.showTabBar()
    119. }, 500)
    120. }
    121. });
    122. }else{
    123. this.setData({isDisabled:true})
    124. wx.hideTabBar({
    125. fail: function() {
    126. setTimeout(function() {
    127. wx.hideTabBar()
    128. }, 500)
    129. }
    130. });
    131. }
    132. }).catch(()=>{
    133. this.setData({isDisabled:true})
    134. wx.hideTabBar({
    135. fail: function() {
    136. setTimeout(function() {
    137. wx.hideTabBar()
    138. }, 500)
    139. }
    140. });
    141. })
    142. },
    143. // 获取用户信息
    144. getUserDetail(){
    145. getWxUserDetail({openId:wx.getStorageSync('openId')}).then(res=>{
    146. if(res.code==200){
    147. this.setData({
    148. name:res.data.userName,
    149. phone:res.data.phone,
    150. company:res.data.companyName,
    151. companyId:res.data.companyId,
    152. isDisabled:false
    153. })
    154. wx.showTabBar({
    155. fail: function() {
    156. setTimeout(function() {
    157. wx.showTabBar()
    158. }, 500)
    159. }
    160. });
    161. }else{
    162. this.setData({isDisabled:true})
    163. wx.hideTabBar({
    164. fail: function() {
    165. setTimeout(function() {
    166. wx.hideTabBar()
    167. }, 500)
    168. }
    169. });
    170. }
    171. }).catch(()=>{
    172. this.setData({isDisabled:true})
    173. wx.hideTabBar({
    174. fail: function() {
    175. setTimeout(function() {
    176. wx.hideTabBar()
    177. }, 500)
    178. }
    179. });
    180. })
    181. },
    182. /**
    183. * 生命周期函数--监听页面加载
    184. */
    185. onLoad: function (options) {
    186. this.getCompanySelectList();//公司列表
    187. },
    188. /**
    189. * 生命周期函数--监听页面初次渲染完成
    190. */
    191. onReady: function () {
    192. },
    193. /**
    194. * 生命周期函数--监听页面显示
    195. */
    196. onShow: function () {
    197. let that = this;
    198. that.getUserDetail();
    199. }
    200. })

    未完待续.........

    考试系统后台管理项目: 

    ⭐️⭐️⭐️  作者:船长在船上
    🚩🚩🚩  主页:来访地址船长在船上的博客
    🔨🔨🔨  简介:CSDN前端领域优质创作者,资深前端开发工程师,专注前端开发,在CSDN总结工作中遇到的问题或者问题解决方法以及对新技术的分享,欢迎咨询交流,共同学习。

    🔔🔔🔔   感谢:如果觉得博主的文章不错或者对你的工作有帮助或者解决了你的问题,可以关注、支持一下博主。如有疑问可以留言、评论,看到后会及时回复。

    👉👉👉  欢迎来访船长在船上的博客,文章持续更新;项目功能持续迭代,项目开发测试完成会把完整代码上传码云,请及时收藏关注,方便查看。 

  • 相关阅读:
    Tor网络的全面解析
    STM32+雷龙SD NAND(贴片SD卡)完成FATFS文件系统移植与测试
    python 使用xlsx和pandas处理Excel表格
    cesium 源码分析 裁切面原理
    xargs命令
    【HTML特效程序】① 给女神表白的程序(让女神看科技烟花),输入名字自动生成表白二维码
    大数据运维实战第七课 通过 Ambari工具自动化构建 Hadoop 大数据平台和外围应用(上)
    11.4商业伦理(全)
    [附源码]计算机毕业设计JAVA课程资源系统管理
    大数据ClickHouse(三):客户端命令行参数
  • 原文地址:https://blog.csdn.net/SmartJunTao/article/details/126809683