猫妈狗爸伴宠师小程序前端代码
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

205 lines
4.0 KiB

2 months ago
fix(订单管理): 修复宠物档案跳转缺少订单ID的问题 修复订单详情页跳转宠物档案页面时未传递orderId参数的问题 ``` ```msg refactor(认证考试): 重构考试答案提交逻辑 将单个题目提交改为批量提交,优化考试流程: 1. 基础考试和培训考试都改为最后统一提交答案 2. 添加加载状态提示 3. 使用Promise.all处理并发请求 ``` ```msg fix(认证考试): 修复考试完成状态判断逻辑 修改answeBaseIsFinish和answeTrainIsFinish接口的返回判断逻辑,从检查code改为检查data字段 ``` ```msg feat(认证考试): 新增重新考试和成为伴宠师接口 1. 添加retakeExam和appletUsersTeacher接口 2. 在错误详情页添加重新考试功能 3. 在考试完成页添加成为伴宠师功能 ``` ```msg style(时间轴组件): 优化操作按钮布局 1. 添加按钮间距(gap) 2. 使用flex:1使按钮等宽 3. 根据状态显示不同按钮文本 4. 添加serviceBtn属性控制档案按钮显示 ``` ```msg refactor(订单弹窗): 重构服务档案弹窗组件 1. 使用timelineService组件替代原有实现 2. 简化数据结构处理 3. 添加状态判断逻辑 4. 优化弹窗标题和样式 ``` ```msg fix(表单验证): 添加认证考试结束页表单验证 1. 添加姓名、电话、地址的必填验证 2. 添加格式验证(电话格式、姓名格式) 3. 添加长度验证 4. 添加错误状态样式 5. 优化错误提示体验 ``` ```msg refactor(工作台): 重构伴宠师申请流程 1. 优化申请条件判断逻辑 2. 添加用户状态检查 3. 完善考试状态跳转逻辑 4. 统一使用store获取用户信息
4 days ago
fix(订单管理): 修复宠物档案跳转缺少订单ID的问题 修复订单详情页跳转宠物档案页面时未传递orderId参数的问题 ``` ```msg refactor(认证考试): 重构考试答案提交逻辑 将单个题目提交改为批量提交,优化考试流程: 1. 基础考试和培训考试都改为最后统一提交答案 2. 添加加载状态提示 3. 使用Promise.all处理并发请求 ``` ```msg fix(认证考试): 修复考试完成状态判断逻辑 修改answeBaseIsFinish和answeTrainIsFinish接口的返回判断逻辑,从检查code改为检查data字段 ``` ```msg feat(认证考试): 新增重新考试和成为伴宠师接口 1. 添加retakeExam和appletUsersTeacher接口 2. 在错误详情页添加重新考试功能 3. 在考试完成页添加成为伴宠师功能 ``` ```msg style(时间轴组件): 优化操作按钮布局 1. 添加按钮间距(gap) 2. 使用flex:1使按钮等宽 3. 根据状态显示不同按钮文本 4. 添加serviceBtn属性控制档案按钮显示 ``` ```msg refactor(订单弹窗): 重构服务档案弹窗组件 1. 使用timelineService组件替代原有实现 2. 简化数据结构处理 3. 添加状态判断逻辑 4. 优化弹窗标题和样式 ``` ```msg fix(表单验证): 添加认证考试结束页表单验证 1. 添加姓名、电话、地址的必填验证 2. 添加格式验证(电话格式、姓名格式) 3. 添加长度验证 4. 添加错误状态样式 5. 优化错误提示体验 ``` ```msg refactor(工作台): 重构伴宠师申请流程 1. 优化申请条件判断逻辑 2. 添加用户状态检查 3. 完善考试状态跳转逻辑 4. 统一使用store获取用户信息
4 days ago
fix(订单管理): 修复宠物档案跳转缺少订单ID的问题 修复订单详情页跳转宠物档案页面时未传递orderId参数的问题 ``` ```msg refactor(认证考试): 重构考试答案提交逻辑 将单个题目提交改为批量提交,优化考试流程: 1. 基础考试和培训考试都改为最后统一提交答案 2. 添加加载状态提示 3. 使用Promise.all处理并发请求 ``` ```msg fix(认证考试): 修复考试完成状态判断逻辑 修改answeBaseIsFinish和answeTrainIsFinish接口的返回判断逻辑,从检查code改为检查data字段 ``` ```msg feat(认证考试): 新增重新考试和成为伴宠师接口 1. 添加retakeExam和appletUsersTeacher接口 2. 在错误详情页添加重新考试功能 3. 在考试完成页添加成为伴宠师功能 ``` ```msg style(时间轴组件): 优化操作按钮布局 1. 添加按钮间距(gap) 2. 使用flex:1使按钮等宽 3. 根据状态显示不同按钮文本 4. 添加serviceBtn属性控制档案按钮显示 ``` ```msg refactor(订单弹窗): 重构服务档案弹窗组件 1. 使用timelineService组件替代原有实现 2. 简化数据结构处理 3. 添加状态判断逻辑 4. 优化弹窗标题和样式 ``` ```msg fix(表单验证): 添加认证考试结束页表单验证 1. 添加姓名、电话、地址的必填验证 2. 添加格式验证(电话格式、姓名格式) 3. 添加长度验证 4. 添加错误状态样式 5. 优化错误提示体验 ``` ```msg refactor(工作台): 重构伴宠师申请流程 1. 优化申请条件判断逻辑 2. 添加用户状态检查 3. 完善考试状态跳转逻辑 4. 统一使用store获取用户信息
4 days ago
fix(订单管理): 修复宠物档案跳转缺少订单ID的问题 修复订单详情页跳转宠物档案页面时未传递orderId参数的问题 ``` ```msg refactor(认证考试): 重构考试答案提交逻辑 将单个题目提交改为批量提交,优化考试流程: 1. 基础考试和培训考试都改为最后统一提交答案 2. 添加加载状态提示 3. 使用Promise.all处理并发请求 ``` ```msg fix(认证考试): 修复考试完成状态判断逻辑 修改answeBaseIsFinish和answeTrainIsFinish接口的返回判断逻辑,从检查code改为检查data字段 ``` ```msg feat(认证考试): 新增重新考试和成为伴宠师接口 1. 添加retakeExam和appletUsersTeacher接口 2. 在错误详情页添加重新考试功能 3. 在考试完成页添加成为伴宠师功能 ``` ```msg style(时间轴组件): 优化操作按钮布局 1. 添加按钮间距(gap) 2. 使用flex:1使按钮等宽 3. 根据状态显示不同按钮文本 4. 添加serviceBtn属性控制档案按钮显示 ``` ```msg refactor(订单弹窗): 重构服务档案弹窗组件 1. 使用timelineService组件替代原有实现 2. 简化数据结构处理 3. 添加状态判断逻辑 4. 优化弹窗标题和样式 ``` ```msg fix(表单验证): 添加认证考试结束页表单验证 1. 添加姓名、电话、地址的必填验证 2. 添加格式验证(电话格式、姓名格式) 3. 添加长度验证 4. 添加错误状态样式 5. 优化错误提示体验 ``` ```msg refactor(工作台): 重构伴宠师申请流程 1. 优化申请条件判断逻辑 2. 添加用户状态检查 3. 完善考试状态跳转逻辑 4. 统一使用store获取用户信息
4 days ago
fix(订单管理): 修复宠物档案跳转缺少订单ID的问题 修复订单详情页跳转宠物档案页面时未传递orderId参数的问题 ``` ```msg refactor(认证考试): 重构考试答案提交逻辑 将单个题目提交改为批量提交,优化考试流程: 1. 基础考试和培训考试都改为最后统一提交答案 2. 添加加载状态提示 3. 使用Promise.all处理并发请求 ``` ```msg fix(认证考试): 修复考试完成状态判断逻辑 修改answeBaseIsFinish和answeTrainIsFinish接口的返回判断逻辑,从检查code改为检查data字段 ``` ```msg feat(认证考试): 新增重新考试和成为伴宠师接口 1. 添加retakeExam和appletUsersTeacher接口 2. 在错误详情页添加重新考试功能 3. 在考试完成页添加成为伴宠师功能 ``` ```msg style(时间轴组件): 优化操作按钮布局 1. 添加按钮间距(gap) 2. 使用flex:1使按钮等宽 3. 根据状态显示不同按钮文本 4. 添加serviceBtn属性控制档案按钮显示 ``` ```msg refactor(订单弹窗): 重构服务档案弹窗组件 1. 使用timelineService组件替代原有实现 2. 简化数据结构处理 3. 添加状态判断逻辑 4. 优化弹窗标题和样式 ``` ```msg fix(表单验证): 添加认证考试结束页表单验证 1. 添加姓名、电话、地址的必填验证 2. 添加格式验证(电话格式、姓名格式) 3. 添加长度验证 4. 添加错误状态样式 5. 优化错误提示体验 ``` ```msg refactor(工作台): 重构伴宠师申请流程 1. 优化申请条件判断逻辑 2. 添加用户状态检查 3. 完善考试状态跳转逻辑 4. 统一使用store获取用户信息
4 days ago
  1. <template>
  2. <!-- <view>伴宠师认证</view> -->
  3. <view class="page">
  4. <view class="box">
  5. <view class="content bg-fff">
  6. <view class="group" v-for="(group, gIdx) in list" :key="`group-${gIdx}`">
  7. <view class="label size-22 level" :style="{borderRadius:'10rpx'}">
  8. {{ group.title }}
  9. </view>
  10. <view >
  11. <questionCard
  12. v-for="(item, qIdx) in group.children"
  13. :key="`${gIdx}-question-${qIdx}`"
  14. :index="qIdx"
  15. :data="item"
  16. :type="item.type"
  17. mode="display"
  18. ></questionCard>
  19. </view>
  20. </view>
  21. </view>
  22. </view>
  23. <view class="footer-btn flex-colc">
  24. <view class="size-22 color-777 tips-rest">
  25. <!-- todo -->
  26. 剩余考试机会<text class="highlight">{{ restTimes }}</text>
  27. </view>
  28. <view class="btn" @click="onClick">
  29. 重新考试
  30. </view>
  31. </view>
  32. </view>
  33. </template>
  34. <script setup>
  35. import { ref, computed } from 'vue'
  36. import { onShow } from '@dcloudio/uni-app'
  37. import { getQuestionList, getQuestionOptions, answeBaseByQuestionId, answeTrainByQuestionId, retakeExam } from '@/api/examination'
  38. import { useStore } from 'vuex'
  39. import questionCard from '../components/questionCard.vue';
  40. const store = useStore()
  41. const configList = computed(() => {
  42. return store.getters.configList
  43. })
  44. const userInfo = computed(() => {
  45. return store.state.user.userInfo
  46. })
  47. const list = ref([
  48. {
  49. title: '选择题',
  50. children: [],
  51. },
  52. {
  53. title: '主观题',
  54. children: [],
  55. },
  56. ])
  57. const initList = async () => {
  58. try {
  59. let groups = [
  60. { title: '选择题', children: [], },
  61. { title: '主观题', children: [], },
  62. ]
  63. let questions = await getQuestionList()
  64. for (let i = 0; i < questions.length; i++) {
  65. const { id, title, type } = questions[i]
  66. let data = { id, title, type }
  67. if (type === '基本') {
  68. const options = (await getQuestionOptions({ questionId: id })).map(item => ({ id: item.id, title: item.title}))
  69. data.options = options
  70. // todo: 替换成批量查询接口
  71. const { answer, answerId } = await answeBaseByQuestionId({ questionId: id })
  72. if (answer.isTrue) {
  73. continue
  74. }
  75. data.answer = answer.id
  76. data.value = answerId
  77. data.isTrue = answer.isTrue
  78. groups[0].children.push(data)
  79. } else {
  80. // todo: 替换成批量查询接口
  81. const { answer, remark } = await answeTrainByQuestionId({ questionId: id })
  82. if (!remark) {
  83. continue
  84. }
  85. data.answer = remark
  86. data.value = answer
  87. groups[1].children.push(data)
  88. }
  89. }
  90. list.value = groups.filter(group => group.children.length > 0)
  91. console.log('--list', list.value)
  92. } catch (err) {
  93. console.log('--initList--err', err)
  94. }
  95. }
  96. const restTimes = ref()
  97. onShow(() => {
  98. // todo: fetch
  99. restTimes.value = parseInt(configList.value.pet_work_num.paramValueText || 0)
  100. initList()
  101. })
  102. const onClick = () => {
  103. retakeExam({
  104. userId : userInfo.value.userId
  105. }).then(res => {
  106. uni.reLaunch({
  107. url: "/otherPages/authentication/examination/start"
  108. // todo: check
  109. // url: "/otherPages/authentication/list/index"
  110. })
  111. })
  112. }
  113. </script>
  114. <style lang="scss" scoped>
  115. $bar-height: 163rpx;
  116. .page {
  117. padding-bottom: $bar-height;
  118. }
  119. .box {
  120. // background-image: linear-gradient(to bottom, #ffbf60, #f2f2f2);
  121. padding: 16rpx;
  122. .step {
  123. width: 720rpx;
  124. height: 32rpx;
  125. border-radius: 32rpx;
  126. background-color: #D9D9D9;
  127. .in {
  128. width: 50%;
  129. height: 32rpx;
  130. background-color: #ffbf60;
  131. border-radius: 32rpx;
  132. }
  133. }
  134. }
  135. .content {
  136. border-radius: 20rpx;
  137. padding: 15rpx 20rpx;
  138. .label {
  139. width: 86rpx;
  140. padding: 5rpx 15rpx;
  141. color: #fff;
  142. background-color: #FFBF60;
  143. justify-content: center;
  144. }
  145. }
  146. .group + .group {
  147. margin-top: 68rpx;
  148. }
  149. .level {
  150. display: flex;
  151. }
  152. .footer-btn {
  153. height: $bar-height;
  154. }
  155. .tips {
  156. &-rest {
  157. color: #707070;
  158. font-size: 22rpx;
  159. margin: 9rpx 0 13rpx 0;
  160. .highlight {
  161. color: #FF8DC6;
  162. }
  163. }
  164. }
  165. </style>