raceDetail.vue 50 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871
  1. <template>
  2. <!-- 项目基础信息 -->
  3. <div class="pb_content">
  4. <div class="race_content_body">
  5. <div class="raceBox">
  6. <div class="stepBg">
  7. <div class="steps">
  8. <div>
  9. <img src="../../../../assets/icon/race/progress.png" alt="" />
  10. </div>
  11. <div class="stepRightNav" @click="jump('first')">
  12. <div>案例活动信息</div>
  13. <div>说明</div>
  14. </div>
  15. </div>
  16. <div class="steps">
  17. <div>
  18. <img src="../../../../assets/icon/race/progress.png" alt="" />
  19. </div>
  20. <div class="stepRightNav" @click="jump('second')">
  21. <div>封面</div>
  22. <div>说明</div>
  23. </div>
  24. </div>
  25. <div class="steps">
  26. <div>
  27. <img src="../../../../assets/icon/race/progress.png" alt="" />
  28. </div>
  29. <div class="stepRightNav" @click="jump('third')">
  30. <div>成员信息</div>
  31. <div>协同人员</div>
  32. </div>
  33. </div>
  34. <div class="steps">
  35. <div>
  36. <img src="../../../../assets/icon/race/progress.png" alt="" />
  37. </div>
  38. <div class="stepRightNav" @click="jump('fouth')">
  39. <div>项目说明</div>
  40. <div>项目简介</div>
  41. </div>
  42. </div>
  43. <div class="steps">
  44. <div>
  45. <img src="../../../../assets/icon/race/progress.png" alt="" />
  46. </div>
  47. <div class="stepRightNav" @click="jump('fouth')">
  48. <div>文件上传</div>
  49. <div>项目资料</div>
  50. </div>
  51. </div>
  52. </div>
  53. <div class="right">
  54. <div class="whiteBg">
  55. <div class="right_title" id="first">项目基本信息</div>
  56. <div class="basic_box">
  57. <div class="big_box">
  58. <div class="left_first">
  59. <div>
  60. <div>
  61. <div class="bInfo_title" style="margin-bottom: 15px">
  62. 案例名称
  63. </div>
  64. <div style="display: flex; margin-right: 20px">
  65. <img
  66. src="../../../../assets/icon/projectName.png"
  67. alt
  68. style="margin-right: 8px"
  69. />
  70. <input
  71. type="text"
  72. placeholder="请输入项目名称"
  73. class="binfo_input"
  74. v-model="raceDetail.title"
  75. @input="updateTitle"
  76. />
  77. </div>
  78. </div>
  79. <div class="both">
  80. <div class="choose">
  81. <div
  82. class="all_choose"
  83. v-for="(item, index) in CourseType[0]"
  84. :key="index"
  85. >
  86. <span>{{ item.name }}</span>
  87. <el-checkbox-group
  88. v-model="raceDetail.type"
  89. @change="updateTitle"
  90. >
  91. <el-checkbox
  92. v-for="item1 in CourseTypeJson[item.id]"
  93. :key="item1.id"
  94. :label="item1.id"
  95. >{{ item1.name }}</el-checkbox
  96. >
  97. </el-checkbox-group>
  98. </div>
  99. </div>
  100. </div>
  101. </div>
  102. </div>
  103. </div>
  104. </div>
  105. </div>
  106. <div class="whiteBg" style="border-radius: 0">
  107. <div class="right_first">
  108. <div class="right_title" id="second">案例封面设置</div>
  109. <div class="fmBox">
  110. <div>
  111. <div class="bInfo_title" style="margin-top: 0 !important">
  112. 案例封面
  113. </div>
  114. <div class="picBox">
  115. <div>
  116. <div
  117. class="uploadFm"
  118. v-if="raceDetail.cover.length === 0"
  119. @click="choosePicVisible = true"
  120. >
  121. <!-- @click="addImg($event)" -->
  122. <img
  123. src="../../../../assets/icon/addPoster.png"
  124. alt=""
  125. />
  126. <!-- <input
  127. type="file"
  128. accept="image/*"
  129. style="display: none"
  130. @change="beforeUpload1"
  131. /> -->
  132. </div>
  133. <el-upload
  134. :class="{ disUoloadSty: noneBtnImg }"
  135. class="upCss"
  136. action="#"
  137. list-type="picture"
  138. v-loading="uploadLoading1"
  139. :http-request="beforeUpload1"
  140. ref="upload1"
  141. :on-preview="handlePictureCardPreview"
  142. :on-remove="handle_remove1"
  143. :show-file-list="true"
  144. :file-list="raceDetail.cover"
  145. accept="image/*"
  146. :limit="1"
  147. :on-exceed="onExceed"
  148. v-else
  149. >
  150. <i class="el-icon-plus"></i>
  151. </el-upload>
  152. </div>
  153. </div>
  154. </div>
  155. </div>
  156. </div>
  157. </div>
  158. <div class="whiteBg" style="border-radius: 0">
  159. <div class="right_first">
  160. <div class="right_title" id="third">作者</div>
  161. <div
  162. class="addPeople"
  163. @click="dialogVisibleMember = true"
  164. v-if="raceDetail.tableData.length < 6"
  165. >
  166. 添加作者
  167. </div>
  168. <div class="raTable">
  169. <el-table
  170. class="tableColor"
  171. ref="table"
  172. :data="raceDetail.tableData"
  173. :height="tableHeight"
  174. :fit="true"
  175. style="width: 100%"
  176. :header-cell-style="{
  177. background: '#f1f1f1',
  178. fontSize: '17px',
  179. }"
  180. :row-class-name="tableRowClassName"
  181. >
  182. <el-table-column label="姓名" min-width="20" align="center">
  183. <template slot-scope="scope">
  184. <div class="userImg">
  185. <div class="tx">
  186. <img :src="tx" alt />
  187. </div>
  188. <div
  189. style="
  190. width: 50px;
  191. text-align: left;
  192. white-space: nowrap;
  193. overflow: hidden;
  194. text-overflow: ellipsis;
  195. "
  196. >
  197. {{ scope.row.sn }}
  198. </div>
  199. <div v-if="scope.$index == 0" class="lxr">联系人</div>
  200. </div>
  201. </template>
  202. </el-table-column>
  203. <el-table-column label="学科" min-width="15" align="center">
  204. <template slot-scope="scope">
  205. <div>{{ scope.row.su ? scope.row.su : "" }}</div>
  206. </template>
  207. </el-table-column>
  208. <el-table-column label="学校" min-width="15" align="center">
  209. <template slot-scope="scope">
  210. <div>{{ scope.row.sc ? scope.row.sc : "" }}</div>
  211. </template>
  212. </el-table-column>
  213. <el-table-column label="邮箱" min-width="15" align="center">
  214. <template slot-scope="scope">
  215. <div>{{ scope.row.em ? scope.row.em : "" }}</div>
  216. </template>
  217. </el-table-column>
  218. <el-table-column label="电话" min-width="15" align="center">
  219. <template slot-scope="scope">
  220. <div>
  221. {{ scope.row.ph ? scope.row.ph : "" }}
  222. </div>
  223. </template>
  224. </el-table-column>
  225. <el-table-column label="操作" min-width="20">
  226. <template slot-scope="scope">
  227. <div class="pb_buttonBox">
  228. <!-- <el-button
  229. size="mini"
  230. type="primary"
  231. style="cursor: pointer"
  232. @click="updateStudent(scope.row, scope.$index)"
  233. >修改</el-button
  234. > -->
  235. <div
  236. class="delete"
  237. style="margin-left: 0"
  238. @click="updateStudent(scope.row, scope.$index)"
  239. >
  240. <img src="../../../../assets/autorUp.png" alt />
  241. </div>
  242. <div
  243. class="delete"
  244. @click="deleteStudent(scope.$index)"
  245. >
  246. <img src="../../../../assets/remove.png" alt />
  247. </div>
  248. </div>
  249. </template>
  250. </el-table-column>
  251. </el-table>
  252. </div>
  253. <div
  254. style="
  255. color: #cd0808;
  256. width: 97%;
  257. margin: 10px auto;
  258. font-size: 14px;
  259. "
  260. >
  261. *作者不超过6人;默认第一位为主要负责人,联系电话必填,其余人员可以选填
  262. </div>
  263. </div>
  264. </div>
  265. <div class="whiteBg" style="border-radius: 0">
  266. <div class="right_first">
  267. <div class="right_title" id="fouth">项目简介</div>
  268. <div class="secondTop">
  269. <textarea
  270. rows="8"
  271. class="binfo_input tAreaCss"
  272. cols
  273. v-model="raceDetail.courseText"
  274. @input="updateTitle"
  275. maxlength="200"
  276. placeholder="200字以内,介绍项目背景,描述生活中的现象,引出要解决的核心问题,概述解决问题的思路及预期成果等。"
  277. style="font-size: 14px"
  278. ></textarea>
  279. </div>
  280. </div>
  281. </div>
  282. <div class="whiteBg" style="border-radius: 0">
  283. <div class="right_first">
  284. <div class="right_title" id="fouth">文件上传</div>
  285. <div class="secondTop">
  286. <div>
  287. <div class="basic_box1" style="width: 100%">
  288. <div>
  289. <div
  290. class="add_chapters_box"
  291. v-if="raceDetail.data && raceDetail.data.length == 0"
  292. ></div>
  293. <div
  294. v-else
  295. class="add_chapters_box"
  296. style="display: flex; flex-direction: column"
  297. >
  298. <div
  299. class="chapter_upload"
  300. v-for="(item, index) in raceDetail.data"
  301. :key="item.id"
  302. >
  303. <div class="chapter_upload_t"></div>
  304. <div class="chapter_upload_o">
  305. <div class="chapter_upload_l">
  306. <div
  307. v-if="item.type == 2"
  308. class="chapter_upload_l_i1"
  309. ></div>
  310. <div
  311. v-if="item.type == 1 || item.type == 3"
  312. class="chapter_upload_l_i5"
  313. ></div>
  314. </div>
  315. <div class="chapter_upload_ic">
  316. <div class="chapter_upload_ic_l"></div>
  317. <div
  318. class="chapter_upload_ic_r"
  319. @click.stop="
  320. deleteChapterData($event, index, 0)
  321. "
  322. >
  323. <div></div>
  324. </div>
  325. </div>
  326. <div class="chapter_upload_n">
  327. <input
  328. class="first"
  329. v-if="item.type == 1 || item.type == 3"
  330. :placeholder="item.name"
  331. />
  332. <input
  333. class="first"
  334. v-if="item.type == 2"
  335. :placeholder="item.name"
  336. />
  337. <div class="chapter_upload_ud">
  338. <div class="chapter_upload_up"></div>
  339. <div class="chapter_upload_down"></div>
  340. </div>
  341. </div>
  342. </div>
  343. </div>
  344. </div>
  345. </div>
  346. <div class="add_info_box">
  347. <div class="upTips">
  348. <button
  349. class="info_btn"
  350. @click="addImg($event)"
  351. style="min-width: 108px"
  352. >
  353. 上传附件
  354. <input
  355. type="file"
  356. accept="application/pdf, application/.ppt, .ppt, .pptx, .xlsx, .xls, application/msword, application/vnd.openxmlformats-officedocument.wordprocessingml.document,video/mp4, video/quicktime, video/x-msvideo,image/*"
  357. style="display: none"
  358. @change="beforeUpload($event, null, 0)"
  359. />
  360. </button>
  361. <div>
  362. 此处需要提交《项目式学习方案设计》、《项目式学习活动案例》,上传大小限制为10M,Excel、Word、PPT上传大小限制为5M。
  363. </div>
  364. </div>
  365. </div>
  366. <div v-if="raceDetail.data.proVisible" class="mask">
  367. <div class="progressBox">
  368. <div class="lbox">
  369. <img
  370. src="../../../../assets/loading.gif"
  371. />上传中,请稍后
  372. </div>
  373. <el-progress
  374. :text-inside="true"
  375. :stroke-width="20"
  376. :percentage="
  377. raceDetail.data.progress
  378. ? raceDetail.data.progress
  379. : 0
  380. "
  381. style="width: 80%"
  382. ></el-progress>
  383. </div>
  384. </div>
  385. </div>
  386. </div>
  387. </div>
  388. </div>
  389. </div>
  390. </div>
  391. <!-- <div class="buttonCss">
  392. <div class="info_btn noBg">预览</div>
  393. <div class="info_btn noBg">保存</div>
  394. <div class="info_btn" style="margin-right: 25px">下一步</div>
  395. </div> -->
  396. </div>
  397. </div>
  398. <el-dialog
  399. :title="isAddOrUp == true ? '修改项目成员' : '添加项目成员'"
  400. :visible.sync="dialogVisibleMember"
  401. :append-to-body="true"
  402. width="700px"
  403. height="80%"
  404. :before-close="handleClose"
  405. class="add_student"
  406. >
  407. <el-form>
  408. <el-form-item label="姓名" :label-width="formLabelWidth">
  409. <span>
  410. <el-input
  411. placeholder="请输入姓名"
  412. clearable
  413. v-model="sName"
  414. class="add_input"
  415. ></el-input>
  416. </span>
  417. </el-form-item>
  418. <el-form-item label="学科" :label-width="formLabelWidth">
  419. <span>
  420. <el-input
  421. placeholder="请输入学科"
  422. clearable
  423. v-model="sSubject"
  424. class="add_input"
  425. ></el-input>
  426. </span>
  427. </el-form-item>
  428. <el-form-item label="学校" :label-width="formLabelWidth">
  429. <span>
  430. <el-input
  431. placeholder="请输入学校"
  432. clearable
  433. v-model="sSchool"
  434. class="add_input"
  435. ></el-input>
  436. </span>
  437. </el-form-item>
  438. <el-form-item label="邮箱" :label-width="formLabelWidth">
  439. <span>
  440. <el-input
  441. placeholder="请输入邮箱"
  442. clearable
  443. v-model="sEmail"
  444. class="add_input"
  445. ></el-input>
  446. </span>
  447. </el-form-item>
  448. <el-form-item label="电话" :label-width="formLabelWidth">
  449. <span>
  450. <el-input
  451. placeholder="请输入电话"
  452. clearable
  453. v-model="sPhone"
  454. class="add_input"
  455. ></el-input>
  456. </span>
  457. </el-form-item>
  458. </el-form>
  459. <span slot="footer" class="dialog-footer">
  460. <el-button @click="dialogVisibleMember = false">取 消</el-button>
  461. <el-button type="primary" @click="isAddPPTeacher">确定</el-button>
  462. </span>
  463. </el-dialog>
  464. <el-dialog
  465. title="上传图片"
  466. :visible.sync="choosePicVisible"
  467. :append-to-body="true"
  468. width="500px"
  469. :before-close="handleClose"
  470. class="dialog_diy"
  471. >
  472. <div>
  473. <div class="fileCss" style="padding-top: 20px">
  474. <div>
  475. <button class="info_btn" @click="addImg($event)">
  476. 选择本地文件
  477. <input
  478. type="file"
  479. accept="image/*"
  480. style="display: none"
  481. @change="beforeUpload1"
  482. />
  483. </button>
  484. </div>
  485. <div>
  486. <el-button
  487. @click="getAllBanner"
  488. v-if="isSysPic == false && raceDetail.cover.length == 0"
  489. >选择系统文件</el-button
  490. >
  491. <div
  492. class="isSysPic"
  493. v-if="isSysPic == true && raceDetail.cover.length > 0"
  494. >
  495. <img :src="raceDetail.cover[0].url" alt="" />
  496. <div class="deletePic" @click="deleteSysPic">
  497. <img src="../../../../assets/icon/delete.png" alt="" />
  498. </div>
  499. </div>
  500. </div>
  501. </div>
  502. <div class="fileCss">
  503. <div>选择本地文件</div>
  504. <div>选择系统文件</div>
  505. </div>
  506. </div>
  507. <span slot="footer" class="dialog-footer">
  508. <el-button @click="choosePicVisible = false">取 消</el-button>
  509. <el-button type="primary" @click="choosePicVisible = false"
  510. >确 定</el-button
  511. >
  512. </span>
  513. </el-dialog>
  514. <el-dialog
  515. title="选择系统文件"
  516. :visible.sync="sysPicVisible"
  517. :append-to-body="true"
  518. width="700px"
  519. :before-close="handleClose"
  520. class="dialog_diy"
  521. >
  522. <div class="cru_selectBox" style="margin: 0">
  523. <div
  524. @click="getChoosePic(1)"
  525. class="cru_select"
  526. :class="chooseType == 1 ? 'cru_selected' : ''"
  527. >
  528. 绘画
  529. </div>
  530. <div
  531. @click="getChoosePic(2)"
  532. class="cru_select"
  533. :class="chooseType == 2 ? 'cru_selected' : ''"
  534. >
  535. 科技
  536. </div>
  537. <div
  538. @click="getChoosePic(3)"
  539. class="cru_select"
  540. :class="chooseType == 3 ? 'cru_selected' : ''"
  541. >
  542. 人文
  543. </div>
  544. <div
  545. @click="getChoosePic(4)"
  546. class="cru_select"
  547. :class="chooseType == 4 ? 'cru_selected' : ''"
  548. >
  549. 艺术
  550. </div>
  551. </div>
  552. <div class="sysPicBox">
  553. <div v-for="(sys, sysIndex) in sysPic" :key="sysIndex" class="sysPic">
  554. <img :src="sys.poster" alt="" @click="chooseSysPic(sys.poster)" />
  555. </div>
  556. </div>
  557. <span slot="footer" class="dialog-footer">
  558. <el-button @click="sysPicVisible = false">取 消</el-button>
  559. <el-button type="primary">确 定</el-button>
  560. </span>
  561. </el-dialog>
  562. </div>
  563. </template>
  564. <script>
  565. export default {
  566. props: ["raceInfo"],
  567. data() {
  568. return {
  569. tableHeight: "500px",
  570. formLabelWidth: "100px",
  571. chooseType: 1,
  572. CourseType: [],
  573. CourseTypeJson: [],
  574. noneBtnImg: false,
  575. uploadLoading1: false,
  576. dialogVisibleMember: false,
  577. isAddOrUp: false,
  578. choosePicVisible: false,
  579. sysPicVisible: false,
  580. isSysPic: false,
  581. sysPic: [],
  582. upIndex: -1,
  583. sName: "",
  584. sSubject: "",
  585. sSchool: "",
  586. sEmail: "",
  587. sPhone: "",
  588. raceDetail: {
  589. title: "",
  590. type: [],
  591. cover: [],
  592. tableData: [],
  593. courseText: "",
  594. data: [],
  595. },
  596. tx: require("../../../../assets/avatar.png"),
  597. };
  598. },
  599. mounted() {
  600. this.$nextTick(function () {
  601. this.tableHeight =
  602. window.innerHeight - this.$refs.table.$el.offsetTop - 200;
  603. if (this.tableHeight <= 530) {
  604. this.tableHeight = 530;
  605. }
  606. // 监听窗口大小变化
  607. let self = this;
  608. window.onresize = function () {
  609. self.tableHeight =
  610. window.innerHeight - self.$refs.table.$el.offsetTop - 200;
  611. if (self.tableHeight <= 530) {
  612. self.tableHeight = 530;
  613. }
  614. };
  615. });
  616. },
  617. beforeRouteLeave(to, from, next) {
  618. window.onresize = null;
  619. next();
  620. },
  621. watch: {
  622. raceInfo: {
  623. immediate: true,
  624. deep: true,
  625. handler(newValue, oldValue) {
  626. this.getValue();
  627. },
  628. },
  629. },
  630. methods: {
  631. tableRowClassName({ row, rowIndex }) {
  632. // if ((rowIndex + 1) % 2 === 0) {
  633. // return "even_row";
  634. // } else {
  635. // return "";
  636. // }
  637. if (rowIndex === 0) {
  638. return "tr-blue";
  639. } else {
  640. return "";
  641. }
  642. },
  643. handlePictureCardPreview(file) {
  644. this.dialogImageUrl = file.url;
  645. },
  646. onExceed() {
  647. this.$message.error("项目封面仅支持上传一张,请删除后再进行上传");
  648. },
  649. handleClose(done) {
  650. done();
  651. },
  652. jump(t) {
  653. var a = document.getElementById(t);
  654. var b = document.getElementsByClassName("right")[0];
  655. b.scrollTop = a.offsetTop;
  656. },
  657. handle_remove1(file, fileList, type) {
  658. var _tmp = this.raceDetail.cover;
  659. for (var i = 0, len = _tmp.length; i < len; i++) {
  660. if (_tmp[i].uid == file.uid) {
  661. _tmp.splice(i, 1);
  662. break;
  663. }
  664. this.raceDetail.cover = _tmp;
  665. }
  666. this.noneBtnImg = _tmp.length >= 1;
  667. this.isSysPic = false;
  668. },
  669. addImg(e) {
  670. var el = e.currentTarget;
  671. el.getElementsByTagName("input")[0].click();
  672. },
  673. imgChange1(file, fileList, type, itemTaskIndex) {
  674. if (type == 1) {
  675. var _tmp = this.raceDetail.cover;
  676. }
  677. this.noneBtnImg = _tmp.length >= 1;
  678. },
  679. imgChange(file, fileList, type, jT) {
  680. var _tmp = this.raceDetail.data;
  681. this.noneBtnImg = _tmp.length >= 1;
  682. },
  683. deleteChapterData(e, i, t) {
  684. e.stopPropagation();
  685. this.raceDetail.data.splice(i, 1);
  686. },
  687. chooseSysPic(p) {
  688. this.raceDetail.cover.push({
  689. name: "系统图片.png",
  690. url: p,
  691. });
  692. this.imgChange1(null, null, 1, null);
  693. this.isSysPic = true;
  694. this.sysPicVisible = false;
  695. },
  696. deleteSysPic() {
  697. this.raceDetail.cover = [];
  698. this.isSysPic = false;
  699. },
  700. getChoosePic(t) {
  701. this.chooseType = t;
  702. this.getAllBanner();
  703. },
  704. beforeUpload1(event, type) {
  705. const loading = this.openLoading();
  706. var file = event.target.files[0];
  707. var credentials = {
  708. accessKeyId: "AKIATLPEDU37QV5CHLMH",
  709. secretAccessKey: "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",
  710. }; //秘钥形式的登录上传
  711. window.AWS.config.update(credentials);
  712. window.AWS.config.region = "cn-northwest-1"; //设置区域
  713. var bucket = new window.AWS.S3({ params: { Bucket: "ccrb" } }); //选择桶
  714. var _this = this;
  715. if (file) {
  716. var params = {
  717. Key:
  718. file.name.split(".")[0] +
  719. new Date().getTime() +
  720. "." +
  721. file.name.split(".")[file.name.split(".").length - 1],
  722. ContentType: file.type,
  723. Body: file,
  724. "Access-Control-Allow-Credentials": "*",
  725. ACL: "public-read",
  726. }; //key可以设置为桶的相抵路径,Body为文件, ACL最好要设置
  727. var options = {
  728. partSize: 2048 * 1024 * 1024,
  729. queueSize: 2,
  730. leavePartsOnError: true,
  731. };
  732. bucket
  733. .upload(params, options)
  734. .on("httpUploadProgress", function (evt) {
  735. //这里可以写进度条
  736. // console.log("Uploaded : " + parseInt((evt.loaded * 80) / evt.total) + '%');
  737. })
  738. .send(function (err, data) {
  739. loading.close();
  740. if (err) {
  741. var a = _this.$refs.upload1.uploadFiles;
  742. a.splice(a.length - 1, a.length);
  743. _this.$message.error("上传失败");
  744. } else {
  745. _this.raceDetail.cover.push({
  746. name: file.name,
  747. url: data.Location,
  748. });
  749. _this.imgChange1(null, null, 1, null);
  750. _this.choosePicVisible = false;
  751. console.log(data.Location);
  752. }
  753. });
  754. }
  755. },
  756. beforeUpload(event, type, jsonType) {
  757. var file = event.target.files[0];
  758. var credentials = {
  759. accessKeyId: "AKIATLPEDU37QV5CHLMH",
  760. secretAccessKey: "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",
  761. }; //秘钥形式的登录上传
  762. window.AWS.config.update(credentials);
  763. window.AWS.config.region = "cn-northwest-1"; //设置区域
  764. var type1 = type;
  765. var bucket = new window.AWS.S3({ params: { Bucket: "ccrb" } }); //选择桶
  766. var _this = this;
  767. var b = [
  768. "DOC",
  769. "DOCX",
  770. "DOCM",
  771. "DOTM",
  772. "DOTX",
  773. "PPTX",
  774. "PPSX",
  775. "PPT",
  776. "PPS",
  777. "PPTM",
  778. "POTM",
  779. "PPAM",
  780. "POTX",
  781. "PPSM",
  782. ];
  783. var c = ["PDF", "DOT", "DOC", "DOCX", "PPT", "PPTX", "XLSX", "XLS"];
  784. var d = [
  785. "BMP",
  786. "PJP",
  787. "APNG",
  788. "PNG",
  789. "JPG",
  790. "GIF",
  791. "SVG",
  792. "JPEG",
  793. "JPG",
  794. "ICO",
  795. "PGPEG",
  796. "AVIF",
  797. ];
  798. if (
  799. b.indexOf(
  800. file.name
  801. .split(".")
  802. [file.name.split(".").length - 1].toLocaleUpperCase()
  803. ) != -1
  804. ) {
  805. if (file.size / 1024 / 1024 > 10) {
  806. this.$message.error("上传文件大于10M,请重新选择文件!");
  807. return;
  808. }
  809. } else if (
  810. c.indexOf(
  811. file.name
  812. .split(".")
  813. [file.name.split(".").length - 1].toLocaleUpperCase()
  814. ) != -1
  815. ) {
  816. if (file.size / 1024 / 1024 > 5) {
  817. this.$message.error("添加的上传文件大于5M,请重新选择文件!");
  818. return;
  819. }
  820. }
  821. if (
  822. c.indexOf(
  823. file.name
  824. .split(".")
  825. [file.name.split(".").length - 1].toLocaleUpperCase()
  826. ) != -1
  827. ) {
  828. type1 = 1;
  829. } else if (
  830. d.indexOf(
  831. file.name
  832. .split(".")
  833. [file.name.split(".").length - 1].toLocaleUpperCase()
  834. ) != -1
  835. ) {
  836. type1 = 3;
  837. } else {
  838. type1 = 2;
  839. }
  840. _this.raceDetail.data.progress = 0;
  841. _this.raceDetail.data.proVisible = true;
  842. _this.$forceUpdate();
  843. if (file) {
  844. var params = {
  845. Key:
  846. file.name.split(".")[0] +
  847. new Date().getTime() +
  848. "." +
  849. file.name.split(".")[file.name.split(".").length - 1],
  850. ContentType: file.type,
  851. Body: file,
  852. "Access-Control-Allow-Credentials": "*",
  853. ACL: "public-read",
  854. }; //key可以设置为桶的相抵路径,Body为文件, ACL最好要设置
  855. var options = {
  856. partSize: 2048 * 1024 * 1024,
  857. queueSize: 2,
  858. leavePartsOnError: true,
  859. };
  860. bucket
  861. .upload(params, options)
  862. .on("httpUploadProgress", function (evt) {
  863. //这里可以写进度条
  864. // console.log("Uploaded : " + parseInt((evt.loaded * 80) / evt.total) + '%');
  865. _this.raceDetail.data.progress = parseInt(
  866. (evt.loaded * 80) / evt.total
  867. );
  868. })
  869. .send(function (err, data) {
  870. // loading.close();
  871. _this.raceDetail.data.progress = 100;
  872. setTimeout(() => {
  873. _this.raceDetail.data.proVisible = false;
  874. _this.$forceUpdate();
  875. }, 1000);
  876. if (err) {
  877. _this.$message.error("上传失败");
  878. } else {
  879. _this.raceDetail.data.push({
  880. name: file.name,
  881. url: data.Location,
  882. type: type1,
  883. });
  884. _this.imgChange(null, null, type1, jsonType);
  885. console.log(data.Location);
  886. }
  887. });
  888. }
  889. },
  890. updateTitle() {
  891. this.$emit("updateTitle", this.raceDetail);
  892. },
  893. isAddPPTeacher() {
  894. if (this.raceDetail.tableData.length == 0) {
  895. if (this.sName === "") {
  896. this.$message.error("姓名不能为空");
  897. return;
  898. } else if (this.sSubject === "") {
  899. this.$message.error("学科不能为空");
  900. return;
  901. } else if (this.sSchool === "") {
  902. this.$message.error("学校不能为空");
  903. return;
  904. } else if (this.sPhone == "") {
  905. this.$message.error("手机号不能为空");
  906. return;
  907. } else if (!/^[1][3,4,5,7,8][0-9]{9}$/.test(this.sPhone)) {
  908. this.$message.error("手机号格式不正确");
  909. return;
  910. } else if (this.sEmail == "") {
  911. this.$message.error("邮箱不能为空");
  912. return;
  913. } else if (this.sEmail != "") {
  914. if (
  915. !/^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(\.[a-zA-Z0-9_-])+/.test(
  916. this.sEmail
  917. )
  918. ) {
  919. this.$message.error("邮箱格式不正确");
  920. return;
  921. }
  922. }
  923. } else if (this.raceDetail.tableData.length > 0) {
  924. if (this.upIndex == 0) {
  925. if (this.sName === "") {
  926. this.$message.error("姓名不能为空");
  927. return;
  928. } else if (this.sSubject === "") {
  929. this.$message.error("学科不能为空");
  930. return;
  931. } else if (this.sSchool === "") {
  932. this.$message.error("学校不能为空");
  933. return;
  934. } else if (this.sPhone == "") {
  935. this.$message.error("手机号不能为空");
  936. return;
  937. } else if (!/^[1][3,4,5,7,8][0-9]{9}$/.test(this.sPhone)) {
  938. this.$message.error("手机号格式不正确");
  939. return;
  940. } else if (this.sEmail == "") {
  941. this.$message.error("邮箱不能为空");
  942. return;
  943. } else if (this.sEmail != "") {
  944. if (
  945. !/^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(\.[a-zA-Z0-9_-])+/.test(
  946. this.sEmail
  947. )
  948. ) {
  949. this.$message.error("邮箱格式不正确");
  950. return;
  951. }
  952. }
  953. } else {
  954. if (this.sName === "") {
  955. this.$message.error("姓名不能为空");
  956. return;
  957. } else if (this.sPhone != "") {
  958. if (!/^[1][3,4,5,7,8][0-9]{9}$/.test(this.sPhone)) {
  959. this.$message.error("手机号格式不正确");
  960. return;
  961. }
  962. } else if (this.sEmail != "") {
  963. if (
  964. !/^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(\.[a-zA-Z0-9_-])+/.test(
  965. this.sEmail
  966. )
  967. ) {
  968. this.$message.error("邮箱格式不正确");
  969. return;
  970. }
  971. }
  972. }
  973. }
  974. if (this.isAddOrUp == true) {
  975. this.raceDetail.tableData[this.upIndex].sn = this.sName;
  976. this.raceDetail.tableData[this.upIndex].su = this.sSubject;
  977. this.raceDetail.tableData[this.upIndex].sc = this.sSchool;
  978. this.raceDetail.tableData[this.upIndex].em = this.sEmail;
  979. this.raceDetail.tableData[this.upIndex].ph = this.sPhone;
  980. } else {
  981. this.raceDetail.tableData.push({
  982. sn: this.sName,
  983. su: this.sSubject,
  984. sc: this.sSchool,
  985. em: this.sEmail,
  986. ph: this.sPhone,
  987. });
  988. }
  989. this.sName = "";
  990. this.sSubject = "";
  991. this.sSchool = "";
  992. this.sEmail = "";
  993. this.sPhone = "";
  994. this.isAddOrUp = false;
  995. this.upIndex = -1;
  996. this.dialogVisibleMember = false;
  997. this.$emit("updateTitle", this.raceDetail);
  998. },
  999. updateStudent(r, i) {
  1000. this.sName = r.sn;
  1001. this.sSubject = r.su;
  1002. this.sSchool = r.sc;
  1003. this.sEmail = r.em;
  1004. this.sPhone = r.ph;
  1005. this.isAddOrUp = true;
  1006. this.upIndex = i;
  1007. this.dialogVisibleMember = true;
  1008. },
  1009. deleteStudent(i) {
  1010. this.$confirm("确定删除此作者吗?", "提示", {
  1011. confirmButtonText: "确定",
  1012. cancelButtonText: "取消",
  1013. type: "warning",
  1014. })
  1015. .then(() => {
  1016. this.$message({
  1017. message: "删除成功",
  1018. type: "success",
  1019. });
  1020. this.raceDetail.tableData.splice(i, 1);
  1021. this.$emit("updateTitle", this.raceDetail);
  1022. })
  1023. .catch(() => {});
  1024. },
  1025. selectType() {
  1026. this.ajax
  1027. .get(this.$store.state.api + "selectMatType")
  1028. .then((res) => {
  1029. this.CourseType = res.data;
  1030. for (var i = 0; i < res.data[0].length; i++) {
  1031. if (!this.cid) {
  1032. this.raceDetail.type[res.data[0][i].id] = "";
  1033. }
  1034. for (var j = 0; j < res.data[1].length; j++) {
  1035. if (res.data[0][i].id == res.data[1][j].pid) {
  1036. if (!this.CourseTypeJson[res.data[0][i].id]) {
  1037. this.CourseTypeJson[res.data[0][i].id] = [];
  1038. }
  1039. this.CourseTypeJson[res.data[0][i].id].push(res.data[1][j]);
  1040. }
  1041. }
  1042. }
  1043. })
  1044. .catch((err) => {
  1045. console.error(err);
  1046. });
  1047. },
  1048. getAllBanner() {
  1049. this.sysPicVisible = true;
  1050. let params = {
  1051. t: this.chooseType,
  1052. };
  1053. this.ajax
  1054. .get(this.$store.state.api + "selectAllBanner", params)
  1055. .then((res) => {
  1056. this.sysPic = res.data[0];
  1057. })
  1058. .catch((err) => {
  1059. console.error(err);
  1060. });
  1061. },
  1062. getValue() {
  1063. this.raceDetail.title = this.raceInfo.title;
  1064. this.raceDetail.type = this.raceInfo.type;
  1065. this.raceDetail.cover = this.raceInfo.cover;
  1066. this.raceDetail.tableData = this.raceInfo.tableData;
  1067. this.raceDetail.courseText = this.raceInfo.courseText;
  1068. this.raceDetail.data = this.raceInfo.data;
  1069. this.imgChange1(null, null, 1, null);
  1070. this.$forceUpdate();
  1071. },
  1072. },
  1073. created() {
  1074. this.getValue();
  1075. this.selectType();
  1076. },
  1077. };
  1078. </script>
  1079. <style scoped>
  1080. @media screen and (max-width: 1280px) {
  1081. .upTips {
  1082. align-items: flex-start !important;
  1083. }
  1084. }
  1085. .dialog_diy >>> .el-dialog__header {
  1086. background: #3c3c3c !important;
  1087. padding: 15px 20px;
  1088. }
  1089. .dialog_diy >>> .el-dialog__title {
  1090. color: #fff;
  1091. }
  1092. .dialog_diy >>> .el-dialog__headerbtn {
  1093. top: 19px;
  1094. }
  1095. .dialog_diy >>> .el-dialog__headerbtn .el-dialog__close {
  1096. color: #fff;
  1097. }
  1098. .dialog_diy >>> .el-dialog__headerbtn .el-dialog__close:hover {
  1099. color: #fff;
  1100. }
  1101. .dialog_diy >>> .el-dialog__body,
  1102. .dialog_diy >>> .el-dialog__footer {
  1103. background: #fafafa;
  1104. }
  1105. .pb_content {
  1106. width: 100%;
  1107. height: 100%;
  1108. }
  1109. .race_content_body {
  1110. width: 100%;
  1111. position: relative;
  1112. margin: 0;
  1113. height: 100%;
  1114. }
  1115. .raceBox {
  1116. width: 100%;
  1117. height: 100%;
  1118. display: flex;
  1119. flex-direction: row;
  1120. flex-wrap: nowrap;
  1121. align-items: flex-start;
  1122. }
  1123. .stepBg {
  1124. padding: 80px 0 0 0;
  1125. margin: 0 25px 0 0;
  1126. width: 20%;
  1127. display: flex;
  1128. justify-content: flex-start;
  1129. align-items: center;
  1130. flex-wrap: nowrap;
  1131. background: #fff;
  1132. /* min-height: 800px; */
  1133. height: calc(100% - 80px);
  1134. border-radius: 15px;
  1135. overflow: auto;
  1136. min-width: 260px;
  1137. flex-direction: column;
  1138. font-size: 14px;
  1139. }
  1140. .steps {
  1141. display: flex;
  1142. flex-direction: row;
  1143. flex-wrap: nowrap;
  1144. position: relative;
  1145. width: 145px;
  1146. height: 130px;
  1147. }
  1148. .steps > div:nth-child(1) > img {
  1149. z-index: 9;
  1150. position: relative;
  1151. }
  1152. .stepLeft,
  1153. .isSteps {
  1154. width: 30px;
  1155. height: 30px;
  1156. border-radius: 50%;
  1157. text-align: center;
  1158. line-height: 30px;
  1159. border: 2px solid #eee;
  1160. color: #c0c0c0;
  1161. }
  1162. .isSteps {
  1163. background: #1990ff;
  1164. color: #fff;
  1165. border: none;
  1166. }
  1167. .stepRightNav {
  1168. display: flex;
  1169. flex-direction: column;
  1170. flex-wrap: nowrap;
  1171. justify-content: space-between;
  1172. align-items: flex-start;
  1173. margin-left: 10px;
  1174. height: 40px;
  1175. cursor: pointer;
  1176. }
  1177. .stepRightNav:hover {
  1178. color: #999;
  1179. }
  1180. .line,
  1181. .isLine {
  1182. position: absolute;
  1183. width: 5px;
  1184. height: 50px;
  1185. border-left: 1px solid #dadada;
  1186. top: 38px;
  1187. left: 15px;
  1188. }
  1189. .isLine {
  1190. border-left: 1px solid #1d92ff !important;
  1191. }
  1192. .right {
  1193. width: calc(100% - 20%);
  1194. background: rgb(255, 255, 255);
  1195. border-radius: 10px;
  1196. overflow: auto;
  1197. height: 100%;
  1198. border-radius: 15px;
  1199. /* max-height: 800px; */
  1200. }
  1201. .allBox {
  1202. padding: 25px;
  1203. }
  1204. .allBox > div:nth-child(1) {
  1205. color: #0f40f5;
  1206. font-size: 18px;
  1207. font-weight: bold;
  1208. }
  1209. .raceTop > div:nth-child(2) {
  1210. width: 80%;
  1211. margin-top: 10px;
  1212. }
  1213. .choose {
  1214. display: flex;
  1215. flex-direction: column;
  1216. flex-wrap: nowrap;
  1217. height: 100%;
  1218. justify-content: space-evenly;
  1219. align-items: flex-start;
  1220. }
  1221. .both {
  1222. display: flex;
  1223. flex-direction: row;
  1224. flex-wrap: wrap;
  1225. width: 100%;
  1226. align-items: center;
  1227. justify-content: flex-start;
  1228. margin: 30px 0;
  1229. }
  1230. .all_choose {
  1231. display: flex;
  1232. flex-direction: row;
  1233. align-items: flex-start;
  1234. width: 100%;
  1235. }
  1236. .choose > .all_choose:nth-child(2) > span,
  1237. .choose > .all_choose:nth-child(3) > span {
  1238. letter-spacing: 31px;
  1239. }
  1240. .all_choose > span {
  1241. width: 120px;
  1242. /* display: block;
  1243. letter-spacing: 33px;
  1244. white-space: nowrap;
  1245. overflow: hidden;
  1246. text-overflow: ellipsis; */
  1247. }
  1248. .all_choose >>> .el-checkbox-group {
  1249. display: flex;
  1250. flex-direction: row;
  1251. width: 100%;
  1252. flex-wrap: wrap;
  1253. align-content: center;
  1254. justify-content: flex-start;
  1255. align-items: center;
  1256. margin-top: 3px;
  1257. }
  1258. .all_choose > .el-checkbox-group >>> .el-checkbox {
  1259. margin-bottom: 10px;
  1260. display: flex;
  1261. flex-direction: row;
  1262. align-items: center;
  1263. }
  1264. .all_choose > .el-checkbox-group > .el-checkbox >>> .el-checkbox__label {
  1265. width: 85px;
  1266. min-width: 85px;
  1267. /* min-width: 80px;
  1268. overflow: hidden; */
  1269. /* width: 80px; */
  1270. /* text-overflow: ellipsis;
  1271. white-space: nowrap; */
  1272. }
  1273. .all_choose > .el-checkbox-group > .el-checkbox >>> .el-checkbox__label:hover {
  1274. width: auto;
  1275. }
  1276. .disUoloadSty >>> .el-icon-plus {
  1277. display: none !important;
  1278. /* 上传按钮隐藏 */
  1279. }
  1280. .upCss {
  1281. display: flex;
  1282. flex-direction: row;
  1283. justify-content: flex-start;
  1284. }
  1285. .upCss >>> .el-icon-plus {
  1286. position: none !important;
  1287. width: 200px;
  1288. height: 100px;
  1289. display: flex;
  1290. flex-wrap: nowrap;
  1291. flex-direction: column;
  1292. align-items: center;
  1293. justify-content: center;
  1294. border: 1px dashed #ccc;
  1295. min-width: 78px;
  1296. min-height: 100px;
  1297. z-index: 999;
  1298. }
  1299. .upCss >>> .el-upload-list__item-name {
  1300. width: 100px;
  1301. white-space: nowrap;
  1302. overflow: hidden;
  1303. text-overflow: ellipsis;
  1304. }
  1305. .uploadFm {
  1306. border: 1px dashed #ccc;
  1307. width: 202px;
  1308. height: 102px;
  1309. position: relative;
  1310. cursor: pointer;
  1311. }
  1312. .uploadFm > img {
  1313. position: absolute;
  1314. top: 25px;
  1315. left: 35%;
  1316. width: 50px;
  1317. }
  1318. .picBox {
  1319. display: flex;
  1320. flex-direction: row;
  1321. flex-wrap: nowrap;
  1322. align-items: flex-start;
  1323. margin-top: 10px;
  1324. }
  1325. .picNav {
  1326. margin-left: 10px;
  1327. color: #aaabaa;
  1328. }
  1329. .addPeople {
  1330. color: #75a1f4;
  1331. padding: 10px 20px 10px 0;
  1332. float: right;
  1333. cursor: pointer;
  1334. }
  1335. .binfo_input {
  1336. font: inherit;
  1337. color: currentColor;
  1338. width: 100%;
  1339. margin: 0;
  1340. /* padding: 15px 14px; */
  1341. padding: 8px 14px;
  1342. display: block;
  1343. min-width: 0;
  1344. outline: none;
  1345. box-sizing: content-box;
  1346. background: none;
  1347. border: 1px solid rgba(0, 0, 0, 0.23);
  1348. border-radius: 4px;
  1349. box-sizing: border-box;
  1350. background: #fff;
  1351. font-size: 18px;
  1352. }
  1353. .binfo_input:focus-visible {
  1354. border: 1px solid rgba(61, 103, 188);
  1355. }
  1356. .secondTop {
  1357. width: 97%;
  1358. margin: 10px auto;
  1359. }
  1360. .tAreaCss {
  1361. resize: none;
  1362. font-size: 14px;
  1363. }
  1364. .addNewPP >>> .el-dialog__body {
  1365. padding: 5px 20px;
  1366. }
  1367. .customWidth >>> .el-dialog {
  1368. min-width: 500px !important;
  1369. }
  1370. .whiteBg {
  1371. background: #fff;
  1372. border-radius: 10px;
  1373. }
  1374. .right_title {
  1375. height: 30px;
  1376. padding: 15px 0 15px 20px;
  1377. border-bottom: 1px solid #f2f2f2;
  1378. font-size: 1.5em;
  1379. font-weight: bold;
  1380. color: #0f7eff;
  1381. margin: 0 auto;
  1382. }
  1383. .basic_box {
  1384. margin: 0 auto;
  1385. position: relative;
  1386. padding: 0 20px 0 20px;
  1387. }
  1388. .basic_box1 {
  1389. position: relative;
  1390. margin: 0;
  1391. min-height: 0;
  1392. width: 90%;
  1393. }
  1394. .left_first {
  1395. display: flex;
  1396. flex-direction: column;
  1397. flex-wrap: nowrap;
  1398. }
  1399. .bInfo_title {
  1400. text-align: left;
  1401. margin: 10px 0;
  1402. }
  1403. .fmBox {
  1404. padding: 10px 0 0 20px;
  1405. display: flex;
  1406. align-items: baseline;
  1407. justify-content: flex-start;
  1408. margin: 0 auto;
  1409. }
  1410. .logoImg {
  1411. width: 30px;
  1412. }
  1413. .logoImg > img {
  1414. width: 100%;
  1415. height: 100%;
  1416. }
  1417. .title_add_student {
  1418. margin: 0 auto;
  1419. color: #fff;
  1420. }
  1421. .add_input {
  1422. width: 365px;
  1423. }
  1424. .userImg {
  1425. display: flex;
  1426. flex-direction: row;
  1427. justify-content: center;
  1428. align-items: center;
  1429. }
  1430. .tx {
  1431. width: 40px;
  1432. margin-right: 10px;
  1433. }
  1434. .pb_buttonBox {
  1435. display: flex;
  1436. flex-direction: row;
  1437. flex-wrap: nowrap;
  1438. align-items: flex-start;
  1439. }
  1440. .delete {
  1441. width: 25px;
  1442. cursor: pointer;
  1443. margin-left: 10px;
  1444. }
  1445. .tx > img,
  1446. .delete > img {
  1447. width: 100%;
  1448. height: 100%;
  1449. }
  1450. .add_student >>> .el-dialog__header {
  1451. padding: 20px 20px 10px;
  1452. text-align: center;
  1453. background: #32455b;
  1454. }
  1455. .add_student >>> .el-dialog__title {
  1456. font-size: 14px !important;
  1457. color: #fff !important;
  1458. }
  1459. .add_student >>> .el-dialog__headerbtn {
  1460. font-size: 20px !important;
  1461. }
  1462. .add_student >>> .el-form-item__label {
  1463. margin-left: 65px;
  1464. }
  1465. .add_student >>> .el-form-item {
  1466. display: flex;
  1467. }
  1468. .add_student >>> .el-form-item__content {
  1469. margin: 0 !important;
  1470. }
  1471. .add_student >>> .el-dialog__footer {
  1472. text-align: center !important;
  1473. }
  1474. .header-title {
  1475. display: flex;
  1476. }
  1477. .stepBg .steps:nth-child(1) ::after,
  1478. .stepBg .steps:nth-child(2) ::after,
  1479. .stepBg .steps:nth-child(3) ::after,
  1480. .stepBg .steps:nth-child(4) ::after {
  1481. content: "";
  1482. height: 100%;
  1483. background: #eee;
  1484. width: 4px;
  1485. position: absolute;
  1486. left: 15px;
  1487. top: calc(50% + (35px / 2));
  1488. transform: translateY(-50%);
  1489. z-index: 1;
  1490. }
  1491. .fileCss {
  1492. width: 100%;
  1493. display: flex;
  1494. flex-direction: row;
  1495. flex-wrap: nowrap;
  1496. justify-content: space-around;
  1497. align-items: center;
  1498. padding-top: 15px;
  1499. }
  1500. .sysPicBox {
  1501. display: flex;
  1502. flex-direction: row;
  1503. flex-wrap: wrap;
  1504. align-content: flex-start;
  1505. height: 435px;
  1506. overflow: auto;
  1507. }
  1508. .sysPic {
  1509. width: 200px;
  1510. height: 115px;
  1511. margin: 0 10px 20px 0;
  1512. cursor: pointer;
  1513. }
  1514. .sysPic > img,
  1515. .isSysPic > img,
  1516. .deletePic > img {
  1517. width: 100%;
  1518. height: 100%;
  1519. object-fit: cover;
  1520. }
  1521. .isSysPic {
  1522. width: 200px;
  1523. height: 115px;
  1524. position: relative;
  1525. }
  1526. .deletePic {
  1527. width: 20px;
  1528. height: 20px;
  1529. position: absolute;
  1530. top: 0;
  1531. right: 0;
  1532. cursor: pointer;
  1533. }
  1534. .cru_selectBox {
  1535. display: flex;
  1536. margin: 24px 0 10px;
  1537. flex-wrap: nowrap;
  1538. white-space: nowrap;
  1539. overflow: auto;
  1540. position: relative;
  1541. height: 47px;
  1542. }
  1543. .cru_selectBox::-webkit-scrollbar {
  1544. /*滚动条整体样式*/
  1545. width: 6px;
  1546. /*高宽分别对应横竖滚动条的尺寸*/
  1547. height: 6px;
  1548. }
  1549. /*定义滚动条轨道 内阴影+圆角*/
  1550. .cru_selectBox::-webkit-scrollbar-track {
  1551. border-radius: 10px;
  1552. background-color: #eee;
  1553. }
  1554. /*定义滑块 内阴影+圆角*/
  1555. .cru_selectBox::-webkit-scrollbar-thumb {
  1556. border-radius: 10px;
  1557. -webkit-box-shadow: inset 0 0 6px rgba(0, 0, 0, 0.3);
  1558. background-color: rgba(0, 0, 0, 0.1);
  1559. }
  1560. .cru_select {
  1561. font-size: 21px;
  1562. margin-right: 37px;
  1563. margin-left: 5px;
  1564. cursor: pointer;
  1565. color: #a6a6a6;
  1566. }
  1567. .cru_selected {
  1568. color: #0b7fc2 !important;
  1569. }
  1570. .info_btn {
  1571. color: #fff;
  1572. background-color: #0f7eff;
  1573. padding: 8px 24px;
  1574. font-size: 0.9375rem;
  1575. box-shadow: 0px 1px 3px 0px rgb(0 0 0 / 20%), 0px 2px 2px 0px rgb(0 0 0 / 14%),
  1576. 0px 3px 1px -2px rgb(0 0 0 / 12%);
  1577. min-width: 64px;
  1578. font-weight: 500;
  1579. border-radius: 4px;
  1580. box-sizing: border-box;
  1581. border: none;
  1582. cursor: pointer;
  1583. }
  1584. .raTable {
  1585. width: 97%;
  1586. margin: 0 auto;
  1587. height: auto;
  1588. }
  1589. .raTable >>> .el-table,
  1590. .raTable >>> .el-table__body-wrapper {
  1591. height: auto !important;
  1592. font-size: 16px !important;
  1593. }
  1594. .add_chapters_box {
  1595. text-align: left;
  1596. background-color: rgb(232 234 237);
  1597. width: 100%;
  1598. padding: 0px 15px;
  1599. border-radius: 15px;
  1600. font-size: 16px;
  1601. box-sizing: border-box;
  1602. position: relative;
  1603. padding: 0 10px 5px 10px;
  1604. height: 140px;
  1605. overflow-y: auto;
  1606. overflow-x: hidden;
  1607. }
  1608. .chapter_upload {
  1609. height: 50px;
  1610. margin-top: 12px;
  1611. position: relative;
  1612. display: flex;
  1613. align-items: center;
  1614. width: 100%;
  1615. min-height: 50px;
  1616. }
  1617. .chapter_upload_t {
  1618. background-color: #fff;
  1619. position: absolute;
  1620. height: 100%;
  1621. top: 0px;
  1622. left: 0px;
  1623. border-radius: 40px;
  1624. box-sizing: border-box;
  1625. box-shadow: 0 0 3px 3px #dfdfdf;
  1626. width: 100%;
  1627. }
  1628. .chapter_upload_o {
  1629. width: 100%;
  1630. height: 100%;
  1631. position: relative;
  1632. z-index: 1;
  1633. display: flex;
  1634. align-items: center;
  1635. }
  1636. .chapter_upload_ic {
  1637. height: 30px;
  1638. float: right;
  1639. cursor: pointer;
  1640. position: absolute;
  1641. width: 45px;
  1642. right: 0;
  1643. top: 0;
  1644. }
  1645. .chapter_upload_ic_l {
  1646. width: 50px;
  1647. height: 50px;
  1648. float: left;
  1649. }
  1650. .chapter_upload_ic_l div {
  1651. width: 30px;
  1652. height: 35px;
  1653. background: url("../../../../assets/icon/icon.png");
  1654. }
  1655. .chapter_upload_ic_r {
  1656. width: 50px;
  1657. height: 50px;
  1658. float: left;
  1659. margin-left: 0px;
  1660. display: flex;
  1661. align-items: center;
  1662. position: absolute;
  1663. }
  1664. .chapter_upload_ic_r div {
  1665. width: 25px;
  1666. height: 25px;
  1667. background-image: url("../../../../assets/delete.png");
  1668. background-size: 100% 100%;
  1669. }
  1670. .chapter_upload_n {
  1671. display: flex;
  1672. text-indent: 10px;
  1673. text-decoration: none;
  1674. text-overflow: ellipsis;
  1675. white-space: nowrap;
  1676. overflow: hidden;
  1677. width: 55%;
  1678. margin-left: 10px;
  1679. cursor: pointer;
  1680. margin-top: 2px;
  1681. }
  1682. .chapter_upload_l_i1 {
  1683. background-image: url("../../../../assets/icon/video.png");
  1684. width: 28px;
  1685. height: 28px;
  1686. background-size: 100% 100%;
  1687. }
  1688. .chapter_upload_l_i5 {
  1689. background-image: url("../../../../assets/icon/word.png");
  1690. width: 24px;
  1691. height: 24px;
  1692. background-size: 100% 100%;
  1693. margin-left: 1px;
  1694. }
  1695. .chapter_upload_l_i8 {
  1696. background-image: url("../../../../assets/icon/line.png");
  1697. width: 24px;
  1698. height: 24px;
  1699. background-size: 100% 100%;
  1700. margin-left: 1px;
  1701. }
  1702. .chapter_upload_ud {
  1703. display: flex;
  1704. flex-direction: column;
  1705. margin-left: 5px;
  1706. justify-content: center;
  1707. z-index: 99;
  1708. }
  1709. .chapter_upload_up {
  1710. background-image: url("../../../../assets/icon/up.png");
  1711. width: 17px;
  1712. height: 15px;
  1713. background-size: 100% 100%;
  1714. cursor: pointer;
  1715. }
  1716. .chapter_upload_down {
  1717. background-image: url("../../../../assets/icon/down.png");
  1718. width: 17px;
  1719. height: 15px;
  1720. margin: 2px auto 0 auto;
  1721. background-size: 100% 100%;
  1722. cursor: pointer;
  1723. }
  1724. .chapter_upload_l {
  1725. padding: 1px 0 0 10px;
  1726. }
  1727. .first {
  1728. border: none;
  1729. outline: none;
  1730. width: 80%;
  1731. min-width: 215px;
  1732. z-index: 99;
  1733. font-size: 14px;
  1734. white-space: nowrap;
  1735. overflow: hidden;
  1736. text-overflow: ellipsis;
  1737. }
  1738. .add_info_box {
  1739. margin: 20px 0;
  1740. }
  1741. .add_info_box button {
  1742. margin: 0 10px 10px 0;
  1743. }
  1744. .mask {
  1745. background-color: rgb(0 0 0 / 30%);
  1746. /* position: fixed; */
  1747. position: absolute;
  1748. top: 0;
  1749. left: 0;
  1750. width: 100%;
  1751. height: 100%;
  1752. z-index: 20000;
  1753. display: flex;
  1754. align-items: center;
  1755. justify-content: center;
  1756. }
  1757. .progressBox {
  1758. width: 300px;
  1759. height: 150px;
  1760. background: #fff;
  1761. border-radius: 10px;
  1762. box-shadow: 0 0 6px 1px #bfbfbf;
  1763. display: flex;
  1764. align-items: center;
  1765. justify-content: center;
  1766. flex-direction: column;
  1767. }
  1768. .progressBox .lbox {
  1769. height: 100px;
  1770. font-size: 16px;
  1771. display: flex;
  1772. align-items: center;
  1773. }
  1774. .progressBox .lbox img {
  1775. width: 40px;
  1776. margin-right: 20px;
  1777. }
  1778. .progressBox >>> .el-progress-bar__outer {
  1779. background-color: #d1dfff !important;
  1780. }
  1781. .progressBox .lbox {
  1782. height: 100px;
  1783. font-size: 19px;
  1784. display: flex;
  1785. align-items: center;
  1786. }
  1787. .progressBox .lbox img {
  1788. width: 40px;
  1789. margin-right: 20px;
  1790. }
  1791. .upTips {
  1792. display: flex;
  1793. flex-direction: row;
  1794. flex-wrap: nowrap;
  1795. align-items: baseline;
  1796. }
  1797. .upTips > div {
  1798. margin-left: 10px;
  1799. color: #999;
  1800. font-size: 14px;
  1801. }
  1802. .tableColor >>> .tr-blue {
  1803. color: #628ff3 !important;
  1804. }
  1805. .lxr {
  1806. color: #fff;
  1807. background: center center #4a54ff;
  1808. background-image: linear-gradient(315deg, #6772ff 0, #00f9e5 100%);
  1809. background-size: 104% 104%;
  1810. min-width: 50px;
  1811. margin-left: 3px;
  1812. border-radius: 3px;
  1813. }
  1814. </style>