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.

815 lines
21 KiB

4 weeks ago
4 weeks ago
3 weeks ago
3 weeks ago
4 weeks ago
3 weeks ago
4 weeks ago
3 weeks ago
4 weeks ago
3 weeks ago
4 weeks ago
4 weeks ago
3 weeks ago
4 weeks ago
3 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
3 weeks ago
4 weeks ago
1 week ago
4 weeks ago
4 weeks ago
3 weeks ago
4 weeks ago
3 weeks ago
4 weeks ago
1 week ago
4 weeks ago
3 weeks ago
4 weeks ago
2 weeks ago
4 weeks ago
3 weeks ago
4 weeks ago
4 weeks ago
3 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
3 weeks ago
4 weeks ago
4 weeks ago
3 weeks ago
4 weeks ago
3 weeks ago
4 weeks ago
3 weeks ago
3 weeks ago
4 weeks ago
3 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
3 weeks ago
4 weeks ago
1 week ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
  1. <template>
  2. <view class="content">
  3. <up-navbar leftText=" " title="" :safeAreaInsetTop="false" :autoBack="true">
  4. <template #center>
  5. <view class="flex">
  6. <view class="lastText">剩余时间</view>
  7. <view class="lastText" style="margin: 8rpx 0 0 8rpx"><up-count-down :time="totalExamTime * 60 * 1000" format="mm:ss" @finish="finishFn" ref="countDownRef"></up-count-down></view>
  8. </view>
  9. </template>
  10. </up-navbar>
  11. <view class="top_row flex">
  12. <view class="itemCount">
  13. <up-icon name="checkmark-circle-fill" color="#55ff7f" size="20" ></up-icon>
  14. <view class="count">{{ yesNum }}</view>
  15. </view>
  16. <view class="itemCount">
  17. <up-icon name="close-circle-fill" color="#ff0000" size="20" ></up-icon>
  18. <view class="count">{{ noNum }}</view>
  19. </view>
  20. <view class="mr">
  21. <view class="count">{{currentIndex+1}}/<text>{{questionBankList.length}}</text></view>
  22. </view>
  23. </view>
  24. <view class="con padding">
  25. <view class="h1_row">
  26. <text class="tag" :class="{red: questionBank.types==2, blue: questionBank.types==3}">{{types[questionBank.types-1]}}</text>
  27. <text class="h1" @click="speak(questionBank.title)">{{ questionBank.title}}</text>
  28. </view>
  29. <view class="imgBox" style="width: 100%;padding: 0 0 30rpx 0;" v-if="questionBank.img">
  30. <image :src="questionBank.img" mode="widthFix"></image>
  31. </view>
  32. <view class="option">
  33. <view v-for="(item,index) in questionBank.optionArr" @click="chooseOption(item)">
  34. <!-- 多选题 -->
  35. <view class="optionItem flex" v-if="questionBank.types ==2&& (!curOption.answer||curOption.answer==questionBank.answer)">
  36. <up-icon name="checkmark-circle-fill" color="#55ff7f" size="20" v-if="curOption.ans?.includes(item.key)"></up-icon>
  37. <view class="icon" v-else></view>
  38. <view class="text"><text >{{item.key}}</text> {{item.text}}</view>
  39. </view>
  40. <!-- 正常答案 -->
  41. <view class="optionItem flex" v-else >
  42. <view class="icon" v-if="!curOption.key&&questionBank.types !=2"></view>
  43. <up-icon name="checkmark-circle-fill" color="#55ff7f" size="20" v-else-if="questionBank.answer.includes(item.key)"></up-icon>
  44. <up-icon name="close-circle-fill" color="#ff0000" size="20" v-else></up-icon>
  45. <view class="text"><text v-if="questionBank.types!=3">{{item.key}}</text> {{item.text}}</view>
  46. </view>
  47. <!-- ans -->
  48. </view>
  49. </view>
  50. <view class="answerCss flex" v-if="curOption.answer&&questionBank.answer!=curOption.answer">
  51. <view class="ans">正确答案是
  52. <text v-if="questionBank.types==3" >{{ questionBank.answer=='false'?'错误':'正确' }}</text>
  53. <text v-else >{{ questionBank.answer }}</text>
  54. </view>
  55. <view class="ans">您的答案是
  56. <text v-if="questionBank.types==3" class="red">{{ curOption.answer=='false'?'错误':'正确' }}</text>
  57. <text v-else class="red">{{ curOption.answer }}</text>
  58. </view>
  59. </view>
  60. <view class="btn_row flex-b">
  61. <!-- @click="$goPage('/pages/exercises/lastPage/lastPage')" -->
  62. <button class="btn border" @click="debounce(nextQuestion(-1), 500)" :class="{disable: currentIndex==0}" :disabled="currentIndex==0">上一题</button>
  63. <button class="btn bg" @click="debounce(nextQuestion(1), 500)" :class="{disable: currentIndex>=questionBankList.length-1}" :disabled="currentIndex>=questionBankList.length-1">下一题</button>
  64. </view>
  65. <view class="analysis" v-if="currentNav==2||(curOption.answer&&curOption.answer!=questionBank.answer)">
  66. <view class="tit">题目解析</view>
  67. <view class="txt">{{ questionBank.resolving }}</view>
  68. </view>
  69. </view>
  70. <view class="bottomBar">
  71. <view class="ul">
  72. <!-- <view class="li">
  73. <view class="icon" style="color: #55ff7f;">{{ yesNum }}</view>
  74. <view class="text">答对</view>
  75. </view>
  76. <view class="li">
  77. <view class="icon" style="color: #ff0000;">{{ noNum }}</view>
  78. <view class="text">答错</view>
  79. </view>
  80. <view class="li">
  81. <view class="icon">{{currentIndex}}/<text style="color: #999; font-size: 24rpx;">{{quesIdList.length}}</text></view>
  82. <view class="text">题目</view>
  83. </view> -->
  84. <view class="flex leftCotrl">
  85. <view class="li" @click="showCommt=true">
  86. <view class="icon">
  87. <image src="@/static/images/theory/fankui.png" mode=""></image>
  88. </view>
  89. <view class="text">反馈</view>
  90. </view>
  91. <view class="li" @click="openPopup">
  92. <view class="icon">
  93. <image src="@/static/images/theory/dtk.png" mode=""></image>
  94. </view>
  95. <view class="text">答题卡</view>
  96. </view>
  97. <view class="li" @click="questionWrongColleFn">
  98. <view class="icon">
  99. <image src="@/static/images/theory/scActive.png" mode="" v-if="questionBank.isCollect=='1'"></image>
  100. <image src="@/static/images/theory/sc.png" mode="" v-else></image>
  101. </view>
  102. <view class="text">收藏</view>
  103. </view>
  104. </view>
  105. <view class="submitBtn" @click="handApaper">交卷</view>
  106. </view>
  107. </view>
  108. <up-popup :show="show" @close="closePopup" @open="openPopup" mode="bottom" round="20" closeable>
  109. <view class="popupCon">
  110. <view class="h3">答题卡</view>
  111. <view class="ulRow">
  112. <view class="ul">
  113. <view class="li">
  114. <view class="icon" style="color: #55ff7f;">{{ yesNum }}</view>
  115. <view class="text">答对</view>
  116. </view>
  117. <view class="li">
  118. <view class="icon" style="color: #ff0000;">{{ noNum }}</view>
  119. <view class="text">答错</view>
  120. </view>
  121. <view class="li" style="margin-left: auto;">
  122. <view class="icon">{{currentIndex+1}}/<text style="color: #999; font-size: 24rpx;">{{questionBankList.length}}</text></view>
  123. <view class="text">题目</view>
  124. </view>
  125. </view>
  126. </view>
  127. <view class="ul2">
  128. <view class="li2" v-for="(item,index) in questionBankList" :key="index" @click="quesIdListClick(item,index)">
  129. <view class="num" :class="{yes: item.yes==1, no: item.yes==0}">{{ index+1 }} <text v-if="index==currentIndex">当前</text> </view>
  130. </view>
  131. </view>
  132. </view>
  133. </up-popup>
  134. <up-popup :show="showCommt" @close="showCommtClose" mode="bottom" round="20rpx" closeable>
  135. <view class="commtCon" style="padding: 30rpx">
  136. <up-textarea v-model.trim="contentStr" placeholder="请输入反馈内容" style="margin-top: 50rpx;" maxlength="300"></up-textarea>
  137. <up-button text="提 交" style="margin-top: 20rpx;" type="primary" @click="submitClick"></up-button>
  138. </view>
  139. </up-popup>
  140. <up-popup :show="showCommit" @close="closeCommitPopup" mode="center" round="20rpx" closeable >
  141. <view class="commitCon">
  142. <view class="tit" v-if="remaining">当前考试进度</view>
  143. <view class="tit" style="color: red;" v-else-if="passScore.value*1>yesNum.value">成绩不合格</view>
  144. <view class="flex">
  145. <view class="commitItem">
  146. <view class="num">{{ remaining }}</view>
  147. <view class="lab">未答题数</view>
  148. </view>
  149. <view class="commitItem">
  150. <view class="num">{{ questionBankList.length - remaining}}</view>
  151. <view class="lab">已答题数</view>
  152. </view>
  153. <view class="commitItem">
  154. <view class="num"><up-count-down :time="totalExamTime||0 * 60 * 60 * 1000" format="HH:mm" ref="countDownRef"/></view>
  155. <view class="lab">剩余时间</view>
  156. </view>
  157. </view>
  158. <view class="imgAdd">
  159. <image src="@/static/images/bigImg/addImg.png" mode="widthFix"></image>
  160. </view>
  161. <view class="btn_commit_row flex-b" v-if="remaining">
  162. <view class="border btn" @click="goBack" >放弃考试</view>
  163. <view class="btn" @click="closeCommitPopup">继续考试</view>
  164. </view>
  165. <view class="btn_commit_row flex-b" v-else>
  166. <view class="border btn" @click="closeCommitPopup" >继续答题</view>
  167. <view class="btn" @click="submitBtnFn">现在交卷</view>
  168. </view>
  169. </view>
  170. </up-popup>
  171. </view>
  172. </template>
  173. <script setup>
  174. function speak(text) {
  175. const speech = new SpeechSynthesisUtterance(text); // 创建语音消息
  176. window.speechSynthesis.speak(speech); // 播报消息
  177. }
  178. import { startExam, getQuestionApi, questionCommentAdd, startExamDo, questionWrongColle } from '@/config/api.js'
  179. import { debounce } from '@/uni_modules/uview-plus';
  180. import {
  181. ref,
  182. reactive,
  183. watch,
  184. nextTick,
  185. } from 'vue';
  186. const currentNav = ref('1')
  187. const types = ref([
  188. '单选题',
  189. '多选题',
  190. '判断题'
  191. ])
  192. const yesNum = ref(0)
  193. const noNum = ref(0)
  194. let showCommit = ref(false)
  195. import carStore from '@/store/modules/car.js'
  196. let usecarStore = carStore()
  197. import {
  198. onLoad,
  199. onReady
  200. } from "@dcloudio/uni-app"
  201. let totalExamTime = ref(45)
  202. let passScore = ref(90)
  203. onLoad((options)=>{
  204. totalExamTime.value = options.totalExamTime || 45
  205. passScore.value = options.score
  206. })
  207. // 1:单选题,2:多选题,3:判断题
  208. function changeNav(val) {
  209. console.log(window)
  210. if(currentNav.value == val) return
  211. currentNav.value = val
  212. }
  213. function goEmam() {
  214. uni.navigateTo({
  215. // url: '/pages/exercises/exam/exam',
  216. // url: '/pages/exercises/beforeExam/beforeExam',
  217. // url: '/pages/exercises/examResults/examResults',
  218. // url: '/pages/exercises/wrongQuestion/wrongQuestion',
  219. // url: '/pages/exercises/theoryStudy/theoryStudy',
  220. url: '/pages/vip/vipEntry/vipEntry'
  221. })
  222. }
  223. function changeTabbar(val) {
  224. console.log(val)
  225. }
  226. const show = ref(false)
  227. function closePopup() {
  228. show.value = false
  229. }
  230. function openPopup() {
  231. show.value = true
  232. }
  233. let showCommt = ref(false)
  234. let contentStr = ref('')
  235. function showCommtClose() {
  236. showCommt.value = false
  237. contentStr.value = ''
  238. }
  239. // 提交反馈
  240. async function submitCommt() {
  241. if(!contentStr.value) return uni.$u.toast('请输入内容')
  242. let obj = {
  243. content: contentStr.value,
  244. questionId: questionBank.value.id
  245. }
  246. const res = await questionCommentAdd(obj)
  247. if(res.errorcode==0) {
  248. uni.$u.toast('提交成功,感谢您的反馈')
  249. showCommt.value = false
  250. }
  251. }
  252. // 请求数据
  253. const questionBank = ref({})
  254. const questionBankList = ref([])
  255. let examInfo = ref([])
  256. let currentIndex = ref(0)
  257. async function startQuestionFn() {
  258. try{
  259. uni.showLoading({
  260. title: '正在加载...'
  261. })
  262. let obj = {
  263. carType: usecarStore.carInfo.carType,
  264. stepType: usecarStore.carInfo.stepType,
  265. city: usecarStore.carInfo.city,
  266. examType: 1,
  267. }
  268. const {data: res} = await startExam(obj)
  269. uni.hideLoading()
  270. questionBank.value = res.questionBank[0]
  271. questionBankList.value = res.questionBank
  272. initOptionArr()
  273. examInfo.value = res
  274. }catch(e){
  275. uni.hideLoading()
  276. }
  277. }
  278. startQuestionFn()
  279. watch(()=>questionBankList, (newVal, oldVal)=>{
  280. yesNum.value = oldVal.value.filter(item=>item.yes).length
  281. noNum.value = oldVal.value.filter(item=>item.yes==0).length
  282. }, {deep: true})
  283. function initOptionArr() {
  284. questionBank.value.optionArr = []
  285. let abcd = [
  286. 'a',
  287. 'b',
  288. 'c',
  289. 'd',
  290. 'e',
  291. 'f'
  292. ]
  293. abcd.forEach((k,i)=>{
  294. let option = 'option'+k
  295. if(questionBank.value[option]) {
  296. let obj = {
  297. key: k.toLocaleUpperCase(),
  298. text: questionBank.value[option],
  299. index: i+1
  300. }
  301. questionBank.value.optionArr.push(obj)
  302. // console.log(questionBank.value.optionArr)
  303. }
  304. })
  305. // 如果是判断题
  306. if(questionBank.value.types==3) {
  307. questionBank.value.optionArr[0].key = 'true'
  308. questionBank.value.optionArr[1].key = 'false'
  309. }
  310. }
  311. // 下一题
  312. async function nextQuestion(num) {
  313. // 如果是多选题,什么时候不直接请求下一题,是多选题 ,并且有答案,答错了,并且不是next
  314. if(questionBank.value.types==2 && curOption.value.ans) {
  315. // 如果没有请求就请求一下
  316. if(!curOption.value.answer) {
  317. curOption.value.answer = curOption.value.ans
  318. }
  319. // 如果答案不一样,并且是第一次请求
  320. if(questionBank.value.answer != curOption.value.ans&&curOption.value.isNext != 'next') {
  321. curOption.value.isNext = 'next'
  322. questionBank.value.yes = 0
  323. return false
  324. }else if(questionBank.value.answer == curOption.value.ans) {
  325. questionBank.value.yes = 1
  326. }
  327. }
  328. curOption.value = {}
  329. currentIndex.value = currentIndex.value + num
  330. getQuestionFn()
  331. }
  332. // 请求下一题
  333. async function getQuestionFn() {
  334. console.log(currentIndex.value)
  335. // let questionId = quesIdList.value[currentIndex.value-1]
  336. // let obj = {
  337. // "carType": usecarStore.carInfo.carType,
  338. // "questionId": questionId,
  339. // "sort": currentIndex.value,
  340. // "stepType": usecarStore.carInfo.stepType,
  341. // 'tempId': questionBank.value.questionDoTemp.id
  342. // }
  343. // const {data: res} = await getQuestionApi(obj)
  344. questionBank.value = questionBankList.value[currentIndex.value]
  345. curOption.value = {}
  346. curOption.value.isNext = ''
  347. initOptionArr()
  348. }
  349. async function quesIdListClick(id, index) {
  350. curOption.value = {}
  351. currentIndex.value = index
  352. getQuestionFn()
  353. show.value = false
  354. }
  355. async function questionWrongColleFn() {
  356. let isAdd = questionBank.value.isCollect==1?'0':'1'
  357. const obj = {
  358. "carType": usecarStore.carInfo.carType,
  359. "isAdd": isAdd,
  360. "questionId": questionBank.value.id,
  361. "stepType": usecarStore.carInfo.stepType
  362. }
  363. const res = await questionWrongColle(obj)
  364. questionBank.value.isCollect = isAdd
  365. console.log(questionBank.value.isCollect)
  366. }
  367. // 选择答案
  368. const curOption = ref({})
  369. async function chooseOption(item) {
  370. console.log(item)
  371. if(curOption.value.answer) return
  372. if(questionBank.value.types != 2) {
  373. // 如果答案正确 下一题
  374. if(questionBank.value.answer==item.key) {
  375. questionBank.value.yes = 1
  376. currentIndex.value = currentIndex.value + 1
  377. curOption.value = item
  378. setTimeout(()=>{
  379. getQuestionFn()
  380. },500)
  381. }else {
  382. item.answer = item.key
  383. curOption.value = item
  384. questionBank.value.yes = 0
  385. }
  386. }else if(questionBank.value.types == 2){
  387. if(!curOption.value.ans) curOption.value.ans = ''
  388. if(curOption.value.ans.includes(item.key)) {
  389. curOption.value.ans = curOption.value.ans.replace(item.key, '')
  390. return
  391. }
  392. curOption.value.ans = (curOption.value.ans + item.key).split('').sort().join('')
  393. // console.log(curOption.value.ans)
  394. }
  395. }
  396. // 点击交卷
  397. let remaining = ref(0)
  398. let countDownRef = ref(null)
  399. function handApaper() {
  400. let arr = questionBankList.value.filter(item=>item.yes==undefined)
  401. // 不及格或者有没有做完的题
  402. if(arr.length || passScore.value*1>yesNum.value) {
  403. remaining.value = arr.length
  404. showCommit.value = true
  405. if (countDownRef.value) {
  406. countDownRef.value.pause();
  407. }
  408. }else {
  409. submitBtnFn()
  410. }
  411. }
  412. // 关闭交卷弹框
  413. function closeCommitPopup() {
  414. showCommit.value = false
  415. if (countDownRef.value) {
  416. countDownRef.value.start();
  417. }
  418. }
  419. // 交卷
  420. async function submitBtnFn() {
  421. let wrongArr = questionBankList.value.filter(item=>item.yes!=1)
  422. let worngId = wrongArr.map(item=>item.id).join(',')
  423. let obj = {
  424. "answer": null,
  425. "carType": usecarStore.carInfo.carType,
  426. "examId": examInfo.value.id,
  427. "examType": 1,
  428. "grade": questionBankList.value.length - wrongArr.length,
  429. "isEnd": 1,
  430. "pass": 1,
  431. "sort": examInfo.value.sort,
  432. "stepType": usecarStore.carInfo.stepType,
  433. "userId": examInfo.value.userId,
  434. "wrongQuestionIds": worngId
  435. }
  436. const res = await startExamDo(obj)
  437. console.log(res)
  438. uni.$u.toast('已交卷')
  439. setTimeout(()=>{
  440. uni.navigateBack()
  441. },1500)
  442. }
  443. function finishFn() {
  444. uni.$u.toast('考试时间已到,准备自动为您交卷')
  445. setTimeout(()=>{
  446. submitBtnFn()
  447. },1500)
  448. }
  449. // 返回
  450. function goBack() {
  451. uni.navigateBack()
  452. }
  453. </script>
  454. <style lang="scss" scoped>
  455. .top_row {
  456. height: 88rpx;
  457. font-weight: 500;
  458. font-size: 24rpx;
  459. color: #333333;
  460. border-bottom: 2rpx solid #F4F4F4;
  461. padding: 0 30rpx;
  462. margin-bottom: 30rpx;
  463. .itemCount {
  464. margin-right: 60rpx;
  465. display: flex;
  466. align-items: center;
  467. .count {
  468. margin-left: 20rpx;
  469. }
  470. }
  471. .mr {
  472. margin-left: auto;
  473. }
  474. }
  475. image {display: block;width: 100%;height: 100%;}
  476. .bottomBar {
  477. position: fixed;
  478. bottom: 0;
  479. left: 0;
  480. width: 100%;
  481. height: 98rpx;
  482. background: #FFFFFF;
  483. border-top: 1rpx solid #F4F4F4;
  484. }
  485. .ul {
  486. display: flex;
  487. justify-content: space-between;
  488. height: 100%;
  489. align-items: center;
  490. .leftCotrl {
  491. flex: 1;
  492. }
  493. .submitBtn {
  494. width: 100rpx;
  495. height: 50rpx;
  496. background: linear-gradient(0deg, #4FACFE 0%, #00F2FE 100%);
  497. border-radius: 25rpx;
  498. font-size: 24rpx;
  499. line-height: 50rpx;
  500. text-align: center;
  501. margin-right: 32rpx;
  502. color: #fff;
  503. }
  504. .li {
  505. // width: 16.6%;
  506. padding: 0 30rpx;
  507. display: flex;
  508. flex-direction: column;
  509. align-items: center;
  510. justify-content: center;
  511. .icon {
  512. font-size: 30rpx;
  513. height: 30rpx;
  514. line-height: 30rpx;
  515. image {
  516. display: block;
  517. margin-top: 4rpx;
  518. width: 26rpx;
  519. height: 26rpx;
  520. }
  521. }
  522. .text {
  523. font-weight: 500;
  524. font-size: 24rpx;
  525. color: #999999;
  526. margin-top: 10rpx;
  527. }
  528. }
  529. }
  530. .content {
  531. padding: 120rpx 0;
  532. min-height: 100vh;
  533. .u-nav-slot {
  534. width: 306rpx;
  535. height: 54rpx;
  536. border-radius: 10rpx;
  537. border: 1px solid #333333;
  538. display: flex;
  539. .btn {
  540. font-size: 24rpx;
  541. color: #333333;
  542. flex: 1;
  543. text-align: center;
  544. line-height: 54rpx;
  545. &.active {
  546. background-color: #333333;
  547. color: #fff;
  548. }
  549. }
  550. }
  551. .btn_row {
  552. padding: 60rpx 0 30rpx 0;
  553. .btn {
  554. width: 44%;
  555. height: 76rpx;
  556. border-radius: 38rpx;
  557. border: 1rpx solid $themC;
  558. line-height: 76rpx;
  559. text-align: center;
  560. font-size: 28rpx;
  561. color: $themC;
  562. &.disable {
  563. opacity: 0.4;
  564. }
  565. &.bg {
  566. background: #3776FF;
  567. border-radius: 38rpx;
  568. color: #fff;
  569. }
  570. }
  571. }
  572. .con {
  573. .h1_row {
  574. margin-bottom: 50rpx;
  575. .tag {
  576. display: inline-block;
  577. // width: 66px;
  578. height: 36rpx;
  579. line-height: 36rpx;
  580. padding: 4rpx 6rpx;
  581. background: #63C168;
  582. border-radius: 6rpx;
  583. margin-top: -2rpx;
  584. margin-right: 16rpx;
  585. font-size: 28rpx;
  586. color: #fff;
  587. &.blue {
  588. background: #3776FF;
  589. }
  590. &.red {
  591. background: orangered;
  592. }
  593. }
  594. text.h1 {
  595. font-size: 36rpx;
  596. }
  597. }
  598. .option {
  599. width: 100%;
  600. .optionItem {
  601. margin-bottom: 50rpx;
  602. align-items: center;
  603. .icon {
  604. width: 36rpx;
  605. height:36rpx;
  606. border-radius: 50%;
  607. border: 1rpx solid #999;
  608. }
  609. .text {
  610. font-size: 32rpx;
  611. margin-left: 16rpx;
  612. }
  613. }
  614. }
  615. .answerCss {
  616. height: 90rpx;
  617. background: #F4F4F4;
  618. padding: 30rpx;
  619. margin-top: 20rpx;
  620. justify-content: space-around;
  621. .ans {
  622. font-size: 30rpx;
  623. text {
  624. &.red {
  625. color: red;
  626. }
  627. }
  628. }
  629. }
  630. .analysis {
  631. margin-top: 60rpx;
  632. .tit {
  633. font-weight: 700;
  634. font-size: 32rpx;
  635. position: relative;
  636. padding-left: 30rpx;
  637. &::after {
  638. content: '';
  639. position: absolute;
  640. left: 0;
  641. top: 8rpx;
  642. width: 6rpx;
  643. height: 30rpx;
  644. background: linear-gradient(0deg, #43EA80 0%, #38F8D4 100%);
  645. border-radius: 3rpx;
  646. }
  647. }
  648. .txt {
  649. margin-top: 39rpx;
  650. font-size: 32rpx;
  651. color: #333333;
  652. }
  653. }
  654. }
  655. }
  656. .popupCon {
  657. width: 100%;
  658. height: calc(100vh - 200rpx);
  659. .h3 {
  660. height: 88rpx;
  661. border-bottom: 1px solid #F4F4F4;
  662. line-height: 88rpx;
  663. font-size: 30rpx;
  664. padding: 0rpx 0 0 30rpx;
  665. }
  666. .ulRow {
  667. height: 100rpx;
  668. padding: 30rpx 0;
  669. }
  670. .ul2 {
  671. display: flex;
  672. flex-wrap: wrap;
  673. padding: 30rpx 10rpx;
  674. height: calc(100vh - 388rpx);
  675. overflow-y: auto;
  676. align-content: flex-start;
  677. .li2 {
  678. width: 16.6%;
  679. margin-bottom: 20rpx;
  680. .num {
  681. width: 100rpx;
  682. height: 100rpx;
  683. border-radius: 50%;
  684. margin: auto;
  685. background: #F6F7FA;
  686. font-size: 32rpx;
  687. line-height: 100rpx;
  688. text-align: center;
  689. position: relative;
  690. text {
  691. width: 68rpx;
  692. height: 34rpx;
  693. background: #3776FF;
  694. border-radius: 17rpx;
  695. display: block;
  696. font-weight: 400;
  697. font-size: 24rpx;
  698. color: #FFFFFF;
  699. text-align: center;
  700. line-height: 34rpx;
  701. position: absolute;
  702. bottom: -14rpx;
  703. left: 16rpx;
  704. }
  705. &.yes {
  706. border: 1px solid #63C168;
  707. background: rgba(99,193,104,0.1);
  708. color: #63C168;
  709. }
  710. &.no {
  711. border: 1px solid #FF3333;
  712. background: rgba(255,51,51,0.1);
  713. color: #FF3333;
  714. }
  715. }
  716. }
  717. }
  718. }
  719. .commitCon {
  720. width: calc(100vw - 100rpx);
  721. padding: 30rpx;
  722. .tit {
  723. font-weight: 500;
  724. font-size: 36rpx;
  725. color: #333333;
  726. text-align: center;
  727. }
  728. .flex {
  729. .commitItem {
  730. flex: 1;
  731. text-align: center;
  732. padding: 50rpx 0 40rpx 0;
  733. .lab {
  734. font-size: 28rpx;
  735. color: #CCCCCC;
  736. margin-top: 10rpx;
  737. }
  738. .num {
  739. font-weight: bold;
  740. font-size: 36rpx;
  741. color: #333333;
  742. }
  743. }
  744. }
  745. .imgAdd {
  746. width: 100%;
  747. img {
  748. }
  749. }
  750. .btn_commit_row {
  751. padding-top: 40rpx;
  752. .border.btn {
  753. border: 1rpx solid #CCCCCC;
  754. color: #CCCCCC;
  755. background: none;
  756. }
  757. .btn {
  758. width: 46%;
  759. height: 77rpx;
  760. text-align: center;
  761. line-height: 77rpx;
  762. background: #3776FF;
  763. border-radius: 39rpx;
  764. font-size: 28rpx;
  765. color: #FFFFFF;
  766. }
  767. }
  768. }
  769. </style>