index.vue 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625
  1. <!--学习资源-->
  2. <template>
  3. <div class="app-container el-course hardware">
  4. <div class="list-max-big-box" v-if="pageType === 1">
  5. <div class="top-max-box">
  6. <div class="left-max-box scrollbar-box" v-hasPermiRouter="['exam:elCategory:list']">
  7. <div class="classify_btn" @click="goPageEdit(5,'')">管理分类 >></div>
  8. <el-tree
  9. :data="treeData"
  10. :props="defaultProps"
  11. :highlight-current="true"
  12. :expand-on-click-node="false"
  13. :filter-node-method="filterNode"
  14. node-key="id"
  15. ref="tree"
  16. default-expand-all
  17. @node-click="handleNodeClick"
  18. />
  19. </div>
  20. <div class="center-max-box" v-hasPermiRouter="['exam:el_category:list']"></div>
  21. <div class="right-max-box">
  22. <el-form style="height:60px;" :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch">
  23. <el-form-item label="" prop="title" label-width="90px">
  24. <el-input
  25. v-model="queryParams.title"
  26. placeholder="请输入课程名称"
  27. clearable
  28. size="small"
  29. />
  30. </el-form-item>
  31. <el-form-item label="" prop="title" style="float: right">
  32. <el-col :span="1.5">
  33. <p class="page-submit-common-style-button"
  34. @click="goPageEdit(1)"
  35. v-hasPermiRouter="['exam:elCourse:add']"
  36. >新增</p>
  37. </el-col>
  38. </el-form-item>
  39. <el-form-item >
  40. <p class="page-inquire-common-style-button" @click="handleQuery">查询</p>
  41. <p class="page-reset-common-style-button" @click="resetQuery">重置</p>
  42. </el-form-item>
  43. </el-form>
  44. <div class="min-list-box">
  45. <el-table class="table-box" v-loading="loading" border :data="el_courseList" :cell-style="cellStyle">
  46. <el-table-column label="课程名称" align="left" prop="title" :show-overflow-tooltip="true">
  47. <template slot-scope="scope">
  48. <el-button type="text" size="small" @click="goCourseDetails(scope.row)"
  49. style="padding:0;height:23px;width:320px;display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align: left;">{{scope.row.title}}</el-button>
  50. </template>
  51. </el-table-column>
  52. <el-table-column label="适用学院" align="left" prop="deptNames" :show-overflow-tooltip="true" width="140"/>
  53. <el-table-column label="适用类型" align="left" prop="scopeType" :show-overflow-tooltip="true" width="140">
  54. <template slot-scope="scope">
  55. <span v-for="(bigItem,bigIndex) in scope.row.scopeType" :key="bigIndex">
  56. <span v-for="(item,index) in scopeTypes" :key="index" v-if="bigItem==item.type">{{bigIndex==0?item.value:'、'+item.value}}</span>
  57. </span>
  58. </template>
  59. </el-table-column>
  60. <el-table-column label="分类" align="left" prop="cateTitle" :show-overflow-tooltip="true" width="100"/>
  61. <el-table-column label="章节数" align="left" prop="chapters" width="80"/>
  62. <el-table-column label="有效时间" align="left" prop="createTime" width="120">
  63. <template slot-scope="scope">
  64. {{scope.row.ceType==0?'永久':(scope.row.ceType==1?scope.row.ceTime:'')}}
  65. </template>
  66. </el-table-column>
  67. <el-table-column label="学习人数" align="left" prop="learns" width="100"/>
  68. <el-table-column label="访问人数" align="left" prop="accessNum" width="100"/>
  69. <el-table-column label="状态" align="left" prop="status" width="90">
  70. <template slot-scope="scope">
  71. <el-switch
  72. v-hasPermiRouter="['exam:el_course:edit']"
  73. class="switch"
  74. @change="switchChange(scope.row)"
  75. v-model="scope.row.status+''"
  76. active-value=true
  77. inactive-value=false
  78. active-text="上架"
  79. inactive-text="下架"
  80. >
  81. </el-switch>
  82. </template>
  83. </el-table-column>
  84. <el-table-column label="操作" align="left" class-name="small-padding fixed-width" width="90">
  85. <template slot-scope="scope">
  86. <div class="table-button-box">
  87. <p class="table-button-null"></p>
  88. <el-dropdown size="mini" @command="(command) => handleCommand(command, scope.row)">
  89. <p class="table-button-p">更多>></p>
  90. <el-dropdown-menu slot="dropdown">
  91. <el-dropdown-item command="record">学习记录</el-dropdown-item>
  92. <el-dropdown-item command="edit" v-hasPermiRouter="['exam:elCourse:add','exam:elCourse:edit']">编辑</el-dropdown-item>
  93. <el-dropdown-item command="delete" v-hasPermiRouter="['exam:elCourse:del']">删除</el-dropdown-item>
  94. </el-dropdown-menu>
  95. </el-dropdown>
  96. <p class="table-button-null"></p>
  97. </div>
  98. </template>
  99. </el-table-column>
  100. </el-table>
  101. </div>
  102. </div>
  103. </div>
  104. <div class="bottom-max-box">
  105. <pagination :page-sizes="[20, 30, 40, 50]"
  106. v-show="total>0"
  107. :total="total"
  108. layout="total, prev, pager, next, sizes, jumper"
  109. :page.sync="queryParams.page"
  110. :limit.sync="queryParams.pageSize"
  111. @pagination="getList"
  112. />
  113. </div>
  114. </div>
  115. <!--编辑-->
  116. <edit-page v-if="pageType == 2" :infoId="infoId"></edit-page>
  117. <!--查看记录-->
  118. <detail-page v-if="pageType == 3" :infoId="infoId"></detail-page>
  119. <!-- 添加或修改学习资源对话框 -->
  120. <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body :close-on-click-modal="false">
  121. <el-form ref="form" :model="form" :rules="rules" label-width="80px">
  122. <el-form-item label="备注" prop="remark">
  123. <el-input v-model="form.remark" placeholder="请输入备注" />
  124. </el-form-item>
  125. <el-form-item label="分类ID" prop="cateId">
  126. <el-input v-model="form.cateId" placeholder="请输入分类ID" />
  127. </el-form-item>
  128. <el-form-item label="标题" prop="title">
  129. <el-input v-model="form.title" placeholder="请输入标题" />
  130. </el-form-item>
  131. <el-form-item label="是否公开" prop="private">
  132. <el-input v-model="form.private" placeholder="请输入是否公开" />
  133. </el-form-item>
  134. <el-form-item label="等级" prop="level">
  135. <el-input v-model="form.level" placeholder="请输入等级" />
  136. </el-form-item>
  137. <el-form-item label="是否限制顺序" prop="orderRest">
  138. <el-input v-model="form.orderRest" placeholder="请输入是否限制顺序" />
  139. </el-form-item>
  140. <el-form-item label="课程时长" prop="duration">
  141. <el-input v-model="form.duration" placeholder="请输入课程时长" />
  142. </el-form-item>
  143. <el-form-item label="课程标签" prop="label">
  144. <el-input v-model="form.label" placeholder="请输入课程标签" />
  145. </el-form-item>
  146. <el-form-item label="PDF翻页有效时间" prop="effectiveTime">
  147. <el-input v-model="form.effectiveTime" placeholder="请输入PDF翻页有效时间" />
  148. </el-form-item>
  149. <el-form-item label="课程有效时间类型" prop="ceType">
  150. <el-select v-model="form.ceType" placeholder="请选择课程有效时间类型">
  151. <el-option label="请选择字典生成" value="" />
  152. </el-select>
  153. </el-form-item>
  154. <el-form-item label="课程有效时间" prop="ceTime">
  155. <el-input v-model="form.ceTime" placeholder="请输入课程有效时间" />
  156. </el-form-item>
  157. <el-form-item label="课程关键字" prop="keywords">
  158. <el-input v-model="form.keywords" placeholder="请输入课程关键字" />
  159. </el-form-item>
  160. <el-form-item label="封面图片" prop="img">
  161. <el-input v-model="form.img" placeholder="请输入封面图片" />
  162. </el-form-item>
  163. <el-form-item label="课程状态 1 下架,2 上架">
  164. <el-radio-group v-model="form.status">
  165. <el-radio label="1">请选择字典生成</el-radio>
  166. </el-radio-group>
  167. </el-form-item>
  168. <el-form-item label="是否显示课程拖拽进度" prop="videoDraggable">
  169. <el-input v-model="form.videoDraggable" placeholder="请输入是否显示课程拖拽进度" />
  170. </el-form-item>
  171. <el-form-item label="积分值" prop="points">
  172. <el-input v-model="form.points" placeholder="请输入积分值" />
  173. </el-form-item>
  174. <el-form-item label="设置选项" prop="settings">
  175. <el-input v-model="form.settings" type="textarea" placeholder="请输入内容" />
  176. </el-form-item>
  177. <el-form-item label="课程类型" prop="type">
  178. <el-select v-model="form.type" placeholder="请选择课程类型">
  179. <el-option label="请选择字典生成" value="" />
  180. </el-select>
  181. </el-form-item>
  182. </el-form>
  183. <div slot="footer" class="dialog-footer dialog-footer-box">
  184. <p class="dialog-footer-button-null"></p >
  185. <p class="dialog-footer-button-info" @click="cancel">取消</p >
  186. <p class="dialog-footer-button-primary" @click="submitForm">提交</p >
  187. <p class="dialog-footer-button-null"></p >
  188. </div>
  189. </el-dialog>
  190. <!--课程详情-->
  191. <course-details v-if="pageType == 4" :infoId="infoId"></course-details>
  192. <!--管理分类-->
  193. <add-classify v-if="pageType == 5" :pageData="pageData"></add-classify>
  194. </div>
  195. </template>
  196. <script>
  197. import { listDepartments } from "@/api/commonality/noPermission";
  198. import {
  199. examElCourse, examElCourseDel, examElCourseAdd,
  200. examElCourseEdit, examElCategoryTreeList, examElCourseCourseList
  201. } from "@/api/safetyEducationExam/index";
  202. import editPage from "./edit.vue";
  203. import detailPage from "./detail.vue";
  204. import courseDetails from "./courseDetails.vue";
  205. import addClassify from "../el_category/index";
  206. export default {
  207. name: "El_course",
  208. components: {
  209. editPage,
  210. detailPage,
  211. courseDetails,
  212. addClassify
  213. },
  214. data() {
  215. return {
  216. //页面状态
  217. pageType:1,
  218. pageData:{
  219. type:2,//1资源管理2课程管理
  220. },
  221. //树数据
  222. treeData:[],
  223. defaultProps: {
  224. children: "children",
  225. label: "title"
  226. },
  227. //学院
  228. deptOptions:[],
  229. //适用范围
  230. scopeTypes: [
  231. {
  232. type: 1,
  233. value: "安全准入考试",
  234. },
  235. {
  236. type: 2,
  237. value: "负面清单考试",
  238. },
  239. {
  240. type: 3,
  241. value: "黑名单考试",
  242. },
  243. {
  244. type: 4,
  245. value: "模拟考试",
  246. },
  247. ],
  248. statusList:[
  249. {
  250. type: true,
  251. value: "上架",
  252. },
  253. {
  254. type: false,
  255. value: "下架",
  256. },
  257. ],
  258. // 遮罩层
  259. loading: true,
  260. // 选中数组
  261. ids: [],
  262. // 非单个禁用
  263. single: true,
  264. // 非多个禁用
  265. multiple: true,
  266. // 显示搜索条件
  267. showSearch: true,
  268. // 总条数
  269. total: 0,
  270. // 学习资源表格数据
  271. el_courseList: [],
  272. // 弹出层标题
  273. title: "",
  274. // 是否显示弹出层
  275. open: false,
  276. // 查询参数
  277. queryParams: {
  278. page: 1,
  279. pageSize:20,
  280. title: '',
  281. },
  282. // 日期范围
  283. dateRange: [],
  284. // 表单参数
  285. form: {},
  286. // 表单校验
  287. rules: {
  288. title: [
  289. { required: true, message: "标题不能为空", trigger: "blur" },
  290. { required: true, message: "标题不能为空", validator: this.spaceJudgment, trigger: "blur" }
  291. ],
  292. },
  293. infoId:{},
  294. };
  295. },
  296. created() {
  297. this.getTreeData();
  298. //this.getDeptList();
  299. },
  300. methods: {
  301. //课程状态
  302. switchChange(row){
  303. //1上架0下架
  304. this.$confirm('是否确定'+(row.status==true?'下架':'上架')+'?', '提示', {
  305. confirmButtonText: '确定',
  306. cancelButtonText: '取消',
  307. type: 'warning'
  308. }).then(() => {
  309. this.upDownShelf(row.id,row.status==false?true:false)
  310. }).catch(() => {
  311. this.$message({
  312. type: 'info',
  313. message: '已取消'
  314. });
  315. });
  316. },
  317. //上架下架
  318. upDownShelf(id,status){
  319. let obj = {
  320. id:id,
  321. status:status,//课程状态 0 下架,1 上架
  322. };
  323. examElCourseEdit(obj).then( response => {
  324. this.msgSuccess("修改成功");
  325. this.getList();
  326. });
  327. },
  328. //去课程详情页面
  329. goCourseDetails(row){
  330. this.pageType = 4;
  331. this.infoId.id = row.id;
  332. },
  333. //单元格样式
  334. cellStyle({row, column, rowIndex, columnIndex}) {//根据测试结果动态调整单元格样式,成功-绿色,失败-红色,不支持-黄色
  335. if(column.title) {
  336. return "color:red;"
  337. }
  338. },
  339. /* 查询学院列表 */
  340. getDeptList(){
  341. listDepartments().then(response => {
  342. // this.deptOptions = response.data;
  343. this.$set(this, 'deptOptions', response.data)
  344. });
  345. },
  346. // 更多操作触发
  347. handleCommand(command, row) {
  348. switch (command) {
  349. case "record":
  350. this.goPageEdit(3,row.id);
  351. break;
  352. case "edit":
  353. this.goPageEdit(2,row.id);
  354. break;
  355. case "delete":
  356. this.handleDelete(row);
  357. break;
  358. default:
  359. break;
  360. }
  361. },
  362. //新增/编辑按钮
  363. goPageEdit(type,id){
  364. if(type == 1){
  365. this.infoId = {};
  366. this.pageType = 2;
  367. }else if(type == 2){
  368. this.infoId.id = id;
  369. this.pageType = 2;
  370. }else if(type == 3){
  371. this.infoId.id = id;
  372. this.pageType = 3;
  373. }else if(type == 4){
  374. this.pageType = 1;
  375. this.getList();
  376. this.getTreeData();
  377. }else if(type==5){//管理分类
  378. this.pageType = 5;
  379. }
  380. },
  381. /** 查询分类树 */
  382. getTreeData() {
  383. this.loading = true;
  384. examElCategoryTreeList({},2).then( response => {
  385. let list = [];
  386. let obj = {
  387. children:[],
  388. title:"所有分类",
  389. id:"",
  390. };
  391. list.push(obj);
  392. for(let i=0;i<response.data.length;i++){
  393. list.push(response.data[i]);
  394. }
  395. this.treeData = list;
  396. this.getList();
  397. });
  398. },
  399. // 筛选节点
  400. filterNode(value, data) {
  401. if (!value) return true;
  402. return data.label.indexOf(value) !== -1;
  403. },
  404. // 节点单击事件
  405. handleNodeClick(data) {
  406. this.queryParams.page = 1;
  407. this.queryParams.pageSize = 20;
  408. this.queryParams.cateId = data.id;
  409. this.getList();
  410. },
  411. /** 查询学习资源列表 */
  412. getList() {
  413. let self = this;
  414. this.loading = true;
  415. let obj = JSON.parse(JSON.stringify(this.queryParams))
  416. if(this.dateRange[0]) {
  417. obj.beginTime=this.dateRange[0]+'T00:00:00';
  418. obj.endTime=this.dateRange[1]+'T23:59:59';
  419. } else {
  420. obj.beginTime='';
  421. obj.endTime='';
  422. }
  423. examElCourseCourseList(obj).then( response => {
  424. this.el_courseList = response.data.records;
  425. for(let i=0;i<self.el_courseList.length;i++){
  426. if(self.el_courseList[i].scopeType){
  427. self.el_courseList[i].scopeType = self.el_courseList[i].scopeType.split(',');
  428. }
  429. }
  430. this.total = response.data.total;
  431. this.loading = false;
  432. });
  433. },
  434. // 取消按钮
  435. cancel() {
  436. this.open = false;
  437. this.reset();
  438. },
  439. // 表单重置
  440. reset() {
  441. this.form = {
  442. id: null,
  443. userId: null,
  444. createBy: null,
  445. updateBy: null,
  446. deptId: null,
  447. deptName: null,
  448. createTime: null,
  449. updateTime: null,
  450. remark: null,
  451. cateId: null,
  452. title: null,
  453. private: null,
  454. level: null,
  455. orderRest: null,
  456. duration: null,
  457. label: null,
  458. effectiveTime: null,
  459. ceType: null,
  460. ceTime: null,
  461. keywords: null,
  462. img: null,
  463. status: 0,
  464. videoDraggable: null,
  465. points: null,
  466. settings: null,
  467. type: null
  468. };
  469. this.resetForm("form");
  470. },
  471. /** 搜索按钮操作 */
  472. handleQuery() {
  473. this.queryParams.page = 1;
  474. this.getList();
  475. },
  476. /** 重置按钮操作 */
  477. resetQuery() {
  478. // this.resetForm("queryForm");
  479. this.$set(this,'queryParams',{
  480. page: 1,
  481. pageSize:20,
  482. cateId:"",
  483. title: '',
  484. });
  485. this.dateRange=[];
  486. this.$refs.tree.setCurrentKey();
  487. this.handleQuery();
  488. },
  489. /** 新增按钮操作 */
  490. handleAdd() {
  491. this.reset();
  492. this.open = true;
  493. this.title = "添加学习资源";
  494. },
  495. /** 修改按钮操作 */
  496. handleUpdate(row) {
  497. this.reset();
  498. const id = row.id || this.ids
  499. examElCourse(id).then( response => {
  500. this.form = response.data;
  501. this.open = true;
  502. this.title = "修改学习资源";
  503. });
  504. },
  505. /** 提交按钮 */
  506. submitForm() {
  507. this.$refs["form"].validate(valid => {
  508. if (valid) {
  509. if (this.form.id != null) {
  510. examElCourseEdit(this.form).then( response => {
  511. this.msgSuccess("修改成功");
  512. this.open = false;
  513. this.getList();
  514. });
  515. } else {
  516. examElCourseAdd(this.form).then( response => {
  517. this.msgSuccess("新增成功");
  518. this.open = false;
  519. this.getList();
  520. });
  521. }
  522. }
  523. });
  524. },
  525. /** 删除按钮操作 */
  526. handleDelete(row) {
  527. if(row.status == true){
  528. this.msgError('请先下架课程后再进行删除操作')
  529. return
  530. }
  531. const ids = row.id || this.ids;
  532. this.$confirm('是否确认删除?', "警告", {
  533. confirmButtonText: "确定",
  534. cancelButtonText: "取消",
  535. type: "warning"
  536. }).then(function() {
  537. return examElCourseDel({id:ids});
  538. }).then(() => {
  539. this.getList();
  540. this.msgSuccess("删除成功");
  541. }).catch(() => {});
  542. },
  543. /** 导出按钮操作 */
  544. handleExport() {
  545. this.download('exam/el_course/export', {
  546. ...this.queryParams
  547. }, `exam_el_course.xlsx`)
  548. }
  549. }
  550. };
  551. </script>
  552. <style scoped lang="scss">
  553. .el-course {
  554. display: flex!important;
  555. flex-direction: column;
  556. box-shadow: 0 0 8px 2px rgba(0, 0, 0, 0.1);
  557. overflow: hidden;
  558. .list-max-big-box{
  559. flex:1;
  560. display: flex!important;
  561. flex-direction: column;
  562. padding:20px!important;
  563. overflow: hidden;
  564. .top-max-box{
  565. flex:1;
  566. display: flex;
  567. overflow: hidden!important;
  568. .left-max-box{
  569. width:250px;
  570. .classify_btn{
  571. font-size: 14px;
  572. font-family: Microsoft YaHei;
  573. font-weight: 400;
  574. color: #0183FA;
  575. line-height: 70px;
  576. cursor: pointer;
  577. text-align: left;
  578. }
  579. }
  580. .center-max-box{
  581. border-right:2px dashed #E0E0E0;
  582. margin-right:30px;
  583. margin-top:20px;
  584. }
  585. .right-max-box{
  586. flex:1;
  587. display: flex;
  588. flex-direction: column;
  589. overflow: hidden!important;
  590. .min-list-box{
  591. flex: 1;
  592. overflow: hidden!important;
  593. display: flex;
  594. .button-box{
  595. width:300px;
  596. display: flex;
  597. }
  598. }
  599. }
  600. }
  601. .bottom-max-box{
  602. height:50px;
  603. }
  604. }
  605. }
  606. </style>
  607. <style lang="scss">
  608. .el-course{
  609. .el-tree-node__label{
  610. width: 188px;
  611. display:block;
  612. overflow:hidden;
  613. text-overflow:ellipsis;
  614. white-space:nowrap;
  615. }
  616. }
  617. </style>