CaseDesignS.vue 44 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223
  1. <template>
  2. <div class="cd_body">
  3. <div class="pb_content_body" style="
  4. background: #fff;
  5. padding: 0px 25px;
  6. box-sizing: border-box;
  7. border-radius: 5px;
  8. width: 95%;
  9. ">
  10. <div class="pb_head">
  11. <span>项目数据看板</span>
  12. <div style="display: flex;align-items: center;">
  13. <!-- <el-button type="primary" size="small" @click="exportHtml" style="margin-right: 10px;">导出html</el-button> -->
  14. <el-button type="primary" size="small" @click="exportExcel" style="margin-right: 10px;">导出Excel</el-button>
  15. <el-switch v-model="mode" active-text="详情模式" inactive-text="简易模式" @change="changeMode">
  16. </el-switch>
  17. </div>
  18. </div>
  19. <div class="student_head">
  20. <div class="head_left">
  21. <span>筛选:</span>
  22. <el-select v-model="choose" @change="isLoading = true, getData()" style="margin-right: 10px;">
  23. <el-option label="默认排序" value=""> </el-option>
  24. <el-option label="学校名称" value="school"> </el-option>
  25. <el-option label="任务数量" value="task"> </el-option>
  26. <el-option label="评审结果" value="score"> </el-option>
  27. <!-- <el-option label="评价" value="eval"> </el-option> -->
  28. <el-option label="工具" value="tool"> </el-option>
  29. <el-option label="字数" value="font"> </el-option>
  30. </el-select>
  31. <el-select v-model="ttype" @change="page = 1, isLoading = true, getData()">
  32. <el-option label="全部" value=""></el-option>
  33. <el-option v-for="item in courseTypeId" :key="item.id" :label="item.name" :value="item.id">
  34. </el-option>
  35. </el-select>
  36. <el-input v-model="search" class="student_input" placeholder="请输入教师名称或学校名称" @input="getData"></el-input>
  37. </div>
  38. </div>
  39. </div>
  40. <div class="cd_table">
  41. <el-table ref="table" :data="tableData" border :fit="true" v-loading="isLoading" style="width: 100%"
  42. :header-cell-style="{ background: '#f1f1f1', fontSize: '17px' }" :row-class-name="tableRowClassName" class="table"
  43. :height="tableHeight" :key="mode">
  44. <el-table-column label="序号" prop="number" width="70px" align="center">
  45. </el-table-column>
  46. <el-table-column label="项目" width="150px" align="center">
  47. <template slot-scope="scope">
  48. <div style="max-height: 180px; overflow: auto">
  49. <div v-for="(item, index) in scope.row.course" :key="index" class="cd_course" @click="jump(item.courseId)">
  50. <el-tooltip :content="item.title">
  51. <span>{{ item.title }}</span>
  52. </el-tooltip>
  53. </div>
  54. </div>
  55. </template>
  56. </el-table-column>
  57. <el-table-column label="分类" prop="typename" width="130px" align="center">
  58. </el-table-column>
  59. <el-table-column label="学校" prop="school" width="100px" align="center">
  60. </el-table-column>
  61. <el-table-column label="负责人" prop="username" width="80px" align="center">
  62. </el-table-column>
  63. <el-table-column label="协同人员" prop="cteacher" width="100px" align="center">
  64. <template slot-scope="scope">
  65. <div>{{ scope.row.cteacher ? scope.row.cteacher : '—' }}</div>
  66. </template>
  67. </el-table-column>
  68. <el-table-column label="创建时间" prop="ctime" width="85px" align="center">
  69. </el-table-column>
  70. <el-table-column label="更新时间" prop="time" width="85px" align="center">
  71. </el-table-column>
  72. <el-table-column label="总计" width="85px" align="center">
  73. <template slot-scope="scope">
  74. <div class="cd_d_span">
  75. <div>
  76. <div>
  77. <span>{{ scope.row.jdz.taskC }}</span><span>任务</span>
  78. </div>
  79. <div>
  80. <span>{{ scope.row.jdz.toolC }}</span><span>工具</span>
  81. </div>
  82. <!-- <div>
  83. <span>{{ scope.row.jdz.evalC }}</span
  84. ><span>评价</span>
  85. </div> -->
  86. <div>
  87. <span>{{ scope.row.jdz.fontC }}</span><span>字</span>
  88. </div>
  89. </div>
  90. </div>
  91. </template>
  92. </el-table-column>
  93. <el-table-column label="阶段1" v-if="mode" width="85px" align="center">
  94. <template slot-scope="scope">
  95. <div v-if="scope.row.jd1">
  96. <div class="cd_d_span">
  97. <div>
  98. <span>{{ scope.row.jd1.taskC }}</span><span>任务</span>
  99. </div>
  100. <div>
  101. <span>{{ scope.row.jd1.toolC }}</span><span>工具</span>
  102. </div>
  103. <!-- <div>
  104. <span>{{ scope.row.jd1.evalC }}</span
  105. ><span>评价</span>
  106. </div> -->
  107. <div>
  108. <span>{{ scope.row.jd1.fontC }}</span><span>字</span>
  109. </div>
  110. </div>
  111. </div>
  112. <div v-else>—</div>
  113. </template>
  114. </el-table-column>
  115. <el-table-column label="阶段2" v-if="mode" width="85px" align="center">
  116. <template slot-scope="scope">
  117. <div v-if="scope.row.jd2">
  118. <div class="cd_d_span">
  119. <div>
  120. <span>{{ scope.row.jd2.taskC }}</span><span>任务</span>
  121. </div>
  122. <div>
  123. <span>{{ scope.row.jd2.toolC }}</span><span>工具</span>
  124. </div>
  125. <!-- <div>
  126. <span>{{ scope.row.jd2.evalC }}</span
  127. ><span>评价</span>
  128. </div> -->
  129. <div>
  130. <span>{{ scope.row.jd2.fontC }}</span><span>字</span>
  131. </div>
  132. </div>
  133. </div>
  134. <div v-else>—</div>
  135. </template>
  136. </el-table-column>
  137. <el-table-column label="阶段3" v-if="mode" width="85px" align="center">
  138. <template slot-scope="scope">
  139. <div v-if="scope.row.jd3">
  140. <div class="cd_d_span">
  141. <div>
  142. <span>{{ scope.row.jd3.taskC }}</span><span>任务</span>
  143. </div>
  144. <div>
  145. <span>{{ scope.row.jd3.toolC }}</span><span>工具</span>
  146. </div>
  147. <!-- <div>
  148. <span>{{ scope.row.jd3.evalC }}</span
  149. ><span>评价</span>
  150. </div> -->
  151. <div>
  152. <span>{{ scope.row.jd3.fontC }}</span><span>字</span>
  153. </div>
  154. </div>
  155. </div>
  156. <div v-else>—</div>
  157. </template>
  158. </el-table-column>
  159. <el-table-column label="阶段4" v-if="mode" width="85px" align="center">
  160. <template slot-scope="scope">
  161. <div v-if="scope.row.jd4">
  162. <div class="cd_d_span">
  163. <div>
  164. <span>{{ scope.row.jd4.taskC }}</span><span>任务</span>
  165. </div>
  166. <div>
  167. <span>{{ scope.row.jd4.toolC }}</span><span>工具</span>
  168. </div>
  169. <!-- <div>
  170. <span>{{ scope.row.jd4.evalC }}</span
  171. ><span>评价</span>
  172. </div> -->
  173. <div>
  174. <span>{{ scope.row.jd4.fontC }}</span><span>字</span>
  175. </div>
  176. </div>
  177. </div>
  178. <div v-else>—</div>
  179. </template>
  180. </el-table-column>
  181. <el-table-column label="阶段5" v-if="mode" width="85px" align="center">
  182. <template slot-scope="scope">
  183. <div v-if="scope.row.jd5">
  184. <div class="cd_d_span">
  185. <div>
  186. <span>{{ scope.row.jd5.taskC }}</span><span>任务</span>
  187. </div>
  188. <div>
  189. <span>{{ scope.row.jd5.toolC }}</span><span>工具</span>
  190. </div>
  191. <!-- <div>
  192. <span>{{ scope.row.jd5.evalC }}</span
  193. ><span>评价</span>
  194. </div> -->
  195. <div>
  196. <span>{{ scope.row.jd5.fontC }}</span><span>字</span>
  197. </div>
  198. </div>
  199. </div>
  200. <div v-else>—</div>
  201. </template>
  202. </el-table-column>
  203. <el-table-column label="阶段6" v-if="mode" width="85px" align="center">
  204. <template slot-scope="scope">
  205. <div v-if="scope.row.jd6">
  206. <div class="cd_d_span">
  207. <div>
  208. <span>{{ scope.row.jd6.taskC }}</span><span>任务</span>
  209. </div>
  210. <div>
  211. <span>{{ scope.row.jd6.toolC }}</span><span>工具</span>
  212. </div>
  213. <!-- <div>
  214. <span>{{ scope.row.jd6.evalC }}</span
  215. ><span>评价</span>
  216. </div> -->
  217. <div>
  218. <span>{{ scope.row.jd6.fontC }}</span><span>字</span>
  219. </div>
  220. </div>
  221. </div>
  222. <div v-else>—</div>
  223. </template>
  224. </el-table-column>
  225. <el-table-column label="项目简介" v-if="!mode" min-width="80px" align="center">
  226. <template slot-scope="scope">
  227. <div v-if="scope.row.brief" class="tooltip">
  228. <el-tooltip :content="scope.row.brief" class="my-tooltip-class" popper-class="text_tooltip">
  229. <span>{{ scope.row.brief }}</span>
  230. </el-tooltip>
  231. </div>
  232. <div v-else>
  233. </div>
  234. </template>
  235. </el-table-column>
  236. <el-table-column label="项目所处阶段" prop="lastTask" width="130px" align="center">
  237. <template slot-scope="scope">
  238. <div>{{ scope.row.lastTask ? scope.row.lastTask : '—' }}</div>
  239. </template>
  240. </el-table-column>
  241. <el-table-column label="评审状态" width="80px" align="center">
  242. <template slot-scope="scope">
  243. <div>{{ scope.row.score ? '已评分' : '未评分' }}</div>
  244. </template>
  245. </el-table-column>
  246. <el-table-column label="评审结果" prop="score" width="80px" align="center">
  247. <template slot-scope="scope">
  248. <div>{{ scope.row.score }}分</div>
  249. </template>
  250. </el-table-column>
  251. <el-table-column label="评审类型" prop="psType" width="80px" align="center">
  252. <template slot-scope="scope">
  253. <div>{{ scope.row.psType == '1' ? '造型结构' : scope.row.psType == '2' ? '开源硬件' : scope.row.psType == '3' ? '软件设计'
  254. : scope.row.psType == '4' ? '总分' : '—' }}</div>
  255. </template>
  256. </el-table-column>
  257. <el-table-column fixed="right" label="操作" width="180px" align="center">
  258. <template slot-scope="scope">
  259. <!-- <div
  260. @click="getAll(scope.row)"
  261. >
  262. 查看全部
  263. </div> -->
  264. <el-button type="primary" size="small" @click="jump2(scope.row.course[0].courseId)">评审</el-button>
  265. <el-button type="primary" size="small" @click="setMan(scope.row)">导出</el-button>
  266. </template>
  267. </el-table-column>
  268. </el-table>
  269. <div class="student_page">
  270. <el-pagination background layout="prev, pager, next, sizes" :page-size="pageSize" :page-sizes="[10, 50, 100, 200]"
  271. :total="total" v-if="page && tableData.length" style="padding: 0px" @current-change="handleCurrentChange"
  272. @size-change="handleSizeChange"></el-pagination>
  273. </div>
  274. </div>
  275. <el-dialog title="查看" :visible.sync="dialogVisible" :append-to-body="true" width="620px" :before-close="handleClose"
  276. class="dialog_diy">
  277. <div v-if="dataArray.length">
  278. <div class="cd_d_box">
  279. <span>教师:</span><span>{{ data.username }}</span>
  280. </div>
  281. <div class="cd_d_box">
  282. <span>学校:</span><span>{{ data.school }}</span>
  283. </div>
  284. <div class="cd_d_jd">
  285. <div v-for="(item, index) in dataArray" :key="index" class="cd_d_jd_box">
  286. <div class="cd_d_jd_name">{{ "阶段" + (index + 1) }}</div>
  287. <div class="cd_d_jd_content cd_d_span">
  288. <div>
  289. <span>{{ data[item].taskC }}</span><span>任务</span>
  290. </div>
  291. <div>
  292. <span>{{ data[item].toolC }}</span><span>工具</span>
  293. </div>
  294. <!-- <div>
  295. <span>{{ data[item].evalC }}</span
  296. ><span>评价</span>
  297. </div> -->
  298. <div>
  299. <span>{{ data[item].fontC }}</span><span>字</span>
  300. </div>
  301. </div>
  302. </div>
  303. <div class="cd_d_jd_box">
  304. <div class="cd_d_jd_name">总计</div>
  305. <div class="cd_d_jd_content cd_d_span" style="background: #d4d4d4">
  306. <div>
  307. <span>{{ data["jdz"].taskC }}</span><span>任务</span>
  308. </div>
  309. <div>
  310. <span>{{ data["jdz"].toolC }}</span><span>工具</span>
  311. </div>
  312. <!-- <div>
  313. <span>{{ data["jdz"].evalC }}</span
  314. ><span>评价</span>
  315. </div> -->
  316. <div>
  317. <span>{{ data["jdz"].fontC }}</span><span>字</span>
  318. </div>
  319. </div>
  320. </div>
  321. </div>
  322. </div>
  323. <span slot="footer" class="dialog-footer">
  324. <el-button @click="dialogVisible = false">关闭</el-button>
  325. </span>
  326. </el-dialog>
  327. </div>
  328. </template>
  329. <script>
  330. export default {
  331. data() {
  332. return {
  333. tableData: [],
  334. isLoading: false,
  335. org: this.$route.query.org,
  336. oid: this.$route.query.oid,
  337. timer: null,
  338. dialogVisible: false,
  339. data: {},
  340. dataArray: [],
  341. choose: "",
  342. search: "",
  343. mode: false,
  344. courseTypeId: [],
  345. ttype: "",
  346. total: 0,
  347. page: 1,
  348. pageSize: 100,
  349. tableHeight: "500px",
  350. };
  351. },
  352. methods: {
  353. jump(cid) {
  354. window.parent.postMessage({ cid: cid, screenType: "3s" }, "*");
  355. },
  356. jump2(cid) {
  357. window.parent.postMessage({ cid: cid, screenType: "3s2" }, "*");
  358. },
  359. handleClose(done) {
  360. done();
  361. },
  362. tableRowClassName({ row, rowIndex }) {
  363. if ((rowIndex + 1) % 2 === 0) {
  364. return "even_row";
  365. } else {
  366. return "";
  367. }
  368. },
  369. toText(content) {
  370. if (content == '' && !content) return ''
  371. var str = content
  372. str = str.replace(/<xml>[\s\S]*?<\/xml>/ig, '')
  373. str = str.replace(/<style>[\s\S]*?<\/style>/ig, '')
  374. str = str.replace(/<\/?[^>]*>/g, '')
  375. str = str.replace(/[ | ]*\n/g, '\n')
  376. str = str.replace(/&nbsp;/ig, '')
  377. // console.log('****', content)
  378. // console.log('****', str)
  379. return str
  380. },
  381. getData() {
  382. let params = {
  383. org: this.org,
  384. oid: this.oid,
  385. type: this.ttype,
  386. page: this.page,
  387. pageSize: this.pageSize
  388. // this.org
  389. };
  390. this.ajax
  391. .get(this.$store.state.api + "selectCaseS2", params)
  392. .then((res) => {
  393. this.isLoading = false;
  394. let _res = res.data[0];
  395. this.total = res.data[0].length > 0 ? res.data[0][0].num : 0;
  396. // let _res2 = res.data[1];
  397. for (var i = 0; i < _res.length; i++) {
  398. let taskC = 0;
  399. let toolC = 0;
  400. let evalC = 0;
  401. let fontC = 0;
  402. let course = [];
  403. // for (var j = 0; j < _res2.length; j++) {
  404. // if (_res[i].userid == _res2[j].userid) {
  405. course.push({
  406. title: _res[i].title,
  407. courseId: _res[i].courseId,
  408. });
  409. var _chapter = JSON.parse(_res[i].chapters);
  410. for (var k = 0; k < _chapter.length; k++) {
  411. let taskC2 = 0;
  412. let toolC2 = 0;
  413. let evalC2 = 0;
  414. let fontC2 = 0;
  415. fontC2 += _chapter[k].dyName.length;
  416. taskC2 = _chapter[k].chapterInfo[0].taskJson.length;
  417. let _tasks = _chapter[k].chapterInfo[0].taskJson;
  418. for (var task = 0; task < _tasks.length; task++) {
  419. if (_tasks[task].eList) {
  420. evalC2 += _tasks[task].eList.length;
  421. }
  422. console.log(_tasks[task].toolArray , i);
  423. if (_tasks[task].toolArray && _tasks[task].toolArray.length > 0) {
  424. toolC2 += _tasks[task].toolArray.length;
  425. }
  426. fontC2 += _tasks[task].task.length;
  427. fontC2 += this.toText(_tasks[task].taskDetail).length;
  428. let _tools = _tasks[task].toolArray ? _tasks[task].toolArray : [];
  429. for (var tool = 0; tool < _tools.length; tool++) {
  430. fontC2 += _tools[tool].toolDetail.length;
  431. }
  432. }
  433. if (_res[i]["jd" + (k + 1)]) {
  434. _res[i]["jd" + (k + 1)].taskC += taskC2;
  435. _res[i]["jd" + (k + 1)].toolC += toolC2;
  436. _res[i]["jd" + (k + 1)].evalC += evalC2;
  437. _res[i]["jd" + (k + 1)].fontC += fontC2;
  438. } else {
  439. _res[i]["jd" + (k + 1)] = {};
  440. _res[i]["jd" + (k + 1)].taskC = taskC2;
  441. _res[i]["jd" + (k + 1)].toolC = toolC2;
  442. _res[i]["jd" + (k + 1)].evalC = evalC2;
  443. _res[i]["jd" + (k + 1)].fontC = fontC2;
  444. }
  445. taskC += taskC2;
  446. toolC += toolC2;
  447. evalC += evalC2;
  448. fontC += fontC2;
  449. // }
  450. // }
  451. _res[i]["jdz"] = {};
  452. _res[i]["jdz"].taskC = taskC;
  453. _res[i]["jdz"].toolC = toolC;
  454. _res[i]["jdz"].evalC = evalC;
  455. _res[i]["jdz"].fontC = fontC;
  456. _res[i].course = course;
  457. }
  458. for (var tk = _chapter.length - 1; tk >= 0; tk--) {
  459. let _tasks = _chapter[tk].chapterInfo[0].taskJson;
  460. for (var ttask = _tasks.length - 1; ttask >= 0; ttask--) {
  461. let _tools = _tasks[ttask].toolArray ? _tasks[ttask].toolArray : [];
  462. if (_tools.length) {
  463. _res[i].lastTask = `第${tk + 1}阶段任务${ttask + 1}步骤${_tools.length}`
  464. break;
  465. } else {
  466. continue;
  467. }
  468. }
  469. if (_res[i].lastTask) {
  470. break;
  471. }
  472. }
  473. if (_res[i].score) {
  474. var psJson = JSON.parse(_res[i].score)
  475. if (_res[i].psType == '1') {
  476. _res[i].score = psJson.cxx + psJson.yssm + psJson.jsygn + psJson.kxdy +
  477. psJson.zpwcd
  478. } else if (_res[i].psType == '2') {
  479. _res[i].score = psJson.cxx + psJson.yssm + psJson.jsygn + psJson.kxdd +
  480. psJson.zpwcd
  481. } else if (_res[i].psType == '3') {
  482. _res[i].score = psJson.cxx + psJson.yssm + psJson.jsygn + psJson.kxdd +
  483. psJson.zpwcd
  484. } else if (_res[i].psType == '4') {
  485. _res[i].score = psJson.z
  486. }
  487. } else {
  488. _res[i].score = 0
  489. }
  490. }
  491. if (this.search) {
  492. _res = _res.filter((a) => {
  493. return (
  494. a.school.indexOf(this.search) != -1 ||
  495. a.username.indexOf(this.search) != -1
  496. );
  497. });
  498. }
  499. if (this.choose == "school") {
  500. let array = _res.sort(function (a, b) {
  501. return a.school.localeCompare(b.school);
  502. });
  503. this.tableData = array.filter((item, index) => {
  504. item.number = index + 1
  505. return item;
  506. });;
  507. } else if (this.choose == "task") {
  508. let array = _res.sort(function (a, b) {
  509. // return a.jdz.taskC - b.jdz.taskC;
  510. return b.jdz.taskC - a.jdz.taskC;
  511. });
  512. this.tableData = array.filter((item, index) => {
  513. item.number = index + 1
  514. return item;
  515. });;
  516. } else if (this.choose == "score") {
  517. let array = _res.sort(function (a, b) {
  518. return b.score - a.score;
  519. });
  520. console.log(array);
  521. this.tableData = array.filter((item, index) => {
  522. item.number = index + 1
  523. return item;
  524. });;
  525. } else if (this.choose == "font") {
  526. let array = _res.sort(function (a, b) {
  527. // return a.jdz.fontC - b.jdz.fontC;
  528. return b.jdz.fontC - a.jdz.fontC;
  529. });
  530. this.tableData = array.filter((item, index) => {
  531. item.number = index + 1
  532. return item;
  533. });;
  534. } else if (this.choose == "eval") {
  535. let array = _res.sort(function (a, b) {
  536. // return a.jdz.fontC - b.jdz.fontC;
  537. return b.jdz.evalC - a.jdz.evalC;
  538. });
  539. this.tableData = array.filter((item, index) => {
  540. item.number = index + 1
  541. return item;
  542. });;
  543. } else if (this.choose == "tool") {
  544. let array = _res.sort(function (a, b) {
  545. // return a.jdz.fontC - b.jdz.fontC;
  546. return b.jdz.toolC - a.jdz.toolC;
  547. });
  548. this.tableData = array.filter((item, index) => {
  549. item.number = index + 1
  550. return item;
  551. });
  552. } else {
  553. this.tableData = _res.filter((item, index) => {
  554. item.number = index + 1
  555. return item;
  556. });;
  557. }
  558. })
  559. .catch((err) => {
  560. this.isLoading = false;
  561. console.error(err);
  562. });
  563. },
  564. handleCurrentChange(val) {
  565. // console.log(`当前页: ${val}`);
  566. this.page = val;
  567. this.isLoading = true
  568. this.getData();
  569. },
  570. handleSizeChange(val) {
  571. this.pageSize = val;
  572. this.page = 1;
  573. this.isLoading = true
  574. this.getData();
  575. },
  576. selectAllType() {
  577. let params = {
  578. org: this.org && this.org != "" ? this.org : "",
  579. oid: this.oid && this.oid != "" ? this.oid : "",
  580. };
  581. this.ajax
  582. .get(this.$store.state.api + "selectAllTypeS", params)
  583. .then((res) => {
  584. let _courseTypeId = [];
  585. if (res.data[2].length == 0 && res.data[3].length == 0) {
  586. for (var j = 0; j < res.data[1].length; j++) {
  587. if (res.data[1][j].pid == "34629ce3-d02f-11ec-8c78-005056b86db5" || res.data[1][j].pid == "2f8beae3-d030-11ec-8c78-005056b86db5") {
  588. _courseTypeId.push(res.data[1][j]); // 去除公共分类
  589. }
  590. }
  591. } else {
  592. if (res.data[2].length > 0) {
  593. for (var j = 0; j < res.data[2].length; j++) {
  594. _courseTypeId.push(res.data[2][j]); // 去除公共分类
  595. }
  596. }
  597. if (res.data[3].length > 0) {
  598. for (var j = 0; j < res.data[3].length; j++) {
  599. _courseTypeId.push(res.data[3][j]); // 去除公共分类
  600. }
  601. }
  602. }
  603. this.courseTypeId = _courseTypeId;
  604. })
  605. .catch((err) => {
  606. console.error(err);
  607. });
  608. },
  609. getAll(res) {
  610. this.data = res;
  611. let a = Object.keys(res);
  612. a = a.filter((el) => {
  613. return el.indexOf("jd") != -1 && el != "jdz";
  614. });
  615. this.dataArray = a;
  616. this.dialogVisible = true;
  617. },
  618. changeMode() {
  619. this.tableHeight =
  620. window.innerHeight - this.$refs.table.$el.offsetTop - 50;
  621. if (this.tableHeight <= 530) {
  622. this.tableHeight = 530;
  623. }
  624. },
  625. exportExcel() {
  626. if (!this.tableData.length) {
  627. this.$message.error('请等待加载数据')
  628. return;
  629. }
  630. var res = this.tableData;
  631. //如果value的json字段的key值和想要的headers值不一致时,可做如下更改
  632. //将和下面的Object.fromEntries结合,将json字段的key值改变为要求的excel的header值
  633. var array = [];
  634. for (var i = 0; i < res.length; i++) {
  635. var _json = {};
  636. _json["序号"] = res[i].number;
  637. _json["负责人"] = res[i].username;
  638. _json["项目"] = res[i].course[0].title;
  639. _json["分类"] = res[i].typename;
  640. _json["学校"] = res[i].school;
  641. _json["协同人员"] = res[i].cteacher ? res[i].cteacher : '—';
  642. _json["创建时间"] = res[i].ctime;
  643. _json["更新时间"] = res[i].time;
  644. _json["总计"] = `${res[i].jdz.taskC}任务 ${res[i].jdz.toolC}工具 ${res[i].jdz.fontC}字数`;
  645. if (this.mode) {
  646. _json["阶段1"] = res[i].jd1 ? res[i].brief : '—';
  647. _json["阶段2"] = res[i].jd2 ? res[i].brief : '—';
  648. _json["阶段3"] = res[i].jd3 ? res[i].brief : '—';
  649. _json["阶段4"] = res[i].jd4 ? res[i].brief : '—';
  650. _json["阶段5"] = res[i].jd5 ? res[i].brief : '—';
  651. _json["阶段6"] = res[i].jd6 ? res[i].brief : '—';
  652. } else {
  653. _json["项目简介"] = res[i].brief ? res[i].brief : '—';
  654. }
  655. _json["项目所处阶段"] = res[i].lastTask ? res[i].lastTask : '—';
  656. _json["评审状态"] = res[i].score ? '已评分' : '未评分';
  657. _json["评审结果"] = res[i].score + '分';
  658. _json["评审类型"] = res[i].psType == '1' ? '造型结构' : res[i].psType == '2' ? '开源硬件' : res[i].psType == '3' ? '软件设计' : res[i].psType == '4' ? '总分' : '—';
  659. array.push(_json);
  660. }
  661. var XLSX = require("xlsx");
  662. const workbook = XLSX.utils.book_new(); //创建一个新的工作簿对象
  663. let ws = XLSX.utils.json_to_sheet(array); //将json对象数组转化成工作表
  664. // ws["!cols"] = [
  665. // //设置每一列的宽度
  666. // { wch: 50 },
  667. // { wch: 50 },
  668. // { wch: 50 },
  669. // ];
  670. XLSX.utils.book_append_sheet(workbook, ws, "sheet1"); //把sheet添加到workbook里,第三个参数是sheet名
  671. XLSX.writeFile(workbook, "项目数据导出.xlsx");
  672. // const wopts = { bookType: "xlsx", bookSST: false, type: "array" };//写入的样式bookType:输出的文件类型,type:输出的数据类型,bookSST: 是否生成Shared String Table,官方解释是,如果开启生成速度会下降,但在低版本IOS设备上有更好的兼容性
  673. // const wbout = XLSX.write(workbook, wopts);// 浏览器端和node共有的API,实际上node可以直接使用xlsx.writeFile来写入文件,但是浏览器没有该API
  674. // FileSaver.saveAs(new Blob([wbout], { type: "application/octet-stream" }), `${title} demo.xlsx`);//保存文件
  675. this.$message({
  676. message: "导出成功",
  677. type: "success",
  678. });
  679. },
  680. async exportHtml() {
  681. let res = this.tableData;
  682. for (let i = 0; i < res.length; i++) {
  683. await this.setMan(res[i])
  684. }
  685. },
  686. exportCourse(course, Man) {
  687. // 项目名称、项目创建人、协同人员、创建时间、修改时间、所属赛道、所属主题、项目详情简介;项目阶段数量、项目任务数量、项目进展
  688. // if possible 项目所处阶段、各阶段负责人/任务周期/协同者/任务描述/项目方案
  689. let _course = `<h1>${course.course[0].title}</h1>`
  690. let _people = `<h2>负责人:${course.username}</h2>`
  691. let _cteacher = `<h3>协同人员:${course.cteacher ? course.cteacher : '—'}</h3>`
  692. let _time = `<h2>创建时间:${course.ctime} 修改时间:${course.time}</h2>`
  693. let _type = `<h2>分类:${course.typename}</h2>`
  694. let _detail = `<h2>项目详情:${course.brief}</h2>`
  695. let _jdZ = `<h2>项目阶段数量:${course.chapters.length} 项目任务任数量:${course.jdz.taskC}</h2>`
  696. let _lasttask = ''
  697. if (course.lastTask) {
  698. _lasttask = `<h2>项目所处阶段:${course.lastTask}</h2>`
  699. }
  700. let _chapter = course.chapters
  701. let chapterHTML = ''
  702. for (var i = 0; i < _chapter.length; i++) {
  703. chapterHTML += `<h2 style="border-top: 1px solid #ddd;padding: 10px 0 0 0;">第${i + 1}阶段-${_chapter[i].dyName}</h2>`
  704. let taskJson = _chapter[i].chapterInfo[0].taskJson
  705. for (var j = 0; j < taskJson.length; j++) {
  706. chapterHTML += `<h3>任务${j + 1}-${taskJson[j].task}</h3>`
  707. if (taskJson[j].time && taskJson[j].time.length) {
  708. chapterHTML += `<p>任务周期:${this.timeB(taskJson[j].time[0])}至${this.timeB(taskJson[j].time[1])}</p>`
  709. }
  710. if (taskJson[j].people) {
  711. chapterHTML += `<p>负责人:${this.getMan(Man, taskJson[j].people)}</p>`
  712. }
  713. if (taskJson[j].tcMember && taskJson[j].tcMember.length) {
  714. let tcMember = []
  715. for (var tc = 0; tc < taskJson[j].tcMember.length; tc++) {
  716. tcMember.push(this.getMan(Man, taskJson[j].tcMember[tc]))
  717. }
  718. chapterHTML += `<p>协同者:${tcMember.join(",")}</p>`
  719. }
  720. chapterHTML += `<div>任务描述</div>`
  721. chapterHTML += `<div>${taskJson[j].taskDetail}</div>`
  722. let _tool = taskJson[j].toolArray ? taskJson[j].toolArray : []
  723. for (var tool = 0; tool < _tool.length; tool++) {
  724. if (_tool[tool].tool == 1) {
  725. chapterHTML += `<h4>步骤${tool + 1}:电子白板</h4>`
  726. } else if (_tool[tool].tool == 3) {
  727. chapterHTML += `<h4>步骤${tool + 1}:思维导图</h4>`
  728. } else if (_tool[tool].tool == 6) {
  729. chapterHTML += `<h4>步骤${tool + 1}:协同文档</h4>`
  730. } else if (_tool[tool].tool == 15) {
  731. chapterHTML += `<h4>步骤${tool + 1}:问答</h4>`
  732. } else if (_tool[tool].tool == 53) {
  733. chapterHTML += `<h4>步骤${tool + 1}:文件上传</h4>`
  734. } else if (_tool[tool].tool == 54) {
  735. chapterHTML += `<h4>步骤${tool + 1}:拍照</h4>`
  736. } else if (_tool[tool].tool == 55) {
  737. chapterHTML += `<h4>步骤${tool + 1}:压缩文件</h4>`
  738. } else if (_tool[tool].tool == 56) {
  739. chapterHTML += `<h4>步骤${tool + 1}:投票</h4>`
  740. } else if (_tool[tool].tool == 48) {
  741. chapterHTML += `<h4>步骤${tool + 1}:表格</h4>`
  742. } else if (_tool[tool].tool == 52) {
  743. chapterHTML += `<h4>步骤${tool + 1}:文档</h4>`
  744. } else if (_tool[tool].tool == 51) {
  745. chapterHTML += `<h4>步骤${tool + 1}:资源库</h4>`
  746. } else if (_tool[tool].tool == 56) {
  747. chapterHTML += `<h4>步骤${tool + 1}:投票</h4>`
  748. } else if (_tool[tool].tool == 57) {
  749. chapterHTML += `<h4>步骤${tool + 1}:CocoPi</h4>`
  750. }
  751. if (_tool[tool].tool == 51) {
  752. if (_tool[tool].toolData.length) {
  753. for (var ti = 0; ti < _tool[tool].toolData.length; ti++) {
  754. let _td = _tool[tool].toolData[ti]
  755. if (_td.type == 2) {
  756. chapterHTML += `<div><span>视频链接:</span><a href='${_td.url}'>${_td.name}</a></div>`
  757. } else if (_td.type == 3) {
  758. chapterHTML += `<div><span>文档链接:</span><a href='${_td.url}'>${_td.name}</a></div>`
  759. } else if (_td.type == 6) {
  760. chapterHTML += `<div>图文标题:${_td.name}</div>`
  761. chapterHTML += `<div class="cont"><span>图文内容:</span>${_td.url}</div>`
  762. } else if (_td.type == 8) {
  763. chapterHTML += `<div><span>链接:</span><a href='${_td.src}'>${_td.title}</a></div>`
  764. }
  765. }
  766. }
  767. } else {
  768. if (_tool[tool].toolPhoto.length) {
  769. for (var worki = 0; worki < _tool[tool].toolPhoto.length; worki++) {
  770. let photo = _tool[tool].toolPhoto[worki]
  771. if (photo.type == 1) {
  772. chapterHTML += `<div><img style="max-width:500px" src="${photo.content}"/></div>`
  773. } else if (photo.type == 10) {
  774. chapterHTML += `<div class="cont">${JSON.parse(photo.content)}</div>`
  775. } else if (photo.type == 4) {
  776. chapterHTML += `<div><span>文档链接:</span><a href='${photo.content}'>${photo.content}</a></div>`
  777. } else if (photo.type == 5) {
  778. chapterHTML += `<div><span>视频链接:</span><a href='${photo.content}'>${photo.content}</a></div>`
  779. } else if (photo.type == 12) {
  780. chapterHTML += `<div class="cont">${JSON.parse(photo.content)}</div>`
  781. } else if (photo.type == 14) {
  782. var _ask = "";
  783. var _div = document.createElement("div");
  784. _div.innerHTML = `<h4>标题:${_tool[tool].askJson.askTitle}</h4>`;
  785. for (
  786. var j = 0;
  787. j < _tool[tool].askJson.askJson.length;
  788. j++
  789. ) {
  790. let answer = JSON.parse(photo.content)
  791. var _div2 = document.createElement("div");
  792. _div2.innerHTML = `<h5>第${j + 1}题:${_tool[tool].askJson.askJson[j].askstitle
  793. } 选择:${answer &&
  794. answer.length > 0
  795. ? answer[j]
  796. : 1
  797. }</h5> `;
  798. var _div3 = document.createElement("div");
  799. for (
  800. var z = 0;
  801. z <
  802. _tool[tool].askJson.askJson[j].checkList
  803. .length;
  804. z++
  805. ) {
  806. _div3.innerHTML += `<span style="margin-right:5px">${z + 1}.${_tool[tool].askJson.askJson[j].checkList[z]
  807. }</span>`;
  808. }
  809. _div2.innerHTML += `<div>${_div3.innerHTML}</div>`;
  810. _div.innerHTML += `<div>${_div2.innerHTML}</div>`;
  811. }
  812. _ask += `<div>${_div.innerHTML}</div>`;
  813. chapterHTML += _ask
  814. } else if (photo.type == 13) {
  815. chapterHTML += `<div><span>文件链接:</span><a href='${photo.content}'>${photo.content}</a></div>`
  816. }
  817. // <img v-if="photo.type == 1" :src="photo.content" @click="previewImg(photo.content)" />
  818. // <img v-if="photo.type == 10" :src="word" @click="openTable(photo.content)" />
  819. // <img v-if="photo.type == 4" :src="word" @click="openFile(photo.content)" />
  820. // <img v-if="photo.type == 5" :src="video" @click="openVideo(photo.content)" />
  821. // <img v-if="photo.type == 12" :src="word" @click="openText(photo.content)" />
  822. // <img v-if="photo.type == 14" :src="word" @click="
  823. // openAsk(photo.content, taskCount, toolIndex)
  824. // " />
  825. // <img v-if="photo.type == 13" :src="zip" @click="downloadFile(photo.content)" />
  826. }
  827. }
  828. }
  829. if (_tool[tool].toolDetail) {
  830. chapterHTML += `<div>工具描述</div>`
  831. chapterHTML += `<div>${_tool[tool].toolDetail}</div>`
  832. }
  833. }
  834. }
  835. }
  836. var _html = _course + _people + _cteacher + _time + _type + _detail + _jdZ + _lasttask + chapterHTML;
  837. this.generate(course, _html);
  838. },
  839. getMan(manAarray, people) {
  840. let _people = "";
  841. if (manAarray.length) {
  842. for (var i = 0; i < manAarray.length; i++) {
  843. if (manAarray[i].userid == people) {
  844. _people = manAarray[i].name;
  845. break;
  846. }
  847. }
  848. }
  849. return _people ? _people : "";
  850. },
  851. async setMan(ccourse) {
  852. let course = JSON.parse(JSON.stringify(ccourse));
  853. this.ManAarray = [];
  854. let array = course.course_teacher.split(",")
  855. if (array.indexOf(course.userid) == -1) {
  856. array.push(course.userid);
  857. }
  858. let params = {
  859. uid: array.join(","),
  860. };
  861. const res = await this.ajax.get(this.$store.state.api + "getAllUserById", params)
  862. let params2 = {
  863. cid: course.courseId,
  864. }
  865. const res2 = await this.ajax.get(this.$store.state.api + "select_student_course_detail", params2)
  866. let unitJson = JSON.parse(course.chapters);
  867. let works = res2.data[2];
  868. for (var i = 0; i < unitJson.length; i++) {
  869. let task = unitJson[i].chapterInfo[0].taskJson;
  870. for (var j = 0; j < task.length; j++) {
  871. var tool = task[j].toolArray ? task[j].toolArray : [];
  872. for (var z = 0; z < tool.length; z++) {
  873. let _tool = tool[z];
  874. _tool.toolPhoto = [];
  875. _tool.people = [];
  876. for (var k = 0; k < works.length; k++) {
  877. let _work = works[k];
  878. if (
  879. _work.stage == i &&
  880. _work.task == j &&
  881. _work.tool == z &&
  882. _work.atool == _tool.tool
  883. ) {
  884. if (_tool.tool == 48 || _tool.tool == 52) {
  885. _tool.toolPhoto[0] = _work;
  886. if (_tool.people.indexOf(_work.username) == -1) {
  887. _tool.people.push(_work.username);
  888. }
  889. } else {
  890. _tool.toolPhoto.push(_work);
  891. }
  892. }
  893. }
  894. }
  895. }
  896. }
  897. course.chapters = unitJson
  898. this.exportCourse(course, res.data[0])
  899. },
  900. async generate(a, html) {
  901. // 将html文件中需要用到的数据挂载到store上
  902. this.$store.commit("update", ["report", html]);
  903. const content = `<!DOCTYPE html>
  904. <html lang="en">
  905. <head>
  906. <meta charset="UTF-8">
  907. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  908. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  909. <title>报告</title>
  910. <style>
  911. .cont{
  912. word-break: break-all;
  913. }
  914. .cont table {
  915. border-top: 1px solid #ccc;
  916. border-left: 1px solid #ccc;
  917. }
  918. .cont table td,
  919. .cont table th {
  920. border-bottom: 1px solid #ccc;
  921. border-right: 1px solid #ccc;
  922. /* padding: 20px 5px; */
  923. padding: 5px 10px;
  924. max-width: 0px;
  925. height: 30px;
  926. vertical-align: baseline;
  927. }
  928. .cont table th {
  929. border-bottom: 2px solid #ccc;
  930. text-align: center;
  931. }
  932. /* blockquote 样式 */
  933. .cont blockquote {
  934. display: block;
  935. border-left: 8px solid #d0e5f2;
  936. padding: 5px 10px;
  937. margin: 10px 0;
  938. line-height: 1.4;
  939. font-size: 100%;
  940. background-color: #f1f1f1;
  941. }
  942. /* code 样式 */
  943. .cont code {
  944. display: inline-block;
  945. *display: inline;
  946. *zoom: 1;
  947. background-color: #f1f1f1;
  948. border-radius: 3px;
  949. padding: 3px 5px;
  950. margin: 0 3px;
  951. }
  952. .cont pre code {
  953. display: block;
  954. }
  955. /* ul ol 样式 */
  956. .cont ul,
  957. .cont ol {
  958. margin: 10px 0 10px 20px;
  959. }
  960. </style>
  961. </head>
  962. <body>
  963. ${this.$store.state.report}
  964. </body>
  965. </html>`;
  966. // debugger
  967. // 生成报告
  968. const link = document.createElement("a");
  969. let dname = a.course[0].title + "-" + a.username + ".html";
  970. // link.download = "报告.html"; // 文件名
  971. link.download = dname; // 文件名
  972. link.style.display = "none";
  973. // 创建文件流
  974. // 创建bolb实例时,内容一定要放在[]中
  975. const blob = new Blob([content], {
  976. type: "text/plain;charset='utf-8'",
  977. });
  978. link.href = window.URL.createObjectURL(blob);
  979. document.body.appendChild(link);
  980. link.click();
  981. document.body.removeChild(link);
  982. // saveAs(
  983. // htmlDocx.asBlob(content, {
  984. // orientation: "landscape", //跨域设置
  985. // }),
  986. // //文件名
  987. // "报告.doc"
  988. // );
  989. },
  990. timeB(timeA) {
  991. var time = new Date(timeA);
  992. time.setTime(time.getTime());
  993. var s2 = time.getFullYear() + "-" + ((time.getMonth() + 1) < 10 ? '0' + (time.getMonth() + 1) : (time.getMonth() + 1)) + "-"
  994. + ((time.getDate()) < 10 ? '0' + (time.getDate()) : (time.getDate()));
  995. return time.getFullYear() ? s2 : '无'
  996. },
  997. },
  998. beforeDestroy() {
  999. clearInterval(this.timer);
  1000. this.timer = null;
  1001. },
  1002. mounted() {
  1003. this.$nextTick(function () {
  1004. this.tableHeight =
  1005. window.innerHeight - this.$refs.table.$el.offsetTop - 50;
  1006. if (this.tableHeight <= 530) {
  1007. this.tableHeight = 530;
  1008. }
  1009. // 监听窗口大小变化
  1010. let self = this;
  1011. window.onresize = function () {
  1012. self.tableHeight =
  1013. window.innerHeight - self.$refs.table.$el.offsetTop - 50;
  1014. if (self.tableHeight <= 530) {
  1015. self.tableHeight = 530;
  1016. }
  1017. };
  1018. });
  1019. this.isLoading = true;
  1020. this.getData();
  1021. this.selectAllType();
  1022. this.timer = setInterval(() => {
  1023. this.getData();
  1024. }, 60000);
  1025. },
  1026. };
  1027. </script>
  1028. <style scoped>
  1029. .student_input {
  1030. width: 190px;
  1031. font-size: 13px;
  1032. padding: 0 10px;
  1033. }
  1034. .cd_body {
  1035. height: 100%;
  1036. width: 100%;
  1037. }
  1038. .pb_head {
  1039. margin: 0 !important;
  1040. width: 100% !important;
  1041. display: flex;
  1042. justify-content: space-between;
  1043. }
  1044. .student_head {
  1045. margin-top: 10px;
  1046. padding-bottom: 10px;
  1047. display: flex;
  1048. justify-content: space-between;
  1049. }
  1050. .head_left {
  1051. display: flex;
  1052. align-items: center;
  1053. }
  1054. .cd_title span {
  1055. font-size: 25px;
  1056. font-weight: 700;
  1057. }
  1058. .cd_table {
  1059. width: 95%;
  1060. margin: 0 auto;
  1061. padding: 0 0 10px;
  1062. }
  1063. .el-table>>>.even_row {
  1064. background-color: #f1f1f1 !important;
  1065. }
  1066. .dialog_diy>>>.el-dialog {
  1067. background: #fafafa;
  1068. }
  1069. .dialog_diy>>>.el-dialog__header {
  1070. background: #3d67bc !important;
  1071. padding: 15px 20px;
  1072. }
  1073. .dialog_diy>>>.el-dialog__title {
  1074. color: #fff;
  1075. }
  1076. .dialog_diy>>>.el-dialog__headerbtn {
  1077. top: 19px;
  1078. }
  1079. .dialog_diy>>>.el-dialog__headerbtn .el-dialog__close {
  1080. color: #fff;
  1081. }
  1082. .dialog_diy>>>.el-dialog__headerbtn .el-dialog__close:hover {
  1083. color: #fff;
  1084. }
  1085. .cd_d_box {
  1086. font-size: 16px;
  1087. }
  1088. .cd_d_box+.cd_d_box {
  1089. margin-top: 10px;
  1090. }
  1091. .cd_d_jd {
  1092. display: flex;
  1093. flex-wrap: wrap;
  1094. margin-top: 10px;
  1095. }
  1096. .cd_d_jd_box {
  1097. width: 100px;
  1098. display: flex;
  1099. flex-direction: column;
  1100. align-items: center;
  1101. /* background: #eee; */
  1102. border-radius: 5px;
  1103. margin: 10px 15px 0 0;
  1104. }
  1105. .cd_d_jd_box {}
  1106. .cd_d_jd_content {
  1107. width: 100px;
  1108. display: flex;
  1109. flex-direction: column;
  1110. align-items: center;
  1111. background: #eee;
  1112. border-radius: 5px;
  1113. padding: 5px 0;
  1114. }
  1115. .cd_d_jd_content div+div {
  1116. margin-top: 5px;
  1117. }
  1118. .cd_d_jd_content div span+span {
  1119. margin-left: 5px;
  1120. }
  1121. .cd_d_jd_name {
  1122. margin-bottom: 5px;
  1123. color: #184ebd;
  1124. }
  1125. .cd_d_span div:nth-child(1) span:nth-child(1) {
  1126. color: #3887fe;
  1127. }
  1128. .cd_d_span div:nth-child(2) span:nth-child(1) {
  1129. color: #fe3987;
  1130. }
  1131. .cd_d_span div:nth-child(3) span:nth-child(1) {
  1132. color: #10bb6e;
  1133. }
  1134. .cd_d_span div:nth-child(4) span:nth-child(1) {
  1135. color: #3887fe;
  1136. }
  1137. .cd_d_span div span:nth-child(1) {
  1138. margin-right: 5px;
  1139. }
  1140. .cd_course {
  1141. cursor: pointer;
  1142. width: 100%;
  1143. display: flex;
  1144. }
  1145. .cd_course span {
  1146. width: 100%;
  1147. white-space: nowrap;
  1148. overflow: hidden;
  1149. text-overflow: ellipsis;
  1150. }
  1151. .table>>>.cell {
  1152. padding: 0px 3px !important;
  1153. }
  1154. .student_page {
  1155. width: 100%;
  1156. margin: 20px auto;
  1157. }
  1158. /* .table >>> .el-table .cell, .table >>> .el-table--border td:first-child .cell, .table >>> .el-table--border th:first-child .cell{
  1159. padding: 0 3px;
  1160. } */
  1161. .tooltip>>>.my-tooltip-class {
  1162. display: -webkit-box;
  1163. overflow: hidden;
  1164. white-space: normal !important;
  1165. text-overflow: ellipsis;
  1166. word-wrap: break-word;
  1167. -webkit-line-clamp: 3;
  1168. -webkit-box-orient: vertical
  1169. }
  1170. </style>