studyTimes.vue 68 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258
  1. <template>
  2. <div id="studyTimes">
  3. <div class="top_style">
  4. <header>
  5. <div class="left"><i></i><span>学员信息</span></div>
  6. <span style="margin-left: 10px"
  7. ><strong style="color: red">「1」</strong>所购商品:{{
  8. userData.goodsName
  9. }}</span
  10. >
  11. <span style="margin-left: 10px"
  12. ><strong style="color: red">「2」</strong>所在班级:{{
  13. userData.className
  14. }}</span
  15. >
  16. <span style="margin-left: 10px"
  17. ><strong style="color: red">「3」</strong>学时:{{
  18. userData.classHours
  19. }}</span
  20. >
  21. <span style="margin-left: 10px"
  22. ><strong style="color: red">「4」</strong>完成{{
  23. userData.stuAllNum + userData.recordNum
  24. }}节的内容学习</span
  25. >
  26. <span style="margin-left: 10px"
  27. ><strong style="color: red">「5」</strong>学习时间:{{
  28. $methodsTools.onlyForma(userData.studyStartTime, false)
  29. }}
  30. - {{ $methodsTools.onlyForma(userData.studyEndTime, false) }}</span
  31. >
  32. <el-button type="primary" size="mini" @click="showBox = !showBox">{{
  33. showBox ? "收起" : "展开"
  34. }}</el-button>
  35. </header>
  36. <div class="info_img" v-show="showBox">
  37. <ul>
  38. <li>学员编码:{{ userData.studentCode }}</li>
  39. <li>学员姓名:{{ userData.realName }}</li>
  40. <li>学员身份证号码:{{ userData.idCard }}</li>
  41. <li>绑定手机号码:{{ userData.telPhone }}</li>
  42. </ul>
  43. <div class="img_by">
  44. <div class="photoSty1">
  45. <img
  46. v-if="!userData.oneInchPhotos"
  47. src="@/assets/images/peopleImg.png"
  48. alt=""
  49. />
  50. <el-image
  51. v-else
  52. style="width: 100%; height: 100%"
  53. :src="$methodsTools.splitImgHost(userData.oneInchPhotos)"
  54. :preview-src-list="[
  55. $methodsTools.splitImgHost(userData.oneInchPhotos),
  56. ]"
  57. >
  58. </el-image>
  59. <div class="pos_bottom">一寸头像图</div>
  60. </div>
  61. <div class="photoSty2">
  62. <img
  63. v-if="!userData.idCardImg1"
  64. src="@/assets/images/idcardF.png"
  65. alt=""
  66. />
  67. <el-image
  68. v-else
  69. style="width: 100%; height: 100%"
  70. :src="$methodsTools.splitImgHost(userData.idCardImg1)"
  71. :preview-src-list="[
  72. $methodsTools.splitImgHost(userData.idCardImg1),
  73. ]"
  74. >
  75. </el-image>
  76. <div class="pos_bottom">身份证头像照</div>
  77. </div>
  78. <div class="photoSty2" style="margin-right: 0px">
  79. <img
  80. v-if="!userData.idCardImg2"
  81. src="@/assets/images/idcardZ.png"
  82. alt=""
  83. />
  84. <el-image
  85. v-else
  86. style="width: 100%; height: 100%"
  87. :src="$methodsTools.splitImgHost(userData.idCardImg2)"
  88. :preview-src-list="[
  89. $methodsTools.splitImgHost(userData.idCardImg2),
  90. ]"
  91. >
  92. </el-image>
  93. <div class="pos_bottom">身份证国徽照</div>
  94. </div>
  95. </div>
  96. </div>
  97. </div>
  98. <div class="studyStyle" v-if="!true">
  99. <div class="a_style">
  100. <i></i>
  101. <span>视频审核进度</span>
  102. <div class="flex_style_study">
  103. <div class="num_style" style="color: #0047d0">
  104. 待审:{{ userData.pending }}节
  105. </div>
  106. <div class="num_style" style="color: #e53935">
  107. 作弊:{{ userData.cheat }}节
  108. </div>
  109. <div class="num_style" style="color: #43a047">
  110. 通过:{{ userData.pass }}节
  111. </div>
  112. <div style="clear: both"></div>
  113. </div>
  114. </div>
  115. <div class="a_style">
  116. <i></i>
  117. <span>做题审核进度</span>
  118. <div class="flex_style_study">
  119. <div class="num_style" style="color: #0047d0">
  120. 待审:{{ userData.examPending }}节
  121. </div>
  122. <div class="num_style" style="color: #e53935">
  123. 作弊:{{ userData.examCheat }}节
  124. </div>
  125. <div class="num_style" style="color: #43a047">
  126. 通过:{{ userData.examPass }}节
  127. </div>
  128. <div style="clear: both"></div>
  129. </div>
  130. </div>
  131. <div class="a_style" style="width: 280px">
  132. <i></i>
  133. <span>学时审批状态</span>
  134. <div class="flex_style_study">
  135. <div class="num_style" style="color: #0047d0">
  136. {{
  137. userData.periodStatus === 0
  138. ? "未通过"
  139. : userData.periodStatus === 2
  140. ? "待审核"
  141. : userData.periodStatus === -1
  142. ? "不可审核"
  143. : userData.periodStatus === 1
  144. ? "通过审核"
  145. : userData.periodStatus === 3
  146. ? "审核中"
  147. : "未知状态,请联系管理员"
  148. }}
  149. </div>
  150. <div style="clear: both"></div>
  151. </div>
  152. </div>
  153. <div class="s_sd">
  154. <span v-if="userData.periodStatus !== 3">
  155. <el-checkbox
  156. v-if="userData.periodStatus === 2"
  157. :disabled="!getAllList.length"
  158. :indeterminate="isIndeterminate"
  159. v-model="checkAll"
  160. @change="handleCheckAllChange"
  161. >待审全选</el-checkbox
  162. >
  163. <el-button
  164. style="margin-left: 10px"
  165. size="mini"
  166. type="success"
  167. v-if="userData.periodStatus === 2"
  168. @click="getChangeStatus(1)"
  169. >勾选通过</el-button
  170. >
  171. <el-button
  172. size="mini"
  173. type="danger"
  174. v-if="userData.periodStatus === 2"
  175. @click="getChangeStatus(2)"
  176. >勾选作弊</el-button
  177. >
  178. </span>
  179. <span v-else>
  180. <el-button style="margin-left: 10px" size="mini" @click="checkBack"
  181. >勾选数据,打回待审核状态</el-button
  182. >
  183. <el-button size="mini" type="warning" @click="approvedOK = true"
  184. >确认审核通过结果</el-button
  185. >
  186. </span>
  187. </div>
  188. </div>
  189. <Study-tables
  190. v-if="tablesData.length"
  191. :tablesData="tablesData"
  192. :userData="userData"
  193. :setData="setData"
  194. ></Study-tables>
  195. <div style="flex: 1; flex-shrink: 0; overflow: auto" v-if="!true">
  196. <el-checkbox-group
  197. v-model="checkList"
  198. @change="handleCheckedCitiesChange"
  199. >
  200. <el-table
  201. :default-expand-all="defaultExpand"
  202. v-for="asrt in computedList(listLabel)"
  203. border
  204. v-loading="loading"
  205. :key="asrt.value"
  206. :data="listData[`tableData${asrt.value + 1}`]"
  207. style="width: 100%; border-radius: 4px; overflow: hidden"
  208. :header-cell-style="
  209. asrt.value === 0
  210. ? {
  211. 'background-color': '#CCDDF7',
  212. padding: '8px',
  213. color: '#0047D0',
  214. 'border-right-color': '#0047D0',
  215. 'border-left-color': '#0047D0',
  216. }
  217. : asrt.value === 1
  218. ? {
  219. 'background-color': '#D9ECFA',
  220. padding: '8px',
  221. color: '#1565C0',
  222. 'border-right-color': '#1565C0',
  223. 'border-left-color': '#1565C0',
  224. }
  225. : asrt.value === 2
  226. ? {
  227. 'background-color': '#F5F5F5',
  228. padding: '8px',
  229. color: '#666',
  230. }
  231. : ''
  232. "
  233. >
  234. <!-- 插槽开始--------------------------------------------------------- -->
  235. <el-table-column
  236. :label="['模块', '章', '节/卷'][asrt.value]"
  237. type="expand"
  238. width="70px"
  239. >
  240. <template slot-scope="scope">
  241. <!-- type为3时使用该插槽START -->
  242. <div
  243. v-if="scope.row.type === 3 || scope.row.type === 4"
  244. class="dis_flexs"
  245. >
  246. <ul
  247. style="flex: 1"
  248. v-if="
  249. scope.row.userStudyRecordPhotoList &&
  250. scope.row.userStudyRecordPhotoList.length
  251. "
  252. >
  253. <li
  254. v-for="(its, inds) in scope.row.userStudyRecordPhotoList"
  255. :key="inds"
  256. class="liImgs"
  257. >
  258. <el-image
  259. style="width: 100%; height: 100%"
  260. :src="$methodsTools.splitImgHost(its.photo)"
  261. :preview-src-list="[
  262. $methodsTools.splitImgHost(its.photo),
  263. ]"
  264. >
  265. </el-image>
  266. <div class="abos">
  267. {{ $methodsTools.onlyForma(its.createTime) }}
  268. </div>
  269. </li>
  270. <div style="clear: both"></div>
  271. </ul>
  272. <p v-else style="text-align: center; width: 100%">
  273. 暂无拍照数据
  274. </p>
  275. <div
  276. class="styFlex"
  277. v-if="
  278. (userData.periodStatus === 0 ||
  279. userData.periodStatus === 2 ||
  280. userData.periodStatus === 3) &&
  281. scope.row.periodStatus === 1
  282. "
  283. >
  284. <div>
  285. <el-checkbox
  286. class="checkboxList"
  287. :label="scope.row.periodStatusId"
  288. :disabled="
  289. userData.periodStatus === 3
  290. ? false
  291. : scope.row.status !== 2
  292. ? true
  293. : false
  294. "
  295. ><br
  296. /></el-checkbox>
  297. </div>
  298. <el-button
  299. :disabled="scope.row.status !== 2"
  300. class="btnstyles"
  301. size="small"
  302. type="success"
  303. :loading="disabledBtn"
  304. @click="changeStatus(scope.row, 1, scope.$index)"
  305. >通过</el-button
  306. >
  307. <el-button
  308. :disabled="scope.row.status !== 2"
  309. class="btnstyles"
  310. size="small"
  311. type="danger"
  312. @click="changeStatus(scope.row, 2, scope.$index)"
  313. >作弊</el-button
  314. >
  315. </div>
  316. </div>
  317. <!-- type为3时使用该插槽END -->
  318. <!-- 章表格START -->
  319. <el-table
  320. v-else
  321. border
  322. :data="
  323. scope.row.type === 1
  324. ? scope.row.classPeriods
  325. : scope.row.type === 2
  326. ? scope.row.classPeriodSectionList
  327. : ''
  328. "
  329. :default-expand-all="defaultExpand"
  330. :header-cell-style="
  331. scope.row.type === 1
  332. ? {
  333. 'background-color': '#D9ECFA',
  334. padding: '8px',
  335. color: '#1565C0',
  336. 'border-right-color': '#1565C0',
  337. 'border-left-color': '#1565C0',
  338. }
  339. : scope.row.type === 2
  340. ? {
  341. 'background-color': '#f5f5f5',
  342. padding: '8px',
  343. color: '#666',
  344. }
  345. : ''
  346. "
  347. >
  348. <!-- 章插槽START -->
  349. <el-table-column
  350. type="expand"
  351. :label="
  352. scope.row.type === 1
  353. ? '章'
  354. : scope.row.type === 2
  355. ? '节/卷'
  356. : scope.row.type === 5
  357. ? '模块卷'
  358. : ''
  359. "
  360. :width="
  361. scope.row.type === 1
  362. ? '70px'
  363. : scope.row.type === 2
  364. ? '80px'
  365. : ''
  366. "
  367. >
  368. <template slot-scope="scope2">
  369. <!-- 节插槽START -->
  370. <div
  371. v-if="scope2.row.type === 3 || scope2.row.type === 4"
  372. class="dis_flexs"
  373. >
  374. <ul
  375. style="flex: 1"
  376. v-if="
  377. scope2.row.userStudyRecordPhotoList &&
  378. scope2.row.userStudyRecordPhotoList.length
  379. "
  380. >
  381. <li
  382. v-for="(its, inds) in scope2.row
  383. .userStudyRecordPhotoList"
  384. :key="inds"
  385. class="liImgs"
  386. >
  387. <el-image
  388. style="width: 100%; height: 100%"
  389. :src="$methodsTools.splitImgHost(its.photo)"
  390. :preview-src-list="[
  391. $methodsTools.splitImgHost(its.photo),
  392. ]"
  393. >
  394. </el-image>
  395. <div class="abos">
  396. {{ $methodsTools.onlyForma(its.createTime) }}
  397. </div>
  398. </li>
  399. <div style="clear: both"></div>
  400. </ul>
  401. <p v-else style="text-align: center; width: 100%">
  402. 暂无拍照数据
  403. </p>
  404. <div
  405. class="styFlex"
  406. v-if="
  407. (userData.periodStatus === 0 ||
  408. userData.periodStatus === 2 ||
  409. userData.periodStatus === 3) &&
  410. scope2.row.periodStatus === 1
  411. "
  412. >
  413. <div>
  414. <el-checkbox
  415. class="checkboxList"
  416. :label="scope2.row.periodStatusId"
  417. :disabled="
  418. userData.periodStatus === 3
  419. ? false
  420. : scope2.row.status !== 2
  421. ? true
  422. : false
  423. "
  424. ><br
  425. /></el-checkbox>
  426. </div>
  427. <el-button
  428. :disabled="scope2.row.status !== 2"
  429. class="btnstyles"
  430. size="small"
  431. type="success"
  432. :loading="disabledBtn"
  433. @click="
  434. changeStatusCharpter(
  435. scope2.row,
  436. 1,
  437. scope.$index,
  438. scope2.$index
  439. )
  440. "
  441. >通过</el-button
  442. >
  443. <el-button
  444. :disabled="scope2.row.status !== 2"
  445. class="btnstyles"
  446. size="small"
  447. type="danger"
  448. @click="
  449. changeStatusCharpter(
  450. scope2.row,
  451. 2,
  452. scope.$index,
  453. scope2.$index
  454. )
  455. "
  456. >作弊</el-button
  457. >
  458. </div>
  459. </div>
  460. <!-- 节插槽END -->
  461. <!-- 节表格START -->
  462. <el-table
  463. v-else
  464. border
  465. :data="
  466. scope2.row.type === 2
  467. ? scope2.row.classPeriodSectionList
  468. : ''
  469. "
  470. :default-expand-all="defaultExpand"
  471. :header-cell-style="
  472. scope2.row.type === 2
  473. ? {
  474. 'background-color': '#f5f5f5',
  475. padding: '8px',
  476. color: '#666',
  477. }
  478. : ''
  479. "
  480. >
  481. <!-- 节插槽START -->
  482. <el-table-column
  483. type="expand"
  484. :label="scope2.row.type === 2 ? '节/卷' : ''"
  485. width="80px"
  486. >
  487. <template slot-scope="scope3">
  488. <div
  489. v-if="
  490. scope3.row.type === 3 || scope3.row.type === 4
  491. "
  492. class="dis_flexs"
  493. >
  494. <ul
  495. style="flex: 1"
  496. v-if="
  497. scope3.row.userStudyRecordPhotoList &&
  498. scope3.row.userStudyRecordPhotoList.length
  499. "
  500. >
  501. <li
  502. v-for="(its, inds) in scope3.row
  503. .userStudyRecordPhotoList"
  504. :key="inds"
  505. class="liImgs"
  506. >
  507. <el-image
  508. style="width: 100%; height: 100%"
  509. :src="$methodsTools.splitImgHost(its.photo)"
  510. :preview-src-list="[
  511. $methodsTools.splitImgHost(its.photo),
  512. ]"
  513. >
  514. </el-image>
  515. <div class="abos">
  516. {{ $methodsTools.onlyForma(its.createTime) }}
  517. </div>
  518. </li>
  519. <div style="clear: both"></div>
  520. </ul>
  521. <p v-else style="text-align: center; width: 100%">
  522. 暂无拍照数据
  523. </p>
  524. <div
  525. class="styFlex"
  526. v-if="
  527. (userData.periodStatus === 0 ||
  528. userData.periodStatus === 2 ||
  529. userData.periodStatus === 3) &&
  530. scope3.row.periodStatus === 1
  531. "
  532. >
  533. <div>
  534. <el-checkbox
  535. class="checkboxList"
  536. :label="scope3.row.periodStatusId"
  537. :disabled="
  538. userData.periodStatus === 3
  539. ? false
  540. : scope3.row.status !== 2
  541. ? true
  542. : false
  543. "
  544. ><br
  545. /></el-checkbox>
  546. </div>
  547. <el-button
  548. :disabled="scope3.row.status !== 2"
  549. class="btnstyles"
  550. size="small"
  551. type="success"
  552. :loading="disabledBtn"
  553. @click="
  554. changeStatusModule(
  555. scope3.row,
  556. 1,
  557. scope.$index,
  558. scope2.$index,
  559. scope3.$index
  560. )
  561. "
  562. >通过</el-button
  563. >
  564. <el-button
  565. :disabled="scope3.row.status !== 2"
  566. class="btnstyles"
  567. size="small"
  568. type="danger"
  569. @click="
  570. changeStatusModule(
  571. scope3.row,
  572. 2,
  573. scope.$index,
  574. scope2.$index,
  575. scope3.$index
  576. )
  577. "
  578. >作弊</el-button
  579. >
  580. </div>
  581. </div>
  582. </template>
  583. </el-table-column>
  584. <!-- 节插槽END -->
  585. <el-table-column
  586. v-for="(item, index) in scope2.row.type === 2
  587. ? tableSet3
  588. : ''"
  589. :width="item.width"
  590. :key="index"
  591. :label="item.label"
  592. align="center"
  593. >
  594. <template slot-scope="scope3">
  595. <span v-if="item.scope === 'select'">
  596. <span
  597. v-for="(k, ds) in item.options"
  598. :key="ds"
  599. :style="
  600. scope3.row[item.prop] === 0
  601. ? 'color:red;'
  602. : scope3.row[item.prop] === 2
  603. ? 'color:#0047D0;'
  604. : scope3.row[item.prop] === 1
  605. ? 'color:#67C23A;'
  606. : ''
  607. "
  608. >
  609. {{
  610. k.value == scope3.row[item.prop] ? k.label : ""
  611. }}
  612. </span>
  613. </span>
  614. <div v-else-if="item.scope === 'activeNum'">
  615. <el-select
  616. v-model="scope3.row[item.prop]"
  617. placeholder="请选择"
  618. @change="
  619. getNewListMores(
  620. scope.$index,
  621. scope2.$index,
  622. scope3.$index,
  623. $event,
  624. scope3.row
  625. )
  626. "
  627. >
  628. <el-option
  629. v-for="(items, indexs) in scope3.row['numList']"
  630. :key="indexs"
  631. :label="'第' + items + '次审核记录'"
  632. :value="items"
  633. >
  634. </el-option>
  635. </el-select>
  636. </div>
  637. <span v-else-if="item.scope === 'typeOptions'">
  638. <span v-for="(is, ds) in item.options" :key="ds">
  639. <span v-if="is.value === scope3.row[item.prop]">{{
  640. is.label
  641. }}</span>
  642. </span>
  643. </span>
  644. <span v-else-if="item.scope === 'aTime'">
  645. {{ $methodsTools.onlyForma(scope3.row[item.prop]) }}
  646. </span>
  647. <span v-else-if="item.scope === 'durTime'">
  648. {{
  649. $methodsTools.secondToDate(
  650. scope3.row[item.prop],
  651. false
  652. )
  653. }}
  654. </span>
  655. <div v-else-if="item.scope === 'aTimeSE'">
  656. <span
  657. v-if="
  658. scope3.row['type'] === 3 &&
  659. scope3.row['durationTime'] &&
  660. scope3.row['studyStartTime'] &&
  661. scope3.row['studyEndTime']
  662. "
  663. :style="comput(scope3.row)"
  664. >
  665. {{
  666. $methodsTools.onlyForma(scope3.row[item.prop])
  667. }}
  668. </span>
  669. <span v-else>
  670. {{
  671. $methodsTools.onlyForma(scope3.row[item.prop])
  672. }}
  673. </span>
  674. </div>
  675. <span v-else> {{ scope3.row[item.prop] }} </span>
  676. </template>
  677. </el-table-column>
  678. </el-table>
  679. <!-- 节表格END -->
  680. </template>
  681. </el-table-column>
  682. <!-- 章插槽END -->
  683. <el-table-column
  684. v-for="(item, index) in scope.row.type === 1
  685. ? tableSet2
  686. : scope.row.type === 2
  687. ? tableSet3
  688. : ''"
  689. :width="item.width"
  690. :key="index"
  691. :label="item.label"
  692. align="center"
  693. >
  694. <template slot-scope="scope2">
  695. <span v-if="item.scope === 'select'">
  696. <span
  697. v-for="(k, ds) in item.options"
  698. :key="ds"
  699. :style="
  700. scope2.row[item.prop] === 0
  701. ? 'color:red;'
  702. : scope2.row[item.prop] === 2
  703. ? 'color:#0047D0;'
  704. : scope2.row[item.prop] === 1
  705. ? 'color:#67C23A;'
  706. : ''
  707. "
  708. >
  709. {{ k.value == scope2.row[item.prop] ? k.label : "" }}
  710. </span>
  711. </span>
  712. <div v-else-if="item.scope === 'activeNum'">
  713. <el-select
  714. v-model="scope2.row[item.prop]"
  715. placeholder="请选择"
  716. @change="
  717. getNewListchapt(
  718. scope.$index,
  719. scope2.$index,
  720. $event,
  721. scope2.row
  722. )
  723. "
  724. >
  725. <el-option
  726. v-for="(items, indexs) in scope2.row['numList']"
  727. :key="indexs"
  728. :label="'第' + items + '次审核记录'"
  729. :value="items"
  730. >
  731. </el-option>
  732. </el-select>
  733. </div>
  734. <span v-else-if="item.scope === 'typeOptions'">
  735. <span v-for="(is, ds) in item.options" :key="ds">
  736. <span v-if="is.value === scope2.row[item.prop]">{{
  737. is.label
  738. }}</span>
  739. </span>
  740. </span>
  741. <span v-else-if="item.scope === 'aTime'">
  742. {{ $methodsTools.onlyForma(scope2.row[item.prop]) }}
  743. </span>
  744. <span v-else-if="item.scope === 'durTime'">
  745. {{
  746. $methodsTools.secondToDate(scope2.row[item.prop], false)
  747. }}
  748. </span>
  749. <div v-else-if="item.scope === 'aTimeSE'">
  750. <span
  751. v-if="
  752. scope2.row['type'] === 3 &&
  753. scope2.row['durationTime'] &&
  754. scope2.row['studyStartTime'] &&
  755. scope2.row['studyEndTime']
  756. "
  757. :style="comput(scope2.row)"
  758. >
  759. {{ $methodsTools.onlyForma(scope2.row[item.prop]) }}
  760. </span>
  761. <span v-else>
  762. {{ $methodsTools.onlyForma(scope2.row[item.prop]) }}
  763. </span>
  764. </div>
  765. <span v-else> {{ scope2.row[item.prop] }} </span>
  766. </template>
  767. </el-table-column>
  768. </el-table>
  769. <!-- 章表格END -->
  770. </template>
  771. </el-table-column>
  772. <!-- 插槽结束--------------------------------------------------------- -->
  773. <el-table-column
  774. v-for="(item, index) in asrt.value === 0
  775. ? tableSet1
  776. : asrt.value === 1
  777. ? tableSet2
  778. : asrt.value === 2
  779. ? tableSet3
  780. : ''"
  781. :width="item.width"
  782. :key="index"
  783. :label="item.label"
  784. align="center"
  785. >
  786. <template slot-scope="scope">
  787. <span v-if="item.scope === 'select'">
  788. <span
  789. v-for="(k, ds) in item.options"
  790. :key="ds"
  791. :style="
  792. scope.row[item.prop] === 0
  793. ? 'color:red;'
  794. : scope.row[item.prop] === 2
  795. ? 'color:#0047D0;'
  796. : scope.row[item.prop] === 1
  797. ? 'color:#67C23A;'
  798. : ''
  799. "
  800. >
  801. {{ k.value == scope.row[item.prop] ? k.label : "" }}
  802. </span>
  803. </span>
  804. <div v-else-if="item.scope === 'activeNum'">
  805. <el-select
  806. v-model="scope.row[item.prop]"
  807. placeholder="请选择"
  808. @change="getNewList(scope.$index, $event, scope.row)"
  809. >
  810. <el-option
  811. v-for="(items, indexs) in scope.row['numList']"
  812. :key="indexs"
  813. :label="'第' + items + '次审核记录'"
  814. :value="items"
  815. >
  816. </el-option>
  817. </el-select>
  818. </div>
  819. <span v-else-if="item.scope === 'typeOptions'">
  820. <span v-for="(is, ds) in item.options" :key="ds">
  821. <span v-if="is.value === scope.row[item.prop]">{{
  822. is.label
  823. }}</span>
  824. </span>
  825. </span>
  826. <span v-else-if="item.scope === 'aTime'">
  827. {{ $methodsTools.onlyForma(scope.row[item.prop]) }}
  828. </span>
  829. <span v-else-if="item.scope === 'durTime'">
  830. {{ $methodsTools.secondToDate(scope.row[item.prop], false) }}
  831. </span>
  832. <div v-else-if="item.scope === 'aTimeSE'">
  833. <span
  834. v-if="
  835. scope.row['type'] === 3 &&
  836. scope.row['durationTime'] &&
  837. scope.row['studyStartTime'] &&
  838. scope.row['studyEndTime']
  839. "
  840. :style="comput(scope.row)"
  841. >
  842. {{ $methodsTools.onlyForma(scope.row[item.prop]) }}
  843. </span>
  844. <span v-else>
  845. {{ $methodsTools.onlyForma(scope.row[item.prop]) }}
  846. </span>
  847. </div>
  848. <span v-else>
  849. {{ scope.row[item.prop] }}{{ item.ch ? item.ch : "" }}
  850. </span>
  851. </template>
  852. </el-table-column>
  853. </el-table>
  854. </el-checkbox-group>
  855. </div>
  856. <el-dialog
  857. @closed="loadingClose"
  858. :visible.sync="vidBoxHours"
  859. v-if="vidBoxHours"
  860. width="560px"
  861. :show-close="false"
  862. :close-on-click-modal="false"
  863. >
  864. <div slot="title" class="hearders">
  865. <div class="leftTitle">操作提示:</div>
  866. <div class="rightBoxs">
  867. <img
  868. src="@/assets/images/Close@2x.png"
  869. alt=""
  870. @click="vidBoxHours = false"
  871. />
  872. </div>
  873. </div>
  874. <div>
  875. <el-form
  876. :model="formData"
  877. :rules="rules"
  878. ref="formData"
  879. label-width="80px"
  880. label-position="right"
  881. >
  882. <el-form-item label="作弊原因" prop="cheating_reason">
  883. <el-input
  884. v-model="formData.cheating_reason"
  885. type="textarea"
  886. :rows="4"
  887. placeholder="请输入作弊原因"
  888. ></el-input>
  889. <ul>
  890. <li
  891. class="li_sty"
  892. @click="uploadText(item.label)"
  893. v-for="(item, index) in msgTitle"
  894. :key="index"
  895. >
  896. {{ item.label }}
  897. </li>
  898. </ul>
  899. </el-form-item>
  900. </el-form>
  901. </div>
  902. <span slot="footer" class="dialog-footer">
  903. <el-button :loading="disabledBtn" @click="vidBoxHours = false"
  904. >取 消</el-button
  905. >
  906. <el-button :loading="disabledBtn" @click="submitForm('formData')"
  907. >确 定</el-button
  908. >
  909. </span>
  910. </el-dialog>
  911. <el-dialog
  912. @closed="loadingClose"
  913. :visible.sync="through"
  914. width="560px"
  915. :show-close="false"
  916. :close-on-click-modal="false"
  917. >
  918. <div slot="title" class="hearders">
  919. <div class="leftTitle">操作提示:</div>
  920. <div class="rightBoxs">
  921. <img
  922. src="@/assets/images/Close@2x.png"
  923. alt=""
  924. @click="through = false"
  925. />
  926. </div>
  927. </div>
  928. <div>
  929. 确定所勾选的内容,审核结果为【通过】?<br />
  930. 确认后,初审不可再修改,请检查清楚再操作!
  931. </div>
  932. <span slot="footer" class="dialog-footer">
  933. <el-button :loading="disabledBtn" @click="through = false"
  934. >取 消</el-button
  935. >
  936. <el-button :loading="disabledBtn" @click="submitOK(1)">确 定</el-button>
  937. </span>
  938. </el-dialog>
  939. <el-dialog
  940. @closed="loadingClose"
  941. :visible.sync="popback"
  942. width="560px"
  943. :show-close="false"
  944. :close-on-click-modal="false"
  945. >
  946. <div slot="title" class="hearders">
  947. <div class="leftTitle">操作提示:</div>
  948. <div class="rightBoxs">
  949. <img
  950. src="@/assets/images/Close@2x.png"
  951. alt=""
  952. @click="popback = false"
  953. />
  954. </div>
  955. </div>
  956. <div>
  957. <div style="color: red">
  958. <h4 style="margin: 0px">当前勾选了{{ checkList.length }}条数据:</h4>
  959. <ul style="margin: 0px 0px 6px; max-height: 500px; overflow: auto">
  960. <li v-for="(item, index) in checkList" :key="index">
  961. {{ index + 1 }}.{{ getSecName(item) }}
  962. </li>
  963. </ul>
  964. </div>
  965. <div style="text-align: center; font-weight: bold">
  966. 所选数据,确定要打回待审核状态吗?<br />
  967. 打回后,重新走审核流程,请慎重操作。
  968. </div>
  969. </div>
  970. <span slot="footer" class="dialog-footer">
  971. <el-button :loading="disabledBtn" @click="popback = false"
  972. >取 消</el-button
  973. >
  974. <el-button :loading="disabledBtn" @click="uploadForm">确 定</el-button>
  975. </span>
  976. </el-dialog>
  977. <el-dialog
  978. @closed="loadingClose"
  979. :visible.sync="approvedOK"
  980. width="560px"
  981. :show-close="false"
  982. :close-on-click-modal="false"
  983. >
  984. <div slot="title" class="hearders">
  985. <div class="leftTitle">操作提示:</div>
  986. <div class="rightBoxs">
  987. <img
  988. src="@/assets/images/Close@2x.png"
  989. alt=""
  990. @click="approvedOK = false"
  991. />
  992. </div>
  993. </div>
  994. <div>
  995. <div style="color: red">
  996. <h4 style="margin: 0px">确认审核通过结果后:</h4>
  997. <ul style="margin: 0px 0px 6px">
  998. <li>
  999. (1)有做官方接口的,自动触发【学时官方推送】<br />
  1000. (2)公开【学习学时记录-学时记录】按钮,权限人可查看【审核结果】<br />
  1001. (3)有匹配的预约考试,可走预约流程
  1002. </li>
  1003. </ul>
  1004. </div>
  1005. <div style="font-weight: bold; margin-top: 20px">
  1006. 确认提交审核通过结果?<br />
  1007. 确认后,不能再修改,请慎重操作。
  1008. </div>
  1009. </div>
  1010. <span slot="footer" class="dialog-footer">
  1011. <el-button :loading="disabledBtn" @click="approvedOK = false"
  1012. >取 消</el-button
  1013. >
  1014. <el-button :loading="disabledBtn" @click="approvedOKFunc"
  1015. >确 定</el-button
  1016. >
  1017. </span>
  1018. </el-dialog>
  1019. </div>
  1020. </template>
  1021. <script>
  1022. import StudyTables from "./component/StudyTables.vue";
  1023. export default {
  1024. props: ["setData"],
  1025. data() {
  1026. return {
  1027. showBox: true,
  1028. disabledBtn: false,
  1029. msgTitle: [
  1030. { label: "学习拍照异常", value: 1 },
  1031. {
  1032. label: "学习拍照太黑无法识别人像,请确保拍照光线充足并拍到全脸",
  1033. value: 2,
  1034. },
  1035. {
  1036. label: "学习拍照太模糊无法识别人像,请确保拍照光线充足并拍到全脸",
  1037. value: 3,
  1038. },
  1039. {
  1040. label: "学习拍照人像不全无法识别,请确保拍照光线充足并拍到全脸",
  1041. value: 4,
  1042. },
  1043. ],
  1044. formData: {
  1045. cheating_reason: "",
  1046. },
  1047. vidBoxHours: false,
  1048. through: false, //通过提示弹窗
  1049. checkList: [], //勾选列表
  1050. isIndeterminate: false, //待审半选
  1051. checkAll: false, //全选状态
  1052. defaultExpand: true,
  1053. size: "medium",
  1054. active: "",
  1055. loading: false,
  1056. studentCode: "",
  1057. realName: "",
  1058. idCard: "",
  1059. telPhone: "",
  1060. recent_photos: "",
  1061. idcard_face_photo: "",
  1062. idcard_national_photo: "",
  1063. listLabel: [
  1064. {
  1065. label: "模块卷",
  1066. value: 0,
  1067. },
  1068. {
  1069. label: "章卷",
  1070. value: 1,
  1071. },
  1072. {
  1073. label: "节",
  1074. value: 2,
  1075. },
  1076. {
  1077. label: "模块卷1",
  1078. value: 4,
  1079. },
  1080. ],
  1081. arr: ["tableData1", "tableData2", "tableData3"],
  1082. listData: {
  1083. tableData1: [],
  1084. tableData2: [],
  1085. tableData3: [],
  1086. tableData5: [],
  1087. },
  1088. getAllList: [], //统计得到待审核列表所有
  1089. userData: {},
  1090. tableData: [],
  1091. tableSet1: [
  1092. {
  1093. label: "姓名",
  1094. prop: "realName",
  1095. },
  1096. {
  1097. label: "模块标题",
  1098. prop: "typeName",
  1099. },
  1100. ],
  1101. tableSet2: [
  1102. {
  1103. label: "姓名",
  1104. prop: "realName",
  1105. },
  1106. {
  1107. label: "章标题",
  1108. prop: "typeName",
  1109. },
  1110. {
  1111. label: "学时",
  1112. prop: "classHours",
  1113. },
  1114. {
  1115. label: "开始学习时间",
  1116. prop: "studyStartTime",
  1117. scope: "aTime",
  1118. },
  1119. {
  1120. label: "结束学习时间",
  1121. prop: "studyEndTime",
  1122. scope: "aTime",
  1123. },
  1124. {
  1125. label: "测试成绩",
  1126. prop: "performance",
  1127. },
  1128. ],
  1129. tableSet3: [
  1130. {
  1131. label: "选择",
  1132. prop: "numIndex",
  1133. scope: "activeNum",
  1134. width: "180px",
  1135. },
  1136. {
  1137. label: "姓名",
  1138. prop: "realName",
  1139. },
  1140. {
  1141. label: "标题",
  1142. prop: "typeName",
  1143. },
  1144. {
  1145. label: "类型",
  1146. prop: "type",
  1147. scope: "typeOptions",
  1148. width: "90px",
  1149. options: [
  1150. {
  1151. label: "节",
  1152. value: 3,
  1153. },
  1154. {
  1155. label: "试卷",
  1156. value: 4,
  1157. },
  1158. ],
  1159. },
  1160. {
  1161. label: "节时长",
  1162. prop: "durationTime",
  1163. width: "120px",
  1164. scope: "durTime",
  1165. },
  1166. {
  1167. label: "开始时间",
  1168. prop: "studyStartTime",
  1169. scope: "aTimeSE",
  1170. },
  1171. {
  1172. label: "结束时间",
  1173. prop: "studyEndTime",
  1174. scope: "aTimeSE",
  1175. },
  1176. {
  1177. label: "审核状态",
  1178. prop: "status",
  1179. scope: "select",
  1180. width: "100px",
  1181. options: [
  1182. {
  1183. label: "待审核",
  1184. value: 2,
  1185. },
  1186. {
  1187. label: "通过",
  1188. value: 1,
  1189. },
  1190. {
  1191. label: "作弊",
  1192. value: 0,
  1193. },
  1194. {
  1195. label: "待重修",
  1196. value: 3,
  1197. },
  1198. ],
  1199. },
  1200. {
  1201. label: "审核人",
  1202. prop: "auditUserName",
  1203. width: "100px",
  1204. },
  1205. {
  1206. label: "审核时间",
  1207. prop: "auditTime",
  1208. scope: "aTime",
  1209. },
  1210. ],
  1211. tableDataChild: {},
  1212. tableSetChild: [],
  1213. copyDatas: {}, //记录点击信息
  1214. statusPop: "", //1单个2批量
  1215. setTimeDOM: null, //定时器
  1216. rules: {
  1217. cheating_reason: [
  1218. {
  1219. required: true,
  1220. message: "请填写作弊原因",
  1221. trigger: ["blur", "change"],
  1222. },
  1223. ],
  1224. },
  1225. allArrays: [], //审核中-所有数据
  1226. popback: false, //打回待审核弹窗
  1227. approvedOK: false, //确认审核通过结果
  1228. tablesData: [],
  1229. };
  1230. },
  1231. computed: {
  1232. /**
  1233. * 若数组无数据 则不显示对应第一模块表格
  1234. */
  1235. computedList: function () {
  1236. return function (value) {
  1237. var arr = value.filter((item) => {
  1238. if (item.value === 0) {
  1239. if (this.listData.tableData1.length) {
  1240. return item;
  1241. }
  1242. }
  1243. if (item.value === 1) {
  1244. if (this.listData.tableData2.length) {
  1245. return item;
  1246. }
  1247. }
  1248. if (item.value === 2) {
  1249. if (this.listData.tableData3.length) {
  1250. return item;
  1251. }
  1252. }
  1253. });
  1254. return arr;
  1255. };
  1256. },
  1257. },
  1258. watch: {
  1259. "userData.periodStatus"(val, oldVal) {
  1260. if (val == 3 && oldVal == 2) {
  1261. this.search();
  1262. }
  1263. },
  1264. },
  1265. created() {
  1266. this.$api
  1267. .inquireGradegradelockPeriodStatus({
  1268. gradeId: Number(this.setData.id),
  1269. userId: Number(this.setData.userId),
  1270. goodsId: Number(this.setData.goodsId),
  1271. })
  1272. .then((res) => {
  1273. if (res.msg) {
  1274. this.$alert(`${res.msg}正在操作该页面,请关闭当前页`, "提示", {
  1275. dangerouslyUseHTMLString: true,
  1276. showClose: false,
  1277. }).then((result) => {
  1278. const SESSION = sessionStorage.getItem("hoursAudit");
  1279. let parseSession = {};
  1280. if (SESSION) {
  1281. parseSession = JSON.parse(SESSION);
  1282. }
  1283. if (parseSession.options.length > 1) {
  1284. this.$emit("removeTab", this.setData.keyId);
  1285. } else {
  1286. this.$store
  1287. .dispatch("tagsView/delView", this.$route)
  1288. .then((results) => {
  1289. this.$router.go(-1);
  1290. });
  1291. }
  1292. });
  1293. } else {
  1294. this.getSetTime();
  1295. // 每10秒调用一次 锁定页面
  1296. this.setTimeDOM = setInterval(() => {
  1297. this.getSetTime();
  1298. }, 10000);
  1299. }
  1300. });
  1301. },
  1302. async mounted() {
  1303. await this.getUserInfo();
  1304. this.search();
  1305. },
  1306. methods: {
  1307. loadingClose() {
  1308. this.disabledBtn = false;
  1309. },
  1310. /**
  1311. * 每10秒调用一次 锁定页面
  1312. */
  1313. getSetTime() {
  1314. this.$api
  1315. .inquireGradegradelockPeriod({
  1316. gradeId: Number(this.setData.id),
  1317. userId: Number(this.setData.userId),
  1318. goodsId: Number(this.setData.goodsId),
  1319. })
  1320. .then((res) => {});
  1321. },
  1322. /**
  1323. * 确认审核通过结果
  1324. */
  1325. approvedOKFunc() {
  1326. this.disabledBtn = true;
  1327. let data = {
  1328. gradeId: Number(this.setData.id),
  1329. userId: Number(this.setData.userId),
  1330. goodsId: Number(this.setData.goodsId),
  1331. };
  1332. this.$api
  1333. .editGradeUsereditrollconfirmPeriod(data)
  1334. .then(async (res) => {
  1335. await this.getUserInfo();
  1336. this.search();
  1337. this.$message.success("审核通过");
  1338. this.approvedOK = false;
  1339. })
  1340. .catch(() => {
  1341. this.disabledBtn = false;
  1342. });
  1343. },
  1344. /**
  1345. * 打回待审核状态
  1346. */
  1347. uploadForm() {
  1348. this.disabledBtn = true;
  1349. let data = {
  1350. gradeId: Number(this.setData.id),
  1351. userId: Number(this.setData.userId),
  1352. goodsId: Number(this.setData.goodsId),
  1353. ids: this.checkList,
  1354. };
  1355. this.$api
  1356. .editGradeUsereditrollbackPeriod(data)
  1357. .then(async (res) => {
  1358. this.checkList = []; //勾选列表
  1359. this.isIndeterminate = false; //待审半选
  1360. this.checkAll = false; //全选状态
  1361. await this.getUserInfo();
  1362. this.search();
  1363. this.$message.success("已打回待审核状态");
  1364. this.popback = false;
  1365. })
  1366. .catch(() => {
  1367. this.disabledBtn = false;
  1368. });
  1369. },
  1370. /**
  1371. *
  1372. * @param {Number} id 学时ID
  1373. * @remards 节ID转节标题返回
  1374. */
  1375. getSecName(id) {
  1376. for (let i = 0; i < this.allArrays.length; i++) {
  1377. if (this.allArrays[i].periodStatusId === id) {
  1378. return this.allArrays[i].typeName;
  1379. }
  1380. }
  1381. },
  1382. /**
  1383. * 弹出提示窗:勾选数据-打回待审核状态
  1384. */
  1385. checkBack() {
  1386. if (!this.checkList.length) {
  1387. this.$message.warning("请勾选数据");
  1388. return;
  1389. }
  1390. this.popback = true;
  1391. },
  1392. /**
  1393. *
  1394. * @param {String} formName
  1395. * @remards 表单验证
  1396. */
  1397. submitForm(formName) {
  1398. this.$refs[formName].validate((valid) => {
  1399. if (valid) {
  1400. if (this.statusPop === 1) {
  1401. this.formSubmits();
  1402. }
  1403. if (this.statusPop === 2) {
  1404. this.submitOK(2, this.formData.cheating_reason);
  1405. }
  1406. } else {
  1407. console.log("error submit!!");
  1408. return false;
  1409. }
  1410. });
  1411. },
  1412. /**
  1413. *
  1414. * @param {Object} item 节完整数据
  1415. * @remards 判断当前节是否看完 若没看完 则变更为红色字体
  1416. */
  1417. comput(item) {
  1418. var ast = item.studyEndTime - item.studyStartTime;
  1419. if (ast < item.durationTime) {
  1420. return "color:red;";
  1421. } else {
  1422. return "";
  1423. }
  1424. },
  1425. /**
  1426. *
  1427. * @param {Strings} msg
  1428. * @remards 点击录入文本
  1429. */
  1430. uploadText(msg) {
  1431. this.formData.cheating_reason = msg;
  1432. },
  1433. /**
  1434. * 提交表单
  1435. */
  1436. formSubmits() {
  1437. this.disabledBtn = true;
  1438. var self = this;
  1439. switch (this.copyDatas.type) {
  1440. case 1:
  1441. self.changeStatusModule(
  1442. this.copyDatas.item,
  1443. this.copyDatas.int,
  1444. this.copyDatas.index1,
  1445. this.copyDatas.index2,
  1446. this.copyDatas.index3,
  1447. this.formData.cheating_reason
  1448. );
  1449. break;
  1450. case 2:
  1451. self.changeStatusCharpter(
  1452. this.copyDatas.item,
  1453. this.copyDatas.int,
  1454. this.copyDatas.index1,
  1455. this.copyDatas.index2,
  1456. this.formData.cheating_reason
  1457. );
  1458. break;
  1459. case 3:
  1460. self.changeStatus(
  1461. this.copyDatas.item,
  1462. this.copyDatas.int,
  1463. this.copyDatas.index1,
  1464. this.formData.cheating_reason
  1465. );
  1466. break;
  1467. default:
  1468. this.$message.warning("提交失败,请联系管理人员检查问题");
  1469. this.disabledBtn = false;
  1470. break;
  1471. }
  1472. },
  1473. /**
  1474. *
  1475. * @param {Object} item 节完整数据
  1476. * @param {Number} int 1通过/2作弊
  1477. * @param {Number} index 节索引
  1478. * @remards 通过 作弊 periodId
  1479. */
  1480. changeStatus(item, int, index1, msg) {
  1481. var data = {
  1482. id: item.periodStatusId,
  1483. };
  1484. if (int === 1) {
  1485. this.disabledBtn = true;
  1486. data.status = 1;
  1487. }
  1488. if (int === 2) {
  1489. if (msg) {
  1490. data.status = 0;
  1491. data.auditReason = msg;
  1492. } else {
  1493. this.copyDatas = {
  1494. type: 3,
  1495. item: item,
  1496. int: int,
  1497. index1: index1,
  1498. };
  1499. this.statusPop = 1; // 1单个点击状态 2批量点击状态
  1500. this.formData.cheating_reason = "";
  1501. this.vidBoxHours = true;
  1502. return;
  1503. }
  1504. }
  1505. this.$api
  1506. .editGradeUsereditPeriode(data)
  1507. .then((res) => {
  1508. this.$message.success("修改成功");
  1509. this.vidBoxHours = false;
  1510. this.getNewList(index1, item.numIndex, item);
  1511. this.checkUpload(item.periodStatusId);
  1512. })
  1513. .finally(() => {
  1514. this.disabledBtn = false;
  1515. });
  1516. },
  1517. /**
  1518. *
  1519. * @param {Object} item 节完整数据
  1520. * @param {Number} int 1通过/2作弊
  1521. * @param {Number} index1 章索引
  1522. * @param {Number} index2 节索引
  1523. * @remards 通过 作弊 periodId
  1524. */
  1525. changeStatusCharpter(item, int, index1, index2, msg) {
  1526. var data = {
  1527. id: item.periodStatusId,
  1528. };
  1529. if (int === 1) {
  1530. this.disabledBtn = true;
  1531. data.status = 1;
  1532. }
  1533. if (int === 2) {
  1534. if (msg) {
  1535. data.status = 0;
  1536. data.auditReason = msg;
  1537. } else {
  1538. this.copyDatas = {
  1539. type: 2,
  1540. item: item,
  1541. int: int,
  1542. index1: index1,
  1543. index2: index2,
  1544. };
  1545. this.statusPop = 1; // 1单个点击状态 2批量点击状态
  1546. this.formData.cheating_reason = "";
  1547. this.vidBoxHours = true;
  1548. return;
  1549. }
  1550. }
  1551. this.$api
  1552. .editGradeUsereditPeriode(data)
  1553. .then((res) => {
  1554. this.$message.success("修改成功");
  1555. this.vidBoxHours = false;
  1556. this.getNewListchapt(index1, index2, item.numIndex, item);
  1557. this.checkUpload(item.periodStatusId);
  1558. })
  1559. .finally(() => {
  1560. this.disabledBtn = false;
  1561. });
  1562. },
  1563. /**
  1564. *
  1565. * @param {Object} item 节完整数据
  1566. * @param {Number} int 1通过/2作弊
  1567. * @param {Number} index1 模块索引
  1568. * @param {Number} index2 章索引
  1569. * @param {Number} index3 节索引
  1570. * @remards 通过 作弊 periodId
  1571. */
  1572. changeStatusModule(item, int, index1, index2, index3, msg) {
  1573. var data = {
  1574. id: item.periodStatusId,
  1575. };
  1576. if (int === 1) {
  1577. this.disabledBtn = true;
  1578. data.status = 1;
  1579. }
  1580. if (int === 2) {
  1581. if (msg) {
  1582. data.status = 0;
  1583. data.auditReason = msg;
  1584. } else {
  1585. this.copyDatas = {
  1586. type: 1,
  1587. item: item,
  1588. int: int,
  1589. index1: index1,
  1590. index2: index2,
  1591. index3: index3,
  1592. };
  1593. this.statusPop = 1; // 1单个点击状态 2批量点击状态
  1594. this.formData.cheating_reason = "";
  1595. this.vidBoxHours = true;
  1596. return;
  1597. }
  1598. this.copyDatas = {
  1599. type: 1,
  1600. item: item,
  1601. int: int,
  1602. index1: index1,
  1603. index2: index2,
  1604. index3: index3,
  1605. };
  1606. }
  1607. this.$api
  1608. .editGradeUsereditPeriode(data)
  1609. .then((res) => {
  1610. this.$message.success("修改成功");
  1611. this.vidBoxHours = false;
  1612. this.getNewListMores(index1, index2, index3, item.numIndex, item);
  1613. this.checkUpload(item.periodStatusId);
  1614. })
  1615. .finally(() => {
  1616. this.disabledBtn = false;
  1617. });
  1618. },
  1619. /**
  1620. *
  1621. * @param {Number} int 1通过/2作弊
  1622. * @remards 批量审核通过/作弊
  1623. */
  1624. getChangeStatus(int) {
  1625. if (!this.checkList.length) {
  1626. this.$message.warning("请勾选需要操作的待审核数据");
  1627. return;
  1628. }
  1629. var data = {
  1630. gradeId: Number(this.setData.id),
  1631. userId: Number(this.setData.userId),
  1632. goodsId: Number(this.setData.goodsId),
  1633. };
  1634. if (int === 1) {
  1635. data.status = 1;
  1636. this.through = true;
  1637. }
  1638. if (int === 2) {
  1639. data.status = 0;
  1640. this.statusPop = 2;
  1641. this.formData.cheating_reason = "";
  1642. this.vidBoxHours = true;
  1643. }
  1644. },
  1645. /**
  1646. *
  1647. * @param {Number} int 1通过2作弊
  1648. * @param {String} msg 作弊原因
  1649. * @remards 批量操作
  1650. */
  1651. submitOK(int, msg) {
  1652. this.disabledBtn = true;
  1653. var data = {
  1654. gradeId: Number(this.setData.id),
  1655. userId: Number(this.setData.userId),
  1656. goodsId: Number(this.setData.goodsId),
  1657. ids: this.checkList,
  1658. };
  1659. if (int === 1) {
  1660. data.status = 1;
  1661. }
  1662. if (int === 2) {
  1663. data.auditReason = msg;
  1664. data.status = 0;
  1665. }
  1666. this.$api
  1667. .editGradeUsereditPeriodeAll(data)
  1668. .then(async (res) => {
  1669. if (int === 1) {
  1670. this.$message.success("状态全部通过修改成功");
  1671. this.through = false;
  1672. }
  1673. if (int === 2) {
  1674. this.$message.success("状态全部作弊修改成功");
  1675. this.vidBoxHours = false;
  1676. }
  1677. this.checkList = []; //勾选列表
  1678. this.isIndeterminate = false; //待审半选
  1679. this.checkAll = false; //全选状态
  1680. await this.getUserInfo();
  1681. this.search();
  1682. })
  1683. .catch(() => {
  1684. this.disabledBtn = false;
  1685. });
  1686. },
  1687. /**
  1688. *
  1689. * @param {Number} index 节索引
  1690. * @param {Number} int 节记录索引
  1691. * @param {Object} item 节完整数据
  1692. * @remards 节
  1693. */
  1694. getNewList(index, int, item) {
  1695. let data = {
  1696. courseId: item.courseId,
  1697. moduleId: item.moduleId,
  1698. chapterId: item.chapterId,
  1699. numIndex: int,
  1700. userId: this.setData.userId,
  1701. goodsId: this.setData.goodsId,
  1702. gradeId: this.setData.id,
  1703. };
  1704. if (item.type === 3) {
  1705. data.sectionId = item.id;
  1706. }
  1707. if (item.type === 4) {
  1708. data.examId = item.id;
  1709. }
  1710. this.$api.inquireGradegradelistPeriodAuditStatus(data).then((res) => {
  1711. this.$set(this.listData.tableData3, index, res.data);
  1712. this.getUserInfo();
  1713. });
  1714. },
  1715. /**
  1716. *
  1717. * @param {Number} a 章索引
  1718. * @param {Number} b 节索引
  1719. * @param {Number} int 节记录索引
  1720. * @param {Object} item 节完整数据
  1721. * @remards 章 节
  1722. */
  1723. getNewListchapt(a, b, int, item) {
  1724. let data = {
  1725. courseId: item.courseId,
  1726. moduleId: item.moduleId,
  1727. chapterId: item.chapterId,
  1728. numIndex: int,
  1729. userId: this.setData.userId,
  1730. goodsId: this.setData.goodsId,
  1731. gradeId: this.setData.id,
  1732. };
  1733. if (item.type === 3) {
  1734. data.sectionId = item.id;
  1735. }
  1736. if (item.type === 4) {
  1737. data.examId = item.id;
  1738. }
  1739. this.$api.inquireGradegradelistPeriodAuditStatus(data).then((res) => {
  1740. this.$set(
  1741. this.listData.tableData2[a].classPeriodSectionList,
  1742. b,
  1743. res.data
  1744. );
  1745. this.getUserInfo();
  1746. });
  1747. },
  1748. /**
  1749. *
  1750. * @param {Number} a 模块索引
  1751. * @param {Number} b 章索引
  1752. * @param {Number} c 节索引
  1753. * @param {Number} int 节记录索引
  1754. * @param {Object} item 节完整数据
  1755. * @remards 模块 章 节
  1756. */
  1757. getNewListMores(a, b, c, int, item) {
  1758. let data = {
  1759. courseId: item.courseId,
  1760. moduleId: item.moduleId,
  1761. chapterId: item.chapterId,
  1762. numIndex: int,
  1763. userId: this.setData.userId,
  1764. goodsId: this.setData.goodsId,
  1765. gradeId: this.setData.id,
  1766. };
  1767. if (item.type === 3) {
  1768. data.sectionId = item.id;
  1769. }
  1770. if (item.type === 4) {
  1771. data.examId = item.id;
  1772. }
  1773. this.$api.inquireGradegradelistPeriodAuditStatus(data).then((res) => {
  1774. this.$set(
  1775. this.listData.tableData1[a].classPeriods[b].classPeriodSectionList,
  1776. c,
  1777. res.data
  1778. );
  1779. this.getUserInfo();
  1780. });
  1781. },
  1782. //获取用户信息
  1783. getUserInfo() {
  1784. return new Promise((resolve, reject) => {
  1785. this.$api
  1786. .inquireGradegradelistUserlistPeriod({
  1787. gradeId: this.setData.id,
  1788. userId: this.setData.userId,
  1789. goodsId: this.setData.goodsId,
  1790. })
  1791. .then((res) => {
  1792. this.userData = res.rows[0];
  1793. resolve();
  1794. });
  1795. });
  1796. },
  1797. changeData(data) {
  1798. let arr = [];
  1799. data.forEach((e) => (arr[e.type - 1] || (arr[e.type - 1] = [])).push(e));
  1800. this.tablesData = arr;
  1801. },
  1802. //获取学时审核数据
  1803. search() {
  1804. var self = this;
  1805. let data = {
  1806. gradeId: this.setData.id,
  1807. userId: this.setData.userId,
  1808. goodsId: this.setData.goodsId,
  1809. };
  1810. this.loading = true;
  1811. this.$api
  1812. .inquireGradegradelistPeriodAudit(data)
  1813. .then((res) => {
  1814. /**
  1815. * 将模块 章 节进行分类 tab1/tab2/tab3
  1816. */
  1817. this.changeData(res.rows);
  1818. let tab1 = [];
  1819. let tab2 = [];
  1820. let tab3 = [];
  1821. let tab5 = [];
  1822. for (let i = 0; i < res.rows.length; i++) {
  1823. if (res.rows[i].type === 1) {
  1824. tab1.push(res.rows[i]);
  1825. }
  1826. if (res.rows[i].type === 2) {
  1827. tab2.push(res.rows[i]);
  1828. }
  1829. if (res.rows[i].type === 3) {
  1830. tab3.push(res.rows[i]);
  1831. }
  1832. if (res.rows[i].type === 5) {
  1833. tab5.push(res.rows[i]);
  1834. }
  1835. }
  1836. let allArrays = [];
  1837. /**
  1838. * 统计模块-章-节所有的待审核列表ID getAllList1
  1839. */
  1840. let getAllList1 = [];
  1841. tab1.forEach((item) => {
  1842. item.classPeriods.forEach((items, i) => {
  1843. if (items.type == 5) {
  1844. (item.arr || (item.arr = [])).push(items);
  1845. item.classPeriods.splice(i, 1);
  1846. }
  1847. items.classPeriodSectionList &&
  1848. items.classPeriodSectionList.forEach((itemsxs) => {
  1849. if (self.userData.periodStatus === 3) {
  1850. getAllList1.push(itemsxs.periodStatusId);
  1851. allArrays.push(itemsxs);
  1852. } else {
  1853. if (itemsxs.status === 2) {
  1854. getAllList1.push(itemsxs.periodStatusId);
  1855. }
  1856. }
  1857. });
  1858. });
  1859. });
  1860. /**
  1861. * 统计章-节所有的待审核列表ID getAllList1
  1862. */
  1863. let getAllList2 = [];
  1864. tab2.forEach((item) => {
  1865. item.classPeriodSectionList.forEach((items) => {
  1866. if (self.userData.periodStatus === 3) {
  1867. getAllList2.push(items.periodStatusId);
  1868. allArrays.push(items);
  1869. } else {
  1870. if (items.status === 2) {
  1871. getAllList2.push(items.periodStatusId);
  1872. }
  1873. }
  1874. });
  1875. });
  1876. /**
  1877. * 统计节所有的待审核列表ID getAllList1
  1878. */
  1879. let getAllList3 = [];
  1880. tab3.forEach((item) => {
  1881. if (self.userData.periodStatus === 3) {
  1882. getAllList3.push(item.periodStatusId);
  1883. allArrays.push(item);
  1884. } else {
  1885. if (item.status === 2) {
  1886. getAllList3.push(item.periodStatusId);
  1887. }
  1888. }
  1889. });
  1890. this.getAllList = getAllList1.concat(getAllList2.concat(getAllList3));
  1891. console.log(this.getAllList, "addd");
  1892. this.allArrays = allArrays;
  1893. this.listData.tableData1 = tab1;
  1894. this.listData.tableData2 = tab2;
  1895. this.listData.tableData3 = tab3;
  1896. })
  1897. .finally(() => {
  1898. this.loading = false;
  1899. });
  1900. },
  1901. /**
  1902. *
  1903. * @param {Number} id
  1904. * @remards 点击通过或作弊更新待审数组数据-当前选中数组数据-复选框-全选框
  1905. */
  1906. checkUpload(id) {
  1907. this.getAllList = this.getAllList.filter((item) => {
  1908. return item !== id;
  1909. });
  1910. this.checkList = this.checkList.filter((item) => {
  1911. return item !== id;
  1912. });
  1913. this.handleCheckedCitiesChange(this.checkList);
  1914. },
  1915. /**
  1916. *
  1917. * @param {Bool} val 待审全选按钮当前是否为全选状态
  1918. */
  1919. handleCheckAllChange(val) {
  1920. this.checkList = val ? this.getAllList : [];
  1921. this.isIndeterminate = false;
  1922. },
  1923. /**
  1924. *
  1925. * @param {Arrays} value 点击复选框触发
  1926. * @remards 当前选中数据ID
  1927. */
  1928. handleCheckedCitiesChange(value) {
  1929. let checkedCount = value.length;
  1930. if (checkedCount) {
  1931. this.checkAll = checkedCount === this.getAllList.length;
  1932. } else {
  1933. this.checkAll = false;
  1934. }
  1935. this.isIndeterminate =
  1936. checkedCount > 0 && checkedCount < this.getAllList.length;
  1937. },
  1938. },
  1939. components: {
  1940. StudyTables,
  1941. },
  1942. /**
  1943. * 离开页面前销毁定时器
  1944. */
  1945. beforeDestroy() {
  1946. if (this.setTimeDOM) {
  1947. clearInterval(this.setTimeDOM);
  1948. }
  1949. },
  1950. };
  1951. </script>
  1952. <style lang="less" scoped>
  1953. .top_style {
  1954. background: #ffffff;
  1955. box-shadow: 0px 0px 8px 0px rgba(217, 217, 217, 0.8);
  1956. border-radius: 8px;
  1957. padding: 8px 16px;
  1958. & > header {
  1959. display: flex;
  1960. align-items: center;
  1961. justify-content: space-between;
  1962. height: 48px;
  1963. line-height: 48px;
  1964. & > .left {
  1965. display: flex;
  1966. align-items: center;
  1967. i {
  1968. display: inline-block;
  1969. width: 2px;
  1970. height: 18px;
  1971. background: #0c5dfb;
  1972. margin-right: 8px;
  1973. }
  1974. span {
  1975. color: #666;
  1976. font-weight: bold;
  1977. }
  1978. }
  1979. & > span {
  1980. font-size: 14px;
  1981. }
  1982. }
  1983. & > .info_img {
  1984. display: flex;
  1985. height: 210px;
  1986. ul {
  1987. width: 320px;
  1988. li {
  1989. margin-bottom: 12px;
  1990. font-size: 14px;
  1991. }
  1992. }
  1993. .img_by {
  1994. flex: 1;
  1995. display: flex;
  1996. align-items: center;
  1997. .pos_bottom {
  1998. position: absolute;
  1999. z-index: 1;
  2000. bottom: 0px;
  2001. width: 100%;
  2002. height: 32px;
  2003. background-color: rgba(53, 53, 53, 0.6);
  2004. text-align: center;
  2005. color: #fff;
  2006. font-size: 16px;
  2007. line-height: 32px;
  2008. }
  2009. & > .photoSty1 {
  2010. width: 152px;
  2011. height: 208px;
  2012. position: relative;
  2013. overflow: hidden;
  2014. border-radius: 8px;
  2015. background-color: #f5f5f5;
  2016. margin-right: 75px;
  2017. & > img {
  2018. width: 106px;
  2019. height: 150px;
  2020. margin: 29px auto 0px;
  2021. display: block;
  2022. }
  2023. }
  2024. & > .photoSty2 {
  2025. width: 328px;
  2026. height: 208px;
  2027. position: relative;
  2028. overflow: hidden;
  2029. border-radius: 8px;
  2030. background-color: #f5f5f5;
  2031. margin-right: 75px;
  2032. & > img {
  2033. width: 243px;
  2034. height: 154px;
  2035. margin: 27px auto 0px;
  2036. display: block;
  2037. }
  2038. &:last-of-type {
  2039. margin-right: 0px;
  2040. }
  2041. }
  2042. }
  2043. }
  2044. }
  2045. .studyStyle {
  2046. margin: 16px 0px 0px;
  2047. display: flex;
  2048. align-items: center;
  2049. & > .a_style {
  2050. display: flex;
  2051. align-items: center;
  2052. margin: 0px 16px 16px 0px;
  2053. padding: 11px 16px;
  2054. box-shadow: 0px 0px 8px 0px rgba(217, 217, 217, 0.8);
  2055. border-radius: 4px;
  2056. height: 40px;
  2057. width: 440px;
  2058. user-select: none;
  2059. i {
  2060. width: 2px;
  2061. height: 18px;
  2062. display: inline-block;
  2063. background-color: #0047d0;
  2064. margin-right: 8px;
  2065. }
  2066. span {
  2067. color: #666;
  2068. font-weight: bold;
  2069. }
  2070. .flex_style_study {
  2071. flex: 1;
  2072. }
  2073. .num_style {
  2074. float: right;
  2075. font-size: 14px;
  2076. margin-left: 14px;
  2077. }
  2078. }
  2079. .s_sd {
  2080. flex: 1;
  2081. justify-content: flex-end;
  2082. display: flex;
  2083. align-items: center;
  2084. flex-shrink: 0;
  2085. margin: 0px 16px 16px 0px;
  2086. .dis_colu {
  2087. height: 55px;
  2088. margin-right: 14px;
  2089. display: flex;
  2090. flex-direction: column;
  2091. justify-content: space-around;
  2092. font-size: 14px;
  2093. }
  2094. }
  2095. }
  2096. /deep/ .el-table__expanded-cell {
  2097. background: #f5f5f5;
  2098. }
  2099. /deep/ .el-table__expanded-cell {
  2100. padding: 0px !important;
  2101. }
  2102. .li_sty {
  2103. cursor: pointer;
  2104. transition: all 0.3s;
  2105. background-color: #eee;
  2106. padding: 0px 10px;
  2107. margin-bottom: 6px;
  2108. font-size: 12px;
  2109. line-height: 26px;
  2110. display: table;
  2111. &:hover {
  2112. box-shadow: 0px 0px 4px 2px rgba(0, 0, 0, 0.2);
  2113. }
  2114. }
  2115. #studyTimes {
  2116. display: flex;
  2117. flex-direction: column;
  2118. height: calc(100vh - 190px);
  2119. }
  2120. .styFlex {
  2121. width: 80px;
  2122. text-align: center;
  2123. }
  2124. .checkboxList {
  2125. margin-bottom: 6px;
  2126. &/deep/.el-checkbox__label {
  2127. display: none;
  2128. }
  2129. }
  2130. .btnstyles {
  2131. margin-left: 0px;
  2132. margin-bottom: 10px;
  2133. }
  2134. .dis_flexs {
  2135. display: flex;
  2136. align-items: center;
  2137. padding: 10px 18px;
  2138. ul {
  2139. margin-bottom: 0px;
  2140. }
  2141. }
  2142. .liImgs {
  2143. float: left;
  2144. width: 210px;
  2145. height: 280px;
  2146. margin-right: 16px;
  2147. margin-bottom: 16px;
  2148. position: relative;
  2149. border-radius: 8px;
  2150. overflow: hidden;
  2151. .abos {
  2152. position: absolute;
  2153. bottom: 0px;
  2154. width: 100%;
  2155. height: 32px;
  2156. line-height: 32px;
  2157. font-size: 14px;
  2158. color: #fff;
  2159. text-align: center;
  2160. background-color: rgba(51, 51, 51, 0.7);
  2161. }
  2162. }
  2163. /deep/.el-button {
  2164. border-radius: 8px;
  2165. }
  2166. /deep/.el-dialog {
  2167. border-radius: 8px;
  2168. .el-dialog__header {
  2169. padding: 0;
  2170. .hearders {
  2171. height: 40px;
  2172. display: flex;
  2173. align-items: center;
  2174. justify-content: space-between;
  2175. padding: 0px 18px 0px 20px;
  2176. border-bottom: 1px solid #e2e2e2;
  2177. .leftTitle {
  2178. font-size: 14px;
  2179. font-weight: bold;
  2180. color: #2f4378;
  2181. }
  2182. .rightBoxs {
  2183. display: flex;
  2184. align-items: center;
  2185. img {
  2186. width: 14px;
  2187. height: 14px;
  2188. margin-left: 13px;
  2189. cursor: pointer;
  2190. }
  2191. }
  2192. }
  2193. }
  2194. .el-dialog__footer {
  2195. padding: 0;
  2196. .dialog-footer {
  2197. padding: 0px 40px;
  2198. height: 70px;
  2199. border-top: 1px solid #e2e2e2;
  2200. display: flex;
  2201. align-items: center;
  2202. justify-content: flex-end;
  2203. }
  2204. }
  2205. }
  2206. .imgBox {
  2207. width: 100%;
  2208. // height: 210px;
  2209. border: 1px solid #e2e2e2;
  2210. border-radius: 8px;
  2211. padding: 8px 8px 3px;
  2212. display: flex;
  2213. flex-direction: column;
  2214. align-items: center;
  2215. .imgLabel {
  2216. flex: 1;
  2217. width: 100%;
  2218. border: 1px dotted #e2e2e2;
  2219. color: #999;
  2220. font-size: 14px;
  2221. cursor: pointer;
  2222. border-radius: 8px;
  2223. .msPhoto {
  2224. display: flex;
  2225. justify-content: center;
  2226. align-items: center;
  2227. max-width: 100%;
  2228. max-height: 270px;
  2229. img {
  2230. max-width: 100%;
  2231. max-height: 270px;
  2232. }
  2233. }
  2234. .imgbbx {
  2235. display: flex;
  2236. flex-direction: column;
  2237. align-items: center;
  2238. justify-content: center;
  2239. width: 100%;
  2240. height: 100%;
  2241. i {
  2242. font-weight: bold;
  2243. margin: 14px 0;
  2244. font-size: 24px;
  2245. }
  2246. }
  2247. }
  2248. p {
  2249. margin: 5px 0px;
  2250. }
  2251. }
  2252. </style>