index.vue 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500
  1. <!-- 知识学习 -->
  2. <template>
  3. <div class="app-container knowledgeLearning">
  4. <div class="page-container knowledgeLearningPage">
  5. <p class="pageTitle" v-if="!examName">知识学习</p>
  6. <p class="pageTitle" v-if="examName"><span style="font-weight:700;margin-right:40px;">{{examName}}学时任务</span><span style="font-size:14px;color:#0183fa;">当前学时完成进度 {{completedStudyHours}} / {{studyHoursRequirement}} 学时</span></p>
  7. <div class="max-big-box">
  8. <div class="left-box scrollbar-box">
  9. <p @click="leftCheckButton(index)"
  10. v-for="(item,index) in letDataList" :key="index"
  11. class="left-for-p" :class="index==leftDataIndex?'leftCheck':''">
  12. {{item.knowledgePointName}}
  13. </p>
  14. </div>
  15. <div class="right-box">
  16. <div class="page-form-title-box">
  17. <el-form :model="queryParams" class="form-box" ref="queryForm"
  18. :inline="true" style="width:100%;">
  19. <div class="table-top-button-box-2">
  20. <div>
  21. <p :class="topButtonIndex == 1?'check-table-button':''" @click="topCheckButton(1)">视频资源</p>
  22. <p :class="topButtonIndex == 2?'check-table-button':''" @click="topCheckButton(2)">文档文章</p>
  23. </div>
  24. </div>
  25. <div class="table-top-button-box">
  26. <div>
  27. <p :class="learnStatus === ''?'check-table-button':''" @click="tableTypeButton('')">全部</p>
  28. <p :class="learnStatus === 0?'check-table-button':''" @click="tableTypeButton(0)">未学习</p>
  29. <p :class="learnStatus === 1?'check-table-button':''" @click="tableTypeButton(1)">学习中</p>
  30. <p :class="learnStatus === 2?'check-table-button':''" @click="tableTypeButton(2)">已学完</p>
  31. </div>
  32. </div>
  33. <el-form-item label="" prop="knowledgePointId" v-if="!this.knowledgePointIds[0]">
  34. <el-cascader
  35. v-model="queryParams.knowledgePointId"
  36. :options="optionListB"
  37. :props="{
  38. emitPath:false,
  39. checkStrictly: true,
  40. value: 'id',
  41. label: 'knowledgePointName',
  42. children: 'children',
  43. }"
  44. style="width: 180px"
  45. :show-all-levels="false"
  46. filterable
  47. placeholder="知识点"
  48. ></el-cascader>
  49. </el-form-item>
  50. <el-form-item label="" prop="disciplineTypeId">
  51. <el-select v-model="queryParams.disciplineTypeId" placeholder="知识分类" style="width: 200px">
  52. <el-option
  53. v-for="dict in disciplineOptionList"
  54. :key="dict.id"
  55. :label="dict.disciplineName"
  56. :value="dict.id"
  57. />
  58. </el-select>
  59. </el-form-item>
  60. <el-form-item label="" prop="coursewareName">
  61. <el-input
  62. maxLength="30"
  63. v-model="queryParams.coursewareName"
  64. placeholder="搜索名称"
  65. style="width: 200px"
  66. />
  67. </el-form-item>
  68. <p class="page-inquire-common-style-button" @click="handleQuery">查询</p>
  69. <p class="page-reset-common-style-button" @click="resetQuery">重置</p>
  70. </el-form>
  71. </div>
  72. <div class="page-content-box">
  73. <div class="for-max-big-box scrollbar-box">
  74. <p class="null-text-p" v-if="!dataList[0]">暂无数据</p>
  75. <div class="for-big-box" v-for="(item,index) in dataList" :key="index" @click="tableButton(item)">
  76. <img v-if="item.materialType == 1&&item.exampleImg" :src="item.exampleImg">
  77. <img v-else src="@/assets/ZDimages/basicsModules/image_986222064626770.png">
  78. <div class="bottom-big-box">
  79. <p class="name-p">{{item.coursewareName}}</p>
  80. <p class="time-p">{{secondsToMinutes(item.minLearningDuration)}}分钟 丨 {{item.creditHours}}学时 丨 {{item.points}}积分</p>
  81. </div>
  82. <p class="type-p" :class="item.learnStatus=='0'?'type-p-1':(item.learnStatus=='1'?'type-p-2':(item.learnStatus=='2'?'type-p-3':''))">{{item.learnStatus=='0'?'未学习':(item.learnStatus=='1'?'学习中':(item.learnStatus=='2'?'已学完':''))}}</p>
  83. </div>
  84. </div>
  85. <pagination :page-sizes="[20, 30, 40, 50]"
  86. v-show="total>0"
  87. :total="total"
  88. :page.sync="queryParams.page"
  89. :limit.sync="queryParams.pageSize"
  90. @pagination="getList"
  91. />
  92. </div>
  93. </div>
  94. </div>
  95. </div>
  96. </div>
  97. </template>
  98. <script>
  99. import { Encrypt,Decrypt} from '@/utils/secret'
  100. //import { getDicts } from "@/api/commonality/noPermission";
  101. //import { systemUserSelect } from "@/api/commonality/permission";
  102. //import { getInfo } from "@/api/basicsModules/index";
  103. //import addPage from "./addPage.vue";
  104. import {
  105. examUserCoursewareLearningList,examElKnowledgePointTreeList,
  106. examUserCoursewareLearningRestart,examElDisciplineTypeList,
  107. } from "@/api/safetyEducationExaminationNew/index";
  108. export default {
  109. name: 'index',
  110. //components: {
  111. // addPage
  112. //},
  113. data() {
  114. return {
  115. letDataList:[],
  116. leftDataIndex:0,
  117. topButtonIndex:1,
  118. //下拉列表数据
  119. optionListB: [],
  120. disciplineOptionList:[],
  121. //查询条件
  122. learnStatus:'',
  123. queryParams: {
  124. page: 1,
  125. pageSize: 20,
  126. knowledgePointId: '',
  127. disciplineTypeId: '',
  128. coursewareName: null
  129. },
  130. //列表数据
  131. dataList: [],
  132. //数据数量
  133. total: 0,
  134. //跳转逻辑数据
  135. examName:'',
  136. knowledgePointIds:[],
  137. completedStudyHours:0,
  138. studyHoursRequirement:0,
  139. }
  140. },
  141. created() {
  142. },
  143. mounted() {
  144. if(this.$route.query.skipType){
  145. this.$set(this,'topButtonIndex',this.$route.query.skipType);
  146. this.$set(this.queryParams,'disciplineTypeId',this.$route.query.disciplineId);
  147. }
  148. if(this.$route.query.text){
  149. let obj = JSON.parse(Decrypt(this.$route.query.text));
  150. this.$set(this,'examName',obj.examName);
  151. this.$set(this,'knowledgePointIds',obj.knowledgePointIds);
  152. this.$set(this,'completedStudyHours',obj.completedStudyHours);
  153. this.$set(this,'studyHoursRequirement',obj.studyHoursRequirement);
  154. }
  155. if(sessionStorage.getItem('skipQueryParamsData')){
  156. let skipQueryParamsData = JSON.parse(sessionStorage.getItem('skipQueryParamsData'))
  157. this.$set(this,'queryParams',skipQueryParamsData.queryParams);
  158. this.$set(this,'leftDataIndex',skipQueryParamsData.leftDataIndex);
  159. this.$set(this,'topButtonIndex',skipQueryParamsData.topButtonIndex);
  160. this.$set(this,'learnStatus',skipQueryParamsData.learnStatus);
  161. sessionStorage.removeItem('skipQueryParamsData');
  162. }
  163. this.examElKnowledgePointTreeList();
  164. this.examElDisciplineTypeList();
  165. },
  166. methods: {
  167. //左侧列表切换
  168. leftCheckButton(index){
  169. if(this.leftDataIndex != index){
  170. this.$set(this,'leftDataIndex',index);
  171. this.$set(this.queryParams, 'knowledgePointId', null);
  172. this.$set(this, 'optionListB', this.letDataList[index].children?this.letDataList[index].children:[]);
  173. this.handleQuery();
  174. }
  175. },
  176. //顶部切换
  177. topCheckButton(index){
  178. if(this.topButtonIndex != index){
  179. this.$set(this,'topButtonIndex',index);
  180. this.handleQuery();
  181. }
  182. },
  183. //切换按钮
  184. tableTypeButton(val){
  185. if(this.learnStatus !== val){
  186. this.$set(this,'learnStatus',val);
  187. this.handleQuery();
  188. }
  189. },
  190. //查询按钮
  191. handleQuery() {
  192. this.$set(this.queryParams, 'page', 1)
  193. this.getList()
  194. },
  195. //重置按钮
  196. resetQuery() {
  197. this.$set(this,'learnStatus','');
  198. this.$set(this,'topButtonIndex',1);
  199. this.$set(this, 'queryParams', {
  200. page: 1,
  201. pageSize: 20,
  202. knowledgePointId: '',
  203. disciplineTypeId: '',
  204. coursewareName: null
  205. })
  206. this.getList()
  207. },
  208. //获取数据列表
  209. getList() {
  210. let obj = JSON.parse(JSON.stringify(this.queryParams))
  211. if(!this.queryParams.knowledgePointId){
  212. obj.knowledgePointId = this.letDataList[this.leftDataIndex].id
  213. }
  214. obj.materialType = this.topButtonIndex;
  215. obj.learnStatus = this.learnStatus;
  216. examUserCoursewareLearningList(obj).then(response => {
  217. this.$set(this, 'dataList', response.data.records)
  218. this.$set(this, 'total', response.data.total)
  219. })
  220. },
  221. //操作按钮
  222. tableButton(item) {
  223. let self = this;
  224. if(item.learnStatus == 2){
  225. this.$confirm('该课件已学完,是否重置进度重新学习?', "提示", {
  226. confirmButtonText: "确认",
  227. cancelButtonText: "取消",
  228. type: "warning"
  229. }).then(function() {
  230. }).then(() => {
  231. examUserCoursewareLearningRestart({coursewareId:item.coursewareId}).then(response => {
  232. self.$router.push({
  233. path: '/learningMaterials',
  234. query: {
  235. coursewareId: item.coursewareId,
  236. }
  237. })
  238. });
  239. }).catch(() => {});
  240. }else{
  241. this.$router.push({
  242. path: '/learningMaterials',
  243. query: {
  244. coursewareId: item.coursewareId,
  245. }
  246. })
  247. }
  248. },
  249. examElKnowledgePointTreeList(){
  250. let obj = {
  251. knowledgePointIds : this.knowledgePointIds,
  252. dataScope:1,
  253. };
  254. examElKnowledgePointTreeList(obj).then(response => {
  255. const list = response.data || [];
  256. this.formatTreeData(list);
  257. if(this.knowledgePointIds[0]){
  258. this.$set(this, 'letDataList', list);
  259. this.$set(this, 'optionListB', list[0].children?list[0].children:[]);
  260. }else{
  261. this.$set(this, 'letDataList', [{knowledgePointName:'全部',id:''},...list]);
  262. }
  263. this.getList();
  264. });
  265. },
  266. //查询全部专业类别
  267. examElDisciplineTypeList(){
  268. examElDisciplineTypeList({}).then(response => {
  269. this.$set(this,'disciplineOptionList',response.data);
  270. });
  271. },
  272. //换算分钟
  273. secondsToMinutes(totalSeconds) {
  274. if (typeof totalSeconds !== 'number' || totalSeconds <= 0) {
  275. return 1;
  276. }
  277. return Math.ceil(totalSeconds / 60);
  278. },
  279. },
  280. beforeRouteLeave(to, from, next) {
  281. if (to.name === 'learningMaterials') {
  282. const skipQueryParamsData = {
  283. queryParams: this.queryParams,
  284. leftDataIndex: this.leftDataIndex,
  285. topButtonIndex: this.topButtonIndex,
  286. learnStatus: this.learnStatus,
  287. };
  288. sessionStorage.setItem('skipQueryParamsData', JSON.stringify(skipQueryParamsData));
  289. } else {
  290. sessionStorage.removeItem('skipQueryParamsData');
  291. }
  292. next(); // 必须调用 next() 放行路由
  293. },
  294. }
  295. </script>
  296. <style scoped lang="scss">
  297. .knowledgeLearning {
  298. .knowledgeLearningPage {
  299. .pageTitle{
  300. height:60px;
  301. line-height:60px;
  302. padding:0 20px;
  303. border-bottom:1px solid #dedede;
  304. }
  305. .max-big-box{
  306. flex:1;
  307. display: flex;
  308. overflow: hidden;
  309. .left-box{
  310. width:200px;
  311. border-right:1px solid #dedede;
  312. padding:20px 0 ;
  313. .left-for-p{
  314. margin:5px 0;
  315. padding:0 20px;
  316. text-align: center;
  317. border-left:6px solid #ffffff;
  318. cursor: pointer;
  319. font-weight:700;
  320. font-size:16px;
  321. line-height:40px;
  322. /*单行省略号*/
  323. display:block;
  324. overflow:hidden;
  325. text-overflow:ellipsis;
  326. white-space:nowrap;
  327. }
  328. .left-for-p:hover{
  329. background-color: #0183fa;
  330. color: #ffffff;
  331. }
  332. .leftCheck{
  333. color: #fff;
  334. background-color: #0183fa;
  335. /*border-right:4px solid #0183fa;*/
  336. }
  337. }
  338. .right-box{
  339. flex:1;
  340. display: flex;
  341. flex-direction: column;
  342. overflow: hidden;
  343. .top-max-button-box{
  344. display: flex;
  345. margin:20px 0 0 20px;
  346. p{
  347. width:120px;
  348. line-height:40px;
  349. border-radius:4px;
  350. color:#333;
  351. border:1px solid #333;
  352. text-align: center;
  353. margin-right:20px;
  354. cursor: pointer;
  355. }
  356. .top-check-button{
  357. border:1px solid #0183fa;
  358. background-color: #0183fa;
  359. color:#fff;
  360. }
  361. }
  362. .table-top-button-box-2{
  363. display: inline-block;
  364. vertical-align: top;
  365. margin-right:10px;
  366. div{
  367. display: flex;
  368. p{
  369. border:1px solid #DCDFE6;
  370. width:100px;
  371. text-align: center;
  372. height:40px;
  373. line-height:40px;
  374. cursor: pointer;
  375. font-size:14px;
  376. }
  377. p:nth-child(1){
  378. border-top-left-radius:4px;
  379. border-bottom-left-radius:4px;
  380. border-right:none;
  381. }
  382. p:nth-child(2){
  383. border-left:none;
  384. border-top-right-radius:4px;
  385. border-bottom-right-radius:4px;
  386. }
  387. .check-table-button{
  388. border:1px solid #0183fa;
  389. background-color: #0183fa;
  390. color:#fff;
  391. }
  392. }
  393. }
  394. .table-top-button-box{
  395. display: inline-block;
  396. vertical-align: top;
  397. margin-right:10px;
  398. div{
  399. display: flex;
  400. p{
  401. border:1px solid #DCDFE6;
  402. width:80px;
  403. text-align: center;
  404. height:40px;
  405. line-height:40px;
  406. cursor: pointer;
  407. font-size:14px;
  408. }
  409. p:nth-child(1){
  410. border-top-left-radius:4px;
  411. border-bottom-left-radius:4px;
  412. }
  413. p:nth-child(2){
  414. border-left:none;
  415. }
  416. p:nth-child(3){
  417. border-left:none;
  418. border-right:none;
  419. }
  420. p:nth-child(4){
  421. border-top-right-radius:4px;
  422. border-bottom-right-radius:4px;
  423. }
  424. .check-table-button{
  425. border:1px solid #0183fa;
  426. background-color: #0183fa;
  427. color:#fff;
  428. }
  429. }
  430. }
  431. .page-content-box{
  432. padding: 0 0 10px 0;
  433. }
  434. .for-max-big-box{
  435. flex:1;
  436. .null-text-p{
  437. line-height:200px;
  438. text-align: center;
  439. color:#999;
  440. font-size:14px;
  441. }
  442. .for-big-box{
  443. cursor: pointer;
  444. display: inline-block;
  445. width:320px;
  446. margin:20px 0 0 20px;
  447. border-radius:6px;
  448. overflow: hidden;
  449. box-shadow: 0 2px 8px rgba(37, 50, 74, 0.12);
  450. position: relative;
  451. img{
  452. display: inline-block;
  453. width:320px;
  454. height:180px;
  455. }
  456. .bottom-big-box{
  457. padding:10px 0 10px 10px;
  458. .name-p{
  459. line-height:30px;
  460. font-size:16px;
  461. font-weight:700;
  462. display:block;
  463. overflow:hidden;
  464. text-overflow:ellipsis;
  465. white-space:nowrap;
  466. }
  467. .time{
  468. line-height:30px;
  469. font-size:14px;
  470. }
  471. }
  472. .type-p{
  473. position: absolute;
  474. right:5px;
  475. bottom:5px;
  476. padding:2px 8px;
  477. border-radius:4px;
  478. font-size:14px;
  479. }
  480. .type-p-1{
  481. color:#fff;
  482. background-color: #999;
  483. }
  484. .type-p-2{
  485. color:#fff;
  486. background-color: #7CCD7C;
  487. }
  488. .type-p-3{
  489. color:#fff;
  490. background-color: #0183fa;
  491. }
  492. }
  493. }
  494. }
  495. }
  496. }
  497. }
  498. </style>