浏览代码

add:第四部分细节优化

Tang 3 年之前
父节点
当前提交
1ea4d13a00
共有 87 个文件被更改,包括 6923 次插入1886 次删除
  1. 二进制
      dist.zip
  2. 9 0
      src/api/api.js
  3. 539 0
      src/assets/fonts/demo.css
  4. 211 0
      src/assets/fonts/demo_index.html
  5. 19 0
      src/assets/fonts/iconfont.css
  6. 0 0
      src/assets/fonts/iconfont.js
  7. 16 0
      src/assets/fonts/iconfont.json
  8. 二进制
      src/assets/fonts/iconfont.ttf
  9. 二进制
      src/assets/fonts/iconfont.woff
  10. 二进制
      src/assets/fonts/iconfont.woff2
  11. 二进制
      src/assets/images/dc.png
  12. 2 1
      src/components/searchBoxNew.vue
  13. 226 12
      src/components/tableList.vue
  14. 30 11
      src/layout/components/Sidebar/Item.vue
  15. 62 34
      src/layout/components/Sidebar/SidebarItem.vue
  16. 1 0
      src/main.js
  17. 34 0
      src/newApi/adv.js
  18. 34 0
      src/newApi/advList.js
  19. 27 0
      src/newApi/answer.js
  20. 8 0
      src/newApi/business.js
  21. 10 1
      src/newApi/classTab.js
  22. 8 0
      src/newApi/goods.js
  23. 8 0
      src/newApi/order.js
  24. 8 0
      src/newApi/polyv.js
  25. 8 0
      src/newApi/profileStamp.js
  26. 8 0
      src/newApi/profiles.js
  27. 34 0
      src/newApi/rolesBusin.js
  28. 8 0
      src/store/getters.js
  29. 1 0
      src/store/modules/dict.js
  30. 4 2
      src/utils/request.js
  31. 1 1
      src/utils/uopladFile.js
  32. 38 0
      src/views/2Cport/adSlotManagement/index.vue
  33. 612 0
      src/views/2Cport/adSlotManagement/tab1.vue
  34. 21 0
      src/views/2Cport/adSlotManagement/tab2.vue
  35. 405 0
      src/views/2Cport/adv/index.vue
  36. 1 2
      src/views/Marketing/basicParameters/index.vue
  37. 37 12
      src/views/Marketing/goods/commodityManageMent/add/index.vue
  38. 61 22
      src/views/Marketing/goods/commodityManageMent/edit/index.vue
  39. 65 57
      src/views/Marketing/goods/commodityManageMent/index.vue
  40. 0 3
      src/views/Marketing/goods/commodityManageMent/poppleSet.vue
  41. 0 3
      src/views/Marketing/goods/commodityManageMent/poppleSetTK.vue
  42. 0 1
      src/views/Marketing/goods/courseInquiryList/index.vue
  43. 57 44
      src/views/Marketing/order/orderList/details/studentManageOrder.vue
  44. 46 36
      src/views/Marketing/order/orderList/index.vue
  45. 45 9
      src/views/education/classManageMent/classHours/index.vue
  46. 4 1048
      src/views/education/classManageMent/classHoursReview/index.vue
  47. 1235 0
      src/views/education/classManageMent/classHoursReview/studyTimes.vue
  48. 4 0
      src/views/education/classManageMent/classList/addClass/index.vue
  49. 6 6
      src/views/education/classManageMent/classList/index.vue
  50. 89 34
      src/views/education/classManageMent/classList/manageClass/baseInfo.vue
  51. 387 0
      src/views/education/classManageMent/learningHoursRecordList/index.vue
  52. 368 0
      src/views/education/classManageMent/listOfhoursToBeReviewed/index.vue
  53. 49 28
      src/views/education/classManageMent/studentMenu/index.vue
  54. 33 9
      src/views/education/dataReview/dataConfig/index.vue
  55. 64 61
      src/views/education/dataReview/informationTemplate/index.vue
  56. 28 10
      src/views/education/dataReview/stamp/index.vue
  57. 1 29
      src/views/education/examManagement/applicationData/asPlanned.vue
  58. 0 4
      src/views/education/examManagement/examArrangement/index.vue
  59. 363 0
      src/views/education/qaManagement/qaList/ask.vue
  60. 39 0
      src/views/education/qaManagement/qaList/index.vue
  61. 298 0
      src/views/education/qaManagement/qaList/reply.vue
  62. 48 32
      src/views/education/studentManageMent/studentList/index.vue
  63. 3 3
      src/views/education/studentManageMent/studentXQ/BankQuestionPassRecord.vue
  64. 24 17
      src/views/education/studentManageMent/studentXQ/studyRecord.vue
  65. 5 2
      src/views/resource/bankManagement/chapterVolumeManagement/add/index.vue
  66. 5 2
      src/views/resource/bankManagement/chapterVolumeManagement/edit/index.vue
  67. 17 10
      src/views/resource/bankManagement/testPaperManagement/addPaper/baseAddPaper/index.vue
  68. 21 0
      src/views/resource/bankManagement/testPaperManagement/addPaper/topicAddPaper/index.vue
  69. 15 3
      src/views/resource/bankManagement/testPaperManagement/editPaper/baseEditPaper/index.vue
  70. 57 26
      src/views/resource/bankManagement/testPaperManagement/editPaper/topicEditPaper/index.vue
  71. 57 45
      src/views/resource/bankManagement/testPaperManagement/index.vue
  72. 38 37
      src/views/resource/bankManagement/volumeManagement/add/index.vue
  73. 5 2
      src/views/resource/bankManagement/volumeManagement/edit/index.vue
  74. 128 34
      src/views/resource/baseManageInfos/resource/businessLevel/index.vue
  75. 10 1
      src/views/resource/videoManagement/chapter/edit/index.vue
  76. 45 33
      src/views/resource/videoManagement/chapter/index.vue
  77. 9 1
      src/views/resource/videoManagement/courseManagement/basicInfoEdit/index.vue
  78. 36 42
      src/views/resource/videoManagement/courseManagement/chapterContent/index.vue
  79. 35 28
      src/views/resource/videoManagement/courseManagement/index.vue
  80. 4 5
      src/views/resource/videoManagement/festival/add/index.vue
  81. 17 1
      src/views/resource/videoManagement/festival/edit/index.vue
  82. 42 34
      src/views/resource/videoManagement/festival/index.vue
  83. 92 11
      src/views/resource/videoManagement/flow/index.vue
  84. 9 1
      src/views/resource/videoManagement/moduleManagement/edit/index.vue
  85. 44 34
      src/views/resource/videoManagement/moduleManagement/index.vue
  86. 378 0
      src/views/systemManagement/auditManagement/assignReviewers/index.vue
  87. 107 2
      src/views/systemManagement/roleManagement/index.vue

二进制
dist.zip


+ 9 - 0
src/api/api.js

@@ -85,6 +85,11 @@ import polyv from '../newApi/polyv'//保利威
 import profiles from '../newApi/profiles'//填写资料审核管理
 import profileStamp from '../newApi/profileStamp'//盖章资料审核管理
 import recordList from '../newApi/recordList'//试卷做题记录
+import adv from '../newApi/adv'//广告位管理
+import advList from '../newApi/advList'//广告位发布储存管理
+import answer from '../newApi/answer'//答疑管理
+import rolesBusin from '../newApi/rolesBusin'//角色和业务层次关联
+
 
 
 // 导入对应模块------------------------
@@ -149,6 +154,10 @@ export default {
     ...profiles,
     ...profileStamp,
     ...recordList,
+    ...adv,
+    ...advList,
+    ...answer,
+    ...rolesBusin,
 
     // ...login,
     // ...profession,

+ 539 - 0
src/assets/fonts/demo.css

@@ -0,0 +1,539 @@
+/* Logo 字体 */
+@font-face {
+  font-family: "iconfont logo";
+  src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834');
+  src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834#iefix') format('embedded-opentype'),
+    url('https://at.alicdn.com/t/font_985780_km7mi63cihi.woff?t=1545807318834') format('woff'),
+    url('https://at.alicdn.com/t/font_985780_km7mi63cihi.ttf?t=1545807318834') format('truetype'),
+    url('https://at.alicdn.com/t/font_985780_km7mi63cihi.svg?t=1545807318834#iconfont') format('svg');
+}
+
+.logo {
+  font-family: "iconfont logo";
+  font-size: 160px;
+  font-style: normal;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+
+/* tabs */
+.nav-tabs {
+  position: relative;
+}
+
+.nav-tabs .nav-more {
+  position: absolute;
+  right: 0;
+  bottom: 0;
+  height: 42px;
+  line-height: 42px;
+  color: #666;
+}
+
+#tabs {
+  border-bottom: 1px solid #eee;
+}
+
+#tabs li {
+  cursor: pointer;
+  width: 100px;
+  height: 40px;
+  line-height: 40px;
+  text-align: center;
+  font-size: 16px;
+  border-bottom: 2px solid transparent;
+  position: relative;
+  z-index: 1;
+  margin-bottom: -1px;
+  color: #666;
+}
+
+
+#tabs .active {
+  border-bottom-color: #f00;
+  color: #222;
+}
+
+.tab-container .content {
+  display: none;
+}
+
+/* 页面布局 */
+.main {
+  padding: 30px 100px;
+  width: 960px;
+  margin: 0 auto;
+}
+
+.main .logo {
+  color: #333;
+  text-align: left;
+  margin-bottom: 30px;
+  line-height: 1;
+  height: 110px;
+  margin-top: -50px;
+  overflow: hidden;
+  *zoom: 1;
+}
+
+.main .logo a {
+  font-size: 160px;
+  color: #333;
+}
+
+.helps {
+  margin-top: 40px;
+}
+
+.helps pre {
+  padding: 20px;
+  margin: 10px 0;
+  border: solid 1px #e7e1cd;
+  background-color: #fffdef;
+  overflow: auto;
+}
+
+.icon_lists {
+  width: 100% !important;
+  overflow: hidden;
+  *zoom: 1;
+}
+
+.icon_lists li {
+  width: 100px;
+  margin-bottom: 10px;
+  margin-right: 20px;
+  text-align: center;
+  list-style: none !important;
+  cursor: default;
+}
+
+.icon_lists li .code-name {
+  line-height: 1.2;
+}
+
+.icon_lists .icon {
+  display: block;
+  height: 100px;
+  line-height: 100px;
+  font-size: 42px;
+  margin: 10px auto;
+  color: #333;
+  -webkit-transition: font-size 0.25s linear, width 0.25s linear;
+  -moz-transition: font-size 0.25s linear, width 0.25s linear;
+  transition: font-size 0.25s linear, width 0.25s linear;
+}
+
+.icon_lists .icon:hover {
+  font-size: 100px;
+}
+
+.icon_lists .svg-icon {
+  /* 通过设置 font-size 来改变图标大小 */
+  width: 1em;
+  /* 图标和文字相邻时,垂直对齐 */
+  vertical-align: -0.15em;
+  /* 通过设置 color 来改变 SVG 的颜色/fill */
+  fill: currentColor;
+  /* path 和 stroke 溢出 viewBox 部分在 IE 下会显示
+      normalize.css 中也包含这行 */
+  overflow: hidden;
+}
+
+.icon_lists li .name,
+.icon_lists li .code-name {
+  color: #666;
+}
+
+/* markdown 样式 */
+.markdown {
+  color: #666;
+  font-size: 14px;
+  line-height: 1.8;
+}
+
+.highlight {
+  line-height: 1.5;
+}
+
+.markdown img {
+  vertical-align: middle;
+  max-width: 100%;
+}
+
+.markdown h1 {
+  color: #404040;
+  font-weight: 500;
+  line-height: 40px;
+  margin-bottom: 24px;
+}
+
+.markdown h2,
+.markdown h3,
+.markdown h4,
+.markdown h5,
+.markdown h6 {
+  color: #404040;
+  margin: 1.6em 0 0.6em 0;
+  font-weight: 500;
+  clear: both;
+}
+
+.markdown h1 {
+  font-size: 28px;
+}
+
+.markdown h2 {
+  font-size: 22px;
+}
+
+.markdown h3 {
+  font-size: 16px;
+}
+
+.markdown h4 {
+  font-size: 14px;
+}
+
+.markdown h5 {
+  font-size: 12px;
+}
+
+.markdown h6 {
+  font-size: 12px;
+}
+
+.markdown hr {
+  height: 1px;
+  border: 0;
+  background: #e9e9e9;
+  margin: 16px 0;
+  clear: both;
+}
+
+.markdown p {
+  margin: 1em 0;
+}
+
+.markdown>p,
+.markdown>blockquote,
+.markdown>.highlight,
+.markdown>ol,
+.markdown>ul {
+  width: 80%;
+}
+
+.markdown ul>li {
+  list-style: circle;
+}
+
+.markdown>ul li,
+.markdown blockquote ul>li {
+  margin-left: 20px;
+  padding-left: 4px;
+}
+
+.markdown>ul li p,
+.markdown>ol li p {
+  margin: 0.6em 0;
+}
+
+.markdown ol>li {
+  list-style: decimal;
+}
+
+.markdown>ol li,
+.markdown blockquote ol>li {
+  margin-left: 20px;
+  padding-left: 4px;
+}
+
+.markdown code {
+  margin: 0 3px;
+  padding: 0 5px;
+  background: #eee;
+  border-radius: 3px;
+}
+
+.markdown strong,
+.markdown b {
+  font-weight: 600;
+}
+
+.markdown>table {
+  border-collapse: collapse;
+  border-spacing: 0px;
+  empty-cells: show;
+  border: 1px solid #e9e9e9;
+  width: 95%;
+  margin-bottom: 24px;
+}
+
+.markdown>table th {
+  white-space: nowrap;
+  color: #333;
+  font-weight: 600;
+}
+
+.markdown>table th,
+.markdown>table td {
+  border: 1px solid #e9e9e9;
+  padding: 8px 16px;
+  text-align: left;
+}
+
+.markdown>table th {
+  background: #F7F7F7;
+}
+
+.markdown blockquote {
+  font-size: 90%;
+  color: #999;
+  border-left: 4px solid #e9e9e9;
+  padding-left: 0.8em;
+  margin: 1em 0;
+}
+
+.markdown blockquote p {
+  margin: 0;
+}
+
+.markdown .anchor {
+  opacity: 0;
+  transition: opacity 0.3s ease;
+  margin-left: 8px;
+}
+
+.markdown .waiting {
+  color: #ccc;
+}
+
+.markdown h1:hover .anchor,
+.markdown h2:hover .anchor,
+.markdown h3:hover .anchor,
+.markdown h4:hover .anchor,
+.markdown h5:hover .anchor,
+.markdown h6:hover .anchor {
+  opacity: 1;
+  display: inline-block;
+}
+
+.markdown>br,
+.markdown>p>br {
+  clear: both;
+}
+
+
+.hljs {
+  display: block;
+  background: white;
+  padding: 0.5em;
+  color: #333333;
+  overflow-x: auto;
+}
+
+.hljs-comment,
+.hljs-meta {
+  color: #969896;
+}
+
+.hljs-string,
+.hljs-variable,
+.hljs-template-variable,
+.hljs-strong,
+.hljs-emphasis,
+.hljs-quote {
+  color: #df5000;
+}
+
+.hljs-keyword,
+.hljs-selector-tag,
+.hljs-type {
+  color: #a71d5d;
+}
+
+.hljs-literal,
+.hljs-symbol,
+.hljs-bullet,
+.hljs-attribute {
+  color: #0086b3;
+}
+
+.hljs-section,
+.hljs-name {
+  color: #63a35c;
+}
+
+.hljs-tag {
+  color: #333333;
+}
+
+.hljs-title,
+.hljs-attr,
+.hljs-selector-id,
+.hljs-selector-class,
+.hljs-selector-attr,
+.hljs-selector-pseudo {
+  color: #795da3;
+}
+
+.hljs-addition {
+  color: #55a532;
+  background-color: #eaffea;
+}
+
+.hljs-deletion {
+  color: #bd2c00;
+  background-color: #ffecec;
+}
+
+.hljs-link {
+  text-decoration: underline;
+}
+
+/* 代码高亮 */
+/* PrismJS 1.15.0
+https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript */
+/**
+ * prism.js default theme for JavaScript, CSS and HTML
+ * Based on dabblet (http://dabblet.com)
+ * @author Lea Verou
+ */
+code[class*="language-"],
+pre[class*="language-"] {
+  color: black;
+  background: none;
+  text-shadow: 0 1px white;
+  font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
+  text-align: left;
+  white-space: pre;
+  word-spacing: normal;
+  word-break: normal;
+  word-wrap: normal;
+  line-height: 1.5;
+
+  -moz-tab-size: 4;
+  -o-tab-size: 4;
+  tab-size: 4;
+
+  -webkit-hyphens: none;
+  -moz-hyphens: none;
+  -ms-hyphens: none;
+  hyphens: none;
+}
+
+pre[class*="language-"]::-moz-selection,
+pre[class*="language-"] ::-moz-selection,
+code[class*="language-"]::-moz-selection,
+code[class*="language-"] ::-moz-selection {
+  text-shadow: none;
+  background: #b3d4fc;
+}
+
+pre[class*="language-"]::selection,
+pre[class*="language-"] ::selection,
+code[class*="language-"]::selection,
+code[class*="language-"] ::selection {
+  text-shadow: none;
+  background: #b3d4fc;
+}
+
+@media print {
+
+  code[class*="language-"],
+  pre[class*="language-"] {
+    text-shadow: none;
+  }
+}
+
+/* Code blocks */
+pre[class*="language-"] {
+  padding: 1em;
+  margin: .5em 0;
+  overflow: auto;
+}
+
+:not(pre)>code[class*="language-"],
+pre[class*="language-"] {
+  background: #f5f2f0;
+}
+
+/* Inline code */
+:not(pre)>code[class*="language-"] {
+  padding: .1em;
+  border-radius: .3em;
+  white-space: normal;
+}
+
+.token.comment,
+.token.prolog,
+.token.doctype,
+.token.cdata {
+  color: slategray;
+}
+
+.token.punctuation {
+  color: #999;
+}
+
+.namespace {
+  opacity: .7;
+}
+
+.token.property,
+.token.tag,
+.token.boolean,
+.token.number,
+.token.constant,
+.token.symbol,
+.token.deleted {
+  color: #905;
+}
+
+.token.selector,
+.token.attr-name,
+.token.string,
+.token.char,
+.token.builtin,
+.token.inserted {
+  color: #690;
+}
+
+.token.operator,
+.token.entity,
+.token.url,
+.language-css .token.string,
+.style .token.string {
+  color: #9a6e3a;
+  background: hsla(0, 0%, 100%, .5);
+}
+
+.token.atrule,
+.token.attr-value,
+.token.keyword {
+  color: #07a;
+}
+
+.token.function,
+.token.class-name {
+  color: #DD4A68;
+}
+
+.token.regex,
+.token.important,
+.token.variable {
+  color: #e90;
+}
+
+.token.important,
+.token.bold {
+  font-weight: bold;
+}
+
+.token.italic {
+  font-style: italic;
+}
+
+.token.entity {
+  cursor: help;
+}

+ 211 - 0
src/assets/fonts/demo_index.html

@@ -0,0 +1,211 @@
+<!DOCTYPE html>
+<html>
+<head>
+  <meta charset="utf-8"/>
+  <title>iconfont Demo</title>
+  <link rel="shortcut icon" href="//img.alicdn.com/imgextra/i2/O1CN01ZyAlrn1MwaMhqz36G_!!6000000001499-73-tps-64-64.ico" type="image/x-icon"/>
+  <link rel="icon" type="image/svg+xml" href="//img.alicdn.com/imgextra/i4/O1CN01EYTRnJ297D6vehehJ_!!6000000008020-55-tps-64-64.svg"/>
+  <link rel="stylesheet" href="https://g.alicdn.com/thx/cube/1.3.2/cube.min.css">
+  <link rel="stylesheet" href="demo.css">
+  <link rel="stylesheet" href="iconfont.css">
+  <script src="iconfont.js"></script>
+  <!-- jQuery -->
+  <script src="https://a1.alicdn.com/oss/uploads/2018/12/26/7bfddb60-08e8-11e9-9b04-53e73bb6408b.js"></script>
+  <!-- 代码高亮 -->
+  <script src="https://a1.alicdn.com/oss/uploads/2018/12/26/a3f714d0-08e6-11e9-8a15-ebf944d7534c.js"></script>
+  <style>
+    .main .logo {
+      margin-top: 0;
+      height: auto;
+    }
+
+    .main .logo a {
+      display: flex;
+      align-items: center;
+    }
+
+    .main .logo .sub-title {
+      margin-left: 0.5em;
+      font-size: 22px;
+      color: #fff;
+      background: linear-gradient(-45deg, #3967FF, #B500FE);
+      -webkit-background-clip: text;
+      -webkit-text-fill-color: transparent;
+    }
+  </style>
+</head>
+<body>
+  <div class="main">
+    <h1 class="logo"><a href="https://www.iconfont.cn/" title="iconfont 首页" target="_blank">
+      <img width="200" src="https://img.alicdn.com/imgextra/i3/O1CN01Mn65HV1FfSEzR6DKv_!!6000000000514-55-tps-228-59.svg">
+      
+    </a></h1>
+    <div class="nav-tabs">
+      <ul id="tabs" class="dib-box">
+        <li class="dib active"><span>Unicode</span></li>
+        <li class="dib"><span>Font class</span></li>
+        <li class="dib"><span>Symbol</span></li>
+      </ul>
+      
+      <a href="https://www.iconfont.cn/manage/index?manage_type=myprojects&projectId=2689859" target="_blank" class="nav-more">查看项目</a>
+      
+    </div>
+    <div class="tab-container">
+      <div class="content unicode" style="display: block;">
+          <ul class="icon_lists dib-box">
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe631;</span>
+                <div class="name">安全警报</div>
+                <div class="code-name">&amp;#xe631;</div>
+              </li>
+          
+          </ul>
+          <div class="article markdown">
+          <h2 id="unicode-">Unicode 引用</h2>
+          <hr>
+
+          <p>Unicode 是字体在网页端最原始的应用方式,特点是:</p>
+          <ul>
+            <li>支持按字体的方式去动态调整图标大小,颜色等等。</li>
+            <li>默认情况下不支持多色,直接添加多色图标会自动去色。</li>
+          </ul>
+          <blockquote>
+            <p>注意:新版 iconfont 支持两种方式引用多色图标:SVG symbol 引用方式和彩色字体图标模式。(使用彩色字体图标需要在「编辑项目」中开启「彩色」选项后并重新生成。)</p>
+          </blockquote>
+          <p>Unicode 使用步骤如下:</p>
+          <h3 id="-font-face">第一步:拷贝项目下面生成的 <code>@font-face</code></h3>
+<pre><code class="language-css"
+>@font-face {
+  font-family: 'iconfont';
+  src: url('iconfont.woff2?t=1642413060925') format('woff2'),
+       url('iconfont.woff?t=1642413060925') format('woff'),
+       url('iconfont.ttf?t=1642413060925') format('truetype');
+}
+</code></pre>
+          <h3 id="-iconfont-">第二步:定义使用 iconfont 的样式</h3>
+<pre><code class="language-css"
+>.iconfont {
+  font-family: "iconfont" !important;
+  font-size: 16px;
+  font-style: normal;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+</code></pre>
+          <h3 id="-">第三步:挑选相应图标并获取字体编码,应用于页面</h3>
+<pre>
+<code class="language-html"
+>&lt;span class="iconfont"&gt;&amp;#x33;&lt;/span&gt;
+</code></pre>
+          <blockquote>
+            <p>"iconfont" 是你项目下的 font-family。可以通过编辑项目查看,默认是 "iconfont"。</p>
+          </blockquote>
+          </div>
+      </div>
+      <div class="content font-class">
+        <ul class="icon_lists dib-box">
+          
+          <li class="dib">
+            <span class="icon iconfont icon-safe_warn"></span>
+            <div class="name">
+              安全警报
+            </div>
+            <div class="code-name">.icon-safe_warn
+            </div>
+          </li>
+          
+        </ul>
+        <div class="article markdown">
+        <h2 id="font-class-">font-class 引用</h2>
+        <hr>
+
+        <p>font-class 是 Unicode 使用方式的一种变种,主要是解决 Unicode 书写不直观,语意不明确的问题。</p>
+        <p>与 Unicode 使用方式相比,具有如下特点:</p>
+        <ul>
+          <li>相比于 Unicode 语意明确,书写更直观。可以很容易分辨这个 icon 是什么。</li>
+          <li>因为使用 class 来定义图标,所以当要替换图标时,只需要修改 class 里面的 Unicode 引用。</li>
+        </ul>
+        <p>使用步骤如下:</p>
+        <h3 id="-fontclass-">第一步:引入项目下面生成的 fontclass 代码:</h3>
+<pre><code class="language-html">&lt;link rel="stylesheet" href="./iconfont.css"&gt;
+</code></pre>
+        <h3 id="-">第二步:挑选相应图标并获取类名,应用于页面:</h3>
+<pre><code class="language-html">&lt;span class="iconfont icon-xxx"&gt;&lt;/span&gt;
+</code></pre>
+        <blockquote>
+          <p>"
+            iconfont" 是你项目下的 font-family。可以通过编辑项目查看,默认是 "iconfont"。</p>
+        </blockquote>
+      </div>
+      </div>
+      <div class="content symbol">
+          <ul class="icon_lists dib-box">
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-safe_warn"></use>
+                </svg>
+                <div class="name">安全警报</div>
+                <div class="code-name">#icon-safe_warn</div>
+            </li>
+          
+          </ul>
+          <div class="article markdown">
+          <h2 id="symbol-">Symbol 引用</h2>
+          <hr>
+
+          <p>这是一种全新的使用方式,应该说这才是未来的主流,也是平台目前推荐的用法。相关介绍可以参考这篇<a href="">文章</a>
+            这种用法其实是做了一个 SVG 的集合,与另外两种相比具有如下特点:</p>
+          <ul>
+            <li>支持多色图标了,不再受单色限制。</li>
+            <li>通过一些技巧,支持像字体那样,通过 <code>font-size</code>, <code>color</code> 来调整样式。</li>
+            <li>兼容性较差,支持 IE9+,及现代浏览器。</li>
+            <li>浏览器渲染 SVG 的性能一般,还不如 png。</li>
+          </ul>
+          <p>使用步骤如下:</p>
+          <h3 id="-symbol-">第一步:引入项目下面生成的 symbol 代码:</h3>
+<pre><code class="language-html">&lt;script src="./iconfont.js"&gt;&lt;/script&gt;
+</code></pre>
+          <h3 id="-css-">第二步:加入通用 CSS 代码(引入一次就行):</h3>
+<pre><code class="language-html">&lt;style&gt;
+.icon {
+  width: 1em;
+  height: 1em;
+  vertical-align: -0.15em;
+  fill: currentColor;
+  overflow: hidden;
+}
+&lt;/style&gt;
+</code></pre>
+          <h3 id="-">第三步:挑选相应图标并获取类名,应用于页面:</h3>
+<pre><code class="language-html">&lt;svg class="icon" aria-hidden="true"&gt;
+  &lt;use xlink:href="#icon-xxx"&gt;&lt;/use&gt;
+&lt;/svg&gt;
+</code></pre>
+          </div>
+      </div>
+
+    </div>
+  </div>
+  <script>
+  $(document).ready(function () {
+      $('.tab-container .content:first').show()
+
+      $('#tabs li').click(function (e) {
+        var tabContent = $('.tab-container .content')
+        var index = $(this).index()
+
+        if ($(this).hasClass('active')) {
+          return
+        } else {
+          $('#tabs li').removeClass('active')
+          $(this).addClass('active')
+
+          tabContent.hide().eq(index).fadeIn()
+        }
+      })
+    })
+  </script>
+</body>
+</html>

+ 19 - 0
src/assets/fonts/iconfont.css

@@ -0,0 +1,19 @@
+@font-face {
+  font-family: "iconfont"; /* Project id 2689859 */
+  src: url('iconfont.woff2?t=1642413060925') format('woff2'),
+       url('iconfont.woff?t=1642413060925') format('woff'),
+       url('iconfont.ttf?t=1642413060925') format('truetype');
+}
+
+.iconfont {
+  font-family: "iconfont" !important;
+  font-size: 16px;
+  font-style: normal;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+
+.icon-safe_warn:before {
+  content: "\e631";
+}
+

文件差异内容过多而无法显示
+ 0 - 0
src/assets/fonts/iconfont.js


+ 16 - 0
src/assets/fonts/iconfont.json

@@ -0,0 +1,16 @@
+{
+  "id": "2689859",
+  "name": "demo1",
+  "font_family": "iconfont",
+  "css_prefix_text": "icon-",
+  "description": "",
+  "glyphs": [
+    {
+      "icon_id": "967645",
+      "name": "安全警报",
+      "font_class": "safe_warn",
+      "unicode": "e631",
+      "unicode_decimal": 58929
+    }
+  ]
+}

二进制
src/assets/fonts/iconfont.ttf


二进制
src/assets/fonts/iconfont.woff


二进制
src/assets/fonts/iconfont.woff2


二进制
src/assets/images/dc.png


+ 2 - 1
src/components/searchBoxNew.vue

@@ -203,7 +203,7 @@
             </el-select>
             <!-- 自定义select -->
             <el-select
-              clearable
+              :clearable="item.noClear === false ? false : true"
               v-else-if="item.scope === 'select'"
               v-model="formData[item.prop]"
               :placeholder="item.placeholder"
@@ -214,6 +214,7 @@
                 :key="indexs"
                 :label="items.label"
                 :value="items.value"
+                :disabled="items.disable"
               ></el-option>
             </el-select>
             <div v-else-if="item.scope === 'numList'">

+ 226 - 12
src/components/tableList.vue

@@ -912,16 +912,34 @@
                 : "未知"
             }}</span>
             <span
-              v-else-if="item.scope === 'statusPeriod'"
-              :style="scope.row[item.prop] === 0 ? 'color:red' : ''"
+              v-else-if="item.scope === 'statusPeriods'"
+              :style="scope.row[item.prop] === 1 ? 'color:red' : ''"
             >
               {{
-                scope.row[item.prop] === 0
+                scope.row[item.prop] === -1
+                  ? "不可审核"
+                  : scope.row[item.prop] === 2
+                  ? "待审核"
+                  : scope.row[item.prop] === 0
                   ? "未通过"
                   : scope.row[item.prop] === 1
-                  ? "已通过"
-                  : scope.row[item.prop] === 2
+                  ? "通过"
+                  : ""
+              }}
+            </span>
+            <span
+              v-else-if="item.scope === 'statusPeriod'"
+              :style="scope.row[item.prop] === 2 ? 'color:red' : ''"
+            >
+              {{
+                scope.row[item.prop] === -1
+                  ? "不可审核"
+                  : scope.row[item.prop] === 0
                   ? "待审核"
+                  : scope.row[item.prop] === 1
+                  ? "未通过"
+                  : scope.row[item.prop] === 2
+                  ? "通过"
                   : ""
               }}
             </span>
@@ -936,6 +954,15 @@
               </div>
               <span v-else> 正常 </span>
             </div>
+            <div v-else-if="item.scope === 'rebuy'">
+              <span>{{ scope.row[item.prop] === 1 ? "是" : "" }}</span>
+              <span
+                v-if="scope.row[item.prop] === 1"
+                style="margin-left: 6px; color: blue; cursor: pointer"
+                @click="isShowRebuy(scope.row)"
+                >查看</span
+              >
+            </div>
             <span
               v-else-if="item.scope === 'finishStatus'"
               :style="scope.row[item.prop] === 0 ? 'color:red' : ''"
@@ -953,9 +980,30 @@
               {{
                 scope.row[item.prop1] == 0 && scope.row[item.prop2] == 0
                   ? "0%"
-                  : (scope.row[item.prop1] / scope.row[item.prop2]) * 100 + "%"
+                  : (
+                      (scope.row[item.prop1] / scope.row[item.prop2]) *
+                      100
+                    ).toFixed(2) + "%"
               }}
             </span>
+
+            <div v-else-if="item.scope === 'payGoodsList'">
+              <span
+                style="margin-right: 6px"
+                class="goodsListStyle"
+                @click="openGoodsListBoxs(scope.row, 1)"
+                >视频({{
+                  scope.row[item.prop1] ? scope.row[item.prop1] : 0
+                }})</span
+              >
+              <span
+                class="goodsListStyle"
+                @click="openGoodsListBoxs(scope.row, 2)"
+                >题库({{
+                  scope.row[item.prop2] ? scope.row[item.prop2] : 0
+                }})</span
+              >
+            </div>
             <span v-else-if="item.scope === 'statusOrder'">{{
               scope.row[item.prop] === -2
                 ? "超时关闭"
@@ -1372,6 +1420,9 @@
             <p style="padding-left: 14px; color: #999">
               身份证号码:{{ items.idCard }}
             </p>
+            <p style="padding-left: 14px; color: #999">
+              绑定手机号码:{{ items.telphone }}
+            </p>
           </li>
         </ul>
       </div>
@@ -1379,6 +1430,41 @@
         <el-button @click="isShowBoxs = false">取 消</el-button>
       </span>
     </el-dialog>
+    <el-dialog
+      :visible.sync="isShowBoxRebuy"
+      width="600px"
+      :show-close="false"
+      :close-on-click-modal="false"
+    >
+      <div slot="title" class="hearders">
+        <div class="leftTitle">复购-学时冲突提示</div>
+        <div class="rightBoxs">
+          <img
+            src="@/assets/images/Close@2x.png"
+            alt=""
+            @click="isShowBoxRebuy = false"
+          />
+        </div>
+      </div>
+      <div style="max-height: 400px; overflow: auto">
+        <ul>
+          <li
+            v-for="(item, index) in rebuyInfos"
+            :key="index"
+            style="margin-bottom: 10px"
+          >
+            学员曾购买过此商品【<span style="color: red"
+              >{{ item.orderSn }} - {{ item.goodsName }}</span
+            >】,所在班级【{{
+              item.gradeName
+            }}】的【官方学时推送状态为:是】,如为重复申报学时请及时联系学员并关闭订单。
+          </li>
+        </ul>
+      </div>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="isShowBoxRebuy = false">取 消</el-button>
+      </span>
+    </el-dialog>
     <el-dialog
       :visible.sync="diaviosTKOpen"
       width="560px"
@@ -1407,6 +1493,57 @@
         <el-button @click="diaviosTKOpen = false">取 消</el-button>
       </span>
     </el-dialog>
+    <el-dialog
+      :visible.sync="goosListBoxs"
+      width="560px"
+      :show-close="false"
+      :close-on-click-modal="false"
+    >
+      <div slot="title" class="hearders">
+        <div class="leftTitle">所购商品</div>
+        <div class="rightBoxs">
+          <img
+            src="@/assets/images/Close@2x.png"
+            alt=""
+            @click="goosListBoxs = false"
+          />
+        </div>
+      </div>
+      <div>
+        <div class="zdyBoxStyle">
+          <div
+            class="zdyBtnstyle"
+            style="margin-right: 20px"
+            :class="goodsActiveIndex === 1 ? 'goodsActiveStyle' : ''"
+            @click="getGoodsAboutList(1)"
+          >
+            视频商品
+          </div>
+          <div
+            class="zdyBtnstyle"
+            :class="goodsActiveIndex === 2 ? 'goodsActiveStyle' : ''"
+            @click="getGoodsAboutList(2)"
+          >
+            题库商品
+          </div>
+        </div>
+        <ul class="overBoxs" v-if="goodsList.length">
+          <li v-for="(item, index) in goodsList" :key="index" class="liSYTS">
+            <div style="margin-bottom: 10px">
+              支付时间:{{ $methodsTools.onlyForma(item.createTime) }}
+            </div>
+            <div style="margin-bottom: 10px">商品编码:{{ item.code }}</div>
+            <div>商品名称:{{ item.goodsName }}</div>
+          </li>
+        </ul>
+        <div v-else style="text-align: center; margin-top: 20px">
+          暂无相关商品
+        </div>
+      </div>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="goosListBoxs = false">取 消</el-button>
+      </span>
+    </el-dialog>
   </div>
 </template>
 
@@ -1418,6 +1555,10 @@ export default {
       diaviosOpen: false,
       diaviosTKOpen: false,
       dialogVisible: false,
+      goosListBoxs: false,
+      goodsActiveIndex: 1,
+      goodsList: [],
+      rebuyInfos: [],
       tableSet: this.tableSets,
       allCheckData: [], //表格多选
       checkAll: true,
@@ -1427,6 +1568,7 @@ export default {
       videoUrls: "",
       diaBox: false,
       isShowBoxs: false,
+      isShowBoxRebuy: false,
       listBoxsGET: [],
       props: {
         label(data, node) {
@@ -1488,22 +1630,63 @@ export default {
   },
   mounted() {},
   methods: {
+    /**
+     * @param {Array} 学员数据— 学员管理-所购商品
+     */
+    openGoodsListBoxs(option, int) {
+      this.goosListBoxs = true;
+      this.copyUserInfo = option;
+      this.$api
+        .inquireOrderList({ goodsType: int, userId: option.userId })
+        .then((res) => {
+          this.goodsActiveIndex = int;
+          this.goodsList = res.rows;
+        });
+    },
+    /**
+     * 点击商品类型切换请求新数据
+     */
+    getGoodsAboutList(int) {
+      this.$api
+        .inquireOrderList({ goodsType: int, userId: this.copyUserInfo.userId })
+        .then((res) => {
+          this.goodsActiveIndex = int;
+          this.goodsList = res.rows;
+        });
+    },
     isShowBoxsFun(item) {
       this.$api.inquireuserUpdateListsy({ userId: item.userId }).then((res) => {
         this.listBoxsGET = res.rows;
         this.isShowBoxs = true;
-        this.$api
-          .editgradestudentuserUpdate({ userId: item.userId, status: 1 })
-          .then((result) => {});
+        // this.$api
+        //   .editgradestudentuserUpdate({ userId: item.userId, status: 1 })
+        //   .then((result) => {});
       });
     },
+    /**
+     * 查看复购信息
+     */
+    isShowRebuy(item) {
+      this.$api
+        .inquireOrderRebuyInfo({
+          orderGoodsId: item.orderGoodsId,
+          userId: item.userId,
+          goodsId: item.goodsId,
+        })
+        .then((res) => {
+          this.rebuyInfos = res.rows;
+          this.isShowBoxRebuy = true;
+        });
+    },
     sortMethods(a, b) {
       return a.classGradeUserGoodsVoList.length >
         b.classGradeUserGoodsVoList.length
         ? -1
         : 1;
     },
-    // int: 1 节列表-关联章 2 章列表-关联模块 3 模块列表-关联课程 4 课程列表-关联商品 5 题目列表-关联试卷 6 试卷列表-关联商品 7 章卷列表-关联商品 8 模块列表-关联商品
+    /**
+     * int: 1 节列表-关联章 2 章列表-关联模块 3 模块列表-关联课程 4 课程列表-关联商品 5 题目列表-关联试卷 6 试卷列表-关联商品 7 章卷列表-关联商品 8 模块列表-关联商品
+     */
     jumpPages(v, int) {
       if (int === 1) {
         this.$router.push({
@@ -1670,7 +1853,7 @@ export default {
         }
         if (node.data.type === 1) {
           this.$api
-            .inquireCourseListmodulechapter(node.data.courseId)
+            .inquireCourseListmodulechapter(node.data.menuId)
             .then((res) => {
               res.data.forEach((item) => {
                 item.TypeId = 2 + "-" + item.chapterId;
@@ -1933,7 +2116,7 @@ export default {
 };
 </script>
 <style lang="less">
-.max-heightStyles{
+.max-heightStyles {
   max-height: 500px;
   overflow-y: auto;
 }
@@ -1986,6 +2169,10 @@ export default {
     }
   }
 }
+.goodsListStyle {
+  cursor: pointer;
+  color: blue;
+}
 .popoverDis {
   display: flex;
   flex-direction: column;
@@ -2100,5 +2287,32 @@ export default {
   color: blue;
   cursor: pointer;
 }
+.zdyBoxStyle {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  .zdyBtnstyle {
+    padding: 4px 16px;
+    border-radius: 4px;
+    border: 1px solid #666;
+    color: #666;
+    cursor: pointer;
+  }
+  .goodsActiveStyle {
+    color: #fff;
+    background-color: #409eff;
+    border-color: #409eff;
+  }
+}
+.liSYTS {
+  padding: 10px;
+  margin-bottom: 16px;
+  background: #eee;
+  width: 96%;
+}
+.overBoxs {
+  max-height: 500px;
+  overflow-y: auto;
+}
 </style>
 

+ 30 - 11
src/layout/components/Sidebar/Item.vue

@@ -1,29 +1,48 @@
 <script>
 export default {
-  name: 'MenuItem',
+  name: "MenuItem",
   functional: true,
   props: {
     icon: {
       type: String,
-      default: ''
+      default: "",
     },
     title: {
       type: String,
-      default: ''
-    }
+      default: "",
+    },
+    indexnum: {
+      type: Number,
+      default: "",
+    },
   },
   render(h, context) {
-    const { icon, title } = context.props
-    const vnodes = []
+    const { icon, title, indexnum } = context.props;
+    const vnodes = [];
 
     if (icon) {
-      vnodes.push(<svg-icon icon-class={icon}/>)
+      vnodes.push(<svg-icon icon-class={icon} />);
     }
 
+    if (title === "学时待审核列表") {
+      if (indexnum >= 301) {
+        vnodes.push(
+          <i class="iconfont icon-safe_warn" style="color:red!important;"></i>
+        );
+      } else if (indexnum < 301 && indexnum >= 101) {
+        vnodes.push(
+          <i class="iconfont icon-safe_warn" style="color:yellow!important;"></i>
+        );
+      } else {
+        vnodes.push(
+          <i class="iconfont icon-safe_warn" style="color:#bfcbd9!important;"></i>
+        );
+      }
+    }
     if (title) {
-      vnodes.push(<span slot='title'>{(title)}</span>)
+      vnodes.push(<span slot="title">{title}</span>);
     }
-    return vnodes
-  }
-}
+    return vnodes;
+  },
+};
 </script>

+ 62 - 34
src/layout/components/Sidebar/SidebarItem.vue

@@ -1,16 +1,42 @@
 <template>
   <div v-if="!item.hidden">
-    <template v-if="hasOneShowingChild(item.children,item) && (!onlyOneChild.children||onlyOneChild.noShowingChildren)&&!item.alwaysShow">
-      <app-link v-if="onlyOneChild.meta" :to="resolvePath(onlyOneChild.path, onlyOneChild.query)">
-        <el-menu-item :index="resolvePath(onlyOneChild.path)" :class="{'submenu-title-noDropdown':!isNest}">
-          <item :icon="onlyOneChild.meta.icon||(item.meta&&item.meta.icon)" :title="onlyOneChild.meta.title" />
+    <template
+      v-if="
+        hasOneShowingChild(item.children, item) &&
+        (!onlyOneChild.children || onlyOneChild.noShowingChildren) &&
+        !item.alwaysShow
+      "
+    >
+      <app-link
+        v-if="onlyOneChild.meta"
+        :to="resolvePath(onlyOneChild.path, onlyOneChild.query)"
+      >
+        <el-menu-item
+          :index="resolvePath(onlyOneChild.path)"
+          :class="{ 'submenu-title-noDropdown': !isNest }"
+        >
+          <item
+            :icon="onlyOneChild.meta.icon || (item.meta && item.meta.icon)"
+            :title="onlyOneChild.meta.title"
+            :indexnum="indexnum"
+          />
         </el-menu-item>
       </app-link>
     </template>
 
-    <el-submenu v-else ref="subMenu" :index="resolvePath(item.path)" popper-append-to-body>
+    <el-submenu
+      v-else
+      ref="subMenu"
+      :index="resolvePath(item.path)"
+      popper-append-to-body
+    >
       <template slot="title">
-        <item v-if="item.meta" :icon="item.meta && item.meta.icon" :title="item.meta.title" />
+        <item
+          v-if="item.meta"
+          :icon="item.meta && item.meta.icon"
+          :title="item.meta.title"
+          :indexnum="indexnum"
+        />
       </template>
       <sidebar-item
         v-for="child in item.children"
@@ -25,76 +51,78 @@
 </template>
 
 <script>
-import path from 'path'
-import { isExternal } from '@/utils/validate'
-import Item from './Item'
-import AppLink from './Link'
-import FixiOSBug from './FixiOSBug'
+import { mapGetters } from "vuex";
+import path from "path";
+import { isExternal } from "@/utils/validate";
+import Item from "./Item";
+import AppLink from "./Link";
+import FixiOSBug from "./FixiOSBug";
 
 export default {
-  name: 'SidebarItem',
+  name: "SidebarItem",
   components: { Item, AppLink },
   mixins: [FixiOSBug],
   props: {
     // route object
     item: {
       type: Object,
-      required: true
+      required: true,
     },
     isNest: {
       type: Boolean,
-      default: false
+      default: false,
     },
     basePath: {
       type: String,
-      default: ''
-    }
+      default: "",
+    },
   },
   data() {
-    this.onlyOneChild = null
-    return {}
+    this.onlyOneChild = null;
+    return {};
   },
+  computed: { ...mapGetters(["indexnum"]) },
   methods: {
     hasOneShowingChild(children = [], parent) {
       if (!children) {
         children = [];
       }
-      const showingChildren = children.filter(item => {
+      const showingChildren = children.filter((item) => {
         if (item.hidden) {
-          return false
+          return false;
         } else {
           // Temp set(will be used if only has one showing child)
-          this.onlyOneChild = item
-          return true
+          this.onlyOneChild = item;
+          return true;
         }
-      })
+      });
 
       // When there is only one child router, the child router is displayed by default
       if (showingChildren.length === 1) {
-        return true
+        return true;
       }
 
       // Show parent if there are no child router to display
       if (showingChildren.length === 0) {
-        this.onlyOneChild = { ... parent, path: '', noShowingChildren: true }
-        return true
+        this.onlyOneChild = { ...parent, path: "", noShowingChildren: true };
+        return true;
       }
 
-      return false
+      return false;
     },
     resolvePath(routePath, routeQuery) {
       if (isExternal(routePath)) {
-        return routePath
+        return routePath;
       }
       if (isExternal(this.basePath)) {
-        return this.basePath
+        return this.basePath;
       }
       if (routeQuery) {
         let query = JSON.parse(routeQuery);
-        return { path: path.resolve(this.basePath, routePath), query: query }
+        return { path: path.resolve(this.basePath, routePath), query: query };
       }
-      return path.resolve(this.basePath, routePath)
-    }
-  }
-}
+      return path.resolve(this.basePath, routePath);
+    },
+  },
+};
 </script>

+ 1 - 0
src/main.js

@@ -3,6 +3,7 @@ import Vue from 'vue'
 import Cookies from 'js-cookie'
 
 import Element from 'element-ui'
+import './assets/fonts/iconfont.css'
 import './assets/styles/element-variables.scss'
 
 import '@/assets/styles/index.scss' // global css

+ 34 - 0
src/newApi/adv.js

@@ -0,0 +1,34 @@
+import request from '@/utils/request' //引入axios请求及拦截器
+export default {
+    //新增广告位
+    appadvlocation(data) {
+        return request({
+            url: '/base/adv/location', 
+            method: 'post',
+            data
+        })
+    },
+    //修改广告位
+    editadvlocation(data) {
+        return request({
+            url: '/base/adv/location/edit',
+            method: 'post',
+            data
+        })
+    },
+    //查询广告位列表
+    inquireadvlocationlist(data) {
+        return request({
+            url: '/base/adv/location/list',
+            method: 'get',
+            params: data
+        })
+    },
+    //获取广告位详细信息
+    obtainadvlocation(data) {
+        return request({
+            url: `/base/adv/location/` + data,
+            method: 'get',
+        })
+    },
+}

+ 34 - 0
src/newApi/advList.js

@@ -0,0 +1,34 @@
+import request from '@/utils/request' //引入axios请求及拦截器
+export default {
+    //新增广告发布储存
+    appbaseadvertising(data) {
+        return request({
+            url: '/base/advertising',
+            method: 'post',
+            data
+        })
+    },
+    //修改广告发布储存
+    editbaseadvertising(data) {
+        return request({
+            url: '/base/advertising/edit',
+            method: 'post',
+            data
+        })
+    },
+    //查询广告发布储存列表
+    inquirebaseadvertisinglist(data) {
+        return request({
+            url: '/base/advertising/list',
+            method: 'get',
+            params: data
+        })
+    },
+    //获取广告发布储存详细信息
+    obtainbaseadvertising(data) {
+        return request({
+            url: `/base/advertising/` + data,
+            method: 'get',
+        })
+    },
+}

+ 27 - 0
src/newApi/answer.js

@@ -0,0 +1,27 @@
+import request from '@/utils/request' //引入axios请求及拦截器
+export default {
+    //新增答疑
+    addcourseanswer(data) {
+        return request({
+            url: '/course/answer',
+            method: 'post',
+            data
+        })
+    },
+    //修改答疑
+    editcourseanswer(data) {
+        return request({
+            url: '/course/answer/edit',
+            method: 'post',
+            data
+        })
+    },
+    //查询答疑列表
+    inquirecourseanswerlist(data) {
+        return request({
+            url: '/course/answer/list',
+            method: 'get',
+            params: data
+        })
+    },
+}

+ 8 - 0
src/newApi/business.js

@@ -16,6 +16,14 @@ export default {
             data
         })
     },
+    //批量更改业务层次学习顺序的模板
+    editLearningOrderCourseBusiness(data) {
+        return request({
+            url: '/course/business/editLearningOrder',
+            method: 'post',
+            data
+        })
+    },
     //查询业务层次列表
     inquirebusinessList(data) {
         return request({

+ 10 - 1
src/newApi/classTab.js

@@ -1,5 +1,14 @@
 import request from '@/utils/request' //引入axios请求及拦截器
 export default {
+
+    //选新班
+    gradegradechangeGrade(data) {
+        return request({
+            url: '/grade/grade/sysChangeGrade',
+            method: 'post',
+            data
+        })
+    },
     //新增班级
     appGradegrade(data) {
         return request({
@@ -127,7 +136,7 @@ export default {
             params: data
         })
     },
-    
+
     //更改审核状态
     editGradeUsereditPeriode(data) {
         return request({

+ 8 - 0
src/newApi/goods.js

@@ -95,4 +95,12 @@ export default {
             data
         })
     },
+    //查询编辑数据是否有用户通过学时
+    gradecheckGoodsChange(data) {
+        return request({
+            url: '/grade/grade/checkGoodsChange',
+            method: 'get',
+            params: data
+        })
+    },
 }

+ 8 - 0
src/newApi/order.js

@@ -47,4 +47,12 @@ export default {
             params: data
         })
     },
+    //获取订单商品重复购买详细信息
+    inquireOrderRebuyInfo(data) {
+        return request({
+            url: '/order/goods/rebuyInfo',
+            method: 'get',
+            params: data
+        })
+    },
 }

+ 8 - 0
src/newApi/polyv.js

@@ -8,6 +8,14 @@ export default {
             params: data
         })
     },
+    //同步保利威视频
+    uploadPolyvvideocata(data) {
+        return request({
+            url: '/polyv/video/importList',
+            method: 'post',
+            data
+        })
+    },
     //查询保利威视频分类
     obtainpolyvvideosignlistCata(data) {
         return request({

+ 8 - 0
src/newApi/profileStamp.js

@@ -16,6 +16,14 @@ export default {
             params: data
         })
     },
+    //导出盖章审核列表
+    inquirebaseprofileStampexport(data) {
+        return request({
+            url: '/base/profileStamp/export',
+            method: 'get',
+            params: data
+        })
+    },
     //查询填写盖章审记录列表
     inquirebaseprofileStamplistRecord(data) {
         return request({

+ 8 - 0
src/newApi/profiles.js

@@ -16,6 +16,14 @@ export default {
             params: data
         })
     },
+    //导出资料审核列表
+    inquirebaseprofileExport(data) {
+        return request({
+            url: '/base/profile/export',
+            method: 'get',
+            params: data
+        })
+    },
     //查询填写资料审记录列表
     inquirebaseprofilelistRecord(data) {
         return request({

+ 34 - 0
src/newApi/rolesBusin.js

@@ -0,0 +1,34 @@
+import request from '@/utils/request' //引入axios请求及拦截器
+export default {
+    //新增角色和业务层次关联
+    appsystemrolebusiness(data) {
+        return request({
+            url: '/system/role/business',
+            method: 'post',
+            data
+        })
+    },
+    //修改角色和业务层次关联
+    editsystemrolebusiness(data) {
+        return request({
+            url: '/system/role/business/edit',
+            method: 'post',
+            data
+        })
+    },
+    //查询角色和业务层次关联列表
+    inquiresystemrolebusinessList(data) {
+        return request({
+            url: '/system/role/business/list',
+            method: 'get',
+            params: data
+        })
+    },
+    //获取角色和业务层次关联详细信息
+    obtainsystemrolebusiness(data) {
+        return request({
+            url: `/system/role/business/` + data,
+            method: 'get',
+        })
+    },
+} 

+ 8 - 0
src/store/getters.js

@@ -17,6 +17,14 @@ const getters = {
   topbarRouters: state => state.permission.topbarRouters,
   defaultRoutes: state => state.permission.defaultRoutes,
   sidebarRouters: state => state.permission.sidebarRouters,
+  indexnum(state) {
+    if (!state.dict.indexnum) {
+      api.inquireGradegradelistUserPeriod({ status: "0,1", periodStatus: 2 }).then(res => {
+        state.dict.indexnum = res.total
+      })
+    }
+    return state.dict.indexnum
+  },
   roleList(state) {
     if (!state.dict.roleList) {
       api.obtainRoleList({ status: 1 }).then(res => {

+ 1 - 0
src/store/modules/dict.js

@@ -25,6 +25,7 @@ const state = {
     classList:null,//班级
     examList:null,//考试安排
     beforeList:null,//前培安排
+    indexnum:null,//模拟
 }
 const mutations = {
   //更新角色列表

+ 4 - 2
src/utils/request.js

@@ -30,7 +30,7 @@ service.interceptors.request.use(config => {
   if (getToken() && !isToken) {
     config.headers['AuthorizationToken'] = 'Bearer ' + getToken() // 让每个请求携带自定义token 请根据实际情况自行修改
   }
-    config.headers.TenantId = sessionStorage.TenantId || methods.getQueryVariable('TenantId')
+  config.headers.TenantId = sessionStorage.TenantId || methods.getQueryVariable('TenantId')
   // get请求映射params参数
   if (config.method === 'get' && config.params) {
     let url = config.url + '?';
@@ -82,7 +82,9 @@ service.interceptors.response.use(res => {
   } else if (code === 500) {
     Message({
       message: msg,
-      type: 'error'
+      type: 'error',
+      duration: 5000,
+      showClose: true
     })
     return Promise.reject(new Error(msg))
   } else if (code !== 200) {

+ 1 - 1
src/utils/uopladFile.js

@@ -76,7 +76,7 @@ export function uploadFile(files, fileSetting, callback) {
     /**
      * 这里的调用是上传全部
      * 本来我也是一个一个调的
-     * 但是考虑到对于有多选上传的童鞋不是很友好
+     * 但是考虑到对于有多选上传不是很友好
      * 就无论你传递几个视频 这里都统一一起上传
      * */
     

+ 38 - 0
src/views/2Cport/adSlotManagement/index.vue

@@ -0,0 +1,38 @@
+<template>
+  <div id="adSlotManagement">
+    <div>
+      <el-button
+        size="mini"
+        :type="activeIndex === 1 ? 'primary' : ''"
+        @click="activeIndex = 1"
+        >小程序</el-button
+      >
+      <el-button
+        size="mini"
+        :type="activeIndex === 2 ? 'primary' : ''"
+        @click="activeIndex = 2"
+        disabled
+        >PC官网</el-button
+      >
+    </div>
+    <tab1 v-if="activeIndex === 1" />
+    <tab2 v-if="activeIndex === 2" />
+  </div>
+</template>
+
+<script>
+import tab1 from "./tab1.vue";
+import tab2 from "./tab2.vue";
+export default {
+  components: { tab1, tab2 },
+  data() {
+    return {
+      activeIndex: 1,
+    };
+  },
+  methods: {},
+};
+</script>
+
+<style lang="less" scoped>
+</style>

+ 612 - 0
src/views/2Cport/adSlotManagement/tab1.vue

@@ -0,0 +1,612 @@
+<template>
+  <div id="tab1">
+    <el-tabs
+      type="border-card"
+      style="margin-top: 16px"
+      v-model="activeid"
+      @tab-click="activeFunc(activeid)"
+    >
+      <el-tab-pane
+        v-for="(item, index) in tabList"
+        :label="item.name"
+        :name="item.locationId + ''"
+        :key="index"
+      ></el-tab-pane>
+      <div>
+        <div>
+          轮播间隔:{{ second }}S
+          <el-popover placement="bottom" trigger="manual" v-model="visible">
+            <el-input-number
+              v-model="copySecond"
+              :min="1"
+              :max="60"
+              :precision="0"
+            ></el-input-number>
+            <div style="text-align: center; margin-top: 10px">
+              <el-button size="mini" @click="visible = false">取消</el-button
+              ><el-button size="mini" @click="editFun">确定</el-button>
+            </div>
+            <el-button size="mini" slot="reference" @click="visibleFun"
+              >修改</el-button
+            >
+          </el-popover>
+          <el-button
+            size="mini"
+            @click="editList(1)"
+            type="success"
+            style="margin-left: 10px"
+            >添加轮播</el-button
+          >
+        </div>
+        <el-table
+          :data="tableData"
+          style="width: 100%; margin-top: 10px"
+          border
+        >
+          <template v-for="(item, index) in tableSet">
+            <el-table-column
+              :width="item.width"
+              :key="index"
+              :prop="item.prop"
+              :label="item.label"
+              align="center"
+            >
+              <template slot-scope="scope">
+                <div v-if="item.scope === 'img'">
+                  <el-image
+                    style="width: 225px; height: 96px"
+                    :src="$methodsTools.splitImgHost(scope.row[item.prop])"
+                    :preview-src-list="[
+                      $methodsTools.splitImgHost(scope.row[item.prop]),
+                    ]"
+                  >
+                  </el-image>
+                </div>
+                <div v-else-if="item.scope === 'input'">
+                  <el-input-number
+                    v-model="scope.row[item.prop]"
+                    :controls="false"
+                    :min="0"
+                    :precision="0"
+                    style="width: 100%"
+                  ></el-input-number>
+                </div>
+                <span v-else-if="item.scope === 'status'">
+                  {{
+                    scope.row[item.prop] === 1
+                      ? "启用"
+                      : scope.row[item.prop] === 2
+                      ? "关闭"
+                      : "未知"
+                  }}
+                </span>
+                <div v-else>{{ scope.row[item.prop] }}</div>
+              </template></el-table-column
+            ></template
+          >
+          <el-table-column
+            fixed="right"
+            label="操作"
+            width="100"
+            align="center"
+          >
+            <template slot-scope="scope">
+              <el-button
+                type="text"
+                size="small"
+                @click="editList(0, scope.row)"
+                >修改</el-button
+              >
+            </template>
+          </el-table-column>
+        </el-table>
+      </div>
+    </el-tabs>
+    <el-dialog
+      @closed="loadingClose"
+      :visible.sync="dialogVisible"
+      width="610px"
+      :show-close="false"
+      :close-on-click-modal="false"
+    >
+      <div slot="title" class="hearders">
+        <div class="leftTitle">
+          {{ statusPop === 1 ? "添加" : statusPop === 0 ? "修改" : "详情" }}
+        </div>
+        <div class="rightBoxs">
+          <img src="@/assets/images/Close@2x.png" alt="" @click="close" />
+        </div>
+      </div>
+      <div>
+        <el-form
+          label-position="right"
+          label-width="150px"
+          :model="listData"
+          :rules="rules"
+          ref="listData"
+        >
+          <el-form-item label="图片标题" prop="advName">
+            <el-input v-model="listData.advName"></el-input>
+          </el-form-item>
+          <el-form-item label="图片" prop="adverUrl">
+            <div class="dis_fs">
+              <span v-if="!listData.adverUrl">暂无图片</span>
+              <img
+                v-else
+                class="imgBoxs"
+                :src="$methodsTools.splitImgHost(listData.adverUrl)"
+                alt="加载失败"
+              />
+            </div>
+            <div class="styPsty">
+              <label class="btns"
+                >修改封面
+                <input
+                  ref="file"
+                  type="file"
+                  style="display: none"
+                  @change="editImg"
+                />
+              </label>
+              <div style="font-size: 12px; color: #999; line-height: 17px">
+                注:请上传小于300kb,尺寸为
+                <span style="color: red">750*320</span>
+                的像素图片,支持jpg、jpeg、png等类型
+              </div>
+            </div>
+          </el-form-item>
+          <el-form-item
+            label="跳转位置"
+            :required="
+              listData.jumpType === 2 ||
+              listData.jumpType === 3 ||
+              listData.jumpType === 4
+                ? true
+                : false
+            "
+          >
+            <el-select
+              v-model="listData.jumpType"
+              placeholder="请选择跳转类型"
+              clearable
+            >
+              <el-option
+                v-for="(item, index) in options"
+                :key="index"
+                :label="item.label"
+                :value="item.value"
+              >
+              </el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item
+            label=""
+            v-if="
+              listData.jumpType === 2 ||
+              listData.jumpType === 3 ||
+              listData.jumpType === 4
+            "
+            :prop="
+              listData.jumpType === 2 ||
+              listData.jumpType === 3 ||
+              listData.jumpType === 4
+                ? 'jumpUrl'
+                : ''
+            "
+          >
+            <el-input
+              v-model="listData.jumpUrl"
+              :placeholder="
+                listData.jumpType === 2
+                  ? '请输入URL'
+                  : listData.jumpType === 3
+                  ? '请输入内部接口地址'
+                  : listData.jumpType === 4
+                  ? '请输入外部接口地址'
+                  : ''
+              "
+            ></el-input>
+          </el-form-item>
+          <el-form-item label="排序" prop="sort">
+            <el-input-number
+              :min="1"
+              v-model="listData.sort"
+              :precision="0"
+              :controls="false"
+            ></el-input-number>
+          </el-form-item>
+          <el-form-item label="发布状态" prop="status">
+            <el-radio-group v-model="listData.status">
+              <el-radio :label="1">启用</el-radio>
+              <el-radio :label="0">关闭</el-radio>
+            </el-radio-group>
+          </el-form-item>
+        </el-form>
+      </div>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="close">取 消</el-button>
+        <el-button @click="submitForm('listData')" :loading="disabledBtn"
+          >确 定</el-button
+        >
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+export default {
+  data() {
+    var valiIcon = (rule, value, callback) => {
+      // 图片验证
+      if (!this.listData.adverUrl) {
+        callback(new Error("请上传图片"));
+      } else {
+        callback();
+      }
+    };
+    return {
+      disabledBtn: false,
+      activeid: "",
+      visible: false,
+      second: "",
+      copySecond: "",
+      tableSet: [
+        {
+          label: "排序",
+          prop: "sort",
+          width: "120px",
+        },
+        {
+          label: "广告标题",
+          prop: "advName",
+        },
+        {
+          label: "图片",
+          prop: "adverUrl",
+          scope: "img",
+        },
+        {
+          label: "跳转位置",
+          prop: "jumpUrl",
+        },
+        {
+          label: "发布状态",
+          prop: "status",
+          scope: "status",
+        },
+      ],
+      tabList: [],
+      tableData: [],
+      dialogVisible: false,
+      listData: {},
+      rules: {
+        advName: [
+          { required: true, message: "请输入广告标题", trigger: "blur" },
+        ],
+        jumpUrl: [{ required: true, message: "请输入内容", trigger: "blur" }],
+        adverUrl: [{ required: true, validator: valiIcon, trigger: "change" }],
+        status: [
+          { required: true, message: "请选择发布状态", trigger: "change" },
+        ],
+        sort: [{ required: true, message: "请输入图片排序", trigger: "blur" }],
+      },
+      statusPop: 0,
+      options: [
+        {
+          label: "无跳转",
+          value: 1,
+        },
+        {
+          label: "URL",
+          value: 2,
+        },
+        {
+          label: "内部接口地址",
+          value: 3,
+        },
+        {
+          label: "外部接口地址",
+          value: 4,
+        },
+      ],
+    };
+  },
+  mounted() {
+    this.getInfo();
+  },
+  methods: {
+    loadingClose() {
+      this.$refs["listData"].resetFields();
+      this.disabledBtn = false;
+    },
+    getInfo() {
+      this.$api.inquireadvlocationlist({ status: 1 }).then((res) => {
+        this.tabList = res.rows;
+        if (res.rows.length) {
+          this.activeid = res.rows[0].locationId + "";
+          this.activeFunc(res.rows[0].locationId);
+          this.second = res.rows[0].intervalTime;
+        }
+      });
+    },
+    close() {
+      this.dialogVisible = false;
+    },
+    /**
+     * 修改单条轮播信息
+     */
+    editList(int, v) {
+      if (int === 1) {
+        this.statusPop = 1;
+        this.listData = {
+          adverUrl: "oss/images/avatar/20211013/1634097664410_1397766697",
+          status: 1,
+        };
+      } else {
+        this.statusPop = 0;
+        this.listData = JSON.parse(JSON.stringify(v));
+      }
+      this.listData.locationId = Number(this.activeid)
+      this.dialogVisible = true;
+    },
+    /**
+     * 修改封面
+     */
+    editImg(e) {
+      var file = e.target.files[0];
+      if (file === undefined) {
+        return;
+      }
+      if (file.size > 0.3 * 1024 * 1024) {
+        this.$message.warning("图片不得大于300kb");
+        return;
+      }
+      var type = this.$refs.file.value.toLowerCase().split(".").splice(-1);
+      if (type[0] != "jpg" && type[0] != "png" && type[0] != "jpeg") {
+        this.$message.warning("上传格式需为:.jpg/.png/.jpeg");
+        this.$refs.file.value = "";
+        return;
+      }
+      this.$upload.upload(file, 0).then((res) => {
+        this.$set(this.listData, "adverUrl", res);
+        console.log(this.listData);
+      });
+    },
+    /**
+     * 提交修改/添加 表单验证
+     */
+    submitForm(formName) {
+      this.$refs[formName].validate((valid) => {
+        if (valid) {
+          this.submit();
+        } else {
+          console.log("error submit!!");
+          return false;
+        }
+      });
+    },
+    submit() {
+      this.disabledBtn = true;
+      var anum = 0;
+      var statusNS = false;
+      this.tableData.forEach((item) => {
+        if (item.status === 1) {
+          anum++;
+        }
+        if (this.statusPop === 1) {
+          if (item.sort == this.listData.sort) {
+            statusNS = true;
+          }
+        } else {
+          if (
+            item.sort == this.listData.sort &&
+            item.id !== this.listData.id
+          ) {
+            statusNS = true;
+          }
+        }
+      });
+      if (anum >= 5) {
+        this.$message.error("轮播图启用数量不得大于5个!");
+        this.disabledBtn = false;
+        return;
+      }
+      if (statusNS) {
+        this.$message.warning("存在相同排序,请重新设置排序");
+        this.disabledBtn = false;
+        return;
+      }
+      if (this.statusPop === 1) {
+        this.$api
+          .appbaseadvertising(this.listData)
+          .then((res) => {
+            this.$message.success("新增成功");
+            this.dialogVisible = false;
+            this.activeFunc(this.activeid);
+          })
+          .catch(() => {
+            this.disabledBtn = false;
+          });
+      }
+      if (this.statusPop === 0) {
+        this.$api
+          .editbaseadvertising(this.listData)
+          .then((res) => {
+            this.$message.success("修改成功");
+            this.dialogVisible = false;
+            this.activeFunc(this.activeid);
+          })
+          .catch(() => {
+            this.disabledBtn = false;
+          });
+      }
+    },
+    activeFunc(id) {
+      if (this.visible) {
+        this.visible = false;
+      }
+      this.$api.inquirebaseadvertisinglist({ locationId: id }).then((res) => {
+        this.tabList.forEach((item) => {
+          if (item.locationId == id) {
+            this.second = item.intervalTime;
+          }
+        });
+        this.tableData = res.rows;
+      });
+    },
+    visibleFun() {
+      if (this.visible) {
+        this.visible = false;
+        return;
+      }
+      this.copySecond = this.second;
+      this.visible = true;
+    },
+    /**
+     * 确定修改轮播间隔
+     */
+    editFun() {
+      this.$api
+        .editadvlocation({
+          locationId: this.activeid,
+          intervalTime: this.copySecond,
+        })
+        .then((res) => {
+          this.$api.inquireadvlocationlist({ status: 1 }).then((res) => {
+            this.tabList = res.rows;
+            if (res.rows.length) {
+              this.activeFunc(this.activeid);
+              this.second = res.rows[0].intervalTime;
+              this.$message.success("修改成功");
+              this.visible = false;
+            }
+          });
+        });
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.styFlex {
+  margin-top: 10px;
+  text-align: center;
+}
+/deep/.el-button {
+  border-radius: 8px;
+}
+/deep/.el-dialog {
+  border-radius: 8px;
+  .el-dialog__header {
+    padding: 0;
+    .hearders {
+      height: 40px;
+      display: flex;
+      align-items: center;
+      justify-content: space-between;
+      padding: 0px 18px 0px 20px;
+      border-bottom: 1px solid #e2e2e2;
+      .leftTitle {
+        font-size: 14px;
+        font-weight: bold;
+        color: #2f4378;
+      }
+      .rightBoxs {
+        display: flex;
+        align-items: center;
+        img {
+          width: 14px;
+          height: 14px;
+          margin-left: 13px;
+          cursor: pointer;
+        }
+      }
+    }
+  }
+  .el-dialog__footer {
+    padding: 0;
+    .dialog-footer {
+      padding: 0px 40px;
+      height: 70px;
+      border-top: 1px solid #e2e2e2;
+      display: flex;
+      align-items: center;
+      justify-content: flex-end;
+    }
+  }
+}
+.imgBox {
+  width: 100%;
+  // height: 210px;
+  border: 1px solid #e2e2e2;
+  border-radius: 8px;
+  padding: 8px 8px 3px;
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  .imgLabel {
+    flex: 1;
+    width: 100%;
+    border: 1px dotted #e2e2e2;
+    color: #999;
+    font-size: 14px;
+    cursor: pointer;
+    border-radius: 8px;
+    .msPhoto {
+      display: flex;
+      justify-content: center;
+      align-items: center;
+      max-width: 100%;
+      max-height: 270px;
+      img {
+        max-width: 100%;
+        max-height: 270px;
+      }
+    }
+    .imgbbx {
+      display: flex;
+      flex-direction: column;
+      align-items: center;
+      justify-content: center;
+      width: 100%;
+      height: 100%;
+      i {
+        font-weight: bold;
+        margin: 14px 0;
+        font-size: 24px;
+      }
+    }
+  }
+  p {
+    margin: 5px 0px;
+  }
+}
+.dis_fs {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  width: 337.5px;
+  height: 144px;
+  border: 1px solid #999;
+  .imgBoxs {
+    width: 100%;
+    height: 100%;
+  }
+}
+.styPsty {
+  margin-top: 10px;
+  display: flex;
+  align-items: center;
+  .btns {
+    border: 1px solid #999;
+    font-size: 12px;
+    height: 28px;
+    line-height: 28px;
+    padding: 0px 10px;
+    border-radius: 4px;
+    cursor: pointer;
+    margin-right: 10px;
+    flex-shrink: 0;
+  }
+}
+</style>

+ 21 - 0
src/views/2Cport/adSlotManagement/tab2.vue

@@ -0,0 +1,21 @@
+<template>
+  <div id="tab2">
+tab2
+  </div>
+</template>
+
+<script>
+export default {
+  data () {
+    return {
+    }
+  },
+  methods: {
+
+  }
+}
+</script>
+
+<style lang="less" scoped>
+
+</style>

+ 405 - 0
src/views/2Cport/adv/index.vue

@@ -0,0 +1,405 @@
+<template>
+  <div id="adv">
+    <table-list
+      :tableSets="tableSet"
+      :tableData="tableData"
+      :navText="navText"
+      @addClick="addClick"
+      :loading="loading"
+    >
+      <template slot="btn" slot-scope="props">
+        <el-button type="text" @click="addClick(props.scope.row, 0)"
+          >修改</el-button
+        >
+        <el-button type="text" @click="del(props.scope.row)">删除</el-button>
+      </template>
+    </table-list>
+    <pagination
+      :total="total"
+      :pageSize="pageSize"
+      :currentPage="currentPage"
+      @handleSizeChange="handleSizeChange"
+      @handleCurrentChange="handleCurrentChange"
+    />
+    <el-dialog
+      @closed="loadingClose"
+      :visible.sync="dialogVisible"
+      width="560px"
+      :show-close="false"
+      :close-on-click-modal="false"
+    >
+      <div slot="title" class="hearders">
+        <div class="leftTitle">
+          {{ statusPop === 1 ? "添加" : statusPop === 0 ? "修改" : "详情" }}
+        </div>
+        <div class="rightBoxs">
+          <img src="@/assets/images/Close@2x.png" alt="" @click="close" />
+        </div>
+      </div>
+      <div>
+        <el-form
+          label-position="right"
+          label-width="110px"
+          :model="listData"
+          :rules="rules"
+          ref="listData"
+        >
+          <el-form-item
+            v-for="(items, indexs) in listitem"
+            :key="indexs"
+            :label="items.label"
+            :prop="items.prop"
+          >
+            <el-radio-group
+              v-if="items.scope === 'status'"
+              v-model="listData[items.prop]"
+            >
+              <el-radio
+                v-for="(item, index) in items.options"
+                :key="index"
+                :label="item.value"
+                :disabled="statusPop === 2"
+                >{{ item.label }}</el-radio
+              >
+            </el-radio-group>
+            <el-input-number
+              :min="1"
+              :controls="false"
+              :precision="0"
+              :disabled="statusPop === 2"
+              v-else-if="items.scope === 'Number'"
+              v-model="listData[items.prop]"
+            ></el-input-number>
+            <el-input
+              :disabled="statusPop === 2"
+              v-else
+              v-model="listData[items.prop]"
+            ></el-input>
+          </el-form-item>
+        </el-form>
+      </div>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="close">取 消</el-button>
+        <el-button
+          type="primary"
+          :loading="disabledBtn"
+          v-if="statusPop !== 2"
+          @click="submit('listData')"
+          >确 定</el-button
+        >
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import tableList from "@/components/tableList";
+import pagination from "@/components/pagination";
+export default {
+  components: { tableList, pagination },
+  data() {
+    return {
+      disabledBtn: false,
+      loading: false, //当前表单加载是否加载动画
+      navText: {
+        title: "Banner列表",
+        index: 0,
+        ch: "条",
+        num: true,
+        choice: true,
+        addHide: false,
+        backFatherBtn: {
+          status: false,
+          title: "未定义",
+        },
+      },
+      // 表单
+      tableSet: [
+        {
+          label: "Banner名称",
+          prop: "name",
+          hidden: true,
+        },
+        {
+          label: "BannerKey",
+          prop: "locationKey",
+          hidden: true,
+        },
+        {
+          label: "间隔秒数",
+          prop: "intervalTime",
+          hidden: true,
+        },
+        {
+          label: "状态",
+          prop: "status",
+          hidden: true,
+          scope: "status",
+        },
+      ],
+      tableData: [], //表单数据
+      total: 0, //一共多少条
+      pageSize: 10, //每页多少条数据
+      currentPage: 1, //当前页码
+      // 弹窗字段
+      listitem: [
+        {
+          label: "Banner名称",
+          prop: "name",
+        },
+        {
+          label: "BannerKey",
+          prop: "locationKey",
+        },
+        {
+          label: "间隔秒数",
+          prop: "intervalTime",
+          scope: "Number",
+        },
+        {
+          label: "状态",
+          prop: "status",
+          scope: "status",
+          options: [
+            {
+              label: "启用",
+              value: 1,
+            },
+            {
+              label: "关闭",
+              value: 0,
+            },
+          ],
+        },
+      ],
+      //   弹窗数据
+      listData: {},
+      statusPop: -1,
+      dialogVisible: false,
+      //表单验证
+      rules: {
+        name: [
+          { required: true, message: "请输入banner名称", trigger: "blur" },
+        ],
+        locationKey: [
+          { required: true, message: "请输入bannerKey", trigger: "blur" },
+        ],
+        intervalTime: [
+          { required: true, message: "请输入间隔秒数", trigger: "blur" },
+        ],
+        status: [{ required: true, message: "请选择状态", trigger: "change" }],
+      },
+    };
+  },
+  mounted() {
+    this.search();
+  },
+  methods: {
+    loadingClose() {
+      this.disabledBtn = false;
+    },
+    search(v) {
+      this.loading = true;
+      var data = {
+        status: "0,1",
+        pageSize: this.pageSize,
+        pageNum: this.currentPage,
+      };
+      this.$api
+        .inquireadvlocationlist(data)
+        .then((res) => {
+          this.tableData = res.rows;
+          this.total = res.total;
+          this.navText.index = res.total;
+        })
+        .finally(() => {
+          this.loading = false;
+        });
+    },
+    init() {
+      this.search();
+    },
+    del(v) {
+      this.$alert(
+        "确定删除此内容?<br />内容删除后将无法恢复,请慎重考虑",
+        "提示",
+        {
+          dangerouslyUseHTMLString: true,
+        }
+      )
+        .then(() => {
+          var data = {
+            locationId: v.locationId,
+            status: -1,
+          };
+          this.$api.editadvlocation(data).then((res) => {
+            this.$message.success("删除成功");
+            this.search();
+          });
+        })
+        .catch(() => {
+          this.$message({
+            type: "info",
+            message: "已取消删除",
+          });
+        });
+    },
+    addClick(v, int) {
+      if (v === undefined) {
+        this.statusPop = 1;
+        this.listData = {
+          status: 1,
+        };
+      } else {
+        this.statusPop = int;
+        this.listData = JSON.parse(JSON.stringify(v));
+      }
+      this.$nextTick(() => {
+        this.$refs.listData.clearValidate();
+      });
+      this.dialogVisible = true;
+    },
+    submit(formName) {
+      this.$refs[formName].validate((valid) => {
+        if (valid) {
+          this.rulesTableSumbit();
+        } else {
+          return false;
+        }
+      });
+    },
+    rulesTableSumbit() {
+      this.disabledBtn = true;
+      if (this.statusPop === 1) {
+        this.$api
+          .appadvlocation(this.listData)
+          .then((res) => {
+            this.$message.success("新增成功");
+            this.dialogVisible = false;
+            this.search();
+          })
+          .catch(() => {
+            this.disabledBtn = false;
+          });
+      }
+      if (this.statusPop === 0) {
+        this.$api
+          .editadvlocation(this.listData)
+          .then((res) => {
+            this.$message.success("修改成功");
+            this.dialogVisible = false;
+            this.search();
+          })
+          .catch(() => {
+            this.disabledBtn = false;
+          });
+      }
+    },
+    close() {
+      this.dialogVisible = false;
+    },
+    handleSizeChange(v) {
+      this.pageSize = v;
+      this.currentPage = 1;
+      this.search();
+    },
+    handleCurrentChange(v) {
+      this.currentPage = v;
+      this.search();
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+/deep/.el-button {
+  border-radius: 8px;
+}
+/deep/.el-dialog {
+  border-radius: 8px;
+  .el-dialog__header {
+    padding: 0;
+    .hearders {
+      height: 40px;
+      display: flex;
+      align-items: center;
+      justify-content: space-between;
+      padding: 0px 18px 0px 20px;
+      border-bottom: 1px solid #e2e2e2;
+      .leftTitle {
+        font-size: 14px;
+        font-weight: bold;
+        color: #2f4378;
+      }
+      .rightBoxs {
+        display: flex;
+        align-items: center;
+        img {
+          width: 14px;
+          height: 14px;
+          margin-left: 13px;
+          cursor: pointer;
+        }
+      }
+    }
+  }
+  .el-dialog__footer {
+    padding: 0;
+    .dialog-footer {
+      padding: 0px 40px;
+      height: 70px;
+      border-top: 1px solid #e2e2e2;
+      display: flex;
+      align-items: center;
+      justify-content: flex-end;
+    }
+  }
+}
+.imgBox {
+  width: 100%;
+  // height: 210px;
+  border: 1px solid #e2e2e2;
+  border-radius: 8px;
+  padding: 8px 8px 3px;
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  .imgLabel {
+    flex: 1;
+    width: 100%;
+    border: 1px dotted #e2e2e2;
+    color: #999;
+    font-size: 14px;
+    cursor: pointer;
+    border-radius: 8px;
+    .msPhoto {
+      display: flex;
+      justify-content: center;
+      align-items: center;
+      max-width: 100%;
+      max-height: 270px;
+      img {
+        max-width: 100%;
+        max-height: 270px;
+      }
+    }
+    .imgbbx {
+      display: flex;
+      flex-direction: column;
+      align-items: center;
+      justify-content: center;
+      width: 100%;
+      height: 100%;
+      i {
+        font-weight: bold;
+        margin: 14px 0;
+        font-size: 24px;
+      }
+    }
+  }
+  p {
+    margin: 5px 0px;
+  }
+}
+</style>
+

+ 1 - 2
src/views/Marketing/basicParameters/index.vue

@@ -63,11 +63,10 @@ export default {
   methods: {
     changePages() {
       this.$router.push({
-        name: 'BaseManageInfos',
+        name: "BaseManageInfos",
       });
     },
     jumpPage(item) {
-      console.log(item.url);
       this.$router.push({
         path: item.url,
       });

+ 37 - 12
src/views/Marketing/goods/commodityManageMent/add/index.vue

@@ -29,7 +29,7 @@
                 <el-option
                   v-for="(item, index) in supplyOption"
                   :key="index"
-                  :label="item.supplyName"
+                  :label="`${item.supplyName}(${item.serveName})`"
                   :value="item.supplyId"
                 >
                 </el-option>
@@ -154,7 +154,7 @@
         </el-col>
         <el-col :span="12">
           <el-form label-position="right" label-width="120px" :model="listData">
-            <el-form-item label="课程封面">
+            <el-form-item label="商品封面">
               <div class="imgBoxins">
                 <img
                   :src="$methodsTools.splitImgHost(listData.coverUrl)"
@@ -1167,10 +1167,17 @@
               v-model="photoVideoList.photographConfig.photograph"
             >
               <el-radio :label="1">是</el-radio>
-              <el-radio :label="0" @change="photoVideoList.photographConfig.photoNum = ''">否</el-radio>
+              <el-radio
+                :label="0"
+                @change="photoVideoList.photographConfig.photoNum = ''"
+                >否</el-radio
+              >
             </el-radio-group>
           </div>
-          <div v-if="photoVideoList.photographConfig.photograph === 1">
+          <div
+            v-if="photoVideoList.photographConfig.photograph === 1"
+            style="margin-top: 14px"
+          >
             拍照数量:<el-input-number
               :min="1"
               :controls="false"
@@ -1193,7 +1200,10 @@
               <el-radio :label="0">否</el-radio>
             </el-radio-group>
           </div>
-          <div v-if="photoVideoList.photographConfig.livephotograph === 1">
+          <div
+            v-if="photoVideoList.photographConfig.livephotograph === 1"
+            style="margin-top: 14px"
+          >
             学习开始,就拍照,只拍1张照片
           </div>
         </div>
@@ -1208,7 +1218,10 @@
               <el-radio :label="0">否</el-radio>
             </el-radio-group>
           </div>
-          <div v-if="photoVideoList.goodsPhotographExamConfig.photograph === 1">
+          <div
+            v-if="photoVideoList.goodsPhotographExamConfig.photograph === 1"
+            style="margin-top: 14px"
+          >
             学习开始,就拍照,只拍1张照片
           </div>
         </div>
@@ -2567,6 +2580,7 @@ export default {
       }
       if (this.listData.businessId) {
         data.businessId = this.listData.businessId;
+        self.formDatas.businessId = self.listData.businessId;
       }
       this.$api.inquireCourseListS(data).then((res) => {
         var aList = [];
@@ -2579,10 +2593,9 @@ export default {
         this.dialogVisibleTableBoxs = true;
         this.$nextTick(function () {
           self.$refs.multipleTable.clearSelection();
-          self.$refs.searchBox.changeEducationType(
-            self.listData.educationTypeId
-          );
-          // self.formDatas.businessId = self.listData.businessId;
+          // self.$refs.searchBox.changeEducationType(
+          //   self.listData.educationTypeId
+          // );
         });
       });
     },
@@ -2597,7 +2610,13 @@ export default {
       this.activeLists = [];
     },
     del(item, index) {
-      this.tableData.splice(index, 1);
+      const ast = this.tableData.findIndex((items) => {
+        return items.courseId === item.courseId;
+      });
+      this.tableData.splice(ast, 1);
+      this.auditionList = this.auditionList.filter((items) => {
+        return items.courseId !== item.courseId;
+      });
       this.$message.success("删除成功");
     },
     selectAll(value) {
@@ -2854,7 +2873,13 @@ export default {
       };
     },
     del2(item, index) {
-      this.tableData2.splice(index, 1);
+      const ast = this.tableData2.findIndex((items) => {
+        return items.ids === item.ids;
+      });
+      this.tableData2.splice(ast, 1);
+      this.examConfigList = this.examConfigList.filter((items) => {
+        return items.TypeId !== item.ids;
+      });
       this.$message.success("删除成功");
     },
     selectAll2(value) {

+ 61 - 22
src/views/Marketing/goods/commodityManageMent/edit/index.vue

@@ -29,7 +29,7 @@
                 <el-option
                   v-for="(item, index) in supplyOption"
                   :key="index"
-                  :label="item.supplyName"
+                  :label="`${item.supplyName}(${item.serveName})`"
                   :value="item.supplyId"
                 >
                 </el-option>
@@ -157,7 +157,7 @@
         </el-col>
         <el-col :span="12">
           <el-form label-position="right" label-width="120px" :model="listData">
-            <el-form-item label="课程封面">
+            <el-form-item label="商品封面">
               <div class="imgBoxins">
                 <img
                   :src="$methodsTools.splitImgHost(listData.coverUrl)"
@@ -307,7 +307,7 @@
       <div v-if="listData.goodsType === 1">
         <h5 class="fengs">课程内容</h5>
         <div style="margin-bottom: 20px">
-          <el-button @click="editAddBoxs" size="small">添加</el-button>
+          <el-button @click="editAddBoxs" size="small" v-if="noStudent">添加</el-button>
           <el-button
             @click="openSet"
             type="success"
@@ -385,6 +385,7 @@
             align="center"
             fixed="right"
             width="100px"
+            v-if="noStudent"
           >
             <template slot-scope="scope">
               <el-button type="text" @click="del(scope.row, scope.$index)"
@@ -1179,10 +1180,17 @@
               v-model="photoVideoList.photographConfig.photograph"
             >
               <el-radio :label="1">是</el-radio>
-              <el-radio :label="0" @change="photoVideoList.photographConfig.photoNum = ''">否</el-radio>
+              <el-radio
+                :label="0"
+                @change="photoVideoList.photographConfig.photoNum = ''"
+                >否</el-radio
+              >
             </el-radio-group>
           </div>
-          <div v-if="photoVideoList.photographConfig.photograph === 1">
+          <div
+            v-if="photoVideoList.photographConfig.photograph === 1"
+            style="margin-top: 14px"
+          >
             拍照数量:<el-input-number
               :min="1"
               :controls="false"
@@ -1205,7 +1213,10 @@
               <el-radio :label="0">否</el-radio>
             </el-radio-group>
           </div>
-          <div v-if="photoVideoList.photographConfig.livephotograph === 1">
+          <div
+            v-if="photoVideoList.photographConfig.livephotograph === 1"
+            style="margin-top: 14px"
+          >
             学习开始,就拍照,只拍1张照片
           </div>
         </div>
@@ -1220,7 +1231,10 @@
               <el-radio :label="0">否</el-radio>
             </el-radio-group>
           </div>
-          <div v-if="photoVideoList.goodsPhotographExamConfig.photograph === 1">
+          <div
+            v-if="photoVideoList.goodsPhotographExamConfig.photograph === 1"
+            style="margin-top: 14px"
+          >
             学习开始,就拍照,只拍1张照片
           </div>
         </div>
@@ -1786,6 +1800,7 @@ export default {
       ],
       examConfigList: [],
       //   题库商品表格数据------------------------------------------------------------------------end
+      noStudent: true,
     };
   },
   created() {
@@ -1799,6 +1814,13 @@ export default {
     },
   },
   mounted() {
+    this.$api
+      .gradecheckGoodsChange({ goodsId: this.$route.query.id })
+      .then((res) => {
+        if (res.data > 0) {
+          this.noStudent = false;
+        }
+      });
     this.getDict();
     this.getJyData();
   },
@@ -2279,12 +2301,15 @@ export default {
             res.data.map((item) => {
               if (item.type === 1) {
                 item.moduleExamId = item.majorId;
+                item.ids = item.type + "-" + item.majorId;
               }
               if (item.type === 2) {
                 item.chapterExamId = item.majorId;
+                item.ids = item.type + "-" + item.majorId;
               }
               if (item.type === 3) {
                 item.examId = item.majorId;
+                item.ids = item.type + "-" + item.majorId;
               }
             });
             this.tableData2 = res.data;
@@ -2715,6 +2740,7 @@ export default {
     },
     //视频商品表格函数START
     getInfos(int) {
+      console.log(this.formDatas);
       if (int === 1) {
         this.formDatas.pageNum = 1;
       }
@@ -2738,20 +2764,22 @@ export default {
     },
     editAddBoxs() {
       var self = this;
-      var data = {
-        status: 1,
-        pageSize: 10,
-        pageNum: 1,
-        publishStatus: 1,
-      };
+      // var data = {
+      //   status: 1,
+      //   pageSize: 10,
+      //   pageNum: 1,
+      //   publishStatus: 1,
+      // };
       if (this.listData.educationTypeId) {
-        data.educationTypeId = this.listData.educationTypeId;
+        // data.educationTypeId = this.listData.educationTypeId;
         this.formDatas.educationTypeId = this.listData.educationTypeId;
       }
       if (this.listData.businessId) {
-        data.businessId = this.listData.businessId;
+        // data.businessId = self.listData.businessId;
+        this.formDatas.businessId = this.listData.businessId;
       }
-      this.$api.inquireCourseListS(data).then((res) => {
+      console.log(this.formDatas);
+      this.$api.inquireCourseListS(this.formDatas).then((res) => {
         var aList = [];
         this.tableData.map((item) => {
           aList.push(item.courseId);
@@ -2762,10 +2790,9 @@ export default {
         this.dialogVisibleTableBoxs = true;
         this.$nextTick(function () {
           self.$refs.multipleTable.clearSelection();
-          self.$refs.searchBox.changeEducationType(
-            self.listData.educationTypeId
-          );
-          // self.formDatas.businessId = self.listData.businessId;
+          // self.$refs.searchBox.changeEducationType(
+          //   self.listData.educationTypeId
+          // );
         });
       });
     },
@@ -2780,7 +2807,13 @@ export default {
       this.activeLists = [];
     },
     del(item, index) {
-      this.tableData.splice(index, 1);
+      const ast = this.tableData.findIndex((items) => {
+        return items.courseId === item.courseId;
+      });
+      this.tableData.splice(ast, 1);
+      this.auditionList = this.auditionList.filter((items) => {
+        return items.courseId !== item.courseId;
+      });
       this.$message.success("删除成功");
     },
     selectAll(value) {
@@ -3049,7 +3082,13 @@ export default {
       };
     },
     del2(item, index) {
-      this.tableData2.splice(index, 1);
+      const ast = this.tableData2.findIndex((items) => {
+        return items.ids === item.ids;
+      });
+      this.tableData2.splice(ast, 1);
+      this.examConfigList = this.examConfigList.filter((items) => {
+        return items.TypeId !== item.ids;
+      });
       this.$message.success("删除成功");
     },
     selectAll2(value) {

+ 65 - 57
src/views/Marketing/goods/commodityManageMent/index.vue

@@ -41,7 +41,7 @@ import searchBoxNew from "@/components/searchBoxNew";
 import tableList from "@/components/tableList";
 import pagination from "@/components/pagination";
 export default {
-  name:"CommodityManageMent",
+  name: "CommodityManageMent",
   components: { searchBoxNew, tableList, pagination },
   data() {
     return {
@@ -51,7 +51,7 @@ export default {
         index: 0,
         ch: "条",
         num: false,
-        border:true,
+        border: true,
         choice: true,
         addHide: false,
         backFatherBtn: {
@@ -59,7 +59,7 @@ export default {
           title: "未定义",
         },
       },
-      topType:true,
+      topType: true,
       //搜索
       formList: [
         {
@@ -151,7 +151,7 @@ export default {
         },
       ],
       formData: {
-        goodsType: '',
+        goodsType: "",
         status: "0,1",
         pageSize: 10,
         pageNum: 1,
@@ -184,8 +184,8 @@ export default {
           prop1: "projectName",
           prop2: "businessName",
           hidden: true,
-          width:"220px",
-          scope:"InfoMore"
+          width: "220px",
+          scope: "InfoMore",
         },
         {
           label: "教育类型",
@@ -200,14 +200,14 @@ export default {
         {
           label: "商品内容视图",
           hidden: true,
-          scope:"treeWatch"
+          scope: "treeWatch",
         },
         {
           label: "商品价格",
           prop: "standPrice",
           hidden: true,
-          scope:"leftCh",
-          ch:"¥"
+          scope: "leftCh",
+          ch: "¥",
         },
         {
           label: "商品状态",
@@ -264,8 +264,8 @@ export default {
   mounted() {
     this.search();
   },
-  activated(){
-    this.search()
+  activated() {
+    this.search();
   },
   methods: {
     editInfo(v) {
@@ -278,57 +278,67 @@ export default {
       }
       if (int === 2) {
         this.formData = {
-          goodsType: '',
+          goodsType: "",
           status: "0,1",
           pageSize: 10,
           pageNum: 1,
         };
       }
-      if(int === 3){
-        this.formData.pageNum = 1
+      if (int === 3) {
+        this.formData.pageNum = 1;
       }
-      var data = JSON.parse(JSON.stringify(this.formData))
+      var data = JSON.parse(JSON.stringify(this.formData));
       if (this.formData.validityStartTime) {
-        data.validityStartTime = data.validityStartTime / 1000
+        data.validityStartTime = data.validityStartTime / 1000;
       }
       if (this.formData.validityEndTime) {
-        data.validityEndTime = data.validityEndTime / 1000
+        data.validityEndTime = data.validityEndTime / 1000;
       }
-      this.$api.inquireGoods(data).then((res) => {
-        this.tableData = res.rows;
-        this.total = res.total;
-        this.navText.index = res.total;
-      }).finally(()=>{
-        this.loading = false;
-      })
+      this.$api
+        .inquireGoods(data)
+        .then((res) => {
+          this.tableData = res.rows;
+          this.total = res.total;
+          this.navText.index = res.total;
+        })
+        .finally(() => {
+          this.loading = false;
+        });
     },
     init() {
       this.search(2);
     },
     del(v) {
-      this.$alert(
-        "确定删除此内容?<br />内容删除后将无法恢复,请慎重考虑",
-        "提示",
-        {
-          dangerouslyUseHTMLString: true,
+      this.$api.gradecheckGoodsChange({ goodsId: v.goodsId }).then((res) => {
+        if (res.data > 0) {
+          this.$message.error("已有学员正在学习该商品,无法删除");
+          return;
+        } else {
+          this.$alert(
+            "确定删除此内容?<br />内容删除后将无法恢复,请慎重考虑",
+            "提示",
+            {
+              dangerouslyUseHTMLString: true,
+            }
+          )
+            .then(() => {
+              var data = {
+                goodsId: v.goodsId,
+                status: -1,
+              };
+              this.$api.editGoods(data).then((res) => {
+                this.$message.success("删除成功");
+                this.search();
+              });
+            })
+            .catch(() => {
+              this.$message({
+                type: "info",
+                message: "已取消删除",
+              });
+            });
         }
-      )
-        .then(() => {
-          var data = {
-            goodsId: v.goodsId,
-            status: -1,
-          };
-          this.$api.editGoods(data).then((res) => {
-            this.$message.success("删除成功");
-            this.search();
-          });
-        })
-        .catch(() => {
-          this.$message({
-            type: "info",
-            message: "已取消删除",
-          });
-        });
+      });
     },
     addClick(v, int) {
       if (v === undefined) {
@@ -354,18 +364,16 @@ export default {
       this.search();
     },
     changeStatus(item) {
-      var items = JSON.parse(JSON.stringify(item))
+      var items = JSON.parse(JSON.stringify(item));
       items.goodsStatus = items.goodsStatus === 1 ? 0 : 1;
-      this.$api
-        .editGoods(items)
-        .then((res) => {
-          if (item.goodsStatus === 1) {
-            this.$message.success("下架成功");
-          } else {
-            this.$message.success("上架成功");
-          }
-          this.search();
-        });
+      this.$api.editGoods(items).then((res) => {
+        if (item.goodsStatus === 1) {
+          this.$message.success("下架成功");
+        } else {
+          this.$message.success("上架成功");
+        }
+        this.search();
+      });
     },
   },
 };

+ 0 - 3
src/views/Marketing/goods/commodityManageMent/poppleSet.vue

@@ -91,7 +91,6 @@ export default {
         this.$message.warning("时长禁止为0,请重新设置");
       } else {
         var arrays = this.$refs.trees;
-        console.log(arrays,11)
         //修改指定项的 auditionMinute
         arrays.root.childNodes.forEach((item, index) => {
           item.childNodes.forEach((items, indexs) => {
@@ -223,7 +222,6 @@ export default {
     },
     loadNode(node, resolve) {
       var self = this;
-      console.log(self.auditionListCope);
       if (node.level === 0) {
         this.tableData.map((item) => {
           item.TypeId = "0-" + item.courseId;
@@ -259,7 +257,6 @@ export default {
                 if (this.getAllSeNum.indexOf(item.onlyId) === -1) {
                   this.getAllSeNum.push(item.onlyId);
                 }
-                console.log(item.onlyId, 555555);
                 item.type = 3;
                 item.TypeId = "3" + "-" + item.sectionId;
                 item.menuId = item.sectionId;

+ 0 - 3
src/views/Marketing/goods/commodityManageMent/poppleSetTK.vue

@@ -115,7 +115,6 @@ export default {
       if (!node && this.audition.indexOf(item.TypeId) !== -1) {
         this.audition.splice(this.audition.indexOf(item.TypeId), 1);
       }
-      console.log(item, 555);
       if (node) {
         var sta = this.examConfigListCope.some((items) => {
           return items.TypeId == item.TypeId;
@@ -200,7 +199,6 @@ export default {
         return resolve(this.tableData);
       } else {
         if (node.data.type === 1) {
-          console.log(node.data);
           this.$api
             .inquireBankchapterModule({ moduleExamId: node.data.moduleExamId })
             .then((res) => {
@@ -220,7 +218,6 @@ export default {
               chapterExamId: node.data.chapterExamId,
             })
             .then((res) => {
-              console.log(node.data);
               res.data.map((item) => {
                 if (node.data.moduleExamId) {
                   item.TypeId =

+ 0 - 1
src/views/Marketing/goods/courseInquiryList/index.vue

@@ -149,7 +149,6 @@
       </div>
       <span slot="footer" class="dialog-footer">
         <el-button @click="close">取 消</el-button>
-        <el-button type="primary">确 定</el-button>
       </span>
     </el-dialog>
   </div>

+ 57 - 44
src/views/Marketing/order/orderList/details/studentManageOrder.vue

@@ -16,18 +16,24 @@
           </el-col>
           <el-col :span="12">
             <el-form-item label="选择班级" prop="gradeId">
-              <el-select
+              <!-- <el-select
                 v-model="listDataSubmitForm.gradeId"
                 placeholder="请选择班级"
+                :disabled="true"
               >
                 <el-option
                   v-for="(item, index) in classList"
                   :key="index"
+                  :disabled="item.studentNum >= item.studentUpper"
                   :label="item.className"
                   :value="item.gradeId"
                 >
                 </el-option>
-              </el-select>
+              </el-select> -->
+              <el-input
+                :value="listDataSubmitForm.gradeName"
+                disabled
+              ></el-input>
             </el-form-item>
           </el-col>
           <el-col :span="12">
@@ -129,7 +135,8 @@ export default {
     return {
       listData: {},
       listDataSubmitForm: {
-        cityId:'',
+        cityId: "",
+        className: "",
         goodsInputData: {
           applyAreasJson: {},
         },
@@ -137,7 +144,7 @@ export default {
       options: [],
       cityList: [],
       newCityList: [],
-      classList:[],
+      classList: [],
       rules: {
         // company: [
         //   { required: true, message: "请输入所在公司", trigger: "blur" },
@@ -157,19 +164,22 @@ export default {
   },
   computed: { ...mapGetters(["courseExamine", "areas"]) },
   mounted() {
-    this.getClassInfos()
+    this.getClassInfos();
     this.getInfoCity();
     this.search();
   },
   methods: {
-    getClassInfos(){
-      this.$api.inquireGradegradeList({goodsId:this.$route.query.goodsId}).then(res => {
-        if(res.rows.length){
-          this.classList = res.rows.filter(item => {
-            return item.studentNum < item.studentUpper
-          })
-        }
-      })
+    getClassInfos() {
+      this.$api
+        .inquireGradegradeList({ goodsId: this.$route.query.goodsId })
+        .then((res) => {
+          if (res.rows.length) {
+            this.classList = res.rows;
+            // this.classList = res.rows.filter((item) => {
+            //   return item.studentNum < item.studentUpper;
+            // });
+          }
+        });
     },
     getInfoCity() {
       this.$api.inquireapplyCityList({ status: 1, areaType: 2 }).then((res) => {
@@ -194,34 +204,37 @@ export default {
         })
         .then((res) => {
           res.data.goodsInputData = JSON.parse(res.data.goodsInputData);
-          if (res.data.goodsInputData.applyAreasJson) {
-            res.data.goodsInputData.applyAreasJson = JSON.parse(
-              res.data.goodsInputData.applyAreasJson
-            );
-            res.data.areaId = res.data.goodsInputData.applyAreasJson.areaId;
-            res.data.cityId = res.data.goodsInputData.applyAreasJson.cityId;
-            this.newCityList = this.cityList.filter((item) => {
-              return item.parentId == res.data.areaId;
-            });
-          }else{
-            res.data.cityId = ''
-          }
-          if (res.data.goodsInputData.examDateJson) {
-            res.data.goodsInputData.examDateJson = JSON.parse(
-              res.data.goodsInputData.examDateJson
-            );
-            res.data.goodsInputData.examDateJsonName =
-              res.data.goodsInputData.examDateJson.examineName;
-          }
-          if (
-            res.data.goodsInputData.gradeJson
-          ) {
-            res.data.goodsInputData.gradeJson = JSON.parse(
-              res.data.goodsInputData.gradeJson
-            );
-            res.data.goodsInputData.gradeId =
-              res.data.goodsInputData.gradeJson.gradeId;
+          if (res.data.goodsInputData) {
+            if (res.data.goodsInputData.applyAreasJson) {
+              res.data.goodsInputData.applyAreasJson = JSON.parse(
+                res.data.goodsInputData.applyAreasJson
+              );
+              res.data.areaId = res.data.goodsInputData.applyAreasJson.areaId;
+              res.data.cityId = res.data.goodsInputData.applyAreasJson.cityId;
+              this.newCityList = this.cityList.filter((item) => {
+                return item.parentId == res.data.areaId;
+              });
+            } else {
+              res.data.cityId = "";
+            }
+            if (res.data.goodsInputData.examDateJson) {
+              res.data.goodsInputData.examDateJson = JSON.parse(
+                res.data.goodsInputData.examDateJson
+              );
+              res.data.goodsInputData.examDateJsonName =
+                res.data.goodsInputData.examDateJson.examineName;
+            }
+            if (res.data.goodsInputData.gradeJson) {
+              res.data.goodsInputData.gradeJson = JSON.parse(
+                res.data.goodsInputData.gradeJson
+              );
+              res.data.goodsInputData.gradeId =
+                res.data.goodsInputData.gradeJson.gradeId;
+            }
+          } else {
+            res.data.goodsInputData = {};
           }
+
           this.listDataSubmitForm = res.data;
           this.$refs["listDataSubmitForm"].resetFields();
         });
@@ -255,17 +268,17 @@ export default {
           };
         }
       }
-      data.goodsInputData.examDateJson = ''
+      data.goodsInputData.examDateJson = "";
       this.courseExamine.forEach((item) => {
         if (item.examineName == data.goodsInputData.examDateJsonName) {
           data.goodsInputData.examDateJson = JSON.stringify(item);
         }
       });
-      data.goodsInputData.gradeJson = ''
+      data.goodsInputData.gradeJson = "";
       this.classList.forEach((item) => {
         if (item.gradeId == data.gradeId) {
           data.goodsInputData.gradeJson = JSON.stringify(item);
-          data.goodsInputData.gradeId = item.gradeId
+          data.goodsInputData.gradeId = item.gradeId;
         }
       });
       data.orderSn = this.$route.query.orderSn;
@@ -273,7 +286,7 @@ export default {
       data.goodsInputData.applyAreasJson = JSON.stringify(
         data.goodsInputData.applyAreasJson
       );
-      data.gradeId = this.listDataSubmitForm.gradeId
+      data.gradeId = this.listDataSubmitForm.gradeId;
       this.$api.editordergoods(data).then((res) => {
         this.$message.success("保存成功");
       });

+ 46 - 36
src/views/Marketing/order/orderList/index.vue

@@ -39,7 +39,7 @@ import searchBoxNew from "@/components/searchBoxNew";
 import tableList from "@/components/tableList";
 import pagination from "@/components/pagination";
 export default {
-  name:"OrderList",
+  name: "OrderList",
   components: { searchBoxNew, tableList, pagination },
   data() {
     return {
@@ -57,7 +57,7 @@ export default {
           title: "计费单收费",
         },
       },
-      topType:true,
+      topType: true,
       //搜索
       formList: [
         {
@@ -142,7 +142,7 @@ export default {
         },
       ],
       formData: {
-        goodsType: '',
+        goodsType: "",
         pageSize: 10,
         pageNum: 1,
       },
@@ -153,19 +153,19 @@ export default {
           prop: "createTime",
           hidden: true,
           scope: "aTimeList",
-          width:"180px"
+          width: "180px",
         },
         {
           label: "订单编码",
           prop: "orderSn",
           hidden: true,
-          width:"210px"
+          width: "210px",
         },
         {
           label: "手机号码",
           prop: "telphone",
           hidden: true,
-          width:"120px"
+          width: "120px",
         },
         {
           label: "学员姓名",
@@ -176,7 +176,7 @@ export default {
           label: "学员身份证",
           prop: "idCard",
           hidden: true,
-          width:"190px"
+          width: "190px",
         },
         {
           label: "商品名称",
@@ -190,7 +190,7 @@ export default {
           prop3: "businessName",
           hidden: true,
           scope: "eduTypes",
-          width:"280px"
+          width: "280px",
         },
         {
           label: "商品年份",
@@ -202,8 +202,8 @@ export default {
           label: "商品标准价格",
           prop: "goodsPrice",
           hidden: true,
-          ch:"元",
-          width:"120px"
+          ch: "元",
+          width: "120px",
         },
         // {
         //   label: "使用优惠劵",
@@ -214,8 +214,8 @@ export default {
           label: "商品成交价",
           prop: "goodsRealPrice",
           hidden: true,
-          ch:"元",
-          width:"110px"
+          ch: "元",
+          width: "110px",
         },
         {
           label: "支付状态",
@@ -241,20 +241,20 @@ export default {
           label: "已收金额",
           prop: "goodsReceived",
           hidden: true,
-          ch:"元"
+          ch: "元",
         },
         {
           label: "未收金额",
           hidden: true,
-          scope:"refundPrice",
-          ch:"元"
+          scope: "refundPrice",
+          ch: "元",
         },
         {
           label: "订单来源",
           prop: "orderFrom",
           hidden: true,
           scope: "isOptions",
-          width:"130px",
+          width: "130px",
           options: [
             {
               label: "业务员录单",
@@ -306,6 +306,13 @@ export default {
             },
           ],
         },
+        {
+          label: "复购-学时冲突",
+          width:"120px",
+          prop: "rebuy",
+          hidden: true,
+          scope: "rebuy",
+        },
       ],
       tableData: [], //表单数据
       total: 0, //一共多少条
@@ -314,22 +321,22 @@ export default {
   mounted() {
     this.search();
   },
-  activated(){
-    this.search()
+  activated() {
+    this.search();
   },
   methods: {
     emitData(option) {
-      console.log(option,156)
+      console.log(option, 156);
       if (!option.length) {
         this.$message.error("请勾选需要操作的订单");
         return;
       }
-      var statues = option.some(item => {
-        return item.payStatus === 3 || item.orderFrom === 2
-      })
-      if(statues){
+      var statues = option.some((item) => {
+        return item.payStatus === 3 || item.orderFrom === 2;
+      });
+      if (statues) {
         this.$message.warning("请勿勾选完全收费及订单来源为小程序的订单");
-          return;
+        return;
       }
       var arrayId = [];
       for (let i = 0; i < option.length; i++) {
@@ -353,21 +360,24 @@ export default {
       }
       if (int === 2) {
         this.formData = {
-          goodsType: '',
+          goodsType: "",
           pageSize: 10,
           pageNum: 1,
         };
       }
-      if(int === 3){
-        this.formData.pageNum = 1
+      if (int === 3) {
+        this.formData.pageNum = 1;
       }
-      this.$api.inquireOrderList(this.formData).then((res) => {
-        this.tableData = res.rows;
-        this.total = res.total;
-        this.navText.index = res.total;
-      }).finally(()=>{
-        this.loading = false;
-      })
+      this.$api
+        .inquireOrderList(this.formData)
+        .then((res) => {
+          this.tableData = res.rows;
+          this.total = res.total;
+          this.navText.index = res.total;
+        })
+        .finally(() => {
+          this.loading = false;
+        });
     },
     init() {
       this.search(2);
@@ -415,10 +425,10 @@ export default {
       this.$router.push({
         path: "orderDetail",
         query: {
-          orderId:v.orderId,
+          orderId: v.orderId,
           goodsId: v.goodsId,
           orderSn: v.orderSn,
-          userId:v.userId
+          userId: v.userId,
         },
       });
     },

+ 45 - 9
src/views/education/classManageMent/classHours/index.vue

@@ -33,13 +33,27 @@
               reviewListNums >= 200
                 ? 'color:red;'
                 : reviewListNums < 200 && reviewListNums > 99
-                ? 'color:yellow'
+                ? 'color:green'
                 : reviewListNums < 100
                 ? 'color:block;'
                 : ''
             "
             style="font-weight: bold"
-          ></i></el-button
+          ></i>
+          <!-- <i
+            class="el-icon-warning-outline"
+            :style="
+              reviewListNums >= 3
+                ? 'color:red;'
+                : reviewListNums < 3 && reviewListNums > 1
+                ? 'color:green'
+                : reviewListNums <= 1
+                ? 'color:block;'
+                : ''
+            "
+            style="font-weight: bold"
+          ></i> -->
+          </el-button
         ><el-button
           :type="activeBtn === 0 ? 'primary' : ''"
           :size="size"
@@ -213,13 +227,6 @@ export default {
           scope: "computer",
           width: "130px",
         },
-        {
-          label: "学时审批状态",
-          prop: "periodStatus",
-          hidden: true,
-          scope: "statusPeriod",
-          width: "130px",
-        },
         {
           label: "学习开始时间",
           prop: "startTime",
@@ -242,6 +249,34 @@ export default {
           scope: "TimeLists",
           width: "220px",
         },
+        {
+          label: "填写资料审核状态",
+          prop: "profileStatus",
+          hidden: true,
+          scope: "isOptions",
+          width: "130px",
+          options: [
+            {
+              label: "审核通过",
+              value: 1,
+            },
+            {
+              label: "待审核",
+              value: 2,
+            },
+            {
+              label: "审核不通过",
+              value: 3,
+            },
+          ],
+        },
+        {
+          label: "学时审批状态",
+          prop: "allStatus",
+          hidden: true,
+          scope: "statusPeriod",
+          width: "130px",
+        },
         {
           label: "待重修(视频节和题卷)",
           prop: "waitRebuildNum",
@@ -412,6 +447,7 @@ export default {
           status: "0,1",
         })
         .then((res) => {
+          console.log(res.rows)
           this.reviewListNums = res.rows.length;
         });
     },

文件差异内容过多而无法显示
+ 4 - 1048
src/views/education/classManageMent/classHoursReview/index.vue


+ 1235 - 0
src/views/education/classManageMent/classHoursReview/studyTimes.vue

@@ -0,0 +1,1235 @@
+<template>
+  <div id="classHoursReview">
+    <div class="dis_fs">
+      <ul class="ul_ls">
+        <li>学员编码:{{ userData.studentCode }}</li>
+        <li>学员姓名:{{ realName }}</li>
+        <li>学员身份证号码:{{ idCard }}</li>
+        <li>绑定手机号码:{{ telPhone }}</li>
+      </ul>
+      <div class="photoSty1">
+        <el-image
+          style="width: 100%; height: 100%"
+          :src="$methodsTools.splitImgHost(recent_photos)"
+          :preview-src-list="[$methodsTools.splitImgHost(recent_photos)]"
+        >
+        </el-image>
+        <div class="pos_bottom">一寸头像图</div>
+      </div>
+      <div class="photoSty2">
+        <el-image
+          style="width: 100%; height: 100%"
+          :src="$methodsTools.splitImgHost(idcard_face_photo)"
+          :preview-src-list="[$methodsTools.splitImgHost(idcard_face_photo)]"
+        >
+        </el-image>
+        <div class="pos_bottom">身份证正面照片</div>
+      </div>
+      <div class="photoSty2" style="margin-right: 0px">
+        <el-image
+          style="width: 100%; height: 100%"
+          :src="$methodsTools.splitImgHost(idcard_national_photo)"
+          :preview-src-list="[
+            $methodsTools.splitImgHost(idcard_national_photo),
+          ]"
+        >
+        </el-image>
+        <div class="pos_bottom">身份证背面照片</div>
+      </div>
+    </div>
+    <div class="dis_fls">
+      <div class="s_sd">
+        <div class="dis_colu">
+          <div class="jdNumSty" style="margin-bottom: 4px">
+            视频学习进度:{{ userData.stuAllNum }}/{{ userData.secAllNum }}
+            {{
+              userData.stuAllNum == 0 && userData.secAllNum == 0
+                ? "0"
+                : (userData.stuAllNum / userData.secAllNum) * 100
+            }}% 通过:{{ userData.pass }}节
+            <span style="color: #f56c6c">作弊:{{ userData.cheat }}节</span>
+            <span style="color: #409eff"> 待审:{{ userData.pending }}节</span>
+          </div>
+          <div class="jdNumSty">
+            做题学习进度:{{ userData.recordNum }}/{{ userData.examNum }}
+            {{
+              userData.recordNum == 0 && userData.examNum == 0
+                ? "0"
+                : (userData.recordNum / userData.examNum) * 100
+            }}% 通过:{{ userData.examPass }}节
+            <span style="color: #f56c6c">作弊:{{ userData.examCheat }}节</span>
+            <span style="color: #409eff">
+              待审:{{ userData.examPending }}节</span
+            >
+          </div>
+        </div>
+        <div class="shbtns">
+          学时审批状态:{{
+            userData.allStatus === 1
+              ? "未通过"
+              : userData.allStatus === 0
+              ? "待审核"
+              : userData.allStatus === -1
+              ? "不可审核"
+              : userData.allStatus === 2
+              ? "通过审核"
+              : "未知状态,请联系管理员"
+          }}
+        </div>
+      </div>
+      <div class="s_sd">
+        <div
+          class="btnStys"
+          @click="getChangeStatus(1)"
+          v-if="userData.allStatus === 0 || userData.allStatus === 1"
+        >
+          待审核全部通过
+        </div>
+        <div
+          class="btnStys"
+          @click="getChangeStatus(2)"
+          v-if="userData.allStatus === 0 || userData.allStatus === 1"
+        >
+          待审核全部作弊
+        </div>
+      </div>
+    </div>
+    <template v-for="(asrt, insrt) in 3">
+      <el-table
+        border
+        v-loading="loading"
+        :key="insrt"
+        :data="
+          listData[
+            insrt === 0
+              ? 'tableData1'
+              : insrt === 1
+              ? 'tableData2'
+              : insrt === 2
+              ? 'tableData3'
+              : ''
+          ]
+        "
+        style="width: 100%"
+        :default-expand-all="false"
+        :header-cell-style="
+          insrt === 0
+            ? {
+                'background-color': 'skyblue',
+                padding: '8px',
+                color: '#333',
+              }
+            : insrt === 1
+            ? {
+                'background-color': 'rgb(255,255,204)',
+                padding: '8px',
+                color: '#333',
+              }
+            : insrt === 2
+            ? {
+                'background-color': '#eee',
+                padding: '8px',
+                color: '#333',
+              }
+            : ''
+        "
+      >
+        <!-- 插槽开始--------------------------------------------------------- -->
+        <el-table-column
+          :label="
+            insrt === 0
+              ? '模块'
+              : insrt === 1
+              ? '章'
+              : insrt === 2
+              ? '节/卷'
+              : ''
+          "
+          type="expand"
+          width="70px"
+        >
+          <template slot-scope="scope">
+            <!-- type为3时使用该插槽START -->
+            <div
+              v-if="scope.row.type === 3 || scope.row.type === 4"
+              class="dis_flexs"
+            >
+              <ul
+                style="flex: 1"
+                v-if="
+                  scope.row.userStudyRecordPhotoList &&
+                  scope.row.userStudyRecordPhotoList.length
+                "
+              >
+                <li
+                  v-for="(its, inds) in scope.row.userStudyRecordPhotoList"
+                  :key="inds"
+                  class="liImgs"
+                >
+                  <el-image
+                    style="width: 100%; height: 100%"
+                    :src="$methodsTools.splitImgHost(its.photo)"
+                    :preview-src-list="[$methodsTools.splitImgHost(its.photo)]"
+                  >
+                  </el-image>
+                  <div class="abos">
+                    {{ $methodsTools.onlyForma(its.createTime) }}
+                  </div>
+                </li>
+                <div style="clear: both"></div>
+              </ul>
+              <p v-else style="text-align: center; width: 100%">暂无拍照数据</p>
+              <div
+                class="styFlex"
+                v-if="
+                  (userData.allStatus === 0 || userData.allStatus === 1) &&
+                  scope.row.periodStatus === 1
+                "
+              >
+                <el-button
+                  :disabled="scope.row.status === 1"
+                  class="btnstyles"
+                  size="mini"
+                  @click="changeStatus(scope.row, 1, scope.$index)"
+                  >通过</el-button
+                >
+                <el-button
+                  :disabled="scope.row.status === 0"
+                  class="btnstyles"
+                  size="mini"
+                  @click="
+                    scope.row.status === 2 || scope.row.status === 3
+                      ? changeStatus(scope.row, 2, scope.$index)
+                      : ''
+                  "
+                  >作弊</el-button
+                >
+              </div>
+              <!-- <div
+                class="styFlex"
+                v-if="
+                  (scope.row.allStatus === 0 || scope.row.allStatus === 1) &&
+                  scope.row.periodStatus === 1 &&
+                  scope.row.status === 0
+                "
+              >
+                <el-button
+                  class="btnstyles"
+                  size="mini"
+                  @click="changeStatus(scope.row, 1, scope.$index)"
+                  >通过</el-button
+                >
+              </div> -->
+            </div>
+            <!-- type为3时使用该插槽END -->
+            <!-- 章表格START -->
+            <el-table
+              v-else
+              border
+              :data="
+                scope.row.type === 1
+                  ? scope.row.classPeriods
+                  : scope.row.type === 2
+                  ? scope.row.classPeriodSectionList
+                  : ''
+              "
+              style="width: 100%"
+              :default-expand-all="false"
+              :header-cell-style="
+                scope.row.type === 1
+                  ? {
+                      'background-color': 'rgb(255,255,204)',
+                      padding: '8px',
+                      color: '#333',
+                    }
+                  : scope.row.type === 2
+                  ? {
+                      'background-color': '#eee',
+                      padding: '8px',
+                      color: '#333',
+                    }
+                  : ''
+              "
+            >
+              <!-- 章插槽START -->
+              <el-table-column
+                type="expand"
+                :label="
+                  scope.row.type === 1
+                    ? '章'
+                    : scope.row.type === 2
+                    ? '节/卷'
+                    : ''
+                "
+                :width="
+                  scope.row.type === 1
+                    ? '70px'
+                    : scope.row.type === 2
+                    ? '80px'
+                    : ''
+                "
+              >
+                <template slot-scope="scope2">
+                  <!-- 节插槽START -->
+                  <div
+                    v-if="scope2.row.type === 3 || scope2.row.type === 4"
+                    class="dis_flexs"
+                  >
+                    <ul
+                      style="flex: 1"
+                      v-if="
+                        scope2.row.userStudyRecordPhotoList &&
+                        scope2.row.userStudyRecordPhotoList.length
+                      "
+                    >
+                      <li
+                        v-for="(its, inds) in scope2.row
+                          .userStudyRecordPhotoList"
+                        :key="inds"
+                        class="liImgs"
+                      >
+                        <el-image
+                          style="width: 100%; height: 100%"
+                          :src="$methodsTools.splitImgHost(its.photo)"
+                          :preview-src-list="[
+                            $methodsTools.splitImgHost(its.photo),
+                          ]"
+                        >
+                        </el-image>
+                        <div class="abos">
+                          {{ $methodsTools.onlyForma(its.createTime) }}
+                        </div>
+                      </li>
+                      <div style="clear: both"></div>
+                    </ul>
+                    <p v-else style="text-align: center; width: 100%">
+                      暂无拍照数据
+                    </p>
+                    <div
+                      class="styFlex"
+                      v-if="
+                        (userData.allStatus === 0 ||
+                          userData.allStatus === 1) &&
+                        scope2.row.periodStatus === 1
+                      "
+                    >
+                      <el-button
+                        :disabled="scope2.row.status === 1"
+                        class="btnstyles"
+                        size="mini"
+                        @click="
+                          changeStatusCharpter(
+                            scope2.row,
+                            1,
+                            scope.$index,
+                            scope2.$index
+                          )
+                        "
+                        >通过</el-button
+                      >
+                      <el-button
+                        :disabled="scope2.row.status === 0"
+                        class="btnstyles"
+                        size="mini"
+                        @click="
+                          scope2.row.status === 2 || scope2.row.status === 3
+                            ? changeStatusCharpter(
+                                scope2.row,
+                                2,
+                                scope.$index,
+                                scope2.$index
+                              )
+                            : ''
+                        "
+                        >作弊</el-button
+                      >
+                    </div>
+                    <!-- <div
+                      class="styFlex"
+                      v-if="
+                        (scope2.row.allStatus === 0 ||
+                          scope2.row.allStatus === 1) &&
+                        scope2.row.periodStatus === 1 &&
+                        scope2.row.status === 0
+                      "
+                    >
+                      <el-button
+                        class="btnstyles"
+                        size="mini"
+                        @click="
+                          changeStatusCharpter(
+                            scope2.row,
+                            1,
+                            scope.$index,
+                            scope2.$index
+                          )
+                        "
+                        >通过</el-button
+                      >
+                    </div> -->
+                  </div>
+                  <!-- 节插槽END -->
+                  <!-- 节表格START -->
+                  <el-table
+                    v-else
+                    border
+                    :data="
+                      scope2.row.type === 2
+                        ? scope2.row.classPeriodSectionList
+                        : ''
+                    "
+                    style="width: 100%"
+                    :default-expand-all="false"
+                    :header-cell-style="
+                      scope2.row.type === 2
+                        ? {
+                            'background-color': '#eee',
+                            padding: '8px',
+                            color: '#333',
+                          }
+                        : ''
+                    "
+                  >
+                    <!-- 节插槽START -->
+                    <el-table-column
+                      type="expand"
+                      :label="scope2.row.type === 2 ? '节/卷' : ''"
+                      width="80px"
+                    >
+                      <template slot-scope="scope3">
+                        <div
+                          v-if="scope3.row.type === 3 || scope3.row.type === 4"
+                          class="dis_flexs"
+                        >
+                          <ul
+                            style="flex: 1"
+                            v-if="
+                              scope3.row.userStudyRecordPhotoList &&
+                              scope3.row.userStudyRecordPhotoList.length
+                            "
+                          >
+                            <li
+                              v-for="(its, inds) in scope3.row
+                                .userStudyRecordPhotoList"
+                              :key="inds"
+                              class="liImgs"
+                            >
+                              <el-image
+                                style="width: 100%; height: 100%"
+                                :src="$methodsTools.splitImgHost(its.photo)"
+                                :preview-src-list="[
+                                  $methodsTools.splitImgHost(its.photo),
+                                ]"
+                              >
+                              </el-image>
+                              <div class="abos">
+                                {{ $methodsTools.onlyForma(its.createTime) }}
+                              </div>
+                            </li>
+                            <div style="clear: both"></div>
+                          </ul>
+                          <p v-else style="text-align: center; width: 100%">
+                            暂无拍照数据
+                          </p>
+                          <div
+                            class="styFlex"
+                            v-if="
+                              (userData.allStatus === 0 ||
+                                userData.allStatus === 1) &&
+                              scope3.row.periodStatus === 1
+                            "
+                          >
+                            <el-button
+                              :disabled="scope3.row.status === 1"
+                              class="btnstyles"
+                              size="mini"
+                              @click="
+                                changeStatusModule(
+                                  scope3.row,
+                                  1,
+                                  scope.$index,
+                                  scope2.$index,
+                                  scope3.$index
+                                )
+                              "
+                              >通过</el-button
+                            >
+                            <el-button
+                              :disabled="scope3.row.status === 0"
+                              class="btnstyles"
+                              size="mini"
+                              @click="
+                                scope3.row.status === 2 ||
+                                scope3.row.status === 3
+                                  ? changeStatusModule(
+                                      scope3.row,
+                                      2,
+                                      scope.$index,
+                                      scope2.$index,
+                                      scope3.$index
+                                    )
+                                  : ''
+                              "
+                              >作弊</el-button
+                            >
+                          </div>
+                          <!-- <div
+                            class="styFlex"
+                            v-if="
+                              (scope3.row.allStatus === 0 ||
+                                scope3.row.allStatus === 1) &&
+                              scope3.row.periodStatus === 1 &&
+                              scope3.row.status === 0
+                            "
+                          >
+                            <el-button
+                              class="btnstyles"
+                              size="mini"
+                              @click="
+                                changeStatusModule(
+                                  scope3.row,
+                                  1,
+                                  scope.$index,
+                                  scope2.$index,
+                                  scope3.$index
+                                )
+                              "
+                              >通过</el-button
+                            >
+                          </div> -->
+                        </div>
+                      </template>
+                    </el-table-column>
+                    <!-- 节插槽END -->
+                    <template
+                      v-for="(item, index) in scope2.row.type === 2
+                        ? tableSet3
+                        : ''"
+                    >
+                      <el-table-column
+                        :width="item.width"
+                        :key="index"
+                        :label="item.label"
+                        align="center"
+                      >
+                        <template slot-scope="scope3">
+                          <span v-if="item.scope === 'select'">
+                            <span v-for="(k, ds) in item.options" :key="ds">
+                              {{
+                                k.value == scope3.row[item.prop] ? k.label : ""
+                              }}
+                            </span>
+                          </span>
+                          <div v-else-if="item.scope === 'activeNum'">
+                            <el-select
+                              v-model="scope3.row[item.prop]"
+                              placeholder="请选择"
+                              @change="
+                                getNewListMores(
+                                  scope.$index,
+                                  scope2.$index,
+                                  scope3.$index,
+                                  $event,
+                                  scope3.row
+                                )
+                              "
+                            >
+                              <el-option
+                                v-for="(items, indexs) in scope3.row['numList']"
+                                :key="indexs"
+                                :label="'第' + items + '次审核记录'"
+                                :value="items"
+                              >
+                              </el-option>
+                            </el-select>
+                          </div>
+                          <span v-else-if="item.scope === 'typeOptions'">
+                            <span v-for="(is, ds) in item.options" :key="ds">
+                              <span v-if="is.value === scope3.row[item.prop]">{{
+                                is.label
+                              }}</span>
+                            </span>
+                          </span>
+                          <span v-else-if="item.scope === 'aTime'">
+                            {{ $methodsTools.onlyForma(scope3.row[item.prop]) }}
+                          </span>
+                          <div v-else-if="item.scope === 'aTimeSE'">
+                            <span
+                              v-if="
+                                scope3.row['type'] === 3 &&
+                                scope3.row['durationTime'] &&
+                                scope3.row['studyStartTime'] &&
+                                scope3.row['studyEndTime']
+                              "
+                              :style="comput(scope3.row)"
+                            >
+                              {{
+                                $methodsTools.onlyForma(scope3.row[item.prop])
+                              }}
+                            </span>
+                            <span v-else>
+                              {{
+                                $methodsTools.onlyForma(scope3.row[item.prop])
+                              }}
+                            </span>
+                          </div>
+                          <span v-else> {{ scope3.row[item.prop] }} </span>
+                        </template>
+                      </el-table-column>
+                    </template>
+                  </el-table>
+                  <!-- 节表格END -->
+                </template>
+              </el-table-column>
+              <!-- 章插槽END -->
+              <template
+                v-for="(item, index) in scope.row.type === 1
+                  ? tableSet2
+                  : scope.row.type === 2
+                  ? tableSet3
+                  : ''"
+              >
+                <el-table-column
+                  :width="item.width"
+                  :key="index"
+                  :label="item.label"
+                  align="center"
+                >
+                  <template slot-scope="scope2">
+                    <span v-if="item.scope === 'select'">
+                      <span v-for="(k, ds) in item.options" :key="ds">
+                        {{ k.value == scope2.row[item.prop] ? k.label : "" }}
+                      </span>
+                    </span>
+                    <div v-else-if="item.scope === 'activeNum'">
+                      <el-select
+                        v-model="scope2.row[item.prop]"
+                        placeholder="请选择"
+                        @change="
+                          getNewListchapt(
+                            scope.$index,
+                            scope2.$index,
+                            $event,
+                            scope2.row
+                          )
+                        "
+                      >
+                        <el-option
+                          v-for="(items, indexs) in scope2.row['numList']"
+                          :key="indexs"
+                          :label="'第' + items + '次审核记录'"
+                          :value="items"
+                        >
+                        </el-option>
+                      </el-select>
+                    </div>
+                    <span v-else-if="item.scope === 'typeOptions'">
+                      <span v-for="(is, ds) in item.options" :key="ds">
+                        <span v-if="is.value === scope2.row[item.prop]">{{
+                          is.label
+                        }}</span>
+                      </span>
+                    </span>
+                    <span v-else-if="item.scope === 'aTime'">
+                      {{ $methodsTools.onlyForma(scope2.row[item.prop]) }}
+                    </span>
+                    <div v-else-if="item.scope === 'aTimeSE'">
+                      <span
+                        v-if="
+                          scope2.row['type'] === 3 &&
+                          scope2.row['durationTime'] &&
+                          scope2.row['studyStartTime'] &&
+                          scope2.row['studyEndTime']
+                        "
+                        :style="comput(scope2.row)"
+                      >
+                        {{ $methodsTools.onlyForma(scope2.row[item.prop]) }}
+                      </span>
+                      <span v-else>
+                        {{ $methodsTools.onlyForma(scope2.row[item.prop]) }}
+                      </span>
+                    </div>
+                    <span v-else> {{ scope2.row[item.prop] }} </span>
+                  </template>
+                </el-table-column>
+              </template>
+            </el-table>
+            <!-- 章表格END -->
+          </template>
+        </el-table-column>
+        <!-- 插槽结束--------------------------------------------------------- -->
+        <template
+          v-for="(item, index) in insrt === 0
+            ? tableSet1
+            : insrt === 1
+            ? tableSet2
+            : insrt === 2
+            ? tableSet3
+            : ''"
+        >
+          <el-table-column
+            :width="item.width"
+            :key="index"
+            :label="item.label"
+            align="center"
+          >
+            <template slot-scope="scope">
+              <span v-if="item.scope === 'select'">
+                <span v-for="(k, ds) in item.options" :key="ds">
+                  {{ k.value == scope.row[item.prop] ? k.label : "" }}
+                </span>
+              </span>
+              <div v-else-if="item.scope === 'activeNum'">
+                <el-select
+                  v-model="scope.row[item.prop]"
+                  placeholder="请选择"
+                  @change="getNewList(scope.$index, $event, scope.row)"
+                >
+                  <el-option
+                    v-for="(items, indexs) in scope.row['numList']"
+                    :key="indexs"
+                    :label="'第' + items + '次审核记录'"
+                    :value="items"
+                  >
+                  </el-option>
+                </el-select>
+              </div>
+              <span v-else-if="item.scope === 'typeOptions'">
+                <span v-for="(is, ds) in item.options" :key="ds">
+                  <span v-if="is.value === scope.row[item.prop]">{{
+                    is.label
+                  }}</span>
+                </span>
+              </span>
+              <span v-else-if="item.scope === 'aTime'">
+                {{ $methodsTools.onlyForma(scope.row[item.prop]) }}
+              </span>
+              <div v-else-if="item.scope === 'aTimeSE'">
+                <span
+                  v-if="
+                    scope.row['type'] === 3 &&
+                    scope.row['durationTime'] &&
+                    scope.row['studyStartTime'] &&
+                    scope.row['studyEndTime']
+                  "
+                  :style="comput(scope.row)"
+                >
+                  {{ $methodsTools.onlyForma(scope.row[item.prop]) }}
+                </span>
+                <span v-else>
+                  {{ $methodsTools.onlyForma(scope.row[item.prop]) }}
+                </span>
+              </div>
+              <span v-else>
+                {{ scope.row[item.prop] }}{{ item.ch ? item.ch : "" }}
+              </span>
+            </template>
+          </el-table-column>
+        </template>
+      </el-table>
+    </template>
+  </div>
+</template>
+
+<script>
+export default {
+  data() {
+    return {
+      size: "medium",
+      active: "",
+      loading: false,
+      studentCode: "",
+      realName: "",
+      idCard: "",
+      telPhone: "",
+      recent_photos: "",
+      idcard_face_photo: "",
+      idcard_national_photo: "",
+      arr: ["tableData1", "tableData2", "tableData3"],
+      listData: {
+        tableData1: [],
+        tableData2: [],
+        tableData3: [],
+      },
+      userData: {},
+      tableData: [],
+      tableSet1: [
+        {
+          label: "姓名",
+          prop: "realName",
+        },
+        {
+          label: "模块标题",
+          prop: "typeName",
+        },
+        {
+          label: "学时",
+          prop: "classHours",
+        },
+      ],
+      tableSet2: [
+        {
+          label: "姓名",
+          prop: "realName",
+        },
+        {
+          label: "章标题",
+          prop: "typeName",
+        },
+        {
+          label: "学时",
+          prop: "classHours",
+        },
+        {
+          label: "开始学习时间",
+          prop: "studyStartTime",
+          scope: "aTime",
+        },
+        {
+          label: "结束学习时间",
+          prop: "studyEndTime",
+          scope: "aTime",
+        },
+        {
+          label: "测试成绩",
+          prop: "performance",
+        },
+      ],
+      tableSet3: [
+        {
+          label: "选择",
+          prop: "numIndex",
+          scope: "activeNum",
+          width: "180px",
+        },
+        {
+          label: "姓名",
+          prop: "realName",
+        },
+        {
+          label: "标题",
+          prop: "typeName",
+        },
+        {
+          label: "类型",
+          prop: "type",
+          scope: "typeOptions",
+          options: [
+            {
+              label: "节",
+              value: 3,
+            },
+            {
+              label: "试卷",
+              value: 4,
+            },
+          ],
+        },
+        {
+          label: "节时长",
+          prop: "durationTime",
+          width: "180px",
+        },
+        {
+          label: "开始时间",
+          prop: "studyStartTime",
+          scope: "aTimeSE",
+        },
+        {
+          label: "结束时间",
+          prop: "studyEndTime",
+          scope: "aTimeSE",
+        },
+        {
+          label: "审核状态",
+          prop: "status",
+          scope: "select",
+          options: [
+            {
+              label: "待审核",
+              value: 2,
+            },
+            {
+              label: "通过",
+              value: 1,
+            },
+            {
+              label: "作弊",
+              value: 0,
+            },
+          ],
+        },
+        {
+          label: "审核人",
+          prop: "auditUserName",
+        },
+        {
+          label: "审核时间",
+          prop: "auditTime",
+          scope: "aTime",
+        },
+      ],
+      tableDataChild: {},
+      tableSetChild: [],
+    };
+  },
+  mounted() {
+    this.getUserInfo();
+    this.search();
+  },
+  methods: {
+    comput(item) {
+      var ast = (item.studyEndTime-item.studyStartTime) / 60;
+      console.log(ast,item.durationTime,555)
+      if (ast < item.durationTime) {
+        return "color:red;";
+      } else {
+        return "";
+      }
+    },
+    /**
+     * 通过 作弊 periodId
+     */
+    changeStatus(item, int, index) {
+      var data = {
+        id: item.periodStatusId,
+      };
+      if (int === 1) {
+        data.status = 1;
+      }
+      if (int === 2) {
+        data.status = 0;
+      }
+      this.$api.editGradeUsereditPeriode(data).then((res) => {
+        this.$message.success("修改成功");
+        this.getNewList(index, item.numIndex, item);
+      });
+    },
+    changeStatusCharpter(item, int, index1, index2) {
+      var data = {
+        id: item.periodStatusId,
+      };
+      if (int === 1) {
+        data.status = 1;
+      }
+      if (int === 2) {
+        data.status = 0;
+      }
+      this.$api.editGradeUsereditPeriode(data).then((res) => {
+        this.$message.success("修改成功");
+        this.getNewListchapt(index1, index2, item.numIndex, item);
+      });
+    },
+    changeStatusModule(item, int, index1, index2, index3) {
+      var data = {
+        id: item.periodStatusId,
+      };
+      if (int === 1) {
+        data.status = 1;
+      }
+      if (int === 2) {
+        data.status = 0;
+      }
+      this.$api.editGradeUsereditPeriode(data).then((res) => {
+        this.$message.success("修改成功");
+        this.getNewListMores(index1, index2, index3, item.numIndex, item);
+      });
+    },
+    //批量审批
+    getChangeStatus(int) {
+      var data = {
+        gradeId: Number(this.$route.query.id),
+        userId: Number(this.$route.query.userId),
+        goodsId: Number(this.$route.query.goodsId),
+      };
+      if (int === 1) {
+        data.status = 1;
+      }
+      if (int === 2) {
+        data.status = 0;
+      }
+      this.$api.editGradeUsereditPeriodeAll(data).then((res) => {
+        if (int === 1) {
+          this.$message.success("状态全部通过修改成功");
+        }
+        if (int === 2) {
+          this.$message.success("状态全部作弊修改成功");
+        }
+        this.getUserInfo();
+        this.search();
+      });
+    },
+    //节
+    getNewList(index, int, item) {
+      let data = {
+        courseId: item.courseId,
+        moduleId: item.moduleId,
+        chapterId: item.chapterId,
+        numIndex: int,
+        userId: this.$route.query.userId,
+        goodsId: this.$route.query.goodsId,
+        gradeId: this.$route.query.id,
+      };
+      if (item.type === 3) {
+        data.sectionId = item.id;
+      }
+      if (item.type === 4) {
+        data.examId = item.id;
+      }
+      this.$api.inquireGradegradelistPeriodAuditStatus(data).then((res) => {
+        this.$set(this.listData.tableData3, index, res.data);
+        this.getUserInfo();
+      });
+    },
+    //章 节
+    getNewListchapt(a, b, int, item) {
+      let data = {
+        courseId: item.courseId,
+        moduleId: item.moduleId,
+        chapterId: item.chapterId,
+        numIndex: int,
+        userId: this.$route.query.userId,
+        goodsId: this.$route.query.goodsId,
+        gradeId: this.$route.query.id,
+      };
+      if (item.type === 3) {
+        data.sectionId = item.id;
+      }
+      if (item.type === 4) {
+        data.examId = item.id;
+      }
+      this.$api.inquireGradegradelistPeriodAuditStatus(data).then((res) => {
+        this.$set(
+          this.listData.tableData2[a].classPeriodSectionList,
+          b,
+          res.data
+        );
+        this.getUserInfo();
+      });
+    },
+    //模块 章 节
+    getNewListMores(a, b, c, int, item) {
+      let data = {
+        courseId: item.courseId,
+        moduleId: item.moduleId,
+        chapterId: item.chapterId,
+        numIndex: int,
+        userId: this.$route.query.userId,
+        goodsId: this.$route.query.goodsId,
+        gradeId: this.$route.query.id,
+      };
+      if (item.type === 3) {
+        data.sectionId = item.id;
+      }
+      if (item.type === 4) {
+        data.examId = item.id;
+      }
+      this.$api.inquireGradegradelistPeriodAuditStatus(data).then((res) => {
+        this.$set(
+          this.listData.tableData1[a].classPeriods[b].classPeriodSectionList,
+          c,
+          res.data
+        );
+        this.getUserInfo();
+      });
+    },
+    //获取用户信息
+    getUserInfo() {
+      this.$api
+        .inquireGradegradelistUserlistPeriod({
+          gradeId: this.$route.query.id,
+          userId: this.$route.query.userId,
+          goodsId: this.$route.query.goodsId,
+        })
+        .then((res) => {
+          if (res.rows[0].keyValue) {
+            var data = JSON.parse(res.rows[0].keyValue);
+            this.recent_photos = data.recent_photos.value;
+            this.idcard_face_photo = data.idcard_face_photo.value;
+            this.idcard_national_photo = data.idcard_national_photo.value;
+            this.realName = data.name.value;
+            this.idCard = data.idcard.value;
+            this.telPhone = data.telphone.value;
+          }
+          this.userData = res.rows[0];
+        });
+    },
+    search() {
+      let data = {
+        gradeId: this.$route.query.id,
+        userId: this.$route.query.userId,
+        goodsId: this.$route.query.goodsId,
+      };
+      this.loading = true;
+      this.$api
+        .inquireGradegradelistPeriodAudit(data)
+        .then((res) => {
+          let tab1 = [];
+          let tab2 = [];
+          let tab3 = [];
+          for (let i = 0; i < res.rows.length; i++) {
+            if (res.rows[i].type === 1) {
+              tab1.push(res.rows[i]);
+            }
+            if (res.rows[i].type === 2) {
+              tab2.push(res.rows[i]);
+            }
+            if (res.rows[i].type === 3) {
+              tab3.push(res.rows[i]);
+            }
+          }
+          this.listData.tableData1 = tab1;
+          this.listData.tableData2 = tab2;
+          this.listData.tableData3 = tab3;
+        })
+        .finally(() => {
+          this.loading = false;
+        });
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.styFlex {
+  width: 80px;
+  text-align: center;
+}
+.btnstyles {
+  margin-left: 0px;
+  margin-bottom: 10px;
+}
+.dis_flexs {
+  display: flex;
+  align-items: center;
+}
+.dis_fs {
+  display: flex;
+  align-items: center;
+  height: 211px;
+  background-color: #eee;
+  padding: 0px 30px;
+  overflow: auto;
+  .ul_ls {
+    margin-right: 30px;
+    align-self: flex-start;
+    li {
+      font-size: 14px;
+      white-space: nowrap;
+      margin-bottom: 14px;
+    }
+  }
+  &::-webkit-scrollbar {
+    width: 14px;
+    height: 14px;
+  }
+
+  &::-webkit-scrollbar-track,
+  &::-webkit-scrollbar-thumb {
+    border-radius: 999px;
+    border: 5px solid transparent;
+  }
+
+  &::-webkit-scrollbar-track {
+    box-shadow: 1px 1px 5px rgba(0, 0, 0, 0.2) inset;
+  }
+
+  &::-webkit-scrollbar-thumb {
+    min-height: 20px;
+    background-clip: content-box;
+    box-shadow: 0 0 0 5px rgba(0, 0, 0, 0.2) inset;
+  }
+
+  &::-webkit-scrollbar-corner {
+    background: transparent;
+  }
+}
+.photoSty1 {
+  flex-shrink: 0;
+  width: 150px;
+  height: 160px;
+  background-color: #fff;
+  margin-right: 60px;
+  position: relative;
+}
+.photoSty2 {
+  position: relative;
+  flex-shrink: 0;
+  width: 230px;
+  height: 160px;
+  margin-right: 60px;
+  background-color: #fff;
+}
+.pos_bottom {
+  position: absolute;
+  height: 20px;
+  bottom: 0px;
+  left: 0px;
+  right: 0px;
+  background-color: rgba(0, 0, 0, 0.8);
+  text-align: center;
+  line-height: 20px;
+  font-size: 14px;
+  color: #fff;
+}
+.dis_fls {
+  margin: 16px 0px;
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  flex-wrap: wrap;
+  .s_sd {
+    display: flex;
+    align-items: center;
+    flex-shrink: 0;
+    margin-bottom: 10px;
+    .dis_colu {
+      height: 55px;
+      margin-right: 14px;
+      display: flex;
+      flex-direction: column;
+      justify-content: space-around;
+      font-size: 14px;
+    }
+  }
+}
+.jdNumSty {
+  border: 1px solid #000;
+  border-radius: 6px;
+  padding: 6px;
+}
+.shbtns {
+  padding: 0px 10px;
+  height: 55px;
+  line-height: 55px;
+  background-color: #eee;
+  border-radius: 6px;
+}
+.btnStys {
+  border: 1px solid #666;
+  padding: 0px 8px;
+  border-radius: 4px;
+  font-size: 15px;
+  margin-right: 8px;
+  cursor: pointer;
+}
+.liImgs {
+  float: left;
+  width: 250px;
+  height: 250px;
+  margin-right: 20px;
+  margin-bottom: 20px;
+  position: relative;
+  .abos {
+    position: absolute;
+    bottom: 0px;
+    width: 100%;
+    height: 44px;
+    line-height: 44px;
+    font-size: 16px;
+    color: #000;
+    text-align: center;
+    background-color: rgba(90, 90, 90, 0.7);
+  }
+}
+</style>

+ 4 - 0
src/views/education/classManageMent/classList/addClass/index.vue

@@ -643,6 +643,10 @@ export default {
         data.classStartTime = this.listData.timeList[0] / 1000;
         data.classEndTime = this.listData.timeList[1] / 1000;
       }
+      if(!data.timeList){
+        data.classStartTime = null
+        data.classEndTime = null 
+      }
       if (data.learningStatus === 3) {
         data.learningTimeStart = this.listData.learningTimeStart / 1000;
       }

+ 6 - 6
src/views/education/classManageMent/classList/index.vue

@@ -41,13 +41,13 @@ import tableList from "@/components/tableList";
 import pagination from "@/components/pagination";
 export default {
   components: { searchBoxNew, tableList, pagination },
-  name:"ClassList",
+  name: "ClassList",
   data() {
     return {
       loading: false, //当前表单加载是否加载动画
       navText: {
         border: true,
-        title: "班级管理",
+        title: "班级列表",
         index: 0,
         ch: "条",
         num: false,
@@ -177,7 +177,7 @@ export default {
           label: "班主任",
           prop: "nickName",
           hidden: true,
-        }, 
+        },
         {
           label: "班级人数",
           prop1: "studentNum",
@@ -235,12 +235,12 @@ export default {
           pageNum: 1,
         };
       }
-      var data = JSON.parse(JSON.stringify(this.formData))
+      var data = JSON.parse(JSON.stringify(this.formData));
       if (this.formData.classStartTime) {
-        data.classStartTime = data.classStartTime / 1000
+        data.classStartTime = data.classStartTime / 1000;
       }
       if (this.formData.classEndTime) {
-        data.classEndTime = data.classEndTime / 1000
+        data.classEndTime = data.classEndTime / 1000;
       }
       this.$api
         .inquireGradegradeList(data)

+ 89 - 34
src/views/education/classManageMent/classList/manageClass/baseInfo.vue

@@ -127,23 +127,37 @@
                 <el-radio :label="0">无效</el-radio>
               </el-radio-group>
             </el-form-item>
-            <el-form-item label="班级有效期" prop="timeList">
+            <el-form-item label="班级有效期">
               <el-date-picker
-                style="width: 90%"
-                v-model="listData.timeList"
-                type="datetimerange"
-                range-separator="至"
-                start-placeholder="开始日期"
-                end-placeholder="结束日期"
+                v-model="listData.classStartTime"
+                type="datetime"
                 value-format="timestamp"
-                @change="changeDataTimeStudy(listData.timeList)"
+                placeholder="选择开始日期时间"
+                @change="changeTimeList1"
+                :disabled="classStartStatus"
+                style="margin-bottom:10px;"
+              >
+              </el-date-picker>
+              <el-date-picker
+                v-model="listData.classEndTime"
+                type="datetime"
+                value-format="timestamp"
+                placeholder="选择结束日期时间"
+                @change="changeTimeList2"
+                :disabled="classEndStatus"
               >
               </el-date-picker>
               <el-tooltip class="item" effect="dark" placement="right">
                 <div slot="content">
-                  商品学习有效期:{{ $methodsTools.onlyForma(timeArrays[0]) }}
+                  商品学习有效期:{{
+                    $methodsTools.onlyForma(
+                      listData.goodsList[0].studyStartTime
+                    )
+                  }}
-                  {{ $methodsTools.onlyForma(timeArrays[1]) }}
+                  {{
+                    $methodsTools.onlyForma(listData.goodsList[0].studyEndTime)
+                  }}
                 </div>
                 <i
                   style="margin-left: 10px; font-size: 20px; color: #e6a23c"
@@ -291,6 +305,8 @@ import { mapGetters } from "vuex";
 export default {
   data() {
     return {
+      classStartStatus: false,
+      classEndStatus: false,
       minNums: 0,
       listData: {
         goodsList: [{}],
@@ -342,6 +358,7 @@ export default {
       teacherList: [],
       statusShow: 0, //0隐藏1出现
       timeArrays: [], //限制班级有效期时间
+      disabledFunc: false,
     };
   },
   computed: { ...mapGetters(["courseExamine", "areas"]) },
@@ -351,20 +368,34 @@ export default {
     this.search();
   },
   methods: {
-    changeDataTimeStudy(arr) {
-      if (arr) {
-        if (
-          this.timeArrays &&
-          (parseInt(arr[0] / 1000) < this.timeArrays[0] ||
-            parseInt(arr[1] / 1000) > this.timeArrays[1])
-        ) {
-          this.$message.warning("超出商品学习有效期,请重新选择");
-          this.listData.timeList = [];
-        }
-        if (arr[0] === arr[1]) {
-          this.$message.warning("开始时间与结束时间不允许相同");
-          this.listData.timeList = [];
-        }
+    changeTimeList1(arr) {
+      if (!arr) {
+        return;
+      }
+      if (arr < this.timeArrays[0] || arr >= this.timeArrays[1]) {
+        this.$message.warning("超出商品学习有效期,请重新选择");
+        this.listData.classStartTime = "";
+      } else if (
+        this.listData.classEndTime &&
+        arr > this.listData.classEndTime
+      ) {
+        this.$message.warning("开始时间不能大于等于结束时间,请重新选择");
+        this.listData.classStartTime = "";
+      }
+    },
+    changeTimeList2(arr) {
+      if (!arr) {
+        return;
+      }
+      if (arr < this.timeArrays[0] || arr > this.timeArrays[1]) {
+        this.$message.warning("超出商品学习有效期,请重新选择");
+        this.listData.classEndTime = "";
+      } else if (
+        this.listData.classStartTime &&
+        arr <= this.listData.classStartTime
+      ) {
+        this.$message.warning("结束时间不能小于等于开始时间,请重新选择");
+        this.listData.classEndTime = "";
       }
     },
     //   初始获取数据
@@ -382,18 +413,35 @@ export default {
           );
         }
         if (res.data.classStartTime && res.data.classEndTime) {
-          res.data.timeList = [
-            this.$methodsTools.time10to13(res.data.classStartTime, 2),
-            this.$methodsTools.time10to13(res.data.classEndTime, 2),
-          ];
+          res.data.classStartTime = this.$methodsTools.time10to13(
+            res.data.classStartTime,
+            2
+          );
+          res.data.classEndTime = this.$methodsTools.time10to13(
+            res.data.classEndTime,
+            2
+          );
+          // classStartStatus
+          if (new Date().getTime() > res.data.classEndTime) {
+            this.classStartStatus = true;
+            this.classEndStatus = true;
+          } else {
+            this.classStartStatus = true;
+          }
         }
         if (
           res.data.goodsList[0].studyStartTime &&
           res.data.goodsList[0].studyEndTime
         ) {
           this.timeArrays = [
-            res.data.goodsList[0].studyStartTime,
-            res.data.goodsList[0].studyEndTime,
+            this.$methodsTools.time10to13(
+              res.data.goodsList[0].studyStartTime,
+              2
+            ),
+            this.$methodsTools.time10to13(
+              res.data.goodsList[0].studyEndTime,
+              2
+            ),
           ];
         }
         this.minNums = res.data.studentNum;
@@ -409,7 +457,6 @@ export default {
         this.statusShow = res.data;
       });
       this.$api.obtainUserList({ status: 1 }).then((res) => {
-        console.log(res.rows);
         this.teacherList = res.rows;
       });
     },
@@ -470,9 +517,17 @@ export default {
     //提交
     submit() {
       var data = JSON.parse(JSON.stringify(this.listData));
-      if (data.timeList && data.timeList.length) {
-        data.classStartTime = this.listData.timeList[0] / 1000;
-        data.classEndTime = this.listData.timeList[1] / 1000;
+      if (!data.classStartTime && !data.classEndTime) {
+        data.classStartTime = null;
+        data.classEndTime = null;
+      } else {
+        if (data.classStartTime && data.classEndTime) {
+          data.classStartTime = data.classStartTime / 1000;
+          data.classEndTime = data.classEndTime / 1000;
+        } else {
+          this.$message.warning("请选择班级有效期的开始时间与结束时间");
+          return;
+        }
       }
       if (data.learningStatus === 3) {
         data.learningTimeStart = this.listData.learningTimeStart / 1000;

+ 387 - 0
src/views/education/classManageMent/learningHoursRecordList/index.vue

@@ -0,0 +1,387 @@
+<template>
+  <div id="learningHoursRecordList">
+    <search-box-new
+      ref="searchBox"
+      :formData="formData"
+      :formList="formList"
+      @search="search"
+      @init="init"
+    />
+    <table-list
+      :tableSets="tableSet"
+      :tableData="tableData"
+      :navText="navText"
+      :loading="loading"
+    >
+      <template slot="btn" slot-scope="props">
+        <el-button type="text">学习记录</el-button>
+        <el-button type="text">学时记录</el-button>
+      </template>
+    </table-list>
+    <pagination
+      :total="total"
+      :pageSize="formData.pageSize"
+      :currentPage="formData.pageNum"
+      @handleSizeChange="handleSizeChange"
+      @handleCurrentChange="handleCurrentChange"
+    />
+  </div>
+</template>
+
+<script>
+import searchBoxNew from "@/components/searchBoxNew";
+import tableList from "@/components/tableList";
+import pagination from "@/components/pagination";
+export default {
+  name: "learningHoursRecordList",
+  components: { searchBoxNew, tableList, pagination },
+  data() {
+    return {
+      loading: false, //当前表单加载是否加载动画
+      navText: {
+        title: "学习学时记录列表",
+        index: 0,
+        ch: "条",
+        num: false,
+        border: true,
+        choice: true,
+        addHide: true,
+        backFatherBtn: {
+          status: false,
+          title: "未定义",
+        },
+      },
+      //搜索
+      formList: [
+        {
+          prop: "educationTypeId",
+          placeholder: "教育类型",
+          scope: "educationType",
+        },
+        {
+          prop: "businessId",
+          placeholder: "业务层次",
+          scope: "businessLevel",
+          edu: "educationTypeId",
+        },
+        {
+          prop: "schoolId",
+          placeholder: "院校",
+          scope: "schoolList",
+          edu: "educationTypeId",
+        },
+        {
+          prop: "majorId",
+          placeholder: "专业",
+          scope: "Professional",
+          edu: "educationTypeId",
+        },
+        {
+          prop: "status",
+          placeholder: "学习状态",
+          scope: "select",
+          options: [
+            {
+              label: "全部",
+              value: 1,
+            },
+            {
+              label: "完成学习",
+              value: 2,
+            },
+            {
+              label: "未完成学习",
+              value: 0,
+            },
+          ],
+        },
+        {
+          prop: "status1",
+          placeholder: "请选择学时官方推送状态",
+          scope: "select",
+          noClear:false,
+          options: [
+            {
+              label: "学时官方推送状态",
+              value: '',
+              disable: true
+            },
+            {
+              label: "是",
+              value: 1,
+            },
+            {
+              label: "否",
+              value: 2,
+            },
+          ],
+        },
+        {
+          prop1: "validityStartTime",
+          prop2: "validityEndTime",
+          placeholder1: "班级有效期开始时间",
+          placeholder2: "班级有效期结束时间",
+          scope: "moreDataPicker",
+        },
+        {
+          prop: "goodsName",
+          placeholder: "请输入关键内容",
+        },
+      ],
+      formData: {
+        goodsType: "",
+        status: "0,1",
+        pageSize: 10,
+        pageNum: 1,
+      },
+      // 表单
+      tableSet: [
+        {
+          label: "商品名称",
+          prop: "goodsName",
+          scope: "editInfo",
+          hidden: true,
+        },
+        {
+          label: "商品编码",
+          prop: "code",
+          hidden: true,
+        },
+        {
+          label: "专业",
+          prop: "categoryName",
+          hidden: true,
+        },
+        {
+          label: "院校",
+          prop: "schoolName",
+          hidden: true,
+        },
+        {
+          label: "业务层次",
+          prop1: "projectName",
+          prop2: "businessName",
+          hidden: true,
+          width: "220px",
+          scope: "InfoMore",
+        },
+        {
+          label: "教育类型",
+          prop: "educationName",
+          hidden: true,
+        },
+        {
+          label: "学时",
+          prop: "classHours",
+          hidden: true,
+        },
+        {
+          label: "商品内容视图",
+          hidden: true,
+          scope: "treeWatch",
+        },
+        {
+          label: "商品价格",
+          prop: "standPrice",
+          hidden: true,
+          scope: "leftCh",
+          ch: "¥",
+        },
+        {
+          label: "商品状态",
+          prop: "status",
+          hidden: true,
+          scope: "hasTime",
+        },
+        {
+          label: "商品有效期",
+          prop1: "validityStartTime",
+          prop2: "validityEndTime",
+          scope: "TimeLists",
+          width: "220px",
+          Diszing: false,
+          hidden: true,
+        },
+        {
+          label: "学习有效期",
+          prop1: "studyStartTime",
+          prop2: "studyEndTime",
+          scope: "TimeLists",
+          width: "220px",
+          Diszing: false,
+          hidden: true,
+        },
+        {
+          label: "供应方(服务)",
+          prop: "supplyName",
+          hidden: true,
+        },
+        {
+          label: "最后编辑时间",
+          prop: "updateTime",
+          hidden: true,
+          scope: "aTimeList",
+        },
+        {
+          label: "创建时间",
+          prop: "createTime",
+          hidden: true,
+          scope: "aTimeList",
+        },
+        {
+          label: "可售状态",
+          prop: "goodsStatus",
+          hidden: true,
+          scope: "status",
+        },
+      ],
+      tableData: [], //表单数据
+      total: 0, //一共多少条
+    };
+  },
+  mounted() {
+    this.search();
+  },
+  activated() {
+    this.search();
+  },
+  methods: {
+    search(int) {
+      this.loading = true;
+      if (int === 1) {
+        this.formData.pageNum = 1;
+      }
+      if (int === 2) {
+        this.formData = {
+          goodsType: "",
+          status: "0,1",
+          pageSize: 10,
+          pageNum: 1,
+        };
+      }
+      if (int === 3) {
+        this.formData.pageNum = 1;
+      }
+      var data = JSON.parse(JSON.stringify(this.formData));
+      if (this.formData.validityStartTime) {
+        data.validityStartTime = data.validityStartTime / 1000;
+      }
+      if (this.formData.validityEndTime) {
+        data.validityEndTime = data.validityEndTime / 1000;
+      }
+      //   this.$api.inquireGoods(data).then((res) => {
+      //     this.tableData = res.rows;
+      //     this.total = res.total;
+      //     this.navText.index = res.total;
+      //   }).finally(()=>{
+      this.loading = false;
+      //   })
+    },
+    init() {
+      this.search(2);
+    },
+    handleSizeChange(v) {
+      this.formData.pageSize = v;
+      this.formData.pageNum = 1;
+      this.search();
+    },
+    handleCurrentChange(v) {
+      this.formData.pageNum = v;
+      this.search();
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+/deep/.el-button {
+  border-radius: 8px;
+}
+/deep/.el-dialog {
+  border-radius: 8px;
+  .el-dialog__header {
+    padding: 0;
+    .hearders {
+      height: 40px;
+      display: flex;
+      align-items: center;
+      justify-content: space-between;
+      padding: 0px 18px 0px 20px;
+      border-bottom: 1px solid #e2e2e2;
+      .leftTitle {
+        font-size: 14px;
+        font-weight: bold;
+        color: #2f4378;
+      }
+      .rightBoxs {
+        display: flex;
+        align-items: center;
+        img {
+          width: 14px;
+          height: 14px;
+          margin-left: 13px;
+          cursor: pointer;
+        }
+      }
+    }
+  }
+  .el-dialog__footer {
+    padding: 0;
+    .dialog-footer {
+      padding: 0px 40px;
+      height: 70px;
+      border-top: 1px solid #e2e2e2;
+      display: flex;
+      align-items: center;
+      justify-content: flex-end;
+    }
+  }
+}
+.imgBox {
+  width: 100%;
+  // height: 210px;
+  border: 1px solid #e2e2e2;
+  border-radius: 8px;
+  padding: 8px 8px 3px;
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  .imgLabel {
+    flex: 1;
+    width: 100%;
+    border: 1px dotted #e2e2e2;
+    color: #999;
+    font-size: 14px;
+    cursor: pointer;
+    border-radius: 8px;
+    .msPhoto {
+      display: flex;
+      justify-content: center;
+      align-items: center;
+      max-width: 100%;
+      max-height: 270px;
+      img {
+        max-width: 100%;
+        max-height: 270px;
+      }
+    }
+    .imgbbx {
+      display: flex;
+      flex-direction: column;
+      align-items: center;
+      justify-content: center;
+      width: 100%;
+      height: 100%;
+      i {
+        font-weight: bold;
+        margin: 14px 0;
+        font-size: 24px;
+      }
+    }
+  }
+  p {
+    margin: 5px 0px;
+  }
+}
+</style>
+

+ 368 - 0
src/views/education/classManageMent/listOfhoursToBeReviewed/index.vue

@@ -0,0 +1,368 @@
+<template>
+  <div id="listOfhoursToBeReviewed">
+    <search-box-new
+      ref="searchBox"
+      :formData="formData"
+      :formList="formList"
+      @search="search"
+      @init="init"
+    />
+    <table-list
+      :tableSets="tableSet"
+      :tableData="tableData"
+      :navText="navText"
+      :loading="loading"
+    >
+      <template slot="btn" slot-scope="props">
+        <el-button type="text">学时审核</el-button>
+      </template>
+    </table-list>
+    <pagination
+      :total="total"
+      :pageSize="formData.pageSize"
+      :currentPage="formData.pageNum"
+      @handleSizeChange="handleSizeChange"
+      @handleCurrentChange="handleCurrentChange"
+    />
+  </div>
+</template>
+
+<script>
+import searchBoxNew from "@/components/searchBoxNew";
+import tableList from "@/components/tableList";
+import pagination from "@/components/pagination";
+export default {
+  name: "ListOfhoursToBeReviewed",
+  components: { searchBoxNew, tableList, pagination },
+  data() {
+    return {
+      loading: false, //当前表单加载是否加载动画
+      navText: {
+        title: "学时待审核列表",
+        index: 0,
+        ch: "条",
+        num: false,
+        border: true,
+        choice: true,
+        addHide: true,
+        backFatherBtn: {
+          status: false,
+          title: "未定义",
+        },
+      },
+      //搜索
+      formList: [
+        {
+          prop: "educationTypeId",
+          placeholder: "教育类型",
+          scope: "educationType",
+        },
+        {
+          prop: "businessId",
+          placeholder: "业务层次",
+          scope: "businessLevel",
+          edu: "educationTypeId",
+        },
+        {
+          prop: "schoolId",
+          placeholder: "院校",
+          scope: "schoolList",
+          edu: "educationTypeId",
+        },
+        {
+          prop: "majorId",
+          placeholder: "专业",
+          scope: "Professional",
+          edu: "educationTypeId",
+        },
+        {
+          prop: "status",
+          placeholder: "填写资料审核状态",
+          scope: "select",
+          options: [
+            {
+              label: "待审核",
+              value: 1,
+            },
+            {
+              label: "审核通过",
+              value: 2,
+            },
+            {
+              label: "审核不通过",
+              value: 0,
+            },
+          ],
+        },
+        {
+          prop1: "validityStartTime",
+          prop2: "validityEndTime",
+          placeholder1: "班级有效期开始时间",
+          placeholder2: "班级有效期结束时间",
+          scope: "moreDataPicker",
+        },
+        {
+          prop: "goodsName",
+          placeholder: "请输入关键内容",
+        },
+      ],
+      formData: {
+        periodStatus:2,
+        status: "0,1",
+        pageSize: 10,
+        pageNum: 1,
+      },
+      // 表单
+      tableSet: [
+        {
+          label: "商品名称",
+          prop: "goodsName",
+          scope: "editInfo",
+          hidden: true,
+        },
+        {
+          label: "商品编码",
+          prop: "code",
+          hidden: true,
+        },
+        {
+          label: "专业",
+          prop: "categoryName",
+          hidden: true,
+        },
+        {
+          label: "院校",
+          prop: "schoolName",
+          hidden: true,
+        },
+        {
+          label: "业务层次",
+          prop1: "projectName",
+          prop2: "businessName",
+          hidden: true,
+          width: "220px",
+          scope: "InfoMore",
+        },
+        {
+          label: "教育类型",
+          prop: "educationName",
+          hidden: true,
+        },
+        {
+          label: "学时",
+          prop: "classHours",
+          hidden: true,
+        },
+        {
+          label: "商品内容视图",
+          hidden: true,
+          scope: "treeWatch",
+        },
+        {
+          label: "商品价格",
+          prop: "standPrice",
+          hidden: true,
+          scope: "leftCh",
+          ch: "¥",
+        },
+        {
+          label: "商品状态",
+          prop: "status",
+          hidden: true,
+          scope: "hasTime",
+        },
+        {
+          label: "商品有效期",
+          prop1: "validityStartTime",
+          prop2: "validityEndTime",
+          scope: "TimeLists",
+          width: "220px",
+          Diszing: false,
+          hidden: true,
+        },
+        {
+          label: "学习有效期",
+          prop1: "studyStartTime",
+          prop2: "studyEndTime",
+          scope: "TimeLists",
+          width: "220px",
+          Diszing: false,
+          hidden: true,
+        },
+        {
+          label: "供应方(服务)",
+          prop: "supplyName",
+          hidden: true,
+        },
+        {
+          label: "最后编辑时间",
+          prop: "updateTime",
+          hidden: true,
+          scope: "aTimeList",
+        },
+        {
+          label: "创建时间",
+          prop: "createTime",
+          hidden: true,
+          scope: "aTimeList",
+        },
+        {
+          label: "可售状态",
+          prop: "goodsStatus",
+          hidden: true,
+          scope: "status",
+        },
+      ],
+      tableData: [], //表单数据
+      total: 0, //一共多少条
+    };
+  },
+  mounted() {
+    this.search();
+  },
+  activated() {
+    this.search();
+  },
+  methods: {
+    search(int) {
+      this.loading = true;
+      if (int === 1) {
+        this.formData.pageNum = 1;
+      }
+      if (int === 2) {
+        this.formData = {
+          periodStatus:2,
+          status: "0,1",
+          pageSize: 10,
+          pageNum: 1,
+        };
+      }
+      if (int === 3) {
+        this.formData.pageNum = 1;
+      }
+      var data = JSON.parse(JSON.stringify(this.formData));
+      if (this.formData.validityStartTime) {
+        data.validityStartTime = data.validityStartTime / 1000;
+      }
+      if (this.formData.validityEndTime) {
+        data.validityEndTime = data.validityEndTime / 1000;
+      }
+      this.$api
+        .inquireGradegradelistUserPeriod(data)
+        .then((res) => {
+          this.tableData = res.rows;
+          this.total = res.total;
+          this.navText.index = res.total;
+        })
+        .finally(() => {
+          this.loading = false;
+        });
+    },
+    init() {
+      this.search(2);
+    },
+    handleSizeChange(v) {
+      this.formData.pageSize = v;
+      this.formData.pageNum = 1;
+      this.search();
+    },
+    handleCurrentChange(v) {
+      this.formData.pageNum = v;
+      this.search();
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+/deep/.el-button {
+  border-radius: 8px;
+}
+/deep/.el-dialog {
+  border-radius: 8px;
+  .el-dialog__header {
+    padding: 0;
+    .hearders {
+      height: 40px;
+      display: flex;
+      align-items: center;
+      justify-content: space-between;
+      padding: 0px 18px 0px 20px;
+      border-bottom: 1px solid #e2e2e2;
+      .leftTitle {
+        font-size: 14px;
+        font-weight: bold;
+        color: #2f4378;
+      }
+      .rightBoxs {
+        display: flex;
+        align-items: center;
+        img {
+          width: 14px;
+          height: 14px;
+          margin-left: 13px;
+          cursor: pointer;
+        }
+      }
+    }
+  }
+  .el-dialog__footer {
+    padding: 0;
+    .dialog-footer {
+      padding: 0px 40px;
+      height: 70px;
+      border-top: 1px solid #e2e2e2;
+      display: flex;
+      align-items: center;
+      justify-content: flex-end;
+    }
+  }
+}
+.imgBox {
+  width: 100%;
+  // height: 210px;
+  border: 1px solid #e2e2e2;
+  border-radius: 8px;
+  padding: 8px 8px 3px;
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  .imgLabel {
+    flex: 1;
+    width: 100%;
+    border: 1px dotted #e2e2e2;
+    color: #999;
+    font-size: 14px;
+    cursor: pointer;
+    border-radius: 8px;
+    .msPhoto {
+      display: flex;
+      justify-content: center;
+      align-items: center;
+      max-width: 100%;
+      max-height: 270px;
+      img {
+        max-width: 100%;
+        max-height: 270px;
+      }
+    }
+    .imgbbx {
+      display: flex;
+      flex-direction: column;
+      align-items: center;
+      justify-content: center;
+      width: 100%;
+      height: 100%;
+      i {
+        font-weight: bold;
+        margin: 14px 0;
+        font-size: 24px;
+      }
+    }
+  }
+  p {
+    margin: 5px 0px;
+  }
+}
+</style>
+

+ 49 - 28
src/views/education/classManageMent/studentMenu/index.vue

@@ -58,7 +58,7 @@
         >
         <el-select
           @change="search(3)"
-          v-model="formData.choice"
+          v-model="formData.studyCountMore"
           placeholder="请选择"
           style="margin: 0px 10px"
           size="medium"
@@ -72,7 +72,7 @@
           </el-option>
         </el-select>
         <el-button
-          v-if="formData.choice === 1"
+          v-if="formData.studyCountMore === 2"
           :size="size"
           type="primary"
           @click="moreActive(2)"
@@ -485,15 +485,19 @@ export default {
       options: [
         {
           label: "全部",
-          value: 0,
+          value: "",
         },
         {
-          label: "无选班再次学习的学员",
+          label: "剩余学习机会>0,商品下最后一次所在班级",
+          value: 2,
+        },
+        {
+          label: "剩余学习机会>0,非商品下最后一次所在班级",
           value: 1,
         },
         {
-          label: "有选班再次学习的学员",
-          value: 2,
+          label: "剩余学习机会=0",
+          value: 0,
         },
       ],
       statusShow: [], //1无官方接口按钮 2只有官方推送 3都有
@@ -516,7 +520,7 @@ export default {
         },
       },
       formData: {
-        choice: 0,
+        studyCountMore: "",
         gradeId: this.$route.query.id,
         status: "0,1",
         pageSize: 10,
@@ -588,7 +592,7 @@ export default {
           label: "学时审批状态",
           prop: "periodStatus",
           hidden: true,
-          scope: "statusPeriod",
+          scope: "statusPeriods",
           width: "130px",
         },
         {
@@ -615,6 +619,18 @@ export default {
           hidden: true,
           scope: "finishStatus",
         },
+        {
+          label: "剩余学习机会",
+          prop: "studyCount",
+          hidden: true,
+        },
+        {
+          label: "复购-学时冲突",
+          width: "120px",
+          prop: "rebuy",
+          hidden: true,
+          scope: "rebuy",
+        },
       ],
       listData: {},
       tableData: [], //表单数据
@@ -702,13 +718,15 @@ export default {
     submitTable() {
       var lets = [];
       this.$refs.tableList.allCheckData.forEach((item) => {
-        lets.push(item.userId);
+        lets.push({
+          oldGradeId: this.$route.query.id,
+          goodsId: item.goodsId,
+          gradeId: this.templateRadio,
+          orderGoodsId: item.orderGoodsId,
+          userId: item.userId,
+        });
       });
-      let data = {
-        gradeId: this.templateRadio,
-        userId: lets,
-      };
-      this.$api.editGradeUserGrade(data).then((res) => {
+      this.$api.gradegradechangeGrade({ userList: lets }).then((res) => {
         this.$message.success("选班成功");
         this.search();
         this.dialogVisibleTable = false;
@@ -755,25 +773,28 @@ export default {
         this.dialogVisible = true;
       }
       if (int === 2) {
-        // var newTime = Date.parse(new Date()) / 1000;
-        // var itemsq = JSON.parse(
-        //   JSON.stringify(this.$refs.tableList.allCheckData)
-        // );
-        // var ast = itemsq.every((items) => {
-        //   return items.periodStatus !== 1 && items.classEndTime >= newTime;
-        // });
-        // if (!ast) {
-        //   this.$message.warning(
-        //     "选择的学员中存在学时审批状态已通过或班级有效期过期"
-        //   );
-        //   return;
-        // }
+        var newTime = Date.parse(new Date()) / 1000;
+        var itemsq = JSON.parse(
+          JSON.stringify(this.$refs.tableList.allCheckData)
+        );
+        var ast = itemsq.every((items) => {
+          console.log(items);
+          return items.periodStatus !== 1 && items.classEndTime
+            ? items.classEndTime < newTime
+            : false;
+        });
+        if (!ast) {
+          this.$message.warning(
+            "选择的学员中存在学时审批状态已通过或班级有效期未过期"
+          );
+          return;
+        }
         this.$api.obtainGoods(this.$route.query.goodsId).then((res) => {
           this.obtainGoods = res.data;
           this.$api.inquireGradegradeList(this.formDataClass).then((res) => {
             if (!res.rows.length) {
               this.$message.warning(
-                "暂无匹配班级,请先确保“有未满学员的有效班级”,再选班!"
+                "暂无匹配班级,请先确保“有【班级有效期未过期】【未满学员的有效班级”,再选班!"
               );
               return;
             }

+ 33 - 9
src/views/education/dataReview/dataConfig/index.vue

@@ -316,17 +316,21 @@
         <div class="swq">
           <img
             style="width: 182px; height: 168px"
-            src="@/assets/images/dr.png"
+            src="@/assets/images/dc.png"
             alt=""
           />
         </div>
         <div style="padding: 40px">
           <el-row>
-            <el-col :span="12"><div style="text-align:end;padding-right:14px;">填写资料审核状态: </div></el-col>
+            <el-col :span="12"
+              ><div style="text-align: end; padding-right: 14px">
+                填写资料审核状态:
+              </div></el-col
+            >
             <el-col :span="12">
               <el-radio-group v-model="activeDCIndex">
                 <el-radio
-                style="display:block;margin-bottom:16px;"
+                  style="display: block; margin-bottom: 16px"
                   v-for="(items, indexs) in DCLIST"
                   :key="indexs"
                   :label="items.value"
@@ -339,13 +343,14 @@
       </div>
       <span slot="footer" class="dialog-footer">
         <el-button @click="dialogDR = false">取消</el-button>
-        <el-button type="primary">确定</el-button>
+        <el-button type="primary" @click="exputs">确定</el-button>
       </span>
     </el-dialog>
   </div>
 </template>
 
 <script>
+import * as baseUrls from "@/utils/request.js";
 import searchBoxNew from "@/components/searchBoxNew";
 import tableList from "@/components/tableList";
 import pagination from "@/components/pagination";
@@ -538,12 +543,12 @@ export default {
       listInfos: [],
       recordList: [{ keyValueArrays: [] }], //记录列表
       activeIndex: 0,
-      activeDCIndex: 1, //导出按钮索引
+      activeDCIndex:0, //导出按钮索引
       DCLIST: [
-        { label: "全部", value: 1 },
+        { label: "全部", value: 0 },
         { label: "待审核", value: 2 },
-        { label: "审核通过", value: 3 },
-        { label: "审核不通过", value: 4 },
+        { label: "审核通过", value: 1 },
+        { label: "审核不通过", value: 3 },
       ], //导出按钮列表
     };
   },
@@ -554,8 +559,27 @@ export default {
     this.search();
   },
   methods: {
+    exputs() {
+      this.$api
+        .inquirebaseprofileExport({ status: this.activeDCIndex })
+        .then((res) => {
+          if (res.code === 200) {
+            let url = baseUrls.baseURL + "common/download?fileName=" + res.msg;
+            let link = document.createElement("a");
+            let fileName = "导出数据" + ".xlsx";
+            document.body.appendChild(link);
+            link.dowmload = fileName;
+            link.href = url;
+            console.log(link)
+              link.click();
+              link.remove();
+              this.$message.success("批量导出成功");
+              this.dialogDR = false;
+          }
+        });
+    },
     moreActive() {
-      this.activeDCIndex = 1;
+      this.activeDCIndex = 0;
       this.dialogDR = true;
     },
     changeIndex(v) {

+ 64 - 61
src/views/education/dataReview/informationTemplate/index.vue

@@ -40,7 +40,7 @@
           <img src="@/assets/images/Close@2x.png" alt="" @click="close" />
         </div>
       </div>
-      <div style="overflow-y:auto;max-height:600px;">
+      <div style="overflow-y: auto; max-height: 600px">
         <p class="p_infos">模板基本信息</p>
         <el-form
           label-position="right"
@@ -131,7 +131,7 @@
                 </el-popover>
                 <span style="margin-left: 10px">注:可多选</span>
               </div>
-              <div v-else-if="items.scope === 'select'">
+              <!-- <div v-else-if="items.scope === 'select'">
                 <el-select
                   v-model="listData[items.prop]"
                   multiple
@@ -146,7 +146,7 @@
                   </el-option>
                 </el-select>
                 <span style="margin-left: 10px">注:可多选</span>
-              </div>
+              </div> -->
               <div v-else>
                 <el-input v-model="listData[items.prop]"></el-input>
                 <div v-if="items.ch">{{ items.ch }}</div>
@@ -582,9 +582,10 @@
               ></i></i
             ><span>{{ item.fieldName }}</span>
           </div>
+          <!-- @click="item.disable == true ? '' : changeStatus2s(item, index)" (旧)下面按钮事件 -->
           <div
             class="disChild"
-            @click="item.disable == true ? '' : changeStatus2s(item, index)"
+            @click="titleFunc"
           >
             <i class="radiosty" :class="item.disable === true ? 'disable' : ''"
               ><div :class="item.required ? 'activeRadio' : ''"></div></i
@@ -692,13 +693,6 @@
         @handleSizeChange="handleSizeChange5"
         @handleCurrentChange="handleCurrentChange5"
       />
-      <!-- <pagination
-        :total="totalAss"
-        :pageSize="pageSize"
-        :currentPage="currentPage"
-        @handleSizeChange="handleSizeChangeAss"
-        @handleCurrentChange="handleCurrentChangeAss"
-      /> -->
       <span slot="footer" class="dialog-footer">
         <el-button @click="dialogVisibleAss = false">取 消</el-button>
         <el-button
@@ -782,21 +776,13 @@
           </template>
         </el-table-column>
       </el-table>
-      <!-- <el-pagination
-        @size-change="handleSizeChangea"
-        @current-change="handleCurrentChangea"
-        :page-size="10"
-        layout="total,prev, pager, next, jumper"
-        :total="boxtableDataIsActive.length"
-      >
-      </el-pagination> -->
       <pagination
-      :total="totala"
-      :pageSize="formDataa.pageSize"
-      :currentPage="formDataa.pageNum"
-      @handleSizeChange="handleSizeChangea"
-      @handleCurrentChange="handleCurrentChangea"
-    />
+        :total="totala"
+        :pageSize="formDataa.pageSize"
+        :currentPage="formDataa.pageNum"
+        @handleSizeChange="handleSizeChangea"
+        @handleCurrentChange="handleCurrentChangea"
+      />
       <span slot="footer" class="dialog-footer">
         <el-button @click="dialogVisibleisActive = false">取 消</el-button>
       </span>
@@ -842,22 +828,21 @@ export default {
           prop: "name",
           hidden: true,
           scope: "editInfo",
-          width: "120px",
+          width: "240px",
         },
         {
           label: "适用业务层级",
           prop: "businessList",
           hidden: true,
           scope: "mapTypesBUS",
-          width: "240px",
-        },
-        {
-          label: "资料审核人",
-          prop: "userList",
-          hidden: true,
-          scope: "teachers",
-          width: "180px",
         },
+        // {
+        //   label: "资料审核人",
+        //   prop: "userList",
+        //   hidden: true,
+        //   scope: "teachers",
+        //   width: "180px",
+        // },
         {
           label: "关联商品",
           prop: "goodsIds",
@@ -869,6 +854,7 @@ export default {
           label: "状态",
           prop: "status",
           hidden: true,
+          width: "100px",
           scope: "status",
         },
       ],
@@ -930,11 +916,11 @@ export default {
           label: "模板标题",
           prop: "name",
         },
-        {
-          label: "指派审核人",
-          prop: "userIds",
-          scope: "select",
-        },
+        // {
+        //   label: "指派审核人",
+        //   prop: "userIds",
+        //   scope: "select",
+        // },
         {
           label: "状态",
           prop: "status",
@@ -1066,11 +1052,11 @@ export default {
         status: [{ required: true, message: "请选择状态", trigger: "change" }],
       },
       activeListGoods: [],
-      totala:0,
-      formDataa:{
+      totala: 0,
+      formDataa: {
         pageNum: 1,
         pageSize: 10,
-      }
+      },
     };
   },
   watch: {
@@ -1094,17 +1080,17 @@ export default {
     handleSizeChangea(v) {
       this.formDataa.pageSize = v;
       this.formDataa.pageNum = 1;
-      this.getNewInfos()
+      this.getNewInfos();
     },
     handleCurrentChangea(v) {
       this.formDataa.pageNum = v;
       this.getNewInfos();
     },
-    getNewInfos(){
+    getNewInfos() {
       this.$api.inquireGoods(this.formDataa).then((res) => {
         this.boxtableDataIsActive = res.rows;
-        this.totala = res.total
-        this.search()
+        this.totala = res.total;
+        this.search();
       });
     },
     getDowm() {
@@ -1123,15 +1109,20 @@ export default {
       });
     },
     delIsActive(items) {
-      var dataInt = this.formDataa.goodsIds.split(",").map(Number)
-      var ats = dataInt.filter(item => {
-        return item != items.goodsId
-      })
-       this.$api
+      var dataInt = this.formDataa.goodsIds.split(",").map(Number);
+      var ats = dataInt.filter((item) => {
+        return item != items.goodsId;
+      });
+      this.$api
         .editbaseprofile({ profileTpId: this.id, goodsIds: ats.toString() })
         .then((res) => {
-          this.formDataa.goodsIds = ats.toString()
+          this.formDataa.goodsIds = ats.toString();
           this.$message.success("删除成功");
+          if(!this.formDataa.goodsIds){
+            this.dialogVisibleisActive = false
+            this.search();
+            return
+          }
           this.getNewInfos();
         });
     },
@@ -1153,10 +1144,10 @@ export default {
         this.$message.warning("该资料模板无关联商品");
         return;
       }
-      this.formDataa.pageNum = 1
-      this.formDataa.goodsIds = option.goodsIds
+      this.formDataa.pageNum = 1;
+      this.formDataa.goodsIds = option.goodsIds;
       this.$api.inquireGoods(this.formDataa).then((res) => {
-        this.totala = res.total
+        this.totala = res.total;
         this.boxtableDataIsActive = res.rows;
         this.dialogVisibleisActive = true;
         this.id = option.profileTpId;
@@ -1252,6 +1243,9 @@ export default {
         this.total5 = res.total;
       });
     },
+    titleFunc(){
+      this.$message.warning("该选项默认必填且不允许修改")
+    },
     openYL() {
       this.dialogVisYL = true;
     },
@@ -1266,14 +1260,19 @@ export default {
     changeStatus1(item, index) {
       if (item.checked) {
         item.checked = false;
-        this.pzList1sss.splice(index, 1);
+        var indexs = this.pzList1sss.findIndex(items => {
+          return items.fieldKey === item.fieldKey
+        })
+        this.pzList1sss.splice(indexs, 1);
       } else {
         item.checked = true;
         this.pzList1sss.push(item);
       }
+      this.$nextTick(() => {
+        console.log(this.pzList1sss, 123);
+      });
     },
     changeStatus1s(item, index) {
-      console.log(this.pzList1sss, 123);
       if (item.required) {
         item.required = false;
       } else {
@@ -1401,8 +1400,12 @@ export default {
       }
       this.pzList2sss = JSON.parse(JSON.stringify(this.listData.keyValue2));
       data = data.filter((item) => {
+        if(item.fieldKey === "commitment_seal"){
+          item.required = true
+        }
         return item.fieldKey === "commitment_seal";
       });
+      console.log(data)
       this.pzList2 = data;
       this.dialogVisibleLitsing2 = true;
     },
@@ -1538,9 +1541,9 @@ export default {
         if (this.listData.keyValue2) {
           this.listData.keyValue2 = JSON.parse(this.listData.keyValue2);
         }
-        if (this.listData.userIds) {
-          this.listData.userIds = this.listData.userIds.split(",").map(Number);
-        }
+        // if (this.listData.userIds) {
+        //   this.listData.userIds = this.listData.userIds.split(",").map(Number);
+        // }
         this.eduType = "";
         var array = [];
         v.businessList.map((items, indexs) => {
@@ -1578,7 +1581,7 @@ export default {
       data.businessList = pushRays;
       data.keyValue = JSON.stringify(this.listData.keyValue);
       data.keyValue2 = JSON.stringify(this.listData.keyValue2);
-      data.userIds = this.listData.userIds.toString();
+      // data.userIds = this.listData.userIds.toString();
       if (this.statusPop === 1) {
         this.$api.appbaseprofiletp(data).then((res) => {
           this.$message.success("新增成功");

+ 28 - 10
src/views/education/dataReview/stamp/index.vue

@@ -226,7 +226,7 @@
         <div class="swq">
           <img
             style="width: 182px; height: 168px"
-            src="@/assets/images/dr.png"
+            src="@/assets/images/dc.png"
             alt=""
           />
         </div>
@@ -253,13 +253,14 @@
       </div>
       <span slot="footer" class="dialog-footer">
         <el-button @click="dialogDR = false">取消</el-button>
-        <el-button type="primary">确定</el-button>
+        <el-button type="primary" @click="exputs">确定</el-button>
       </span>
     </el-dialog>
   </div>
 </template>
 
 <script>
+import * as baseUrls from "@/utils/request.js";
 import searchBoxNew from "@/components/searchBoxNew";
 import tableList from "@/components/tableList";
 import pagination from "@/components/pagination";
@@ -451,13 +452,13 @@ export default {
       listInfos: [],
       recordList: [{ keyValueArrays: [] }], //记录列表
       activeIndex: 0,
-      activeDCIndex: 1, //导出按钮索引
+      activeDCIndex: 0, //导出按钮索引
       DCLIST: [
-        { label: "全部", value: 1 },
+        { label: "全部", value: 0 },
         { label: "待审核", value: 2 },
-        { label: "审核通过", value: 3 },
-        { label: "审核不通过", value: 4 }
-        ],//导出按钮列表
+        { label: "审核通过", value: 1 },
+        { label: "审核不通过", value: 3 },
+      ], //导出按钮列表
     };
   },
   mounted() {
@@ -467,8 +468,26 @@ export default {
     this.search();
   },
   methods: {
+    exputs() {
+      this.$api
+        .inquirebaseprofileStampexport({ status: this.activeDCIndex })
+        .then((res) => {
+          if (res.code === 200) {
+            let url = baseUrls.baseURL + "common/download?fileName=" + res.msg;
+            let link = document.createElement("a");
+            let fileName = "导出数据" + ".xlsx";
+            document.body.appendChild(link);
+            link.href = url;
+            link.dowmload = fileName;
+            link.click();
+            link.remove();
+            this.$message.success("批量导出成功");
+            this.dialogDR = false;
+          }
+        });
+    },
     moreActive() {
-      this.activeDCIndex = 1;
+      this.activeDCIndex = 0;
       this.dialogDR = true;
     },
     changeIndex(v) {
@@ -500,9 +519,8 @@ export default {
             }
             item.keyValueArrays = arst;
           });
-
+          this.activeIndex = 0
           this.recordList = res.rows;
-          console.log(res.rows);
           this.dialogVisibleRecord = true;
         });
     },

+ 1 - 29
src/views/education/examManagement/applicationData/asPlanned.vue

@@ -933,38 +933,10 @@ export default {
           pageNum: 1,
         };
       }
-      console.log(this.formData, 123);
       this.$api
         .inquiresystemsubscribelist(this.formData)
         .then((res) => {
-          // for (let k = 0; k < res.rows.length; k++) {
-          //   for (let i = 0; i < res.rows[k].examApplySite.length; i++) {
-          //     for (
-          //       let j = 0;
-          //       j < res.rows[k].examApplySite[i].examApplySiteTime.length;
-          //       j++
-          //     ) {
-          //       res.rows[k].examApplySite[i].examApplySiteTime[j].siteTime =
-          //         JSON.parse(
-          //           res.rows[k].examApplySite[i].examApplySiteTime[j].siteTime
-          //         );
-          //     }
-          //   }
-          //   for (let i = 0; i < res.rows[k].examApplySiteTrain.length; i++) {
-          //     for (
-          //       let j = 0;
-          //       j < res.rows[k].examApplySiteTrain[i].examApplySiteTime.length;
-          //       j++
-          //     ) {
-          //       res.rows[k].examApplySiteTrain[i].examApplySiteTime[
-          //         j
-          //       ].siteTime = JSON.parse(
-          //         res.rows[k].examApplySiteTrain[i].examApplySiteTime[j]
-          //           .siteTime
-          //       );
-          //     }
-          //   }
-          // }
+          this.$refs.tableList.allCheckData = []
           this.tableData = res.rows;
           this.total = res.total;
           this.navText.index = res.total;

+ 0 - 4
src/views/education/examManagement/examArrangement/index.vue

@@ -1586,10 +1586,6 @@ this.$message.warning(
     cursor: pointer;
   }
 }
-.dis_fs {
-  display: flex;
-  align-items: center;
-}
 .jbtw {
   justify-content: space-between;
 }

+ 363 - 0
src/views/education/qaManagement/qaList/ask.vue

@@ -0,0 +1,363 @@
+<template>
+  <div id="ask">
+    <search-box-new
+      ref="searchBox"
+      :formData="formData"
+      :formList="formList"
+      @search="search"
+      @init="init"
+    />
+    <table-list
+      :tableSets="tableSet"
+      :tableData="tableData"
+      :navText="navText"
+      :loading="loading"
+    >
+      <template slot="btn" slot-scope="props">
+        <el-button type="text" @click="reply(props.scope.row)">回复</el-button>
+        <el-button type="text" @click="del(props.scope.row)">删除</el-button>
+      </template>
+    </table-list>
+    <pagination
+      :total="total"
+      :pageSize="formData.pageSize"
+      :currentPage="formData.pageNum"
+      @handleSizeChange="handleSizeChange"
+      @handleCurrentChange="handleCurrentChange"
+    />
+    <el-dialog
+      :visible.sync="dialogVisible"
+      width="610px"
+      :show-close="false"
+      :close-on-click-modal="false"
+    >
+      <div slot="title" class="hearders">
+        <div class="leftTitle">回复</div>
+        <div class="rightBoxs">
+          <img src="@/assets/images/Close@2x.png" alt="" @click="closeBZ" />
+        </div>
+      </div>
+      <div>
+        <el-form
+          label-position="right"
+          label-width="150px"
+          :model="listData"
+          :rules="rules"
+          ref="listData"
+        >
+          <el-form-item label="问题内容">
+            <span>{{ listData.content }}</span>
+          </el-form-item>
+          <el-form-item label="回复内容" prop="answerText">
+            <el-input type="textarea" v-model="listData.answerText"></el-input>
+          </el-form-item>
+        </el-form>
+      </div>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="closeBZ">取 消</el-button>
+        <el-button @click="submitForm('listData')">确 定</el-button>
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import searchBoxNew from "@/components/searchBoxNew";
+import tableList from "@/components/tableList";
+import pagination from "@/components/pagination";
+export default {
+  name: "ask",
+  components: { searchBoxNew, tableList, pagination },
+  data() {
+    return {
+      loading: false, //当前表单加载是否加载动画
+      navText: {
+        title: "提问信息",
+        index: 0,
+        ch: "条",
+        num: false,
+        border: true,
+        choice: true,
+        addHide: true,
+        backFatherBtn: {
+          status: false,
+          title: "未定义",
+        },
+      },
+      //搜索
+      formList: [
+        {
+          prop: "educationTypeId",
+          placeholder: "教育类型",
+          scope: "educationType",
+        },
+        {
+          prop: "businessId",
+          placeholder: "业务层次",
+          scope: "businessLevel",
+          edu: "educationTypeId",
+        },
+        {
+          prop: "goodsName",
+          placeholder: "请输入商品名称",
+        },
+      ],
+      formData: {
+        status: 1,
+        pageSize: 10,
+        msgType: 1,
+        pageNum: 1,
+      },
+      // 表单
+      tableSet: [
+        {
+          label: "教育类型",
+          prop: "educationName",
+          hidden: true,
+        },
+        {
+          label: "业务层次",
+          prop1: "projectName",
+          prop2: "businessName",
+          hidden: true,
+          width: "220px",
+          scope: "InfoMore",
+        },
+        {
+          label: "商品名称",
+          prop: "goodsName",
+          hidden: true,
+        },
+        {
+          label: "提问内容",
+          prop: "answerText",
+          hidden: true,
+        },
+        {
+          label: "提问人",
+          prop: "realname",
+          hidden: true,
+        },
+        {
+          label: "提问时间",
+          prop: "createTime",
+          hidden: true,
+          scope: "aTimeList",
+        },
+      ],
+      tableData: [], //表单数据
+      total: 0, //一共多少条
+      listData: {
+        answerText: "",
+      },
+      rules: {
+        answerText: [
+          { required: true, message: "请输入回复内容", trigger: "blur" },
+        ],
+      },
+      dialogVisible: false,
+    };
+  },
+  activated() {
+    this.search();
+  },
+  methods: {
+    search(int) {
+      this.loading = true;
+      if (int === 1) {
+        this.formData.pageNum = 1;
+      }
+      if (int === 2) {
+        this.formData = {
+          status: 1,
+          pageSize: 10,
+          pageNum: 1,
+          msgType: 1,
+        };
+      }
+      if (int === 3) {
+        this.formData.pageNum = 1;
+      }
+      var data = JSON.parse(JSON.stringify(this.formData));
+      this.$api
+        .inquirecourseanswerlist(data)
+        .then((res) => {
+          this.tableData = res.rows;
+          this.total = res.total;
+          this.navText.index = res.total;
+        })
+        .finally(() => {
+          this.loading = false;
+        });
+    },
+    init() {
+      this.search(2);
+    },
+    del(v) {
+      this.$alert(
+        "确定删除此内容?<br />内容删除后将无法恢复,请慎重考虑",
+        "提示",
+        {
+          dangerouslyUseHTMLString: true,
+        }
+      )
+        .then(() => {
+          var data = {
+            answerId: v.answerId,
+            status: -1,
+          };
+          this.$api.editcourseanswer(data).then((res) => {
+            this.$message.success("删除成功");
+            this.search();
+          });
+        })
+        .catch(() => {
+          this.$message({
+            type: "info",
+            message: "已取消删除",
+          });
+        });
+    },
+    handleSizeChange(v) {
+      this.formData.pageSize = v;
+      this.formData.pageNum = 1;
+      this.search();
+    },
+    handleCurrentChange(v) {
+      this.formData.pageNum = v;
+      this.search();
+    },
+    reply(item) {
+      var data = JSON.parse(JSON.stringify(item));
+      data.content = item.answerText;
+      data.answerText = "";
+      data.assignAnswerId = item.answerId;
+      data.userId = 0;
+      data.assignAvatar = item.avatar;
+      data.assignRealname = item.realname;
+      data.assignUserId = item.userId;
+      delete data.answerId;
+      this.listData = data;
+      this.dialogVisible = true;
+    },
+    closeBZ() {
+      this.$nextTick(() => {
+        this.$refs["listData"].resetFields();
+      });
+      this.dialogVisible = false;
+    },
+    /**
+     * 提交-表单验证
+     */
+    submitForm(formName) {
+      this.$refs[formName].validate((valid) => {
+        if (valid) {
+          this.submit();
+        } else {
+          console.log("error submit!!");
+          return false;
+        }
+      });
+    },
+    submit() {
+      this.$api.addcourseanswer(this.listData).then((res) => {
+        this.$message.success("回复成功");
+        this.search();
+        this.dialogVisible = false;
+      });
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+/deep/.el-button {
+  border-radius: 8px;
+}
+/deep/.el-dialog {
+  border-radius: 8px;
+  .el-dialog__header {
+    padding: 0;
+    .hearders {
+      height: 40px;
+      display: flex;
+      align-items: center;
+      justify-content: space-between;
+      padding: 0px 18px 0px 20px;
+      border-bottom: 1px solid #e2e2e2;
+      .leftTitle {
+        font-size: 14px;
+        font-weight: bold;
+        color: #2f4378;
+      }
+      .rightBoxs {
+        display: flex;
+        align-items: center;
+        img {
+          width: 14px;
+          height: 14px;
+          margin-left: 13px;
+          cursor: pointer;
+        }
+      }
+    }
+  }
+  .el-dialog__footer {
+    padding: 0;
+    .dialog-footer {
+      padding: 0px 40px;
+      height: 70px;
+      border-top: 1px solid #e2e2e2;
+      display: flex;
+      align-items: center;
+      justify-content: flex-end;
+    }
+  }
+}
+.imgBox {
+  width: 100%;
+  // height: 210px;
+  border: 1px solid #e2e2e2;
+  border-radius: 8px;
+  padding: 8px 8px 3px;
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  .imgLabel {
+    flex: 1;
+    width: 100%;
+    border: 1px dotted #e2e2e2;
+    color: #999;
+    font-size: 14px;
+    cursor: pointer;
+    border-radius: 8px;
+    .msPhoto {
+      display: flex;
+      justify-content: center;
+      align-items: center;
+      max-width: 100%;
+      max-height: 270px;
+      img {
+        max-width: 100%;
+        max-height: 270px;
+      }
+    }
+    .imgbbx {
+      display: flex;
+      flex-direction: column;
+      align-items: center;
+      justify-content: center;
+      width: 100%;
+      height: 100%;
+      i {
+        font-weight: bold;
+        margin: 14px 0;
+        font-size: 24px;
+      }
+    }
+  }
+  p {
+    margin: 5px 0px;
+  }
+}
+</style>

+ 39 - 0
src/views/education/qaManagement/qaList/index.vue

@@ -0,0 +1,39 @@
+<template>
+  <div id="qaList">
+    <div style="margin-bottom: 10px">
+      <el-button
+        size="mini"
+        :type="activeIndex === 1 ? 'primary' : ''"
+        @click="activeIndex = 1"
+        >提问</el-button
+      >
+      <el-button
+        size="mini"
+        :type="activeIndex === 2 ? 'primary' : ''"
+        @click="activeIndex = 2"
+        >回复</el-button
+      >
+    </div>
+    <keep-alive include="ask,reply">
+      <ask v-if="activeIndex === 1" />
+      <reply v-if="activeIndex === 2" />
+    </keep-alive>
+  </div>
+</template>
+
+<script>
+import ask from "./ask.vue";
+import reply from "./reply.vue";
+export default {
+  components: { ask, reply },
+  data() {
+    return {
+      activeIndex: 1,
+    };
+  },
+  methods: {},
+};
+</script>
+
+<style lang="less" scoped>
+</style>

+ 298 - 0
src/views/education/qaManagement/qaList/reply.vue

@@ -0,0 +1,298 @@
+<template>
+  <div id="reply">
+    <search-box-new
+      ref="searchBox"
+      :formData="formData"
+      :formList="formList"
+      @search="search"
+      @init="init"
+    />
+    <table-list
+      :tableSets="tableSet"
+      :tableData="tableData"
+      :navText="navText"
+      :loading="loading"
+    >
+      <template slot="btn" slot-scope="props">
+        <el-button type="text" @click="del(props.scope.row)">删除</el-button>
+      </template>
+    </table-list>
+    <pagination
+      :total="total"
+      :pageSize="formData.pageSize"
+      :currentPage="formData.pageNum"
+      @handleSizeChange="handleSizeChange"
+      @handleCurrentChange="handleCurrentChange"
+    />
+  </div>
+</template>
+
+<script>
+import searchBoxNew from "@/components/searchBoxNew";
+import tableList from "@/components/tableList";
+import pagination from "@/components/pagination";
+export default {
+  name: "reply",
+  components: { searchBoxNew, tableList, pagination },
+  data() {
+    return {
+      loading: false, //当前表单加载是否加载动画
+      navText: {
+        title: "回复信息",
+        index: 0,
+        ch: "条",
+        num: false,
+        border: true,
+        choice: true,
+        addHide: true,
+        backFatherBtn: {
+          status: false,
+          title: "未定义",
+        },
+      },
+      //搜索
+      formList: [
+        {
+          prop: "educationTypeId",
+          placeholder: "教育类型",
+          scope: "educationType",
+        },
+        {
+          prop: "businessId",
+          placeholder: "业务层次",
+          scope: "businessLevel",
+          edu: "educationTypeId",
+        },
+        {
+          prop: "goodsName",
+          placeholder: "请输入商品名称",
+        },
+      ],
+      formData: {
+        status: 1,
+          pageSize: 10,
+          pageNum: 1,
+          msgType: 2,
+      },
+      // 表单
+      tableSet: [
+        {
+          label: "教育类型",
+          prop: "educationName",
+          hidden: true,
+        },
+        {
+          label: "业务层次",
+          prop1: "projectName",
+          prop2: "businessName",
+          hidden: true,
+          width: "220px",
+          scope: "InfoMore",
+        },
+        {
+          label: "商品名称",
+          prop: "goodsName",
+          hidden: true,
+        },
+        {
+          label: "提问内容",
+          prop: "answerText",
+          hidden: true,
+        },
+        {
+          label: "提问人",
+          prop: "assignRealname",
+          hidden: true,
+        },
+        {
+          label: "提问时间",
+          prop: "createTime",
+          hidden: true,
+          scope: "aTimeList",
+        },
+        {
+          label: "回复内容",
+          prop: "answerText",
+          hidden: true,
+        },
+        {
+          label: "回复人",
+          prop: "userId",
+          hidden: true,
+          scope:"replyPeople"
+        },
+        {
+          label: "回复时间",
+          prop: "createTime",
+          hidden: true,
+          scope: "aTimeList",
+        },
+      ],
+      tableData: [], //表单数据
+      total: 0, //一共多少条
+    };
+  },
+  activated(){
+    this.search();
+  },
+  methods: {
+    search(int) {
+      this.loading = true;
+      if (int === 1) {
+        this.formData.pageNum = 1;
+      }
+      if (int === 2) {
+        this.formData = {
+          status: 1,
+          pageSize: 10,
+          pageNum: 1,
+          msgType: 2,
+        };
+      }
+      if (int === 3) {
+        this.formData.pageNum = 1;
+      }
+      var data = JSON.parse(JSON.stringify(this.formData));
+      this.$api
+        .inquirecourseanswerlist(data)
+        .then((res) => {
+          this.tableData = res.rows;
+          this.total = res.total;
+          this.navText.index = res.total;
+        })
+        .finally(() => {
+          this.loading = false;
+        });
+    },
+    init() {
+      this.search(2);
+    },
+    del(v) {
+      this.$alert(
+        "确定删除此内容?<br />内容删除后将无法恢复,请慎重考虑",
+        "提示",
+        {
+          dangerouslyUseHTMLString: true,
+        }
+      )
+        .then(() => {
+        //   var data = {
+        //     goodsId: v.goodsId,
+        //     status: -1,
+        //   };
+        //   this.$api.editGoods(data).then((res) => {
+        //     this.$message.success("删除成功");
+        //     this.search();
+        //   });
+        })
+        .catch(() => {
+          this.$message({
+            type: "info",
+            message: "已取消删除",
+          });
+        });
+    },
+    handleSizeChange(v) {
+      this.formData.pageSize = v;
+      this.formData.pageNum = 1;
+      this.search();
+    },
+    handleCurrentChange(v) {
+      this.formData.pageNum = v;
+      this.search();
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+/deep/.el-button {
+  border-radius: 8px;
+}
+/deep/.el-dialog {
+  border-radius: 8px;
+  .el-dialog__header {
+    padding: 0;
+    .hearders {
+      height: 40px;
+      display: flex;
+      align-items: center;
+      justify-content: space-between;
+      padding: 0px 18px 0px 20px;
+      border-bottom: 1px solid #e2e2e2;
+      .leftTitle {
+        font-size: 14px;
+        font-weight: bold;
+        color: #2f4378;
+      }
+      .rightBoxs {
+        display: flex;
+        align-items: center;
+        img {
+          width: 14px;
+          height: 14px;
+          margin-left: 13px;
+          cursor: pointer;
+        }
+      }
+    }
+  }
+  .el-dialog__footer {
+    padding: 0;
+    .dialog-footer {
+      padding: 0px 40px;
+      height: 70px;
+      border-top: 1px solid #e2e2e2;
+      display: flex;
+      align-items: center;
+      justify-content: flex-end;
+    }
+  }
+}
+.imgBox {
+  width: 100%;
+  // height: 210px;
+  border: 1px solid #e2e2e2;
+  border-radius: 8px;
+  padding: 8px 8px 3px;
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  .imgLabel {
+    flex: 1;
+    width: 100%;
+    border: 1px dotted #e2e2e2;
+    color: #999;
+    font-size: 14px;
+    cursor: pointer;
+    border-radius: 8px;
+    .msPhoto {
+      display: flex;
+      justify-content: center;
+      align-items: center;
+      max-width: 100%;
+      max-height: 270px;
+      img {
+        max-width: 100%;
+        max-height: 270px;
+      }
+    }
+    .imgbbx {
+      display: flex;
+      flex-direction: column;
+      align-items: center;
+      justify-content: center;
+      width: 100%;
+      height: 100%;
+      i {
+        font-weight: bold;
+        margin: 14px 0;
+        font-size: 24px;
+      }
+    }
+  }
+  p {
+    margin: 5px 0px;
+  }
+}
+</style>

+ 48 - 32
src/views/education/studentManageMent/studentList/index.vue

@@ -39,7 +39,7 @@ import searchBoxNew from "@/components/searchBoxNew";
 import tableList from "@/components/tableList";
 import pagination from "@/components/pagination";
 export default {
-  name:"StudentList",
+  name: "StudentList",
   components: { searchBoxNew, tableList, pagination },
   data() {
     return {
@@ -49,7 +49,7 @@ export default {
         index: 0,
         ch: "条",
         num: false,
-        border:true,
+        border: true,
         choice: true,
         addHide: true,
         backFatherBtn: {
@@ -63,13 +63,16 @@ export default {
           prop: "gradePoint",
           placeholder: "是否分班",
           scope: "select",
-          options:[{
-            label:"已分班",
-            value:1
-          },{
-            label:"未分班",
-            value:2
-          }]
+          options: [
+            {
+              label: "已分班",
+              value: 1,
+            },
+            {
+              label: "未分班",
+              value: 2,
+            },
+          ],
         },
         {
           prop: "realname",
@@ -80,6 +83,7 @@ export default {
         status: "0,1",
         pageSize: 10,
         pageNum: 1,
+        getOrderNum: 1,
       },
       // 表单
       tableSet: [
@@ -87,7 +91,7 @@ export default {
           label: "学员编码",
           prop: "studentCode",
           hidden: true,
-          width:"130px"
+          width: "130px",
         },
         {
           label: "学员姓名",
@@ -99,34 +103,42 @@ export default {
           label: "学员身份证",
           prop: "idCard",
           hidden: true,
-          width:"190px"
+          width: "190px",
         },
         {
           label: "绑定手机号",
           prop: "telphone",
           hidden: true,
-          width:"130px"
+          width: "130px",
         },
         {
           label: "绑定微信",
           prop: "nickname",
           hidden: true,
-          width:"130px"
+          width: "130px",
         },
         {
           label: "创建时间",
           prop: "createTime",
           hidden: true,
-          scope:"aTimeList",
-          width:"180px"
+          scope: "aTimeList",
+          width: "180px",
+        },
+        {
+          label: "所购商品",
+          prop1: "goodsCourseNum",
+          prop2: "goodsBankNum",
+          hidden: true,
+          scope: "payGoodsList",
+          width: "200px",
         },
         {
           label: "所属班级",
           prop: "classGradeUserGoodsVoList",
           hidden: true,
-          scope:"classNums",
-          sort:true,
-          width:"120px"
+          scope: "classNums",
+          sort: true,
+          width: "120px",
         },
       ],
       tableData: [], //表单数据
@@ -136,8 +148,8 @@ export default {
   mounted() {
     this.search();
   },
-  activated(){
-    this.search()
+  activated() {
+    this.search();
   },
   methods: {
     editInfo(v) {
@@ -153,15 +165,19 @@ export default {
           status: "0,1",
           pageSize: 10,
           pageNum: 1,
+          getOrderNum: 1,
         };
       }
-      this.$api.inquiregradestudentlistStudent(this.formData).then((res) => {
-        this.tableData = res.rows;
-        this.total = res.total;
-        this.navText.index = res.total;
-      }).finally(()=>{
-        this.loading = false;
-      })
+      this.$api
+        .inquiregradestudentlistStudent(this.formData)
+        .then((res) => {
+          this.tableData = res.rows;
+          this.total = res.total;
+          this.navText.index = res.total;
+        })
+        .finally(() => {
+          this.loading = false;
+        });
     },
     init() {
       this.search(2);
@@ -202,11 +218,11 @@ export default {
         if (int === 2) {
           //学员详情
           this.$router.push({
-            path:'studentXQ',
-            query:{
-              id:v.userId
-            }
-          })
+            path: "studentXQ",
+            query: {
+              id: v.userId,
+            },
+          });
         }
         if (int === 3) {
           // 选班

+ 3 - 3
src/views/education/studentManageMent/studentXQ/BankQuestionPassRecord.vue

@@ -200,7 +200,7 @@
               :style="index !== 0 ? 'border-top: 1px solid transparent' : ''"
               @click="getRecodeInfo(item.recordId)"
             >
-              {{ `第${index + 1}次做题记录` }}
+              {{ `第${RemardList.length - index}次做题记录` }}
             </div>
           </el-col>
           <el-col :span="20" v-if="getInfoRecord.recordId">
@@ -507,11 +507,11 @@ export default {
         {
           label: "题卷名称",
           prop: "examName",
-          width: "160px",
         },
         {
           label: "题目",
-          prop: "examName",
+          prop: "totalQuestionNum",
+          width: "200px",
         },
       ],
       tableData: [],

+ 24 - 17
src/views/education/studentManageMent/studentXQ/studyRecord.vue

@@ -1,7 +1,8 @@
 <template>
   <div id="studyRecord">
     <el-table
-    height="700"
+      v-loading="loading"
+      height="700"
       :data="tableData"
       style="width: 100%"
       :header-cell-style="{
@@ -30,26 +31,26 @@
                 :label="item.label"
                 align="center"
               >
-                <template slot-scope="scope">
+                <template slot-scope="scope1">
                   <span v-if="item.scope === 'types'">
                     {{
-                      scope.row[item.prop] === 1
+                      scope1.row[item.prop] === 1
                         ? "开课"
-                        : scope.row[item.prop] === 0
+                        : scope1.row[item.prop] === 0
                         ? "未开课"
                         : "未知"
                     }}
                   </span>
                   <span v-else-if="item.scope === 'sectionType'">
-                    {{ getTypes(scope.row[item.prop]) }}
+                    {{ getTypes(scope1.row[item.prop]) }}
                   </span>
                   <span v-else-if="item.scope === 'studentStatus'">
-                    已观看{{ scope.row[item.prop1] }}节
+                    已观看{{ scope1.row[item.prop1] }}节
                     <span style="color: green">{{
-                      compons(scope.row[item.prop1], scope.row[item.prop2])
+                      compons(scope1.row[item.prop1], scope1.row[item.prop2])
                     }}</span>
                   </span>
-                  <span v-else> {{ scope.row[item.prop] }} </span>
+                  <span v-else> {{ scope1.row[item.prop] }} </span>
                 </template>
               </el-table-column>
             </template>
@@ -59,10 +60,12 @@
               fixed="right"
               width="100px"
             >
-              <template slot-scope="scope">
+              <template slot-scope="scope1s">
                 <el-button
                   type="text"
-                  @click="wantInfo(scope.row, scope.$index)"
+                  @click="
+                    wantInfo(scope1s.row, scope1s.$index, scope.row.goodsId)
+                  "
                   >查看</el-button
                 >
               </template>
@@ -152,9 +155,8 @@
                 </span>
                 <span v-else-if="item.scope === 'computerTimes'">
                   {{
-                    $methodsTools.humandate(
-                      scope.row[item.prop1],
-                      scope.row[item.prop2]
+                    $methodsTools.secondToDate(
+                      scope.row[item.prop]
                     )
                   }}
                 </span>
@@ -300,10 +302,9 @@ export default {
         },
         {
           label: "学习时长",
-          prop1: "startTime",
-          prop2: "endTime",
+          prop: "videoCurrentTime",
           width: "100px",
-          scope: "computerTimes",
+          scope:"computerTimes"
         },
         {
           label: "学习状态",
@@ -313,13 +314,18 @@ export default {
         },
       ], //学习记录表格对应column
       RemardList: [], //学习记录列表
+      loading: false,
     };
   },
   mounted() {
+    this.loading = true;
     this.$api
       .inquiregradestudentlist({ userId: this.$route.query.id })
       .then((res) => {
         this.tableData = res.rows;
+      })
+      .finally(() => {
+        this.loading = false;
       });
   },
   methods: {
@@ -355,11 +361,12 @@ export default {
       this.dialogVisible = false;
     },
     //获取弹出窗内容
-    wantInfo(item, index) {
+    wantInfo(item, index, goodsId) {
       this.$api
         .inquiregradestudentlistSection({
           userId: this.$route.query.id,
           courseId: item.courseId,
+          goodsId: goodsId,
         })
         .then((res) => {
           this.RemardList = res.rows;

+ 5 - 2
src/views/resource/bankManagement/chapterVolumeManagement/add/index.vue

@@ -38,13 +38,12 @@
           <el-popover
             ref="popovers"
             placement="bottom"
-            width="200"
             trigger="click"
             @show="showHandle"
             @hide="hideHandle"
             :disabled="courType ? false : true"
           >
-            <el-radio-group v-model="sujectApis">
+            <el-radio-group v-model="sujectApis" class="dis_flexbox">
               <el-radio
                 v-for="(item, index) in newSujectOption"
                 :label="item.newId"
@@ -652,6 +651,10 @@ export default {
 </script>
 
 <style lang="less" scoped>
+.dis_flexbox{
+  display: flex;
+  flex-direction: column;
+}
 .boxWidth {
   width: 700px;
 }

+ 5 - 2
src/views/resource/bankManagement/chapterVolumeManagement/edit/index.vue

@@ -40,13 +40,12 @@
           <el-popover
             ref="popovers"
             placement="bottom"
-            width="200"
             trigger="click"
             @show="showHandle"
             @hide="hideHandle"
             :disabled="courType ? false : true"
           >
-            <el-radio-group v-model="sujectApis">
+            <el-radio-group v-model="sujectApis" class="dis_flexbox">
               <el-radio
               disabled
                 v-for="(item, index) in newSujectOption"
@@ -659,6 +658,10 @@ export default {
 </script>
 
 <style lang="less" scoped>
+.dis_flexbox{
+  display: flex;
+  flex-direction: column;
+}
 .boxWidth {
   width: 700px;
 }

+ 17 - 10
src/views/resource/bankManagement/testPaperManagement/addPaper/baseAddPaper/index.vue

@@ -42,13 +42,12 @@
           <el-popover
             ref="popovers"
             placement="bottom"
-            width="200"
             trigger="click"
             @show="showHandle"
             @hide="hideHandle"
             :disabled="courType ? false : true"
           >
-            <el-radio-group v-model="sujectApis">
+            <el-radio-group v-model="sujectApis" class="dis_flexbox">
               <el-radio
                 v-for="(item, index) in newSujectOption"
                 :label="item.newId"
@@ -103,7 +102,7 @@
           </el-select>
         </el-form-item>
         <el-form-item label="地域(省)" prop="provinceId">
-          <el-select v-model="listDataIns.provinceId" placeholder="请选择省">
+          <el-select v-model="listDataIns.provinceId" placeholder="请选择省" @change="changeCity">
             <el-option
               v-for="item in areas"
               :key="item.areaId"
@@ -799,6 +798,8 @@ export default {
       data1: {},
       page: 1,
       listDataIns: {
+        provinceId:'',
+        cityId:'',
         publishStatus: 1,
       }, //   弹窗数据
       eduTypeOptions: [], //教育类型数据
@@ -1047,17 +1048,18 @@ export default {
     },
   },
   mounted() {
+    console.log(this.cityList)
     this.getDict();
     this.getFns();
   },
   watch: {
-    "listDataIns.provinceId": {
-      handler(newVal, oldVal) {
-        this.changeCity(newVal);
-      },
-      // 立即处理 进入页面就触发
-      immediate: true,
-    },
+    // "listDataIns.provinceId": {
+    //   handler(newVal, oldVal) {
+    //     this.changeCity(newVal);
+    //   },
+    //   // 立即处理 进入页面就触发
+    //   immediate: true,
+    // },
     djTime: {
       handler(newVal, oldVal) {
         if (newVal === 0) {
@@ -1103,6 +1105,7 @@ export default {
       this.optionsCity = this.cityList.filter((item) => {
         return item.parentId === newVal;
       });
+      this.listDataIns.cityId = ''
     },
     clearImgs() {
       this.listDataIns.coverUrl = "";
@@ -1848,6 +1851,10 @@ export default {
 </script>
 
 <style lang="less" scoped>
+.dis_flexbox{
+  display: flex;
+  flex-direction: column;
+}
 .boxWidth {
   width: 700px;
 }

+ 21 - 0
src/views/resource/bankManagement/testPaperManagement/addPaper/topicAddPaper/index.vue

@@ -1455,6 +1455,10 @@ export default {
     },
     async submitTableAllInfos() {
       var self = this;
+      if (Number(this.passScore) > Number(this.getAllpocis)) {
+        this.$message.warning("及格分数不得大于当前总分,请重新设置分值");
+        return;
+      }
       for (let i = 0; i < this.tableData.length; i++) {
             if (!this.tableData[i].sort && this.tableData[i].sort !== 0) {
               this.$message.warning(`题目管理第${i + 1}条请输入排序`);
@@ -1526,6 +1530,23 @@ export default {
       this.diansBoxStatus = false;
     },
     submitPagsInfos() {
+      if(this.examsType === 2){
+        var ast = this.boxtableDataPags.every(item => {
+          if(item.type === 2){
+            return item.partScore >= 0 && item.score >= 0
+          }else{
+            return item.score >= 0
+          }
+        })
+        if(!ast){
+          this.$message.warning("请设置每道题目的分值")
+          return
+        }
+      }
+      if(Number(this.passScore) > Number(this.getAllpocis)){
+        this.$message.warning("及格分数不得大于当前总分")
+        return
+      }
       this.tableData = this.boxtableDataPags;
       this.diansBoxStatus = false;
     },

+ 15 - 3
src/views/resource/bankManagement/testPaperManagement/editPaper/baseEditPaper/index.vue

@@ -40,13 +40,12 @@
           <el-popover
             ref="popovers"
             placement="bottom"
-            width="200"
             trigger="click"
             @show="showHandle"
             @hide="hideHandle"
             :disabled="courType ? false : true"
           >
-            <el-radio-group v-model="sujectApis">
+            <el-radio-group v-model="sujectApis" class="dis_flexbox">
               <el-radio
               disabled
                 v-for="(item, index) in newSujectOption"
@@ -150,7 +149,7 @@
         </el-form-item>
         <el-form-item>
           <el-button @click="backPage">取消</el-button>
-          <el-button type="primary" @click="submitIns('listDataIns')"
+          <el-button type="primary" @click="submitIns('listDataIns')" :disabled="!noStudent"
             >确定</el-button
           >
         </el-form-item>
@@ -182,6 +181,7 @@ export default {
       newSujectApis: {},
       sujectApis: "", //当前存在的科目 例如'19-2'
       optionsCity: [],
+      noStudent:true,
       //表单验证
       rules: {
         examPaperId: [
@@ -204,6 +204,14 @@ export default {
     ...mapGetters(["paperexam", "areas", "cityList"]),
   },
   mounted() {
+    this.$api
+      .gradecheckGoodsChange({ examId: this.$route.query.id })
+      .then((res) => {
+        console.log(res.data);
+        if (res.data > 0) {
+          this.noStudent = false;
+        }
+      });
     this.getDict();
     // this.search();
   },
@@ -397,6 +405,10 @@ export default {
 </script>
 
 <style lang="less" scoped>
+.dis_flexbox{
+  display: flex;
+  flex-direction: column;
+}
 .boxWidth {
   width: 700px;
 }

+ 57 - 26
src/views/resource/bankManagement/testPaperManagement/editPaper/topicEditPaper/index.vue

@@ -25,7 +25,7 @@
       </table-list>
       <div class="centerStys">
         <el-button size="small" @click="backPage">取消</el-button>
-        <el-button size="small" type="primary" @click="submitTableAllInfos"
+        <el-button size="small" type="primary" @click="submitTableAllInfos" :disabled="!noStudent"
           >确定</el-button
         >
       </div>
@@ -359,7 +359,8 @@
                   controls-position="right"
                   :min="1"
                   size="mini"
-                ></el-input-number><span v-if="djTimeType === 1">分钟</span>
+                ></el-input-number
+                ><span v-if="djTimeType === 1">分钟</span>
               </div>
               <div class="margin_bs">
                 答卷次数:
@@ -653,7 +654,7 @@ export default {
   components: { searchBoxNew, pagination, tableList, busIns, questionBank },
   data() {
     return {
-      showHide:false,
+      showHide: false,
       formList: [
         // {
         //   prop: "educationTypeId",
@@ -900,6 +901,7 @@ export default {
       djNum: 0, //答卷次数
       examsType: 1,
       businObj: {}, //当前业务层次
+      noStudent: true,
     };
   },
   computed: {
@@ -943,6 +945,14 @@ export default {
     },
   },
   async mounted() {
+    this.$api
+      .gradecheckGoodsChange({ examId: this.$route.query.id })
+      .then((res) => {
+        console.log(res.data);
+        if (res.data > 0) {
+          this.noStudent = false;
+        }
+      });
     this.getInfos();
     await this.getFns();
     this.changeAmdis();
@@ -1081,7 +1091,7 @@ export default {
         item.sort = 0;
         item.partScore = 0;
         item.score = "";
-        item.diff = false
+        item.diff = false;
       });
       this.activeLists.forEach((item) => {
         this.tableData.unshift(item);
@@ -1115,7 +1125,7 @@ export default {
       if (v === undefined) {
         self.statusPop = 1;
         self.innerVisiblePaperTopic = true;
-        self.showHide = true
+        self.showHide = true;
         self.$nextTick(() => {
           (self.listNums = {
             type: 1,
@@ -1136,9 +1146,9 @@ export default {
           self.activeExam = [];
         });
       } else {
-        self.tableData[indexZB].diff = true
+        self.tableData[indexZB].diff = true;
         self.innerVisiblePaperTopic = true;
-        self.showHide = true
+        self.showHide = true;
         self.statusPop = int;
         var vres = JSON.parse(JSON.stringify(v));
         self.indexZB = indexZB;
@@ -1155,8 +1165,8 @@ export default {
               });
             });
           self.activeExam = a;
-        }else{
-          self.activeExam = []
+        } else {
+          self.activeExam = [];
         }
         if (vres.type === 2) {
           if (vres.answerQuestion) {
@@ -1302,7 +1312,7 @@ export default {
     },
     closeBefore() {
       this.innerVisiblePaperTopic = false;
-      this.showHide = false
+      this.showHide = false;
     },
     async submitForm(formName, int) {
       this.$refs[formName].validate((valid) => {
@@ -1419,7 +1429,7 @@ export default {
             // this.$api.addbankquestion(data).then((res) => {
             self.$message.success("添加成功");
             self.innerVisiblePaperTopic = false;
-            self.showHide = false
+            self.showHide = false;
             // self.search();
             // });
           }
@@ -1428,7 +1438,7 @@ export default {
             // this.$api.editbankquestion(data).then((res) => {
             self.$message.success("修改成功");
             self.innerVisiblePaperTopic = false;
-            self.showHide = false
+            self.showHide = false;
             // self.search();
             // });
           }
@@ -1454,25 +1464,29 @@ export default {
     },
     async submitTableAllInfos() {
       var self = this;
+      if (Number(this.passScore) > Number(this.getAllpocis)) {
+        this.$message.warning("及格分数不得大于当前总分,请重新设置分值");
+        return;
+      }
       for (let i = 0; i < this.tableData.length; i++) {
-            if (!this.tableData[i].sort && this.tableData[i].sort !== 0) {
-              this.$message.warning(`题目管理第${i + 1}条请输入排序`);
-              return;
-            }
-          }
-          let arr = this.tableData.map((items) => {
-            return items.sort;
-          });
-          if (new Set(arr).size != arr.length) {
-            this.$message.warning("排序不允许重复");
-            return
-          }
+        if (!this.tableData[i].sort && this.tableData[i].sort !== 0) {
+          this.$message.warning(`题目管理第${i + 1}条请输入排序`);
+          return;
+        }
+      }
+      let arr = this.tableData.map((items) => {
+        return items.sort;
+      });
+      if (new Set(arr).size != arr.length) {
+        this.$message.warning("排序不允许重复");
+        return;
+      }
       var arrs = [];
       for (let i = 0; i < this.tableData.length; i++) {
         if (self.tableData[i].questionId && self.tableData[i].diff) {
           await self.uploadApis(self.tableData[i]);
-        } 
-        if(!self.tableData[i].questionId) {
+        }
+        if (!self.tableData[i].questionId) {
           var ids = await self.addbankquestion(self.tableData[i]);
           self.tableData[i].questionId = ids;
         }
@@ -1522,6 +1536,23 @@ export default {
       this.diansBoxStatus = false;
     },
     submitPagsInfos() {
+      if (this.examsType === 2) {
+        var ast = this.boxtableDataPags.every((item) => {
+          if (item.type === 2) {
+            return item.partScore >= 0 && item.score >= 0;
+          } else {
+            return item.score >= 0;
+          }
+        });
+        if (!ast) {
+          this.$message.warning("请设置每道题目的分值");
+          return;
+        }
+      }
+      if (Number(this.passScore) > Number(this.getAllpocis)) {
+        this.$message.warning("及格分数不得大于当前总分");
+        return;
+      }
       this.tableData = this.boxtableDataPags;
       this.diansBoxStatus = false;
     },

+ 57 - 45
src/views/resource/bankManagement/testPaperManagement/index.vue

@@ -22,7 +22,9 @@
         <el-button type="text" @click="addClick(props.scope.row, 2)"
           >修改试卷题库</el-button
         > -->
-        <el-button type="text" @click="addClick(props.scope.row,1)">编辑</el-button>
+        <el-button type="text" @click="addClick(props.scope.row, 1)"
+          >编辑</el-button
+        >
         <el-button type="text" @click="del(props.scope.row)">删除</el-button>
       </template>
     </table-list>
@@ -41,8 +43,8 @@ import searchBoxNew from "@/components/searchBoxNew";
 import tableList from "@/components/tableList";
 import pagination from "@/components/pagination";
 export default {
-  name:"TestPaperManagement",
-  components: { tableList, pagination,searchBoxNew },
+  name: "TestPaperManagement",
+  components: { tableList, pagination, searchBoxNew },
   data() {
     return {
       loading: false, //当前表单加载是否加载动画
@@ -51,9 +53,9 @@ export default {
         index: 0,
         ch: "条",
         num: true,
-        border:true,
+        border: true,
         choice: true,
-        changeWidth:"140px",
+        changeWidth: "140px",
         addHide: false,
         backFatherBtn: {
           status: false,
@@ -71,17 +73,17 @@ export default {
           prop: "businessId",
           placeholder: "业务层次",
           scope: "businessLevel",
-          edu:"educationTypeId"
+          edu: "educationTypeId",
         },
         {
           prop: "subjectId",
           placeholder: "科目",
           scope: "sujectType",
-          edu:"educationTypeId"
+          edu: "educationTypeId",
         },
         {
-          prop:"publishStatus",
-          placeholder:"发布状态",
+          prop: "publishStatus",
+          placeholder: "发布状态",
           scope: "select",
           options: [
             {
@@ -101,7 +103,7 @@ export default {
         {
           prop: "examName",
           placeholder: "请输入试卷名称",
-        }
+        },
       ],
       formData: {
         status: "0,1",
@@ -133,8 +135,8 @@ export default {
           prop3: "businessName",
           prop4: "subjectName",
           hidden: true,
-          scope:"eduTypes",
-          width:"230px"
+          scope: "eduTypes",
+          width: "230px",
         },
         {
           label: "发布状态",
@@ -163,7 +165,7 @@ export default {
           hidden: true,
           scope: "aboutChapter",
           width: "150",
-          int:6
+          int: 6,
         },
       ],
       tableData: [], //表单数据
@@ -173,7 +175,7 @@ export default {
   mounted() {
     this.search();
   },
-  activated(){
+  activated() {
     this.search();
   },
   methods: {
@@ -192,41 +194,51 @@ export default {
           pageNum: 1,
         };
       }
-      this.$api.inquirebankexamList(this.formData).then((res) => {
-        this.tableData = res.rows;
-        this.total = res.total;
-        this.navText.index = res.total;
-      }).finally(()=>{
-        this.loading = false;
-      })
+      this.$api
+        .inquirebankexamList(this.formData)
+        .then((res) => {
+          this.tableData = res.rows;
+          this.total = res.total;
+          this.navText.index = res.total;
+        })
+        .finally(() => {
+          this.loading = false;
+        });
     },
     init() {
       this.search(2);
     },
     del(v) {
-      this.$alert(
-        "确定删除此内容?<br />内容删除后将无法恢复,请慎重考虑",
-        "提示",
-        {
-          dangerouslyUseHTMLString: true,
+      this.$api.gradecheckGoodsChange({ examId: v.examId }).then((res) => {
+        if (res.data > 0) {
+          this.$message.error("已有学员正在学习,无法删除");
+          return;
+        } else {
+          this.$alert(
+            "确定删除此内容?<br />内容删除后将无法恢复,请慎重考虑",
+            "提示",
+            {
+              dangerouslyUseHTMLString: true,
+            }
+          )
+            .then(() => {
+              var data = {
+                examId: v.examId,
+                status: -1,
+              };
+              this.$api.editbankexam(data).then((res) => {
+                this.$message.success("删除成功");
+                this.search();
+              });
+            })
+            .catch(() => {
+              this.$message({
+                type: "info",
+                message: "已取消删除",
+              });
+            });
         }
-      )
-        .then(() => {
-          var data = {
-            examId: v.examId,
-            status: -1,
-          };
-          this.$api.editbankexam(data).then((res) => {
-            this.$message.success("删除成功");
-            this.search();
-          });
-        })
-        .catch(() => {
-          this.$message({
-            type: "info",
-            message: "已取消删除",
-          });
-        });
+      });
     },
     addClick(v, int) {
       if (v === undefined) {
@@ -240,7 +252,7 @@ export default {
           path: "editPaper",
           query: {
             id: v.examId,
-            code:v.code
+            code: v.code,
           },
         });
         return;
@@ -250,7 +262,7 @@ export default {
           path: "editPaperTopicEditPaper",
           query: {
             id: v.examId,
-            code:v.code
+            code: v.code,
           },
         });
         return;

+ 38 - 37
src/views/resource/bankManagement/volumeManagement/add/index.vue

@@ -38,13 +38,12 @@
           <el-popover
             ref="popovers"
             placement="bottom"
-            width="200"
             trigger="click"
             @show="showHandle"
             @hide="hideHandle"
             :disabled="courType ? false : true"
           >
-            <el-radio-group v-model="sujectApis">
+            <el-radio-group v-model="sujectApis" class="dis_flexbox">
               <el-radio
                 v-for="(item, index) in newSujectOption"
                 :label="item.newId"
@@ -57,7 +56,10 @@
                 >确定</el-button
               >
             </div>
-            <el-button slot="reference" style="margin-left: 12px" @click="getMessage"
+            <el-button
+              slot="reference"
+              style="margin-left: 12px"
+              @click="getMessage"
               >请选择科目</el-button
             >
           </el-popover>
@@ -66,7 +68,10 @@
           <!-- <span v-if="Object.keys(newSujectApis).length == 0"
             >未选项目类型</span
           > -->
-          <div  v-if="Object.keys(newSujectApis).length !== 0" style="display: flex">
+          <div
+            v-if="Object.keys(newSujectApis).length !== 0"
+            style="display: flex"
+          >
             <div class="listBoxStys">
               {{
                 newSujectApis.educationName +
@@ -286,8 +291,8 @@ import searchBoxNew from "@/components/searchBoxNew";
 import pagination from "@/components/pagination";
 import tableList from "@/components/tableList";
 export default {
-  components: {searchBoxNew,tableList, pagination },
-  name:"volumeManagementAdd",
+  components: { searchBoxNew, tableList, pagination },
+  name: "volumeManagementAdd",
   data() {
     return {
       listData: {
@@ -339,7 +344,7 @@ export default {
         },
       ],
       formData: {
-        publishStatus:1,
+        publishStatus: 1,
         status: 1,
         pageSize: 10,
         pageNum: 1,
@@ -348,9 +353,9 @@ export default {
       activeLists: [],
     };
   },
-  watch:{
-    "newSujectApis"(){
-      this.tableData = []
+  watch: {
+    newSujectApis() {
+      this.tableData = [];
     },
   },
   mounted() {
@@ -364,23 +369,21 @@ export default {
       }
       var self = this;
       var data = JSON.parse(JSON.stringify(this.formData));
-      data.businessId = this.newSujectApis.businessId
-      data.subjectId = this.newSujectApis.subjectId
-      this.$api
-        .inquirebankchapterList(data)
-        .then((res) => {
-          var aList = [];
-          this.tableData.map((item) => {
-            aList.push(item.chapterExamId);
-          });
-          this.disCheckList = aList;
-          this.boxtableData = res.rows;
-          this.total = res.total;
-          this.dialogVisible = true;
-          this.$nextTick(function () {
-            self.$refs.multipleTable.clearSelection();
-          });
+      data.businessId = this.newSujectApis.businessId;
+      data.subjectId = this.newSujectApis.subjectId;
+      this.$api.inquirebankchapterList(data).then((res) => {
+        var aList = [];
+        this.tableData.map((item) => {
+          aList.push(item.chapterExamId);
+        });
+        this.disCheckList = aList;
+        this.boxtableData = res.rows;
+        this.total = res.total;
+        this.dialogVisible = true;
+        this.$nextTick(function () {
+          self.$refs.multipleTable.clearSelection();
         });
+      });
     },
     getInfos(int) {
       if (int === 1) {
@@ -391,18 +394,16 @@ export default {
           status: 1,
           pageSize: 10,
           pageNum: 1,
-          publishStatus:1,
+          publishStatus: 1,
         };
       }
       var data = JSON.parse(JSON.stringify(this.formData));
-      data.businessId = this.newSujectApis.businessId
-      data.subjectId = this.newSujectApis.subjectId
-      this.$api
-        .inquirebankchapterList(data)
-        .then((res) => {
-          this.boxtableData = res.rows;
-          this.total = res.total;
-        });
+      data.businessId = this.newSujectApis.businessId;
+      data.subjectId = this.newSujectApis.subjectId;
+      this.$api.inquirebankchapterList(data).then((res) => {
+        this.boxtableData = res.rows;
+        this.total = res.total;
+      });
     },
     init() {
       this.getInfos(2);
@@ -513,7 +514,7 @@ export default {
       });
       this.newCourTypeOptions = arrays;
       this.$refs.popovers.doClose();
-      this.tableData = []
+      this.tableData = [];
     },
     submitIns(formName) {
       this.$refs[formName].validate((valid) => {
@@ -533,7 +534,7 @@ export default {
           });
           if (new Set(arr).size != arr.length) {
             this.$message.warning("排序不允许有重复值");
-            return
+            return;
           }
           this.rulesTableSumbit();
         } else {

+ 5 - 2
src/views/resource/bankManagement/volumeManagement/edit/index.vue

@@ -40,13 +40,12 @@
           <el-popover
             ref="popovers"
             placement="bottom"
-            width="200"
             trigger="click"
             @show="showHandle"
             @hide="hideHandle"
             :disabled="courType ? false : true"
           >
-            <el-radio-group v-model="sujectApis">
+            <el-radio-group v-model="sujectApis" class="dis_flexbox">
               <el-radio
                 disabled
                 v-for="(item, index) in newSujectOption"
@@ -657,6 +656,10 @@ export default {
 </script>
 
 <style lang="less" scoped>
+.dis_flexbox{
+  display: flex;
+  flex-direction: column;
+}
 .boxWidth {
   width: 700px;
 }

+ 128 - 34
src/views/resource/baseManageInfos/resource/businessLevel/index.vue

@@ -10,6 +10,11 @@
       @editInfo="editInfo"
       @emitData="openPZDowm"
     >
+      <template slot="customize">
+        <el-button size="small" type="success" @click="setOptions"
+          >配置“视频节和测试卷”的学习顺序</el-button
+        >
+      </template>
       <template slot="btn" slot-scope="props">
         <el-button type="text" @click="openPZDowm(props.scope.row, 1)"
           >配置模板</el-button
@@ -71,7 +76,7 @@
             <el-select
               v-model="listData[items.prop]"
               filterable
-              :disabled="statusPop=== 0"
+              :disabled="statusPop === 0"
               placeholder="请选择教育类型"
               v-else-if="items.prop === 'educationId'"
               @change="changeJYList"
@@ -87,7 +92,7 @@
             <el-select
               v-model="listData[items.prop]"
               filterable
-              :disabled="statusPop=== 0"
+              :disabled="statusPop === 0"
               placeholder="请选择项目类型"
               v-else-if="items.prop === 'projectId'"
               @change="changeXMList(listData)"
@@ -162,11 +167,47 @@
           @click="radioActives = ''"
           >清除选择</el-button
         >
-        <span style="margin-left:14px;">注:该配置只适用于视频商品</span>
+        <span style="margin-left: 14px">注:该配置只适用于视频商品</span>
       </div>
       <span slot="footer" class="dialog-footer">
         <el-button @click="closePZ">取 消</el-button>
-        <el-button type="primary" @click="submitPZ" :loading="disabledBtn">确 定</el-button>
+        <el-button type="primary" @click="submitPZ" :loading="disabledBtn"
+          >确 定</el-button
+        >
+      </span>
+    </el-dialog>
+    <el-dialog
+      :visible.sync="dialogVisibleSet"
+      width="360px"
+      :show-close="false"
+      @closed="loadingClose"
+      :close-on-click-modal="false"
+    >
+      <div slot="title" class="hearders">
+        <div class="leftTitle">配置“视频节和测试卷”的学习顺序</div>
+        <div class="rightBoxs">
+          <img
+            src="@/assets/images/Close@2x.png"
+            alt=""
+            @click="closeOptions"
+          />
+        </div>
+      </div>
+      <div>
+        <p>注:该配置只适用于视频商品</p>
+        <el-radio-group v-model="learningOrder">
+          <el-radio :label="1">不限制顺序</el-radio>
+          <el-radio :label="0">限制顺序</el-radio>
+        </el-radio-group>
+        <p v-if="learningOrder === 0" style="color: red">
+          单个章对应的【所有节视频】学完才可以【测试】
+        </p>
+      </div>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="closeOptions">取 消</el-button>
+        <el-button type="primary" @click="submitLearn" :loading="disabledBtn"
+          >确 定</el-button
+        >
       </span>
     </el-dialog>
   </div>
@@ -305,6 +346,8 @@ export default {
         schoolYear: [{ required: false, message: "学年不能为空" }],
         status: [{ required: true, message: "请选择状态", trigger: "change" }],
       },
+      dialogVisibleSet: false,
+      learningOrder: "", //1限制 0不限制
     };
   },
   mounted() {
@@ -312,6 +355,48 @@ export default {
     this.initPlate();
   },
   methods: {
+    submitLearn() {
+      console.log(this.learningOrder)
+      this.disabledBtn = true;
+      if (!this.$refs.tablieListmest.allCheckData.length) {
+        this.$message.warning("请勾选需要配置的业务层次");
+        this.disabledBtn = false;
+        return;
+      }
+      if (this.learningOrder !== 0 && this.learningOrder !== 1) {
+        this.$message.warning("请选择是否限制顺序");
+        this.disabledBtn = false;
+        return;
+      }
+      var ast = this.$refs.tablieListmest.allCheckData.map((item) => {
+        return item.id;
+      });
+      this.$api
+        .editLearningOrderCourseBusiness({
+          businessIds: ast,
+          goodsLearningOrder: this.learningOrder,
+        })
+        .then((res) => {
+          this.$message.success("配置成功");
+          this.$refs.tablieListmest.allCheckData = [];
+          this.learningOrder = "";
+          this.dialogVisibleSet = false;
+          this.search();
+        })
+        .catch(() => {
+          this.disabledBtn = false;
+        });
+    },
+    setOptions() {
+      if (!this.$refs.tablieListmest.allCheckData.length) {
+        this.$message.warning("请勾选需要配置的业务层次");
+        return;
+      }
+      this.dialogVisibleSet = true;
+    },
+    closeOptions() {
+      this.dialogVisibleSet = false;
+    },
     initPlate() {
       this.$api.orderinputtemplatelist({ status: 1 }).then((res) => {
         this.plateList = res.rows;
@@ -354,20 +439,23 @@ export default {
         businessIds: ast,
         templateStatus: this.radioActives,
       };
-      this.disabledBtn = true
-      this.$api.editModelCourseBusiness(data).then((res) => {
-        this.$message.success("配置修改成功");
-        this.dialogVisiblePZDown = false;
-        this.activeLists = [];
-        this.radioActives = "";
-        this.$refs.tablieListmest.allCheckData = [];
-        this.search();
-      }).catch(()=>{
-          this.disabledBtn = false
+      this.disabledBtn = true;
+      this.$api
+        .editModelCourseBusiness(data)
+        .then((res) => {
+          this.$message.success("配置修改成功");
+          this.dialogVisiblePZDown = false;
+          this.activeLists = [];
+          this.radioActives = "";
+          this.$refs.tablieListmest.allCheckData = [];
+          this.search();
         })
+        .catch(() => {
+          this.disabledBtn = false;
+        });
     },
-    loadingClose(){
-      this.disabledBtn = false
+    loadingClose() {
+      this.disabledBtn = false;
     },
     changeXMList(option) {
       if (!option.educationId) {
@@ -454,7 +542,7 @@ export default {
           };
           this.$api.editCourseBusiness(data).then((res) => {
             this.$message.success("删除成功");
-          this.$store.commit("BUSINESSLEVEL");
+            this.$store.commit("BUSINESSLEVEL");
             this.search();
           });
         })
@@ -492,26 +580,32 @@ export default {
       });
     },
     rulesTableSumbit() {
-      this.disabledBtn = true
+      this.disabledBtn = true;
       if (this.statusPop === 1) {
-        this.$api.appCourseBusiness(this.listData).then((res) => {
-          this.$message.success("新增成功");
-          this.dialogVisible = false;
-          this.$store.commit("BUSINESSLEVEL");
-          this.search();
-        }).catch(()=>{
-          this.disabledBtn = false
-        })
+        this.$api
+          .appCourseBusiness(this.listData)
+          .then((res) => {
+            this.$message.success("新增成功");
+            this.dialogVisible = false;
+            this.$store.commit("BUSINESSLEVEL");
+            this.search();
+          })
+          .catch(() => {
+            this.disabledBtn = false;
+          });
       }
       if (this.statusPop === 0) {
-        this.$api.editCourseBusiness(this.listData).then((res) => {
-          this.$message.success("修改成功");
-          this.dialogVisible = false;
-          this.$store.commit("BUSINESSLEVEL");
-          this.search();
-        }).catch(()=>{
-          this.disabledBtn = false
-        })
+        this.$api
+          .editCourseBusiness(this.listData)
+          .then((res) => {
+            this.$message.success("修改成功");
+            this.dialogVisible = false;
+            this.$store.commit("BUSINESSLEVEL");
+            this.search();
+          })
+          .catch(() => {
+            this.disabledBtn = false;
+          });
       }
     },
     close() {

+ 10 - 1
src/views/resource/videoManagement/chapter/edit/index.vue

@@ -226,7 +226,7 @@
         </el-form-item>
         <el-form-item>
           <el-button @click="backPage">取消</el-button>
-          <el-button type="primary" @click="submit('listData')">确定</el-button>
+          <el-button type="primary" @click="submit('listData')" :disabled="!noStudent">确定</el-button>
         </el-form-item>
       </el-form>
     </div>
@@ -431,6 +431,7 @@ export default {
       },
       disCheckList: [], //已选转禁用复选列表
       activeLists: [],
+      noStudent:true,
     };
   },
   watch: {
@@ -442,6 +443,14 @@ export default {
     },
   },
   async mounted() {
+    this.$api
+      .gradecheckGoodsChange({ chapterId: this.$route.query.id })
+      .then((res) => {
+        console.log(res.data)
+        if (res.data > 0) {
+          this.noStudent = false;
+        }
+      });
     await this.getDict();
     this.search();
   },

+ 45 - 33
src/views/resource/videoManagement/chapter/index.vue

@@ -37,7 +37,7 @@ import searchBoxNew from "@/components/searchBoxNew";
 import tableList from "@/components/tableList";
 import pagination from "@/components/pagination";
 export default {
-  name:"Festival",
+  name: "Chapter",
   components: { searchBoxNew, tableList, pagination },
   data() {
     return {
@@ -47,7 +47,7 @@ export default {
         index: 0,
         ch: "条",
         num: true,
-        border:true,
+        border: true,
         choice: true,
         addHide: false,
         backFatherBtn: {
@@ -139,7 +139,7 @@ export default {
           hidden: true,
           scope: "aboutChapter",
           width: "150",
-          int:2
+          int: 2,
         },
         // {
         //   label: "关联课程",
@@ -173,7 +173,7 @@ export default {
   mounted() {
     this.search();
   },
-  activated(){
+  activated() {
     this.search();
   },
   methods: {
@@ -192,40 +192,52 @@ export default {
           pageNum: 1,
         };
       }
-      this.$api.inquireCourseListchapter(this.formData).then((res) => {
-        this.tableData = res.rows;
-        this.total = res.total;
-        this.navText.index = res.total;
-      }).finally(()=>{
-        this.loading = false;
-      })
+      this.$api
+        .inquireCourseListchapter(this.formData)
+        .then((res) => {
+          this.tableData = res.rows;
+          this.total = res.total;
+          this.navText.index = res.total;
+        })
+        .finally(() => {
+          this.loading = false;
+        });
     },
     init() {
       this.search(2);
     },
     del(v) {
-      this.$alert(
-        "确定删除此内容?<br />内容删除后将无法恢复,请慎重考虑",
-        "提示",
-        {
-          dangerouslyUseHTMLString: true,
-        }
-      )
-        .then(() => {
-          var data = {
-            chapterId: v.chapterId,
-            status: -1,
-          };
-          this.$api.editCoursechapter(data).then((res) => {
-            this.$message.success("删除成功");
-            this.search();
-          });
-        })
-        .catch(() => {
-          this.$message({
-            type: "info",
-            message: "已取消删除",
-          });
+      this.$api
+        .gradecheckGoodsChange({ chapterId: v.chapterId })
+        .then((res) => {
+          if (res.data > 0) {
+            this.$message.error("已有学员正在学习,无法删除");
+            return;
+          } else {
+            this.$alert(
+              "确定删除此内容?<br />内容删除后将无法恢复,请慎重考虑",
+              "提示",
+              {
+                dangerouslyUseHTMLString: true,
+              }
+            )
+              .then(() => {
+                var data = {
+                  chapterId: v.chapterId,
+                  status: -1,
+                };
+                this.$api.editCoursechapter(data).then((res) => {
+                  this.$message.success("删除成功");
+                  this.search();
+                });
+              })
+              .catch(() => {
+                this.$message({
+                  type: "info",
+                  message: "已取消删除",
+                });
+              });
+          }
         });
     },
     addClick(v, int) {

+ 9 - 1
src/views/resource/videoManagement/courseManagement/basicInfoEdit/index.vue

@@ -180,7 +180,7 @@
       />
       <div style="text-align: center; margin-top: 20px">
         <el-button @click="backPage" size="mini">取消</el-button>
-        <el-button type="primary" @click="submit('listData')" size="mini"
+        <el-button type="primary" @click="submit('listData')" size="mini" :disabled="!noStudent"
           >确定</el-button
         >
       </div>
@@ -218,6 +218,7 @@ export default {
       newSujectOption: [], //当前科目数据数据
       newSchoolOption: [], //当前院校数据
       newMajorOption: [], //当前专业数据
+      noStudent:true,
       //表单验证
       rules: {
         educationTypeId: [
@@ -268,6 +269,13 @@ export default {
     };
   },
   mounted() {
+    this.$api
+      .gradecheckGoodsChange({ courseId: this.$route.query.id })
+      .then((res) => {
+        if (res.data > 0) {
+          this.noStudent = false;
+        }
+      });
     this.getDict();
   },
   methods: {

+ 36 - 42
src/views/resource/videoManagement/courseManagement/chapterContent/index.vue

@@ -40,7 +40,7 @@
             删除
           </el-button>
           <el-button
-          v-if="data.type === 2"
+            v-if="data.type === 2"
             type="text"
             size="mini"
             style="color: green"
@@ -53,7 +53,9 @@
     </el-tree>
     <div class="dis-f">
       <el-button @click="backPage">取消</el-button>
-      <el-button type="primary" @click="submit">确定</el-button>
+      <el-button type="primary" @click="submit" :disabled="!noStudent"
+        >确定</el-button
+      >
     </div>
     <el-dialog
       :visible.sync="centerDialogVisible"
@@ -433,17 +435,17 @@ export default {
         status: 1,
         publishStatus: 1,
         name: "",
-        key:""
+        key: "",
       },
       formList5: [],
-      total6:0,
+      total6: 0,
       formData6: {
         pageSize: 10,
         pageNum: 1,
         status: 1,
         publishStatus: 1,
         name: "",
-        key:'',
+        key: "",
       },
       formList6: [
         {
@@ -455,6 +457,7 @@ export default {
       theChapterList: [],
       theSectionList: [],
       sortList: [],
+      noStudent: true,
       layoutTreeProps: {
         label(data, node) {
           return data.name;
@@ -466,6 +469,13 @@ export default {
     };
   },
   mounted() {
+    this.$api
+      .gradecheckGoodsChange({ courseId: this.$route.query.id })
+      .then((res) => {
+        if (res.data > 0) {
+          this.noStudent = false;
+        }
+      });
     this.getDs();
     this.search();
   },
@@ -627,7 +637,6 @@ export default {
             item.onlyId = lets.join("-");
           });
           this.menuExamList = res.rows;
-          console.log(this.menuExamList);
         });
     },
     getDs() {
@@ -657,7 +666,7 @@ export default {
       data.name = this.formData6.name;
       this.$api.inquirebankexamList(data).then((res) => {
         this.tableDataExam = res.rows;
-        this.total6 = res.total
+        this.total6 = res.total;
       });
     },
     openBoxs() {
@@ -858,6 +867,24 @@ export default {
         }
       });
       this.tableDataInfos = JSON.parse(JSON.stringify(this.tableDataInfos));
+      if (item.type === 1) {
+        this.menuExamList = this.menuExamList.filter((items) => {
+          return items.moduleId !== item.CodeId;
+        });
+      }
+      if (item.type === 2) {
+        this.menuExamList = this.menuExamList.filter((items) => {
+          if (items.moduleId === 0) {
+            if (items.chapterId !== item.CodeId) {
+              return true;
+            } else {
+              return false;
+            }
+          } else {
+            return true;
+          }
+        });
+      }
     },
     getRowKeys(row) {
       if (this.radio === 1) {
@@ -978,39 +1005,6 @@ export default {
         });
       }
       return;
-      if (tree.type === 1) {
-        var arrays = [];
-        await this.$api
-          .inquireCourseListmodulechapter(tree.CodeId)
-          .then((res) => {
-            res.data.map((item, index) => {
-              var arr = {
-                id: tree.id + "-" + item.chapterId,
-                CodeId: item.chapterId,
-                name: item.name,
-                hasChildren: true,
-                type: 2,
-              };
-              arrays.push(arr);
-            });
-          });
-        resolve(arrays);
-      }
-      if (tree.type === 2) {
-        this.$api.inquireCoursechaptersectionlist(tree.CodeId).then((res) => {
-          var arrays = [];
-          res.data.map((item, index) => {
-            var arr = {
-              id: tree.id + "-" + item.sectionId,
-              CodeId: item.sectionId,
-              name: item.name,
-              type: 3,
-            };
-            arrays.push(arr);
-          });
-          resolve(arrays);
-        });
-      }
     },
     handleSizeChange(v) {
       this.formData5.pageSize = v;
@@ -1030,8 +1024,8 @@ export default {
       this.formData6.pageNum = v;
       this.getSJ();
     },
-    init6(){
-      this.getSJ(2)
+    init6() {
+      this.getSJ(2);
     },
     selectAll(value) {
       this.activeLists = value;

+ 35 - 28
src/views/resource/videoManagement/courseManagement/index.vue

@@ -41,7 +41,7 @@ import searchBoxNew from "@/components/searchBoxNew";
 import tableList from "@/components/tableList";
 import pagination from "@/components/pagination";
 export default {
-  name:"ModuleManagement",
+  name: "ModuleManagement",
   components: { searchBoxNew, tableList, pagination },
   data() {
     return {
@@ -51,7 +51,7 @@ export default {
         index: 0,
         ch: "条",
         num: true,
-        border:true,
+        border: true,
         choice: true,
         addHide: false,
         changeWidth: "160px",
@@ -158,8 +158,8 @@ export default {
           prop1: "projectName",
           prop2: "businessName",
           hidden: true,
-          width:"240px",
-          scope:"InfoMore"
+          width: "240px",
+          scope: "InfoMore",
         },
         {
           label: "教育类型",
@@ -198,7 +198,7 @@ export default {
           prop1: "goodsName",
           width: "150px",
           scope: "aboutChapter",
-          int:4
+          int: 4,
         },
       ],
       tableData: [], //表单数据
@@ -210,7 +210,7 @@ export default {
   mounted() {
     this.search();
   },
-  activated(){
+  activated() {
     this.search();
   },
   methods: {
@@ -252,29 +252,36 @@ export default {
       this.search(2);
     },
     del(v) {
-      this.$alert(
-        "确定删除此内容?<br />内容删除后将无法恢复,请慎重考虑",
-        "提示",
-        {
-          dangerouslyUseHTMLString: true,
+      this.$api.gradecheckGoodsChange({ courseId: v.courseId }).then((res) => {
+        if (res.data > 0) {
+          this.$message.error("已有学员正在学习该课程,无法删除");
+          return;
+        } else {
+          this.$alert(
+            "确定删除此内容?<br />内容删除后将无法恢复,请慎重考虑",
+            "提示",
+            {
+              dangerouslyUseHTMLString: true,
+            }
+          )
+            .then(() => {
+              var data = {
+                courseId: v.courseId,
+                status: -1,
+              };
+              this.$api.editCourse(data).then((res) => {
+                this.$message.success("删除成功");
+                this.search();
+              });
+            })
+            .catch(() => {
+              this.$message({
+                type: "info",
+                message: "已取消删除",
+              });
+            });
         }
-      )
-        .then(() => {
-          var data = {
-            courseId: v.courseId,
-            status: -1,
-          };
-          this.$api.editCourse(data).then((res) => {
-            this.$message.success("删除成功");
-            this.search();
-          });
-        })
-        .catch(() => {
-          this.$message({
-            type: "info",
-            message: "已取消删除",
-          });
-        });
+      });
     },
     addClick(v, int) {
       if (v === undefined) {

+ 4 - 5
src/views/resource/videoManagement/festival/add/index.vue

@@ -38,7 +38,6 @@
           <el-popover
             ref="popovers"
             placement="bottom"
-            width="200"
             trigger="click"
             @show="showHandle"
             @hide="hideHandle"
@@ -359,10 +358,10 @@ export default {
           label: "直播",
           value: 2,
         },
-        {
-          label: "回放",
-          value: 3,
-        },
+        // {
+        //   label: "回放",
+        //   value: 3,
+        // },
       ],
       //   弹窗数据
       changeHeight: true,

+ 17 - 1
src/views/resource/videoManagement/festival/edit/index.vue

@@ -101,12 +101,14 @@
         <el-form-item label="节类型">
           <el-select
             clearable
+            :disabled="listData.sectionType === 1 || listData.sectionType === 3"
             v-model="listData.sectionType"
             placeholder="请选择节类型"
           >
             <el-option
               v-for="(item, index) in sectionTypeOptions"
               :key="index"
+              :disabled="item.value == 1"
               :label="item.label"
               :value="item.value"
             >
@@ -282,7 +284,12 @@
         </el-form-item>
         <el-form-item>
           <el-button @click="backPage">取消</el-button>
-          <el-button type="primary" @click="submit('listData')">确定</el-button>
+          <el-button
+            type="primary"
+            @click="submit('listData')"
+            :disabled="noStudent"
+            >确定</el-button
+          >
         </el-form-item>
       </el-form>
     </div>
@@ -389,6 +396,7 @@ export default {
       sujectApis: [], //当前存在的科目
       newSujectApis: [],
       sujectArray: [], //选中的科目
+      noStudent: true,
       //表单验证
       rules: {
         prefixName: [
@@ -414,6 +422,14 @@ export default {
     },
   },
   mounted() {
+    this.$api
+      .gradecheckGoodsChange({ sectionId: this.$route.query.id })
+      .then((res) => {
+        console.log(res.data)
+        if (res.data > 0) {
+          this.noStudent = false;
+        }
+      });
     this.getDict();
   },
   methods: {

+ 42 - 34
src/views/resource/videoManagement/festival/index.vue

@@ -64,9 +64,7 @@
             <i class="el-icon-upload"></i
             ><span class="dowmStys" @click="getDowm">下载模板</span>
           </p>
-          <p>
-            第二步:(批量新增):点击“上传Excel”完成导入
-          </p>
+          <p>第二步:(批量新增):点击“上传Excel”完成导入</p>
           <label
             for="mobles"
             class="el-button el-button--primary"
@@ -290,16 +288,17 @@ export default {
       var file = e.target.files[0];
       let formData = new FormData();
       formData.append("file", file);
-      this.$api.drCourseSectionimportData(formData).then((res) => {
-        if(res.code === 200){
-          self.$message.success("导入成功")
+      this.$api
+        .drCourseSectionimportData(formData)
+        .then((res) => {
+          if (res.code === 200) {
+            self.$message.success("导入成功");
+          }
+        })
+        .finally(() => {
           self.search();
-        }else{
-          self.$message.error(res.msg)
-        }
-      }).finally(()=>{
-        e.target.value = "";
-      })
+          e.target.value = "";
+        });
     },
     moreActive() {
       this.dialogDR = true;
@@ -334,28 +333,37 @@ export default {
       this.search(2);
     },
     del(v) {
-      this.$alert(
-        "确定删除此内容?<br />内容删除后将无法恢复,请慎重考虑",
-        "提示",
-        {
-          dangerouslyUseHTMLString: true,
-        }
-      )
-        .then(() => {
-          var data = {
-            sectionId: v.sectionId,
-            status: -1,
-          };
-          this.$api.editCourseSection(data).then((res) => {
-            this.$message.success("删除成功");
-            this.search();
-          });
-        })
-        .catch(() => {
-          this.$message({
-            type: "info",
-            message: "已取消删除",
-          });
+      this.$api
+        .gradecheckGoodsChange({ sectionId: v.sectionId })
+        .then((res) => {
+          if (res.data > 0) {
+            this.$message.error("已有学员正在学习,无法删除");
+            return;
+          } else {
+            this.$alert(
+              "确定删除此内容?<br />内容删除后将无法恢复,请慎重考虑",
+              "提示",
+              {
+                dangerouslyUseHTMLString: true,
+              }
+            )
+              .then(() => {
+                var data = {
+                  sectionId: v.sectionId,
+                  status: -1,
+                };
+                this.$api.editCourseSection(data).then((res) => {
+                  this.$message.success("删除成功");
+                  this.search();
+                });
+              })
+              .catch(() => {
+                this.$message({
+                  type: "info",
+                  message: "已取消删除",
+                });
+              });
+          }
         });
     },
     addClick(v, int) {

+ 92 - 11
src/views/resource/videoManagement/flow/index.vue

@@ -15,11 +15,11 @@
       :loading="loading"
       @editInfo="editInfo"
     >
-      <!-- <template slot="customize">
+      <template slot="customize">
         <el-button size="small" type="success" @click="moreActive"
           >同步BL频道</el-button
         >
-      </template> -->
+      </template>
       <template slot="btn" slot-scope="props">
         <el-button type="text" @click="addClick(props.scope.row, 0)"
           >修改</el-button
@@ -200,6 +200,7 @@
       </span>
     </el-dialog>
     <el-dialog
+      @closed="loadingClose"
       :visible.sync="disBoxs"
       width="440px"
       :show-close="false"
@@ -216,11 +217,32 @@
         </div>
       </div>
       <div class="max-heightSty">
-        <el-tree :props="props" :load="loadNode" lazy show-checkbox> </el-tree>
+        <el-tree :props="props" :load="loadNode" lazy>
+          <span class="custom-tree-node" slot-scope="{ node, data }">
+            <div
+              class="radioSty"
+              @click.stop="cataid = data.cataid"
+              :style="
+                data.cataid === cataid ? 'border-color:#F56C6C!important;' : ''
+              "
+            >
+              <transition name="fade">
+                <div v-if="data.cataid === cataid" class="isActives"></div>
+              </transition>
+            </div>
+            <span>{{ node.label }}</span>
+          </span>
+        </el-tree>
+      </div>
+      <div class="mat-TOP">
+        <el-radio-group v-model="streamAddType">
+          <el-radio :label="1">正式</el-radio>
+          <el-radio :label="2">测试</el-radio>
+        </el-radio-group>
       </div>
       <span slot="footer" class="dialog-footer">
         <el-button @click="disBoxs = false">取 消</el-button>
-        <el-button @click="submitForms">确 定</el-button>
+        <el-button @click="submitForms" :loading="disabledBtn">确 定</el-button>
       </span>
     </el-dialog>
   </div>
@@ -494,9 +516,12 @@ export default {
         ],
       },
       props: {
-        label: "cataname",
+        label: "text",
         children: "children",
       },
+      cataid: "",
+      streamAddType: "",
+      disabledBtn: false,
     };
   },
   watch: {
@@ -507,18 +532,19 @@ export default {
   mounted() {
     this.search();
     this.initOptions();
-    this.getInfosPL();
   },
   activated() {
     this.search();
     this.initOptions();
-    this.getInfosPL();
   },
   methods: {
+    loadingClose() {
+      this.disabledBtn = false;
+    },
     loadNode(node, resolve) {
       console.log(node);
       if (node.level === 0) {
-        this.$api.obtainpolyvvideosignlistCata({ cataid: 1 }).then((res) => {
+        this.$api.obtainpolyvvideosignlistCata({ parentid: 0 }).then((res) => {
           return resolve(res.rows);
         });
       }
@@ -530,11 +556,33 @@ export default {
           });
       }
     },
-    getInfosPL() {
-      this.$api.obtainpolyvvideosignlistCata().then((res) => {});
+    submitForms() {
+      if (!this.cataid) {
+        this.$message.warning("请勾选需要同步的频道");
+        return;
+      }
+      this.$modal.loading("正在同步数据,请稍等...");
+      this.disabledBtn = true;
+      this.$api
+        .uploadPolyvvideocata({
+          cataid: this.cataid,
+          streamingAddressType: this.streamAddType,
+        })
+        .then((res) => {
+          this.$message.success("同步成功");
+          this.search();
+          this.disBoxs = false;
+        })
+        .catch(() => {
+          this.disabledBtn = false;
+        })
+        .finally(() => {
+          this.$modal.closeLoading();
+        });
     },
-    submitForms() {},
     moreActive() {
+      this.cataid = "";
+      this.streamAddType = 1;
       this.disBoxs = true;
     },
     getMessage() {
@@ -762,6 +810,39 @@ export default {
 </script>
 
 <style lang="less" scoped>
+.mat-TOP {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  margin-top: 20px;
+}
+.radioSty {
+  display: inline-block;
+  width: 14px;
+  height: 14px;
+  border-radius: 50%;
+  border: 1px solid #666;
+  margin-right: 6px;
+  position: relative;
+  transition: all 0.2s;
+}
+.isActives {
+  position: absolute;
+  top: 50%;
+  left: 50%;
+  transform: translateX(-50%) translateY(-50%);
+  width: 8px;
+  height: 8px;
+  border-radius: 50%;
+  background-color: #f56c6c;
+}
+.fade-enter-active,
+.fade-leave-active {
+  transition: opacity 0.2s;
+}
+.fade-enter, .fade-leave-to /* .fade-leave-active below version 2.1.8 */ {
+  opacity: 0;
+}
 .max-heightSty {
   max-height: 500px;
   overflow-y: auto;

+ 9 - 1
src/views/resource/videoManagement/moduleManagement/edit/index.vue

@@ -227,7 +227,7 @@
         </el-form-item>
         <el-form-item>
           <el-button @click="backPage">取消</el-button>
-          <el-button type="primary" @click="submit('listData')">确定</el-button>
+          <el-button type="primary" @click="submit('listData')" :disabled="!noStudent">确定</el-button>
         </el-form-item>
       </el-form>
     </div>
@@ -430,6 +430,7 @@ export default {
       },
       disCheckList: [], //已选转禁用复选列表
       activeLists: [],
+      noStudent:true
     };
   },
   watch: {
@@ -441,6 +442,13 @@ export default {
     },
   },
   async mounted() {
+    this.$api
+      .gradecheckGoodsChange({ moduleId: this.$route.query.id })
+      .then((res) => {
+        if (res.data > 0) {
+          this.noStudent = false;
+        }
+      });
     await this.getDict();
     this.search();
   },

+ 44 - 34
src/views/resource/videoManagement/moduleManagement/index.vue

@@ -37,7 +37,7 @@ import searchBoxNew from "@/components/searchBoxNew";
 import tableList from "@/components/tableList";
 import pagination from "@/components/pagination";
 export default {
-  name:"ModuleManagement",
+  name: "ModuleManagement",
   components: { searchBoxNew, tableList, pagination },
   data() {
     return {
@@ -48,7 +48,7 @@ export default {
         ch: "条",
         num: false,
         choice: true,
-        border:true,
+        border: true,
         addHide: false,
         backFatherBtn: {
           status: false,
@@ -138,7 +138,7 @@ export default {
           hidden: true,
           scope: "aboutChapter",
           width: "150",
-          int:3
+          int: 3,
         },
         {
           label: "章总数",
@@ -170,8 +170,8 @@ export default {
   mounted() {
     this.search();
   },
-  activated(){
-    this.search()
+  activated() {
+    this.search();
   },
   methods: {
     editInfo(v) {
@@ -189,41 +189,51 @@ export default {
           pageNum: 1,
         };
       }
-      this.$api.inquireCourseListmodule(this.formData).then((res) => {
-        this.tableData = res.rows;
-        this.total = res.total;
-        this.navText.index = res.total;
-      }).finally(()=>{
-        this.loading = false;
-      })
+      this.$api
+        .inquireCourseListmodule(this.formData)
+        .then((res) => {
+          this.tableData = res.rows;
+          this.total = res.total;
+          this.navText.index = res.total;
+        })
+        .finally(() => {
+          this.loading = false;
+        });
     },
     init() {
       this.search(2);
     },
     del(v) {
-      this.$alert(
-        "确定删除此内容?<br />内容删除后将无法恢复,请慎重考虑",
-        "提示",
-        {
-          dangerouslyUseHTMLString: true,
+      this.$api.gradecheckGoodsChange({ moduleId: v.moduleId }).then((res) => {
+        if (res.data > 0) {
+          this.$message.error("已有学员正在学习该模块,无法删除");
+          return;
+        } else {
+          this.$alert(
+            "确定删除此内容?<br />内容删除后将无法恢复,请慎重考虑",
+            "提示",
+            {
+              dangerouslyUseHTMLString: true,
+            }
+          )
+            .then(() => {
+              var data = {
+                moduleId: v.moduleId,
+                status: -1,
+              };
+              this.$api.editCoursemodule(data).then((res) => {
+                this.$message.success("删除成功");
+                this.search();
+              });
+            })
+            .catch(() => {
+              this.$message({
+                type: "info",
+                message: "已取消删除",
+              });
+            });
         }
-      )
-        .then(() => {
-          var data = {
-            moduleId: v.moduleId,
-            status: -1,
-          };
-          this.$api.editCoursemodule(data).then((res) => {
-            this.$message.success("删除成功");
-            this.search();
-          });
-        })
-        .catch(() => {
-          this.$message({
-            type: "info",
-            message: "已取消删除",
-          });
-        });
+      });
     },
     addClick(v, int) {
       if (v === undefined) {

+ 378 - 0
src/views/systemManagement/auditManagement/assignReviewers/index.vue

@@ -0,0 +1,378 @@
+<template>
+  <div id="assignReviewers">
+    <div class="floatSty">
+      <div class="headsty">资料审核管理</div>
+      <div class="dis_sty">
+        <div class="btnSty" @click="getInfo(1)">填写资料审核</div>
+        <div class="btnSty" @click="getInfo(2)">盖章资料审核</div>
+      </div>
+    </div>
+    <div class="floatSty">
+      <div class="headsty">班级管理</div>
+      <div class="dis_sty">
+        <div class="btnSty" @click="getInfo(3)">学时审核</div>
+      </div>
+    </div>
+    <div style="clear: both"></div>
+    <el-dialog
+      :visible.sync="dialogVisible"
+      width="610px"
+      :show-close="false"
+      :close-on-click-modal="false"
+    >
+      <div slot="title" class="hearders">
+        <div class="leftTitle">{{ getName(statePop) }}</div>
+        <div class="rightBoxs">
+          <img
+            src="@/assets/images/Close@2x.png"
+            alt=""
+            @click="dialogVisible = false"
+          />
+        </div>
+      </div>
+      <div>
+        <el-row :gutter="20">
+          <el-col :span="12" class="leftBox">
+            <div
+              v-for="(item, index) in educationType"
+              :key="index"
+              style="margin-bottom: 6px"
+            >
+              <div
+                @click="getFist(item.id)"
+                style="cursor: pointer; margin-bottom: 6px"
+              >
+                <i
+                  :class="
+                    item.id === activeFist
+                      ? 'el-icon-caret-bottom'
+                      : 'el-icon-caret-right'
+                  "
+                ></i>
+                {{ item.onlyName }}
+              </div>
+              <ul
+                v-if="item.id === activeFist"
+                style="margin: 0px; padding-left: 18px"
+              >
+                <li
+                  v-for="(items, indexs) in item.children"
+                  :key="indexs"
+                  style="margin-bottom: 4px; cursor: pointer"
+                  :style="active === items.id ? 'color:red;' : ''"
+                  @click="getapiUserList(items.id)"
+                >
+                  {{ items.onlyName }}
+                </li>
+                <li v-if="!item.children.length" style="color: blue">
+                  暂无选项
+                </li>
+              </ul>
+            </div>
+          </el-col>
+          <el-col :span="12" v-if="active">
+            <el-select
+              v-model="activeUserid"
+              placeholder="请选择审核人"
+              @change="editUserList"
+            >
+              <el-option
+                v-for="(item, index) in options"
+                :key="index"
+                :label="item.nickName"
+                :value="item.userId"
+                :disabled="newUserList.indexOf(item.userId) !== -1"
+              >
+              </el-option>
+            </el-select>
+            <ul style="max-height: 300px; overflow: auto">
+              <li
+                v-for="(item, index) in newUserList"
+                :key="index"
+                class="userName"
+              >
+                {{ getuserName(item) }}
+                <i
+                  class="el-icon-error clearSty"
+                  @click="newUserList.splice(index, 1)"
+                ></i>
+                <div style="clear: both"></div>
+              </li>
+            </ul>
+            <div style="text-align: center">
+              <el-button size="mini" @click="submits">确定</el-button>
+            </div>
+          </el-col>
+        </el-row>
+      </div>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="dialogVisible = false">取 消</el-button>
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+export default {
+  data() {
+    return {
+      dialogVisible: false,
+      statePop: "",
+      educationType: [],
+      options: [], //审核人列表
+      activeFist: "", //当前选中教育类型ID
+      active: "", //当前选中业务层次ID
+      activeUserid: "",
+      newUserList: [], //审核人索引值
+    };
+  },
+  mounted() {
+    this.getTypes();
+  },
+  methods: {
+    getFist(int) {
+      if (this.activeFist === int) {
+        this.activeFist = "";
+      } else {
+        this.activeFist = int;
+      }
+    },
+    submits() {
+      if (!this.newUserList.length) {
+        this.$message.warning("请选择指派审核人");
+        return;
+      }
+      /**
+       * 提交api
+       */
+      this.$message.success("指派成功");
+    },
+    editUserList(int) {
+      this.newUserList.push(int);
+      this.activeUserid = "";
+    },
+    /**
+     * 点击业务层次获取对应审核人
+     */
+    getapiUserList(id) {
+      this.active = id;
+    },
+    /**
+     * 获取教育类型及业务层次
+     */
+    getTypes() {
+      this.$api.inquireCourseEducationType({ status: 1 }).then((res) => {
+        this.$api.inquirebusinessList({ status: 1 }).then((result) => {
+          result.rows.forEach((items) => {
+            items.onlyName = items.projectName + "-" + items.businessName;
+            res.rows.forEach((ite, ide) => {
+              ite.onlyName = ite.educationName;
+              ite.checked = false;
+              if (!ite.children) {
+                ite.children = [];
+              }
+              if (items.educationId === ite.id) {
+                ite.children.push(items);
+              }
+            });
+          });
+          this.educationType = res.rows;
+        });
+      });
+      this.$api.obtainUserList({ status: 1 }).then((res) => {
+        this.options = res.rows;
+      });
+    },
+    /**
+     * 获取标题
+     */
+    getName(int) {
+      var ast = "";
+      switch (int) {
+        case 1:
+          ast = "填写资料审核-指派审核人";
+          break;
+        case 2:
+          ast = "盖章资料审核-指派审核人";
+          break;
+        case 3:
+          ast = "学时审核-指派审核人";
+          break;
+        default:
+          break;
+      }
+      return ast;
+    },
+    /**
+     * 转换审核人名字
+     */
+    getuserName(int) {
+      var ast = "";
+      for (let i = 0; i < this.options.length; i++) {
+        if (this.options[i].userId === int) {
+          return this.options[i].nickName;
+        }
+      }
+    },
+    getInfo(int) {
+      this.statePop = int;
+      (this.activeFist = ""), (this.active = ""); //当前选中业务层次ID
+      this.activeUserid = "";
+      this.newUserList = []; //审核人索引值
+      this.dialogVisible = true;
+      console.log(this.educationType, this.businessLevel);
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.leftBox {
+  border: 1px solid #999;
+  border-radius: 4px;
+  overflow-y: auto;
+  max-height: 400px;
+  padding: 10px;
+}
+.floatSty {
+  float: left;
+  margin-right: 20px;
+  margin-bottom: 20px;
+  border-radius: 4px;
+  overflow: hidden;
+  border: 1px solid #999;
+  .headsty {
+    height: 30px;
+    line-height: 30px;
+    background-color: #eee;
+    color: #333;
+    text-align: center;
+    font-size: 14px;
+  }
+  .dis_sty {
+    display: flex;
+    flex-direction: column;
+    align-items: center;
+    padding: 20px;
+    .btnSty {
+      padding: 0px 10px;
+      height: 28px;
+      line-height: 28px;
+      text-align: center;
+      border-radius: 4px;
+      border: 1px solid #999;
+      font-size: 14px;
+      margin-bottom: 10px;
+      cursor: pointer;
+      transition: all 0.2s;
+      &:hover {
+        background-color: #f4f4f4;
+      }
+    }
+  }
+}
+/deep/.el-button {
+  border-radius: 8px;
+}
+/deep/.el-dialog {
+  border-radius: 8px;
+  .el-dialog__header {
+    padding: 0;
+    .hearders {
+      height: 40px;
+      display: flex;
+      align-items: center;
+      justify-content: space-between;
+      padding: 0px 18px 0px 20px;
+      border-bottom: 1px solid #e2e2e2;
+      .leftTitle {
+        font-size: 14px;
+        font-weight: bold;
+        color: #2f4378;
+      }
+      .rightBoxs {
+        display: flex;
+        align-items: center;
+        img {
+          width: 14px;
+          height: 14px;
+          margin-left: 13px;
+          cursor: pointer;
+        }
+      }
+    }
+  }
+  .el-dialog__footer {
+    padding: 0;
+    .dialog-footer {
+      padding: 0px 40px;
+      height: 70px;
+      border-top: 1px solid #e2e2e2;
+      display: flex;
+      align-items: center;
+      justify-content: flex-end;
+    }
+  }
+}
+.imgBox {
+  width: 100%;
+  // height: 210px;
+  border: 1px solid #e2e2e2;
+  border-radius: 8px;
+  padding: 8px 8px 3px;
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  .imgLabel {
+    flex: 1;
+    width: 100%;
+    border: 1px dotted #e2e2e2;
+    color: #999;
+    font-size: 14px;
+    cursor: pointer;
+    border-radius: 8px;
+    .msPhoto {
+      display: flex;
+      justify-content: center;
+      align-items: center;
+      max-width: 100%;
+      max-height: 270px;
+      img {
+        max-width: 100%;
+        max-height: 270px;
+      }
+    }
+    .imgbbx {
+      display: flex;
+      flex-direction: column;
+      align-items: center;
+      justify-content: center;
+      width: 100%;
+      height: 100%;
+      i {
+        font-weight: bold;
+        margin: 14px 0;
+        font-size: 24px;
+      }
+    }
+  }
+  p {
+    margin: 5px 0px;
+  }
+}
+.userName {
+  float: left;
+  border-radius: 4px;
+  border: 1px solid #999;
+  margin: 0px 6px 6px 0px;
+  padding: 0px 8px;
+  height: 26px;
+  line-height: 26px;
+  font-size: 14px;
+  .clearSty {
+    color: red;
+    cursor: pointer;
+    font-size: 14px;
+  }
+}
+</style>

+ 107 - 2
src/views/systemManagement/roleManagement/index.vue

@@ -42,7 +42,7 @@
       <div>
         <el-form
           label-position="right"
-          label-width="80px"
+          label-width="100px"
           :model="listData"
           :rules="rules"
           ref="listData"
@@ -87,7 +87,33 @@
                 show-checkbox
                 ref="menu"
                 node-key="id"
-                :check-strictly="!listData.menuCheckStrictly"
+                empty-text="加载中,请稍后"
+                :props="defaultProps"
+              ></el-tree>
+            </div>
+            <div v-else-if="items.scope === 'treeInfo'">
+              <el-checkbox
+                v-model="menuExpandInfo"
+                @change="handleCheckedTreeExpandInfo($event, 'info')"
+                >展开/折叠</el-checkbox
+              >
+              <el-checkbox
+                v-model="menuNodeAll"
+                @change="handleCheckedTreeNodeAllInfo($event, 'info')"
+                >全选/全不选</el-checkbox
+              >
+              <!-- <el-checkbox
+                v-model="listData.menuCheckStrictly"
+                @change="handleCheckedTreeConnect($event, 'menu')"
+                >父子联动</el-checkbox
+              > -->
+              <!-- :check-strictly="!listData.menuCheckStrictly"👇 -->
+              <el-tree
+                class="tree-border"
+                :data="menuOptionsInfo"
+                show-checkbox
+                ref="info"
+                node-key="onlyId"
                 empty-text="加载中,请稍后"
                 :props="defaultProps"
               ></el-tree>
@@ -136,6 +162,7 @@ export default {
   components: { searchBox, tableList, pagination },
   data() {
     return {
+      keys: [],
       loading: false, //当前表单加载是否加载动画
       navText: {
         title: "角色管理",
@@ -218,11 +245,14 @@ export default {
       currentPage: 1, //当前页码
       menuExpand: false,
       menuNodeAll: false,
+      menuExpandInfo: false,
+      menuNodeAllInfo: false,
       defaultProps: {
         children: "children",
         label: "label",
       },
       menuOptions: [], //菜单列表
+      menuOptionsInfo: [], //数据池列表
       // 弹窗字段
       listitem: [
         {
@@ -258,6 +288,11 @@ export default {
           prop: "menuIds",
           scope: "tree",
         },
+        {
+          label: "数据池权限",
+          prop: "keys",
+          scope: "treeInfo",
+        },
         {
           label: "备注",
           prop: "remark",
@@ -350,6 +385,7 @@ export default {
       if (v === undefined) {
         self.statusPop = 1;
         self.getMenuList();
+        self.getMenuListInfo();
         self.dialogVisible = true;
         self.$nextTick(() => {
           self.$refs.listData.clearValidate();
@@ -368,6 +404,14 @@ export default {
             });
             self.listData = res.data;
             self.dialogVisible = true;
+            await self.getMenuListInfo();
+            if (res.data.businessIds) {
+              res.data.businessIds.forEach((v) => {
+                self.$nextTick(() => {
+                  self.$refs.info[0].setChecked("yw-" + v, true, false);
+                });
+              });
+            }
             self.$nextTick(() => {
               self.$refs.listData.clearValidate();
             });
@@ -380,6 +424,33 @@ export default {
         this.menuOptions = res.data;
       });
     },
+    getMenuListInfo() {
+      var self = this;
+      return new Promise((resolve, reject) => {
+        var ary1 = [];
+        self.$api.inquireCourseEducationType({ status: 1 }).then((res) => {
+          res.rows.forEach((item) => {
+            item.label = item.educationName;
+            item.onlyId = "jy-" + item.id;
+            item.children = [];
+          });
+          ary1 = res.rows;
+          self.$api.inquirebusinessList({ status: 1 }).then((result) => {
+            result.rows.forEach((items) => {
+              items.label = items.projectName + items.businessName;
+              items.onlyId = "yw-" + items.id;
+              ary1.forEach((ite) => {
+                if (items.educationId === ite.id) {
+                  ite.children.push(items);
+                }
+              });
+            });
+            self.menuOptionsInfo = ary1;
+            resolve();
+          });
+        });
+      });
+    },
     getUserMenuList(v) {
       return new Promise((resolve, reject) => {
         this.$api.roleMenuTreeselect(v).then((result) => {
@@ -398,6 +469,7 @@ export default {
     },
     rulesTableSumbit() {
       this.listData.menuIds = this.getMenuAllCheckedKeys();
+      this.listData.businessIds = this.getMenuAllCheckedKeysInfo();
       var data = this.listData;
       if (this.statusPop === 1) {
         this.$api.addRole(data).then((res) => {
@@ -476,6 +548,24 @@ export default {
         this.$refs.menu[0].setCheckedNodes(value ? this.menuOptions : []);
       }
     },
+    // 数据池树权限(展开/折叠)
+    handleCheckedTreeExpandInfo(value, type) {
+      console.log(this.$refs.info);
+      if (type == "info") {
+        let treeList = this.menuOptionsInfo;
+        for (let i = 0; i < treeList.length; i++) {
+          this.$refs.info[0].store.nodesMap[treeList[i].onlyId].expanded =
+            value;
+        }
+      }
+    },
+    // 数据池树权限(全选/全不选)
+    handleCheckedTreeNodeAllInfo(value, type) {
+      console.log(this.$refs.info);
+      if (type == "info") {
+        this.$refs.info[0].setCheckedNodes(value ? this.menuOptionsInfo : []);
+      }
+    },
     // 树权限(父子联动)
     handleCheckedTreeConnect(value, type) {
       if (type == "menu") {
@@ -492,6 +582,21 @@ export default {
       checkedKeys.unshift.apply(checkedKeys, halfCheckedKeys);
       return checkedKeys;
     },
+    getMenuAllCheckedKeysInfo() {
+      // 目前被选中的菜单节点
+      let checkedKeys = this.$refs.info[0].getCheckedKeys();
+      // 半选中的菜单节点
+      let halfCheckedKeys = this.$refs.info[0].getHalfCheckedKeys();
+      checkedKeys.unshift.apply(checkedKeys, halfCheckedKeys);
+      let ary = [];
+      checkedKeys.forEach((item) => {
+        var ast = item.split("-");
+        if (ast[0] === "yw") {
+          ary.push(parseInt(ast[1]));
+        }
+      });
+      return ary;
+    },
     handleSizeChange(v) {
       this.pageSize = v;
       this.currentPage = 1;

部分文件因为文件数量过多而无法显示