Tang преди 3 години
родител
ревизия
3838523548

+ 3 - 0
.env.production

@@ -7,3 +7,6 @@ ENV = 'production'
 # 中正云教育管理后台/生产环境
 VUE_APP_BASE_API = 'https://cloud.xyyxt.net/'
 VUE_APP_IMG_API = 'https://file.xyyxt.net'
+
+# 路由懒加载
+VUE_CLI_BABEL_TRANSPILE_MODULES = true

+ 4 - 0
.env.staging

@@ -8,4 +8,8 @@ ENV = 'staging'
 
 # 中正云教育管理后台/预发布环境
 VUE_APP_BASE_API = 'http://120.79.166.78:19007/'
+VUE_APP_BASE_API1 = 'http://192.168.1.222:5030/'
 VUE_APP_IMG_API = 'https://file-dev.xyyxt.net'
+
+# 路由懒加载
+VUE_CLI_BABEL_TRANSPILE_MODULES = true

+ 1 - 2
public/index.html

@@ -11,8 +11,7 @@
     <%= webpackConfig.name %>
   </title>
   <!--[if lt IE 11]><script>window.location.href='/html/ie.html';</script><![endif]-->
-
-  <script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.2.4/gsap.min.js"></script>
+  <script src="https://manage.xyyxt.net/static/js/gsap.min.js"></script>
   <style>
     html,
     body,

+ 19 - 6
src/components/tableList.vue

@@ -976,7 +976,9 @@
           </span>
           <div
             v-else-if="item.scope === 'RealPrice'"
-            :style="scope.row[item.prop2] != null ? 'color:rgb(132, 0, 255);' : ''"
+            :style="
+              scope.row[item.prop2] != null ? 'color:rgb(132, 0, 255);' : ''
+            "
           >
             ¥{{ scope.row[item.prop1] }}
             <span v-if="scope.row[item.prop2] != null">
@@ -1213,6 +1215,15 @@
             @click="editInfo(scope.row)"
             >{{ scope.row[item.prop] }}
           </span>
+          <div v-else-if="item.scope === 'editName'">
+            <span>{{ scope.row[item.prop] }}</span>
+            <el-button
+              style="margin-left: 6px"
+              type="text"
+              @click="editInfo(scope.row, 2)"
+              >修改</el-button
+            >
+          </div>
           <span
             class="editInfoSty"
             v-else-if="item.scope === 'editInfoMore'"
@@ -1460,14 +1471,14 @@
           <div v-else-if="item.scope === 'priceRed'" style="color: red">
             ¥{{ scope.row[item.prop] ? scope.row[item.prop] : 0 }}
           </div>
-          <div v-else
-            >{{ scope.row[item.prop] }}
+          <div v-else>
+            {{ scope.row[item.prop] }}
             {{
               (scope.row[item.prop] || scope.row[item.prop] === 0) && item.ch
                 ? item.ch
                 : ""
-            }}</div
-          >
+            }}
+          </div>
         </template>
       </af-table-column>
 
@@ -2618,7 +2629,9 @@ export default {
       this.$emit("load", tree, treeNode, resolve);
     },
     editInfo(option, int) {
-      if (int === 3) {
+      if (int === 2) {
+        this.$emit("editName", option);
+      } else if (int === 3) {
         this.$emit("aboutGoods", option);
       } else {
         this.$emit("editInfo", option);

+ 13 - 23
src/views/2Cport/filterItemSettings/index.vue

@@ -14,17 +14,12 @@
           :default-checked-keys="item.activeKeyId"
         >
           <span class="custom-tree-node" slot-scope="{ node }">
-            <span>{{ node.label }}</span>
-            <label v-if="node.data.projectId" @click.stop="&quot;&quot;;"
-              ><span style="font-size:14px">显示标题:</span>
-              <el-input
-                style="max-width: 140px"
-                :size="size"
-                v-model="node.data.aliasName"
-                placeholder="请输入标题"
-              >
-              </el-input>
-            </label>
+            <span
+              >{{ node.label }}
+              <span v-if="node.data.projectId"
+                >(别名:{{ node.data.aliasName }})</span
+              ></span
+            >
           </span>
         </el-tree>
       </div>
@@ -162,16 +157,16 @@ export default {
         this.getInitEduSet().then((list) => {
           return resolve(list);
         });
-      }else if (node.level === 1) {
+      } else if (node.level === 1) {
         this.getInitBusSet(node.data.id).then((list) => {
           return resolve(list);
         });
-      }else if (node.level === 2) {
+      } else if (node.level === 2) {
         this.getInitSubjectSet(node.data.id, node.data.keyId).then((list) => {
           return resolve(list);
         });
-      }else{
-          return resolve([]);
+      } else {
+        return resolve([]);
       }
     },
     /**
@@ -193,7 +188,6 @@ export default {
             educationId: item.educationId,
             projectId: item.projectId,
             businessId: item.id,
-            aliasName: item.aliasName,
             status: 1,
             subjectIds: [],
             keyId: item.keyId,
@@ -211,10 +205,6 @@ export default {
         });
       });
       for (let i = 0; i < BusList.length; i++) {
-        if (!BusList[i].aliasName) {
-          this.$message.error("请填写显示标题");
-          return;
-        }
         BusList[i].subjectIds = BusList[i].subjectIds.toString();
         delete BusList[i].keyId;
       }
@@ -258,9 +248,9 @@ export default {
 .margin_bth {
   text-align: center;
 }
-.over_flow{
-    max-height: 76vh;
-    overflow: auto;
+.over_flow {
+  max-height: 76vh;
+  overflow: auto;
 }
 /deep/ .el-tree-node__content {
   margin: 4px 0px;

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

@@ -795,7 +795,7 @@ export default {
     checkSubmitInfo() {
       this.$api.gradecheckGoodsChange({ goodsId: this.goodsId }).then((res) => {
         if (res.data > 0) {
-          this.submitStatusInfo = true;
+          // this.submitStatusInfo = true;
         }
       });
     },

+ 31 - 1
src/views/education/classManageMent/classHoursReview/studyTimes.vue

@@ -3,6 +3,32 @@
     <div class="top_style">
       <header>
         <div class="left"><i></i><span>学员信息</span></div>
+        <span style="margin-left: 10px"
+          ><strong style="color: red">「1」</strong>所购商品:{{
+            userData.goodsName
+          }}</span
+        >
+        <span style="margin-left: 10px"
+          ><strong style="color: red">「2」</strong>所在班级:{{
+            userData.className
+          }}</span
+        >
+        <span style="margin-left: 10px"
+          ><strong style="color: red">「3」</strong>学时:{{
+            userData.classHours
+          }}</span
+        >
+        <span style="margin-left: 10px"
+          ><strong style="color: red">「4」</strong>完成{{
+            userData.stuAllNum + userData.recordNum
+          }}节的内容学习</span
+        >
+        <span style="margin-left: 10px"
+          ><strong style="color: red">「5」</strong>学习时间:{{
+            $methodsTools.onlyForma(userData.studyStartTime, false)
+          }}
+          - {{ $methodsTools.onlyForma(userData.studyEndTime, false) }}</span
+        >
         <el-button type="primary" size="mini" @click="showBox = !showBox">{{
           showBox ? "收起" : "展开"
         }}</el-button>
@@ -1937,6 +1963,10 @@ export default {
         font-weight: bold;
       }
     }
+
+    & > span {
+      font-size: 14px;
+    }
   }
   & > .info_img {
     display: flex;
@@ -2036,7 +2066,7 @@ export default {
   }
   .s_sd {
     flex: 1;
-    justify-content:flex-end;
+    justify-content: flex-end;
     display: flex;
     align-items: center;
     flex-shrink: 0;

+ 689 - 0
src/views/education/classManageMent/hoursTimesRecord/index.vue

@@ -0,0 +1,689 @@
+<template>
+  <div id="hoursTimesRecord">
+    <div class="top_style">
+      <header>
+        <div class="left"><i></i><span>学员信息</span></div>
+        <span style="margin-left: 10px"
+          ><strong style="color: red">「1」</strong>所购商品:{{
+            objs.goodsName
+          }}</span
+        >
+        <span style="margin-left: 10px"
+          ><strong style="color: red">「2」</strong>所在班级:{{
+            objs.className
+          }}</span
+        >
+        <span style="margin-left: 10px"
+          ><strong style="color: red">「3」</strong>学时:{{
+            objs.classHours
+          }}</span
+        >
+        <span style="margin-left: 10px"
+          ><strong style="color: red">「4」</strong>完成{{
+            userData.stuAllNum + userData.recordNum
+          }}节的内容学习</span
+        >
+        <span style="margin-left: 10px"
+          ><strong style="color: red">「5」</strong>学习时间:{{
+            $methodsTools.onlyForma(userData.studyStartTime, false)
+          }}
+          - {{ $methodsTools.onlyForma(userData.studyEndTime, false) }}</span
+        >
+        <el-button type="primary" size="mini" @click="showBox = !showBox">{{
+          showBox ? "收起" : "展开"
+        }}</el-button>
+      </header>
+      <div class="info_img" v-show="showBox">
+        <ul>
+          <li>学员编码:{{ userData.studentCode }}</li>
+          <li>学员姓名:{{ userData.realName }}</li>
+          <li>学员身份证号码:{{ userData.idCard }}</li>
+          <li>绑定手机号码:{{ userData.telPhone }}</li>
+        </ul>
+        <div class="img_by">
+          <div class="photoSty1">
+            <img
+              v-if="!userData.oneInchPhotos"
+              src="@/assets/images/peopleImg.png"
+              alt=""
+            />
+            <el-image
+              v-else
+              style="width: 100%; height: 100%"
+              :src="$methodsTools.splitImgHost(userData.oneInchPhotos)"
+              :preview-src-list="[
+                $methodsTools.splitImgHost(userData.oneInchPhotos),
+              ]"
+            >
+            </el-image>
+            <div class="pos_bottom">一寸头像图</div>
+          </div>
+          <div class="photoSty2">
+            <img
+              v-if="!userData.idCardImg1"
+              src="@/assets/images/idcardF.png"
+              alt=""
+            />
+            <el-image
+              v-else
+              style="width: 100%; height: 100%"
+              :src="$methodsTools.splitImgHost(userData.idCardImg1)"
+              :preview-src-list="[
+                $methodsTools.splitImgHost(userData.idCardImg1),
+              ]"
+            >
+            </el-image>
+            <div class="pos_bottom">身份证头像照</div>
+          </div>
+          <div class="photoSty2" style="margin-right: 0px">
+            <img
+              v-if="!userData.idCardImg2"
+              src="@/assets/images/idcardZ.png"
+              alt=""
+            />
+            <el-image
+              v-else
+              style="width: 100%; height: 100%"
+              :src="$methodsTools.splitImgHost(userData.idCardImg2)"
+              :preview-src-list="[
+                $methodsTools.splitImgHost(userData.idCardImg2),
+              ]"
+            >
+            </el-image>
+            <div class="pos_bottom">身份证国徽照</div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <el-tabs
+      style="margin-top: 14px"
+      v-if="show"
+      v-model="activeCourseId"
+      type="card"
+      :before-leave="changeActiveCourseIdFunc"
+    >
+      <el-tab-pane
+        v-for="(item, index) in courseList"
+        :key="index"
+        :label="item.courseName"
+        :name="item.courseId + ''"
+      ></el-tab-pane>
+    </el-tabs>
+    <div class="footerTableStyle">
+      <el-table
+        v-if="!loading"
+        v-loading="loading"
+        ref="multipleTable"
+        :data="tableData"
+        border
+        :span-method="objectSpanMethod"
+        :header-cell-style="{
+          'background-color': '#CCDDF7',
+          padding: '2px',
+          color: '#0047D0',
+          'border-right-color': '#0047D0',
+          'border-left-color': '#0047D0',
+        }"
+      >
+        <el-table-column
+          v-for="(item, index) in tableList"
+          :width="item.width"
+          :key="index"
+          :label="item.label"
+          align="center"
+          :show-overflow-tooltip="true"
+          header-align="center"
+        >
+          <template slot-scope="scope">
+            <span v-if="item.scope === 'status'">
+              {{
+                scope.row[item.prop] == 1
+                  ? "及格"
+                  : scope.row[item.prop] == 0
+                  ? "不及格"
+                  : ""
+              }}
+            </span>
+            <span v-else-if="item.scope === 'sectionType'">
+              {{
+                scope.row[item.prop] == 1
+                  ? "录播"
+                  : scope.row[item.prop] == 2
+                  ? "直播"
+                  : scope.row[item.prop] == 3
+                  ? "回放"
+                  : scope.row[item.prop] == 4
+                  ? "题卷"
+                  : ""
+              }}
+            </span>
+            <div v-else-if="item.scope === 'moreTime'">
+              {{ $methodsTools.onlyForma(scope.row[item.prop1]) }} -
+              {{ $methodsTools.onlyForma(scope.row[item.prop2]) }}
+            </div>
+            <span v-else-if="item.scope === 'durationTime'">
+              {{
+                scope.row[item.prop]
+                  ? $methodsTools.secondToDate(scope.row[item.prop], false)
+                  : ""
+              }}
+            </span>
+            <span v-else-if="item.scope === 'score'">
+              {{ scope.row[item.prop] ? scope.row[item.prop] + "分" : "" }}
+            </span>
+            <span v-else>{{ scope.row[item.prop] }}</span></template
+          >
+        </el-table-column>
+      </el-table>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  name: "HoursTimesRecord",
+  data() {
+    return {
+      size: "medium",
+      loading: false,
+      userData: {},
+      tableList: [
+        {
+          label: "模块标题",
+          prop: "moduleName",
+        },
+        {
+          label: "章标题",
+          prop: "chapterName",
+        },
+        {
+          label: "节标题",
+          prop: "sectionName",
+        },
+        {
+          label: "学习类型",
+          prop: "sectionType",
+          scope: "sectionType",
+        },
+        {
+          label: "节时长",
+          prop: "durationTime",
+          scope: "durationTime",
+        },
+        {
+          label: "学习/做题的次数",
+          prop: "newVisitNum",
+          width: "140px",
+        },
+        {
+          label: "学习/做题时间",
+          prop1: "studyStartTime",
+          prop2: "studyEndTime",
+          scope: "moreTime",
+          width: "310px",
+        },
+        {
+          label: "学习/做题状态",
+          prop: "status",
+          scope: "status",
+          width: "140px",
+        },
+        {
+          label: "做题成绩",
+          prop: "score",
+          scope: "score",
+        },
+        {
+          label: "做题正确率",
+          prop: "rightRate",
+        },
+      ],
+      tableData: [],
+      formData: {},
+      total: 0,
+      showBox: true,
+      //路由参数
+      objs: {},
+      //课程列表
+      courseList: [],
+      //选中课程Id
+      activeCourseId: "",
+      //等待获取课程成功后渲染
+      show: false,
+      typeNameArr: [],
+      typeNamePos: 0,
+      storeArr: [],
+      storePos: 0,
+      feeArr: [],
+      feePos: 0,
+    };
+  },
+  created() {
+    this.objs = this.$route.query;
+  },
+  mounted() {
+    //获取用户信息
+    this.getUserInfo();
+    //获取课程列表
+    this.getGoodsCourseList(this.objs.goodsId).then((newName) => {
+      this.changeActiveCourseIdFunc(newName);
+    });
+  },
+  watch: {
+    tableData(val) {
+      this.merage();
+    },
+  },
+  methods: {
+    //获取商品课程列表
+    getGoodsCourseList(id) {
+      return new Promise((resolve, reject) => {
+        this.$api.obtainCourseSgoodsId(id).then((res) => {
+          if (res.rows.length > 0) {
+            this.courseList = res.rows;
+            this.activeCourseId = res.rows[0].courseId + "";
+            this.show = true;
+            resolve(res.rows[0].courseId + "");
+          } else {
+            this.$message.warning("查无该商品课程列表");
+            reject();
+          }
+        });
+      });
+    },
+    //获取用户信息
+    getUserInfo() {
+      this.$api
+        .inquireGradegradelistUserlistPeriod({
+          gradeId: this.objs.gradeId,
+          userId: this.objs.userId,
+          goodsId: this.objs.goodsId,
+        })
+        .then((res) => {
+          this.userData = res.rows[0];
+        });
+    },
+    //选中课程触发方法
+    changeActiveCourseIdFunc(newName, oldName) {
+      return new Promise((resolve, reject) => {
+        this.loading = true;
+        const data = {
+          gradeId: this.objs.gradeId,
+          userId: this.objs.userId,
+          goodsId: this.objs.goodsId,
+          courseId: newName,
+        };
+        this.$api
+          .gradegradelistUserStudyRecord(data)
+          .then((res) => {
+            if (res.code === 200) {
+              let COURSELISTMX = [];
+              res.rows.forEach((item) => {
+                if (item.recordList && item.recordList.length) {
+                  for (let i = 0; i < item.recordList.length; i++) {
+                    let ary = { ...item };
+                    ary.recordList[i].newVisitNum = i + 1;
+                    COURSELISTMX.push(Object.assign(ary, ary.recordList[i]));
+                  }
+                } else {
+                  if (item.studyStartTime || item.studyEndTime) {
+                    item.newVisitNum = 1;
+                  } else {
+                    item.newVisitNum = "未参与";
+                  }
+
+                  COURSELISTMX.push(item);
+                }
+              });
+              this.tableData = COURSELISTMX;
+              resolve();
+            } else {
+              reject();
+            }
+          })
+          .finally(() => {
+            this.loading = false;
+          });
+      });
+    },
+    merageInit() {
+      // 在下文的时候会用到,对数据进行初始化是很有必要的
+      this.typeNameArr = [];
+      this.typeNamePos = 0;
+      this.storeArr = [];
+      this.storePos = 0;
+      this.feeArr = [];
+      this.feePos = 0;
+    },
+    merage() {
+      this.merageInit(); // 前文的初始化数据函数
+      let arys = JSON.parse(JSON.stringify(this.tableData));
+      for (let i = 0; i < arys.length; i += 1) {
+        if (i === 0) {
+          // 第一行必须存在
+          this.typeNameArr.push(1);
+          this.typeNamePos = 0;
+          this.storeArr.push(1);
+          this.storePos = 0;
+          this.feeArr.push(1);
+          this.feePos = 0;
+        } else {
+          // 判断当前元素与上一个元素是否相同,eg:this.typeNamePos 是 this.typeNameArr序号
+          // 第一列 下面的是eslint的不限制语法
+          // eslint-disable-next-line no-lonely-if
+          if (arys[i].moduleName === arys[i - 1].moduleName) {
+            this.typeNameArr[this.typeNamePos] += 1;
+            this.typeNameArr.push(0);
+          } else {
+            this.typeNameArr.push(1);
+            this.typeNamePos = i;
+          }
+          // 第二列
+          if (
+            arys[i].chapterName === arys[i - 1].chapterName &&
+            arys[i].moduleName === arys[i - 1].moduleName
+          ) {
+            this.storeArr[this.storePos] += 1;
+            this.storeArr.push(0);
+          } else {
+            this.storeArr.push(1);
+            this.storePos = i;
+          }
+          // 第三列
+          if (
+            arys[i].sectionName === arys[i - 1].sectionName &&
+            arys[i].chapterName === arys[i - 1].chapterName &&
+            arys[i].moduleName === arys[i - 1].moduleName
+          ) {
+            this.feeArr[this.feePos] += 1;
+            this.feeArr.push(0);
+          } else {
+            this.feeArr.push(1);
+            this.feePos = i;
+          }
+        }
+      }
+    },
+    objectSpanMethod({ row, column, rowIndex, columnIndex }) {
+      if (columnIndex === 0) {
+        // 第一列的合并方法
+        const row1 = this.typeNameArr[rowIndex];
+        const col1 = row1 > 0 ? 1 : 0; // 如果被合并了row = 0; 则他这个列需要取消
+        return {
+          rowspan: row1,
+          colspan: col1,
+        };
+      } else if (columnIndex === 1) {
+        // 第二列的合并方法
+        const row2 = this.storeArr[rowIndex];
+        const col2 = row2 > 0 ? 1 : 0; // 如果被合并了row = 0; 则他这个列需要取消
+        return {
+          rowspan: row2,
+          colspan: col2,
+        };
+      } else if (columnIndex === 2) {
+        // 第三列的合并方法
+        const row3 = this.feeArr[rowIndex];
+        const col3 = row3 > 0 ? 1 : 0; // 如果被合并了row = 0; 则他这个列需要取消
+        return {
+          rowspan: row3,
+          colspan: col3,
+        };
+      }
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+#hoursTimesRecord {
+  display: flex;
+  flex-direction: column;
+  height: calc(100vh - 145px);
+}
+.footerTableStyle {
+  flex: 1;
+  overflow: auto;
+}
+.btn_styleShow {
+  float: right;
+}
+.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;
+  flex-shrink: 0;
+  .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);
+  }
+}
+.top_style {
+  background: #ffffff;
+  box-shadow: 0px 0px 8px 0px rgba(217, 217, 217, 0.8);
+  border-radius: 8px;
+  padding: 8px 16px;
+  & > header {
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+    height: 48px;
+    line-height: 48px;
+    & > span {
+      font-size: 14px;
+    }
+    & > .left {
+      display: flex;
+      align-items: center;
+      i {
+        display: inline-block;
+        width: 2px;
+        height: 18px;
+        background: #0c5dfb;
+        margin-right: 8px;
+      }
+      span {
+        color: #666;
+        font-weight: bold;
+      }
+    }
+  }
+  & > .info_img {
+    display: flex;
+    height: 210px;
+    ul {
+      width: 320px;
+      li {
+        margin-bottom: 12px;
+        font-size: 14px;
+      }
+    }
+    .img_by {
+      flex: 1;
+      display: flex;
+      align-items: center;
+      .pos_bottom {
+        position: absolute;
+        z-index: 1;
+        bottom: 0px;
+        width: 100%;
+        height: 32px;
+        background-color: rgba(53, 53, 53, 0.6);
+        text-align: center;
+        color: #fff;
+        font-size: 16px;
+        line-height: 32px;
+      }
+      & > .photoSty1 {
+        width: 152px;
+        height: 208px;
+        position: relative;
+        overflow: hidden;
+        border-radius: 8px;
+        background-color: #f5f5f5;
+        margin-right: 75px;
+        & > img {
+          width: 106px;
+          height: 150px;
+          margin: 29px auto 0px;
+          display: block;
+        }
+      }
+      & > .photoSty2 {
+        width: 328px;
+        height: 208px;
+        position: relative;
+        overflow: hidden;
+        border-radius: 8px;
+        background-color: #f5f5f5;
+        margin-right: 75px;
+        & > img {
+          width: 243px;
+          height: 154px;
+          margin: 27px auto 0px;
+          display: block;
+        }
+        &:last-of-type {
+          margin-right: 0px;
+        }
+      }
+    }
+  }
+}
+/deep/ .el-table{
+  border-radius: 8px;
+  overflow: hidden;
+}
+</style>

+ 86 - 78
src/views/education/classManageMent/learningHoursRecordList/index.vue

@@ -37,54 +37,6 @@
       @handleSizeChange="handleSizeChange"
       @handleCurrentChange="handleCurrentChange"
     />
-    <el-dialog
-      :visible.sync="vidBoxHours"
-      v-if="vidBoxHours"
-      width="1360px"
-      :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="vidBoxHours = false"
-          />
-        </div>
-      </div>
-      <div>
-        <hours-times-record :objs="objs" />
-      </div>
-      <span slot="footer" class="dialog-footer">
-        <el-button @click="vidBoxHours = false">取 消</el-button>
-      </span>
-    </el-dialog>
-    <el-dialog
-      :visible.sync="vidBox"
-      v-if="vidBox"
-      width="1360px"
-      :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="vidBox = false"
-          />
-        </div>
-      </div>
-      <div>
-        <study-times-record :objs="objs" />
-      </div>
-      <span slot="footer" class="dialog-footer">
-        <el-button @click="vidBox = false">取 消</el-button>
-      </span>
-    </el-dialog>
     <el-dialog
       @closed="loadingClose"
       :visible.sync="dialogDR"
@@ -121,8 +73,6 @@ import * as baseUrls from "@/utils/request.js";
 import searchBoxNew from "@/components/searchBoxNew";
 import tableList from "@/components/tableList";
 import pagination from "@/components/pagination";
-import studyTimesRecord from "./studyTimesRecord.vue";
-import hoursTimesRecord from "./hoursTimesRecord.vue";
 import exportTable from "./exportTable.vue";
 export default {
   name: "LearningHoursRecordList",
@@ -130,8 +80,6 @@ export default {
     searchBoxNew,
     tableList,
     pagination,
-    studyTimesRecord,
-    hoursTimesRecord,
     exportTable,
   },
   data() {
@@ -152,7 +100,6 @@ export default {
           title: "未定义",
         },
       },
-      objs: {},
       //搜索
       formList: [
         {
@@ -393,8 +340,6 @@ export default {
       ],
       tableData: [], //表单数据
       total: 0, //一共多少条
-      vidBox: false,
-      vidBoxHours: false,
     };
   },
   mounted() {
@@ -498,48 +443,111 @@ export default {
      * @remard 学习记录
      */
     activeHoursRecord(options) {
-      this.objs = {
-        gradeId: options.gradeId,
-        userId: options.userId,
-        goodsId: options.goodsId,
-        className: options.className,
-        classHours: options.classHours,
-        studyStartTime: options.studyStartTime,
-        studyEndTime: options.studyEndTime,
+      const jump = () => {
+        //班级详情
+        this.$router.push({
+          path: "hoursTimesRecord",
+          query: {
+            gradeId: options.gradeId,
+            userId: options.userId,
+            goodsId: options.goodsId,
+            goodsName: options.goodsName,
+            className: options.className,
+            classHours: options.classHours,
+            studyStartTime: options.studyStartTime,
+            studyEndTime: options.studyEndTime,
+          },
+        });
       };
-      this.vidBoxHours = true;
+      const statusPage = this.$store.state.tagsView.visitedViews.some(
+        (item) => {
+          return item.name == "HoursTimesRecord";
+        }
+      );
+      if (statusPage) {
+        this.$store
+          .dispatch("tagsView/delCachedView", {
+            name: "HoursTimesRecord",
+          })
+          .then((res) => {
+            jump();
+          });
+      } else {
+        jump();
+      }
     },
     /**
      *
      * @param {obj} int
      * @remard 学时记录
      */
-    activeStudyRecord(options) {
+    activeStudyRecord(v) {
       this.$api
         .inquireGradegradelockPeriodStatus({
-          gradeId: Number(options.gradeId),
-          userId: Number(options.userId),
-          goodsId: Number(options.goodsId),
+          gradeId: v.gradeId,
+          userId: v.userId,
+          goodsId: v.goodsId,
         })
         .then((res) => {
           if (res.msg) {
             this.$message.warning(res.msg + "正在操作");
             return;
           } else {
-            this.objs = {
-              id: options.gradeId,
-              gradeId: options.gradeId,
-              userId: options.userId,
-              goodsId: options.goodsId,
-              className: options.className,
-              classHours: options.classHours,
-              studyStartTime: options.studyStartTime,
-              studyEndTime: options.studyEndTime,
+            let data = {
+              userId: v.userId,
+              realName: v.realName,
+              id: v.gradeId,
+              className: v.className,
+              goodsId: v.goodsId,
+              goodsName: v.goodsName,
+              keyId: `${v.userId}-${v.goodsId}-${v.gradeId}`,
             };
-            this.vidBox = true;
+            console.log(data, v);
+            this.checkSession(data)
+              .then(() => {
+                //学员详情
+                this.$router.push({
+                  path: "classHoursReview",
+                });
+              })
+              .catch(() => {
+                this.$message.error("存在异常,请联系开发人员");
+              });
           }
         });
     },
+    checkSession(row) {
+      return new Promise((resolve, reject) => {
+        const SESSION = sessionStorage.getItem("hoursAudit");
+        try {
+          if (SESSION) {
+            let parseSession = JSON.parse(SESSION);
+            const STATUS = parseSession.options.some((item) => {
+              return (
+                item.userId == row.userId &&
+                item.goodsId == row.goodsId &&
+                item.id == row.id
+              );
+            });
+            if (!STATUS) {
+              parseSession.options.push(row);
+            }
+            parseSession.activeData = `${row.userId}-${row.goodsId}-${row.id}`;
+            sessionStorage.setItem("hoursAudit", JSON.stringify(parseSession));
+          } else {
+            let data = {
+              activeData: `${row.userId}-${row.goodsId}-${row.id}`,
+              options: [row],
+            };
+            sessionStorage.setItem("hoursAudit", JSON.stringify(data));
+          }
+
+          resolve();
+        } catch (error) {
+          reject();
+        }
+      });
+    },
     /**
      * 搜索列表
      */

+ 49 - 5
src/views/resource/baseManageInfos/resource/businessLevel/index.vue

@@ -18,6 +18,7 @@
       @editInfo="editInfo"
       @emitData="openPZDowm"
       @sortFunc="sortFunc"
+      @editName="editName"
     >
       <!-- <template slot="customize">
         <el-button size="small" type="success" @click="setOptions"
@@ -324,17 +325,20 @@ export default {
         },
         {
           label: "业务层次名称",
-          prop: "businessName",
+          prop1: "projectName",
+          prop2: "businessName",
+          scope: "InfoMore",
           hidden: true,
         },
         {
-          label: "教育类型",
-          prop: "educationName",
+          label: "业务层次别名",
+          prop: "aliasName",
           hidden: true,
+          scope: "editName",
         },
         {
-          label: "项目类型",
-          prop: "projectName",
+          label: "教育类型",
+          prop: "educationName",
           hidden: true,
         },
         {
@@ -478,6 +482,46 @@ export default {
     this.initPlate();
   },
   methods: {
+    /**
+     * 修改别名
+     */
+    editName(item) {
+      this.$prompt("请输入新别名", "修改", {
+        inputErrorMessage: "请输入内容",
+        inputValidator: (value) => {
+          if (value == null || value == "" || value == undefined) {
+            return false;
+          } else {
+            if (value.trim().length == 0) {
+              return false;
+            } else {
+              return true;
+            }
+          }
+        },
+        inputValue:item.aliasName,
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        beforeClose: (action, instance, done) => {
+          if (action === "confirm") {
+            let apiData = JSON.parse(JSON.stringify(item));
+            apiData.aliasName = instance.inputValue;
+            this.$api.editCourseBusiness(apiData).then((res) => {
+              done();
+              this.$store.commit("BUSINESSLEVEL");
+              this.search();
+            })
+          } else {
+            done();
+          }
+        },
+      })
+        .then(({ value }) => {
+          this.$message.success("修改成功");
+        })
+        .catch(() => {});
+      console.log(item);
+    },
     sortFunc(row) {
       if (row.sort || row.sort == 0) {
         this.$api.editCourseBusiness(row).then((res) => {

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

@@ -625,7 +625,7 @@ export default {
     this.$modal.loading("正在导入数据,请稍后...");
     this.$api.gradecheckGoodsChange({ chapterId: this.pageId }).then((res) => {
       if (res.data > 0) {
-        this.noStudent = false;
+        // this.noStudent = false;
       }
     });
     await this.getDict();

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

@@ -299,7 +299,7 @@ export default {
       .gradecheckGoodsChange({ courseId: this.$route.query.id })
       .then((res) => {
         if (res.data > 0) {
-          this.noStudent = false;
+          // this.noStudent = false;
         }
       });
     this.getDict();

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

@@ -552,7 +552,7 @@ export default {
       .gradecheckGoodsChange({ courseId: this.$route.query.id })
       .then((res) => {
         if (res.data > 0) {
-          this.noStudent = false;
+          // this.noStudent = false;
         }
       });
     this.getDs();

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

@@ -533,7 +533,7 @@ export default {
     this.$modal.loading("正在导入数据,请稍后...");
     this.$api.gradecheckGoodsChange({ sectionId: this.pageId }).then((res) => {
       if (res.data > 0) {
-        this.noStudent = false;
+        // this.noStudent = false;
       }
     });
     this.getDict();

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

@@ -588,7 +588,7 @@ export default {
     this.$modal.loading("正在导入数据,请稍后...");
     this.$api.gradecheckGoodsChange({ moduleId: this.pageId }).then((res) => {
       if (res.data > 0) {
-        this.noStudent = false;
+        // this.noStudent = false;
       }
     });
     await this.getDict();

+ 1 - 1
src/views/system/menu/index.vue

@@ -424,7 +424,7 @@ export default {
       this.$refs["form"].validate(valid => {
         if (valid) {
           if (this.form.menuId != undefined) {
-            updateMenu(this.form).then(response => {
+            this.$api.editsystemmenu(this.form).then(response => {
               this.$modal.msgSuccess("修改成功");
               this.open = false;
               this.getList();