caichengyu 1 год назад
Родитель
Сommit
9f4c36acbb
40 измененных файлов с 5286 добавлено и 120 удалено
  1. 31 3
      src/apis/course.js
  2. 31 0
      src/apis/login.js
  3. 8 0
      src/apis/note.js
  4. 24 0
      src/apis/order.js
  5. BIN
      src/assets/new1/banner2.png
  6. BIN
      src/assets/new1/course2.png
  7. BIN
      src/assets/new1/tkbank2.png
  8. BIN
      src/assets/new1/zlps2.png
  9. 1 0
      src/axios.js
  10. 28 5
      src/common/tools.js
  11. 56 4
      src/components/countDown/index.vue
  12. 3 3
      src/components/dataReview/index.vue
  13. 256 20
      src/components/login/index.vue
  14. 14 5
      src/components/takePicture/index.vue
  15. 27 8
      src/components/takePicture/media.vue
  16. 271 9
      src/components/videoCy/index.vue
  17. 10 10
      src/pages/bank-exam-all-explain/index.vue
  18. 8 8
      src/pages/bank-exam-explain/index.vue
  19. 10 10
      src/pages/bank-exam-wrong-explain/index.vue
  20. 129 2
      src/pages/home1/index.vue
  21. 2663 0
      src/pages/home1/index241230.vue
  22. 6 3
      src/pages/home2/index.vue
  23. 8 2
      src/pages/home2/top.vue
  24. 123 7
      src/pages/login/index.vue
  25. 1082 0
      src/pages/notice-list/index.vue
  26. 1 1
      src/pages/payment/index.vue
  27. 6 2
      src/pages/person-center/handle-order/order/index.vue
  28. 67 3
      src/pages/person-center/handle-order/order/step-0.vue
  29. 38 2
      src/pages/person-center/handle-order/order/step-1/index.vue
  30. 13 1
      src/pages/person-center/handle-rollCall/importStudent.vue
  31. 152 0
      src/pages/person-center/handle-student/index.vue
  32. 6 0
      src/pages/person-center/index.vue
  33. 1 1
      src/pages/person-center/my-classhour/index/index.vue
  34. 32 5
      src/pages/person-center/my-course/index.vue
  35. 7 0
      src/pages/person-center/my-info/index.vue
  36. 147 0
      src/pages/person-center/my-log/index.vue
  37. 1 0
      src/pages/person-center/my-order/index.vue
  38. 2 4
      src/pages/person-center/play-record/index.vue
  39. 23 1
      src/router/index.js
  40. 1 1
      src/store/index.js

+ 31 - 3
src/apis/course.js

@@ -275,7 +275,22 @@ export default {
 			data: data
 		})
 	},
-	
+	//保存当前视频节录像
+	courseTakeVideoRecord(data) {
+		return request({
+			url: '/study/record/save/video',
+			method: 'post',
+			data: data
+		})
+	},
+	//查询当前视频节是否需要录像
+	getCheckTakeVideo(data) {
+		return request({
+			url: '/study/record/check/video',
+			method: 'get',
+			params: data
+		})
+	},
 	ordersevenyear(data) {
 		return request({
 			url: '/order/seven/year/' + data,
@@ -298,7 +313,13 @@ export default {
 			data: data
 		})
 	},
-
+	resetSection(data) {
+		return request({
+			url: '/study/record/reset/section',
+			method: 'post',
+			data: data
+		})
+	},
 	getPhotoLastRecord(data) {
 		return request({
 			url: '/course/photo/log/getLastInfo',
@@ -428,5 +449,12 @@ export default {
 			params: data
 		})
 	},
-
+	sys_study_prompt(data) {
+		return request({
+			url: '/app/common/prompt',
+			method: 'get',
+			noToken: true,
+			params: data
+		})
+	},
 }

+ 31 - 0
src/apis/login.js

@@ -195,4 +195,35 @@ export default {
       params: params
     })
   },
+  login_sign(data) {
+    return request({
+      url: '/app/common/login/sign',
+      method: 'get',
+      noToken: true
+    })
+  },
+	//用户操作日志
+	userloglist(data) {
+		return request({
+			url: '/app/user/controls/record',
+			method: 'get',
+      params:data
+		})
+	},
+	//登出日志记录
+	account_loginout(data) {
+		return request({
+			url: '/app/user/login/out/record',
+			method: 'post',
+      data: data,
+		})
+	},
+	// 获取图形验证码
+  captchaImage(data) {
+    return request({
+      url: '/captchaImage',
+      method: 'get',
+      noToken: true
+    })
+  },
 }

+ 8 - 0
src/apis/note.js

@@ -34,4 +34,12 @@ export default {
 			params: data
 		})
 	},
+	systemannouncemen(data) {
+		return request({
+			url: '/app/common/announcement',
+			method: 'get',
+			params: data,
+			noToken: true
+		})
+	},
 }

+ 24 - 0
src/apis/order.js

@@ -245,5 +245,29 @@ export default {
 			data: data
 		})
 	},
+	//获取课程模板列表
+	orderbusinessconfiglist(data) {
+		return request({
+			url: '/order/business/config/list',
+			method: 'get',
+			params: data
+		})
+	},
+	//获取商品列表
+	orderbusinessgoodslist(data) {
+		return request({
+			url: '/order/business/goods/list',
+			method: 'get',
+			params: data
+		})
+	},
+	//经办订单学习进度
+	orderhandlestudy(data) {
+		return request({
+			url: '/order/handle/study',
+			method: 'get',
+			params: data
+		})
+	},
 	
 }

BIN
src/assets/new1/banner2.png


BIN
src/assets/new1/course2.png


BIN
src/assets/new1/tkbank2.png


BIN
src/assets/new1/zlps2.png


+ 1 - 0
src/axios.js

@@ -3,6 +3,7 @@ import store from './store'
 import { Notification, Message,MessageBox } from 'element-ui'
 export const BASE_URL = process.env.BASE_URL    //测试-外网
 // export const BASE_URL = "https://api.xyyxt.net"    //测试-外网
+// export const BASE_URL = "http://192.168.1.123:5055"    //测试-外网
 export const BASE_IMG_URL = process.env.BASE_IMG_URL
 // export const BASE_IMG_URL = "https://file.xyyxt.net/"
 export const tenantId = process.env.TENANT_ID

+ 28 - 5
src/common/tools.js

@@ -1,8 +1,8 @@
 import store from '@/store/index.js'
 import router from '@/router/index.js'
-import {BASE_IMG_URL} from '@/axios.js'
-
+import {BASE_IMG_URL,BASE_URL} from '@/axios.js'
 import { JSEncrypt } from "jsencrypt";
+import axios from 'axios';
 
 let publicKey = "-----BEGIN PUBLIC KEY-----MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC4qkbwIKErstK1sFESPEhOShpRpj4+sOVpJHxl5r/2xLBfA/MrXcAEra5Ro9cXNQSqmLLt8wecoLk/glfa5IdhXV0hRVQplIVs5z3MxcUa9ptKPHUTgh8xMCBvl8sUJKwkmn4vYWeDfHT22EL7Hr1pTMwUhF6WiNlWfQTVoF1rhwIDAQAB-----END PUBLIC KEY-----"
 
@@ -63,18 +63,41 @@ export default {
 		return sessionStorage.getItem('uuid')
 	},
 
-	exit(isJ = true) {
-
+	async exit(isJ = true) {
+		var datas = {
+			url: BASE_URL+'/app/common/account_login/out/record',
+			method: 'post',
+			data: {userId:store.state.userInfo.userId},
+		}
+	    const res=await	axios.request(datas)
+		
 		localStorage.removeItem('user_account')
 		localStorage.removeItem('token')
 		sessionStorage.removeItem('uuid')
 		store.state.userInfo = null
-
 		if (router.currentRoute.path != '/home' && isJ) {
 			router.replace({
 				path: '/home'
 			})
 		}
+		return
+		request.account_loginout({userId:store.state.userInfo.userId})
+		.then(res => {
+			localStorage.removeItem('user_account')
+			localStorage.removeItem('token')
+			sessionStorage.removeItem('uuid')
+			store.state.userInfo = null
+	
+			if (router.currentRoute.path != '/home' && isJ) {
+				router.replace({
+					path: '/home'
+				})
+			}
+		})
+		.catch(err => {
+			console.log(err.msg,err)
+		 
+		});
 
 	},
 

+ 56 - 4
src/components/countDown/index.vue

@@ -10,12 +10,31 @@
     >
       <div class="size">
         视频学习时长不达标,请等待<br /><br />倒计时
-        <span style="color: red;font-weight: bold;font-size: 24px;">{{
+        <span style="color: red; font-weight: bold; font-size: 24px">{{
           time
         }}</span>
       </div>
     </el-dialog>
+    <el-dialog
+      width="400px"
+      class="take-photo"
+      :visible.sync="Modal2"
+      :close-on-click-modal="false"
+      :close-on-press-escape="false"
+      :show-close="false"
+    >
+      <div class="size">
+        系统检测您在学习过程中有拖拽或快进行为,请重新学习!<br /><br />倒计时
+        <span style="color: red; font-weight: bold; font-size: 24px">{{
+          time
+        }}</span>
+        秒后自动刷新重学
+      </div>
+      <span slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="restart">刷新重学</el-button>
+      </span>
+    </el-dialog>
   </div>
 </template>
 
@@ -24,7 +43,10 @@ export default {
   data() {
     return {
       Modal: false,
-      time: 0 //倒计时
+      time: 0, //倒计时
+      Modal2: false,
+      times2: null,
+      errcode:0,
     };
   },
   methods: {
@@ -41,8 +63,38 @@ export default {
           this.time--;
         }
       }, 1000);
-    }
-  }
+    },
+    restart() {
+      if (this.times2) {
+        clearInterval(this.times2);
+      }
+      this.Modal2 = false;
+      if (this.errcode == 557) {
+        // this.$emit("resetSection",this.errcode); //重置
+        location.reload();
+      } else {
+        this.$emit("resetSection",this.errcode); //重置
+      }
+    },
+    openBoxsRestart(errcode) {
+      this.errcode = errcode;
+      this.time = 180;
+      this.Modal2 = true;
+      this.times2 = setInterval(() => {
+        if (this.time <= 0) {
+          clearInterval(this.times2);
+          this.Modal2 = false;
+          if (this.errcode == 557) {
+            location.reload();
+          } else {
+            this.$emit("resetSection",this.errcode); //重置
+          }
+        } else {
+          this.time--;
+        }
+      }, 1000);
+    },
+  },
 };
 </script>
 

+ 3 - 3
src/components/dataReview/index.vue

@@ -154,10 +154,10 @@
                     @click="downloadStamp"
                     >下载模板</span
                   >
-                  <span style="vertical-align: bottom;color: #a4a4a4;" v-else>{{
+                  <span style="vertical-align: bottom;color: orange;display: block;line-height: 1.2;" v-else>{{
                     item.fieldKey == "recent_photos"
-                      ? "竖向白底证件照 文件大小<2M"
-                      : "文件大小<2M"
+                      ? "模糊或者大小异常的照片将影响学习,请勿使用身份证代替标准照上传,竖向白底证件照 ,件大小<2M"
+                      : "请剪裁至合适大小,并且身份证方向不能倒置,文件大小<2M"
                   }}</span>
                 </el-form-item>
               </template>

+ 256 - 20
src/components/login/index.vue

@@ -15,7 +15,8 @@
               v-show="
                 activeName == 'generalLogin' ||
                 activeName == 'quickLogin' ||
-                activeName == 'wxLogin'
+                activeName == 'wxLogin'||
+                activeName == 'wxLogin2'
               "
               :model="ruleForm"
               :rules="rules"
@@ -23,7 +24,34 @@
               label-width="100px"
               class="demo-ruleForm"
               ><el-tabs stretch v-model="activeName" @tab-click="handleClick">
-                <el-tab-pane label="普通登录" name="generalLogin">
+                 <el-tab-pane label="微信登录" name="wxLogin2" v-if="wxSign==1">
+                  <template v-if="activeName == 'wxLogin2'">
+                <div class="dis_flex" >
+                  <img
+                    :src="
+                      imgUrl2 && !scanningStatus2
+                        ? imgUrl2
+                        : require('@/assets/qrcode.png')
+                    "
+                    alt=""
+                  />
+                  <p v-if="scanningStatus2" style="color: red">微信已扫码</p>
+                  <p class="headerTitle">使用微信扫一扫快捷登录</p>
+                  <p class="clickFuncStyle">
+                    扫描即表示同意<br /><span @click="innerVisibleOpenFunc(1)"
+                      >《用户使用协议》</span
+                    >及<span @click="innerVisibleOpenFunc(2)"
+                      >《个人信息保护政策》</span
+                    >
+                  </p>
+                  <div class="find_res">
+                      <span @click="signIn">立即注册</span>
+                      <span @click="forget">找回密码</span>
+                    </div>
+                </div>
+              </template>
+              </el-tab-pane>
+                <el-tab-pane label="普通登录" name="generalLogin" v-if="loginSign==1">
                   <template v-if="activeName == 'generalLogin'">
                     <el-form-item
                       label=""
@@ -64,7 +92,7 @@
                     ></div>
                   </template>
                 </el-tab-pane>
-                <el-tab-pane label="手机快速登录" name="quickLogin">
+                <el-tab-pane label="手机快速登录" name="quickLogin" v-if="telSign==1">
                   <template v-if="activeName == 'quickLogin'">
                     <el-form-item label="" prop="tel" style="margin-top: 20px">
                       <el-input
@@ -120,11 +148,11 @@
                       @click="login"
                       >登录</el-button
                     >
-                    <div
+                    <!-- <div
                       v-if="false"
                       class="wx_login"
                       @click="login_open"
-                    ></div>
+                    ></div> -->
                   </template>
                 </el-tab-pane>
                 <!-- <el-tab-pane label="微信登录" name="wxLogin">
@@ -229,7 +257,7 @@
                         <el-checkbox v-model="bindForm.read"
                           >我已认真阅读并同意</el-checkbox
                         >
-                        <span @click="activeName = 'generalLogin'"
+                        <span @click="tologin"
                           >前往登录</span
                         >
                       </div>
@@ -316,7 +344,7 @@
                       ></el-input>
                     </el-form-item>
                     <div class="find_res">
-                      <span @click="activeName = 'generalLogin'">前往登录</span>
+                      <span @click="tologin">前往登录</span>
                     </div>
                     <el-button
                       class="submit"
@@ -384,6 +412,32 @@
           </div>
         </template>
       </el-dialog>
+      <el-dialog
+      title="获取手机验证码"
+      :visible.sync="codeModal"
+      width="400px"
+      class="showconfirm"
+      :close-on-click-modal="false"
+      :close-on-press-escape="false"
+      ><div
+        class="ql-editor"
+        style="white-space: pre-wrap;display: inline-flex;"
+      >
+      
+                      <el-input
+                        clearable
+                        class="input_300"
+                        placeholder="短信验证码"
+                        v-model="imageCode"
+                      >
+                        </el-input
+                      >
+                          <img slot="right" style="width: 106px;height: 40px;"  :src="codeUrl" @click="getCodepre" />
+    </div>
+      <span slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="loginSmsFormBack()">获取手机验证码</el-button>
+      </span></el-dialog
+    >
     </div>
     <agree ref="agree"></agree>
   </div>
@@ -431,6 +485,10 @@ export default {
       }
     };
     return {
+      getsign:false,
+      loginSign:1,
+      wxSign:0,
+      telSign:1,
       checkTwoClassList: {}, // 检查是否有二建班级10天过期
       checkDialogVisible: false, // 检查是否有二建班级10天过期
       showHk: false, // 是否展示滑块  点击登录按钮是 设置为true 同时隐藏登录按钮
@@ -442,8 +500,13 @@ export default {
       interValTime: null,
       interValupdate: null,
       scanCode: "",
+      imgUrl2: "",
+      scanningStatus2: false, //扫码状态
+      interValTime2: null,
+      interValupdate2: null,
+      scanCode: "",
       dialogVisible: false,
-      activeName: "generalLogin",
+      activeName: "wxLogin2",
       ruleForm: {},
       bindForm: {
         read: false,
@@ -485,6 +548,10 @@ export default {
           },
         ],
       },
+      codeModal: false,
+				imageCode:"",
+				imageUuid:"",
+				codeUrl:"",
     };
   },
   beforeDestroy() {
@@ -500,12 +567,40 @@ export default {
       this.isPassing = false;
     },
   },
+  mounted() {
+    console.log("sdada");
+    var that=this;
+    if(!this.getsign){
+   
+          }
+  },
   methods: {
     ...mapMutations(["setUserInfo", "setCurrentRouter"]),
     closeTang() {
       this.closeFunc();
       this.dialogVisible = false;
     },
+    getlogin_sign(){
+      this.$request
+            .login_sign()
+            .then((res) => {
+              console.log(res)
+              this.loginSign = res.data.loginSign;
+              this.wxSign= res.data.wxSign;
+              this.telSign= res.data.telSign;
+              this.activeName=this.wxSign==1?"wxLogin2":(this.loginSign==1?"generalLogin":(this.telSign==1?"quickLogin":"generalLogin"));
+              if(this.wxSign==1){
+                this.login_open2();
+              }
+            })
+            .catch((err) => {
+              this.activeName="generalLogin";
+              console.log(err)
+            });
+    },
+    tologin(){
+      this.activeName=this.wxSign==1?"wxLogin2":(this.loginSign==1?"generalLogin":(this.telSign==1?"quickLogin":"generalLogin"));
+    },
     forgetFunc() {
       this.$refs.bindForm.validate((valid) => {
         if (valid) {
@@ -629,6 +724,27 @@ export default {
               localStorage.setItem("token", res.data.token);
               this.$tools.setUuid(new Date().valueOf() + "");
               this.getInfo();
+              if(res.data.pwd_sign==1)//需修改密码
+                {
+                  console.log("dsad",res.data.pwd_sign);
+                  this.$confirm("您的密码已长时间未变更,为了您的账号安全,请前往更改密码。", "提示", {
+              confirmButtonText: "确定",
+              closeOnClickModal: false,
+              closeOnPressEscape: false,
+              showCancelButton: false,
+              distinguishCancelAndClose: false,
+              showClose: true,
+            })
+              .then((_) => {
+                this.$router.push({
+        path: '/person-center/my-info',
+        query: {
+          showUsername: true,
+            }
+      });
+              })
+              .catch((_) => {});
+                }
             })
             .catch((err) => {
               this.islogin = false;
@@ -714,34 +830,108 @@ export default {
       this.$tools.setUuid(new Date().valueOf() + "");
       this.getInfo();
     },
+    /**
+     * 更新二维码
+     */
+     updateQRcode2() {
+      this.$request.pc_login_url().then((res) => {
+        if (res.code === 200) {
+          this.imgUrl2 = res.data.urlBase64;
+          this.scanCode2 = res.data.scanCode;
+        } else {
+          this.imgUrl2 = "";
+        }
+      });
+    },
+     /**
+     * 更新登入状态
+     */
+     updateBackApi2() {
+      this.$request
+        .check_login_url({
+          scanCode: this.scanCode2,
+        })
+        .then((res) => {
+          this.backData(res);
+          this.scanningStatus2 = false;
+        })
+        .catch((err) => {
+          if (err.msg === "微信已扫码" && this.interValTime2 !== null) {
+            clearInterval(this.interValTime2);
+            this.interValTime2 = null;
+            this.scanningStatus2 = true;
+          } else if (err.msg === "暂未登录" && !this.interValTime2) {
+            this.interValTime2 = setInterval(() => {
+              this.updateQRcode2();
+            },5* 60000);
+            this.scanningStatus2 = false;
+          }
+        });
+    },
     /**
      * 关闭方法合集
      */
     closeFunc() {
       clearInterval(this.interValTime);
       clearInterval(this.interValupdate);
+      clearInterval(this.interValTime2);
+      clearInterval(this.interValupdate2);
       this.interValTime = null;
       this.interValupdate = null;
+      this.interValTime2 = null;
+      this.interValupdate2 = null;
       this.islogin = false;
       this.scanCode = "";
+      this.scanCode2 = "";
       this.checkDialogVisible = false;
     },
-    login_open() {
-      this.activeName = "wxLogin";
-      this.updateQRcode();
-      this.interValTime = setInterval(() => {
-        this.updateQRcode();
-      }, 60000);
-      this.interValupdate = setInterval(() => {
-        this.updateBackApi();
+    login_open2() {
+      this.activeName = "wxLogin2";
+      this.updateQRcode2();
+      if(this.interValTime2){
+      clearInterval(this.interValTime2);
+      }
+      this.interValTime2 = setInterval(() => {
+        this.updateQRcode2();
+      },5* 60000);
+      if(this.interValupdate2){
+      clearInterval(this.interValupdate2);
+      }
+      this.interValupdate2 = setInterval(() => {
+        this.updateBackApi2();
       }, 3000);
     },
+    // login_open() {
+    //   this.activeName = "wxLogin";
+    //   this.updateQRcode();
+    //   this.interValTime = setInterval(() => {
+    //     this.updateQRcode();
+    //   }, 60000);
+    //   this.interValupdate = setInterval(() => {
+    //     this.updateBackApi();
+    //   }, 3000);
+    // },
     handleClick(e) {
-      if (e.name == "wxLogin") {
+      if (e.name == "wxLogin2") {//微信公众号绑定
+        this.updateQRcode2();
+        if(this.interValTime2){
+        clearInterval(this.interValTime2);
+        }
+        this.interValTime2 = setInterval(() => {
+          this.updateQRcode2();
+        }, 5*60000);
+      if(this.interValupdate2){
+        clearInterval(this.interValupdate2);
+      }
+        this.interValupdate2 = setInterval(() => {
+          this.updateBackApi2();
+        }, 3000);
+      }
+      else if (e.name == "wxLogin") {//微信小程序绑定
         this.updateQRcode();
         this.interValTime = setInterval(() => {
           this.updateQRcode();
-        }, 60000);
+        }, 5*60000);
         this.interValupdate = setInterval(() => {
           this.updateBackApi();
         }, 3000);
@@ -782,14 +972,44 @@ export default {
       setTimeout(() => {
         this.showHk = false;
         this.isPassing = false;
-        this.loginSmsFormBack();
+        this.getCodepre();
+        // this.loginSmsFormBack();
       }, 500);
     },
+    //获取图形验证码
+			getCodepre(){
+				this.codeModal=true;
+        this.imageCode="";
+				this.$request.captchaImage({}).then(
+					(res) => {
+						if (res.code == 200) {
+							this.codeUrl = "data:image/gif;base64," + res.data.img;
+							this.imageUuid= res.data.uuid;
+						} else {
+              this.$message({
+            message: res.msg,
+            type: "error",
+          });
+						}
+					},
+					(err) => {
+						console.log(err);
+					}
+				);
+			},
     /**
      * 获取验证码
      */
     loginSmsFormBack() {
       var self = this;
+      if(!this.imageCode)
+				{
+          this.$message({
+            message: "请输入图形验证码",
+            type: "error",
+          });
+					return;
+				}
       this.getRegisterCodeLock = true;
       this.$request[
         this.activeName == "quickLogin"
@@ -800,8 +1020,11 @@ export default {
       ]({
         tel: this[this.activeName == "quickLogin" ? "ruleForm" : "bindForm"]
           .tel,
+          imageCode:this.imageCode,
+							imageUuid:this.imageUuid
       })
         .then((res) => {
+          this.codeModal=false;
           this.getRegisterCodeLock = false;
           this.$message({
             message: `验证码已发送`,
@@ -824,9 +1047,22 @@ export default {
         });
     },
     openBox() {
+      console.log('sa',this.$store.state.TENANT_NANE,window.location.hostname,window.location.hostname.indexOf('web.gdzzkj.net'))
+      // if(this.$store.state.TENANT_NANE == '867735392558919680'){//867735392558919680,141250585240548145
+      if(window.location.hostname.indexOf('web.gdzzkj.net')>-1){
+        this.go('/login', { state: 1 });
+      }else{
       this.islogin = false;
-      this.activeName = "generalLogin";
+      this.getlogin_sign();
+      // this.activeName = "generalLogin";
       this.dialogVisible = true;
+      }
+    },
+    go(path, query) {
+      this.$router.push({
+        path,
+        query
+      });
     },
     // 检查是否有二建班级15天过期
     checkTenClassGradeUser() {

+ 14 - 5
src/components/takePicture/index.vue

@@ -15,7 +15,7 @@
           <div class="left-box">
             <div class="title">重要提示:</div>
             <div class="content">
-              <p>1、请保证摄像头正对自己,避免头像偏左或者偏右。</p>
+              <p>1、请保证摄像头正对自己,避免头像偏左或者偏右。并离远一点拍照,肩膀要拍到。</p>
               <p>
                 2、请保证拍照环境光线充足(照片太暗或曝光会降低验证通过率)。
               </p>
@@ -23,7 +23,10 @@
                 3、请保证整个头像在人脸识别区域内,脸部无遮挡装饰物(佩戴眼镜会降低通过率)。
               </p>
               <p>
-                4、如果下面视频中出现黑屏,摄像头可能被其他进程占用,请关闭其他调用摄像头的程序,重新刷新当前页面重新拍照识别。
+                4、拍照时不要开启背景虚化,保证背景清晰。。
+              </p>
+              <p>
+                5、如果下面视频中出现黑屏,摄像头可能被其他进程占用,请关闭其他调用摄像头的程序,重新刷新当前页面重新拍照识别。
               </p>
             </div>
           </div>
@@ -74,6 +77,7 @@ export default {
       loading: false,
       faceUrl: "",
       photoBadStatus:false,//摄像头无法使用触发true
+      deviceName:'',
     };
   },
   methods: {
@@ -116,6 +120,7 @@ export default {
     photographSuccess(stream) {
       // 兼容webkit核心浏览器
       // --虚拟摄像头
+      this.deviceName=stream.getTracks()[0].label;
       if (this.isVirtualCamera(stream)) {
         return;
       }
@@ -140,9 +145,13 @@ export default {
       let isT = list.some(e => {
         return stream.getTracks()[0].label.indexOf(e) != -1;
       });
-      if (isT) {
+      let isT2=false;
+      if(!stream.getTracks()[0].label){
+        isT2=true;
+      }
+      if (isT||isT2) {
         this.photoBadStatus = true; //摄像头无法使用触发true
-        this.$confirm("检测到你使用虚拟摄像头,无法继续学习。", "提示", {
+        this.$confirm(isT?"检测到你使用虚拟摄像头,无法继续学习。":"暂不支持当前设备学习,请更换设备学习", "提示", {
           confirmButtonText: "返回",
           showConfirmButton: true,
           closeOnClickModal: false,
@@ -244,7 +253,7 @@ export default {
     //确认拍照
     async takeOk() {
       this.loading = true;
-      this.$emit("returnParameter", this.faceUrl);
+      this.$emit("returnParameter", this.faceUrl,this.deviceName);
       this.takePhotoModal = false;
     }
   }

+ 27 - 8
src/pages/person-center/play-record/media.vue → src/components/takePicture/media.vue

@@ -3,14 +3,14 @@
     <el-dialog
       width="600px"
       class="take-photo"
-      :visible.sync="visible"
+      :visible.sync="takeVideoModal"
       :close-on-click-modal="false"
       :close-on-press-escape="false"
       :show-close="false"
     >
-      <h1 class="h_t">抽查检测</h1>
+      <h1 class="h_t">人脸录像抽查检测</h1>
       <div class="content">
-        <video
+        <video ref="videoPlayer11"
           id="video1"
           v-show="status === 3"
           class="video"
@@ -25,9 +25,9 @@
           :type="status === 3 ? 'success' : 'primary'"
           class="pos"
           @click="luzhi"
-          :disabled="status !== 1"
+          :disabled="status === 2"
           >{{
-            status === 1 ? "开始录制2秒" : status === 2 ? "录制中" : "提交"
+            status === 1 ? "开始录制3秒" : status === 2 ? "录制中" : "提交"
           }}</el-button
         >
         <el-button @click="again" v-if="status === 3">重录</el-button>
@@ -41,14 +41,16 @@ export default {
   data() {
     return {
       status: 1, //1未录制 2录制中 3录制完成
-      visible: false,
+      takeVideoModal: false,
       mediaRecorder: null,
+      videoblob:null,
       url: null,
+      faceUrl:null,
     };
   },
   methods: {
     openBoxs() {
-      this.visible = true;
+      this.takeVideoModal = true;
       this.$nextTick(() => {
         const video = document.getElementById("video2");
         navigator.mediaDevices
@@ -70,14 +72,29 @@ export default {
     luzhi() {
       if (this.status === 3) {
         //完成提交
+        this.loading = true;
+        this.$emit("returnParameterVideo", this.videoblob,this.faceUrl);
+        this.takeVideoModal=false;
         return;
       }
+      this.onCatchPhoto();
       this.mediaRecorder.start();
       this.status = 2;
       setTimeout(() => {
         this.stop();
         this.status = 3;
-      }, 2000);
+      }, 3500);
+    },
+    //拍照
+    onCatchPhoto() {
+      const canvas = document.createElement("canvas");
+      const video = document.getElementById("video1"); 
+      canvas.width = 500;
+      canvas.height = 375;
+      const context = canvas.getContext("2d");
+      context.drawImage(video, 0, 0, 500, 375);
+      this.faceUrl = canvas.toDataURL("image/png");
+      // console.log(this.faceUrl,'faceUrl')
     },
     stop() {
       this.mediaRecorder.stop();
@@ -87,6 +104,8 @@ export default {
         // 尝试转换为mp4类型
         const blob = event.data.slice(0, event.data.size, "video/mp4");
         this.url = URL.createObjectURL(blob);
+        this.videoblob =blob;
+        //console.log(event.data,'url')
       };
     },
   },

+ 271 - 9
src/components/videoCy/index.vue

@@ -18,15 +18,17 @@
       ref="takePicture"
       @returnParameter="returnParameter"
     ></takePicture>
-    <count-down ref="countDown" @againSubmit="postStudyRecord(1)"></count-down>
+    <count-down ref="countDown" @againSubmit="postStudyRecord(1)" @resetSection="resetSection"></count-down>
+    <media ref="media" @returnParameterVideo="returnParameterVideo"></media>
   </div>
 </template>
 
 <script>
 import takePicture from "@/components/takePicture/index.vue";
 import countDown from "@/components/countDown/index.vue";
+import media from "@/components/takePicture/media";
 export default {
-  components: { takePicture, countDown },
+  components: { takePicture, countDown, media },
   inject: ["getGoodsData"],
   props: {
     activeSection: {
@@ -56,7 +58,11 @@ export default {
       videoPauseSetTimeStatus: false,
       player_tencent: null,
       firstPlay: true, //是否初次播放
-      viewSign: null,
+      viewSign: null, //2腾讯视频播放器,其他保利威视播放器
+      needtoTakeVideo: false, //是否需要随机录制2秒视频
+      timeNeedtoTakeVideo: null, //需要随机录制2秒视频定时器
+      curPlayOver:false,//当前视频已播放完毕
+      picDeviceName:'',//PHOTE
     };
   },
   computed: {
@@ -106,6 +112,7 @@ export default {
       this.initData(); //初始化参数
       await this.getRecordHistoryPhoto(); //获取拍照历史记录
       await this.getRecordLast(); //获取播放记录
+      await this.getCheckTakeVideo(); //获取是否需要随机录制3秒视频
       let viewSign = this.viewSign || 1;
       if (viewSign == 2) {
         await this.loadPlayer_tencent(); //加载播放内容
@@ -157,6 +164,8 @@ export default {
       this.openPhotoStatus = 0;
       this.videoPauseSetTimeStatus = false;
       this.firstPlay = true;
+      this.curPlayOver=false;
+      this.needtoTakeVideo=false;
       clearTimeout(this.videoPauseSetTimeout); //删除暂停计算拍照定时器
       clearTimeout(this.timeEventStatusTimeout); //删除双重保障定时器
     },
@@ -475,7 +484,7 @@ export default {
             preload: "auto",
             autoplay: autoPlay,
             controlBar: {
-              progressControl: isAllowSeek,
+              progressControl:isAllowSeek,
               playbackRateMenuButton: playbackRate,
             },
             // player-tencent 为播放器容器 ID,必须与 html 中一致
@@ -593,13 +602,18 @@ export default {
         this.firstPlay = false;
         //计算拍照逻辑
         this.photoLogic();
+        //计算录视频逻辑
+        this.takeVideoLogic();
         //开启上次播放位置提示
         if (this.activeSection.videoCurrentTime) {
           this.showRecordStatus = true;
           if (this.viewSign == 2) {
-            this.player_tencent.currentTime(
+            setTimeout(() => {
+              this.player_tencent.currentTime(
               Number(this.activeSection.videoCurrentTime) || 0
             );
+          }, 2000);
+            
           }
           this.showRecordSetTimeOut = setTimeout(() => {
             this.showRecordStatus = false;
@@ -645,10 +659,17 @@ export default {
         type: "success",
         message: "播放完毕",
       });
+      this.curPlayOver=true;//当前视频已播放完毕
       this.isFullScreen();
       clearTimeout(this.videoPauseSetTimeout); //删除暂停计算拍照定时器
+      //如果未录制视频的,需要录制
+      if (this.needtoTakeVideo) {
+        this.openTakeVideo();
+        return;
+      }
       this.postStudyRecord(1);
       console.log("当前视频播放完毕时触发");
+      this.curPlayOver=false;
     },
 
     //判断是全屏则退出全屏
@@ -705,7 +726,8 @@ export default {
       this.HideVideo = true;
     },
     //拍照成功回显 url
-    async returnParameter(url) {
+    async returnParameter(url,deviceName) {
+      this.picDeviceName=deviceName;
       let file = this.$tools.convertBase64UrlToBlob(url);
       try {
         var photoUrl = await this.$upload.upload(file, 0, {
@@ -722,6 +744,7 @@ export default {
         }, 1500);
         return;
       }
+      // let compareFaceData =window.location.hostname.indexOf('localhost')>-1?90: await this.faceRecognition(photoUrl);
       let compareFaceData = await this.faceRecognition(photoUrl);
       if (compareFaceData >= 70) {
         this.HideVideo = false;
@@ -768,7 +791,212 @@ export default {
         }, 1500);
       }
     },
-
+    //计算录视频逻辑
+    takeVideoLogic() {
+      if (!this.needtoTakeVideo) return;
+      if (!this.goodsData.erJianErZao) return;
+      if (this.viewSign == 2) {
+        var polyvPlayerContext = this.player_tencent;
+        var totalVideoTime = polyvPlayerContext.duration();
+        var duration =
+          Number(this.activeSection.videoCurrentTime) ||
+          polyvPlayerContext.currentTime() ||
+          0;
+      } else {
+        var polyvPlayerContext = this.player;
+        var totalVideoTime = polyvPlayerContext.j2s_getDuration();
+        var duration =
+          Number(this.activeSection.videoCurrentTime) ||
+          polyvPlayerContext.j2s_getCurrentTime();
+      }
+      var durtime = totalVideoTime - duration;
+      var takevideosec = this.randomNum(
+        durtime > 10 ? 10 : 1,
+        durtime > 310 ? durtime - 300 : durtime - 1
+      ); //多少秒后执行
+      this.timeNeedtoTakeVideo = setTimeout(() => {
+        this.openTakeVideo();
+      }, takevideosec * 1000);
+      console.log("多少秒后录制", takevideosec * 1000);
+    },
+    //启动录制视频
+    openTakeVideo() {
+      if (this.HideVideo) {
+        this.timeNeedtoTakeVideo = setTimeout(() => {
+          this.openTakeVideo();
+        }, 3000);
+        return;
+      }
+      if (this.isFullScreen()) {
+        this.exitFullscreen();
+      }
+      setTimeout(() => {
+        if (this.viewSign == 2) {
+          this.player_tencent.pause(); //暂停
+        } else {
+          this.player.j2s_pauseVideo(); //暂停
+        }
+      }, 1000);
+      this.$refs.media.openBoxs();
+      this.HideVideo = true;
+    },
+    //录制视频成功回显 url
+    async returnParameterVideo(url, faceUrl) {
+      //先拿照片人脸对比
+      let file1 = this.$tools.convertBase64UrlToBlob(faceUrl);
+      try {
+        var photoUrl = await this.$upload.upload(file1, 0, {
+          gradeId: this.goodsData.gradeId,
+          orderGoodsId: this.goodsData.orderGoodsId,
+        });
+      } catch (err) {
+        this.$message({
+          type: "warning",
+          message: "上传接口报错,请重新录制上传",
+        });
+        setTimeout(() => {
+          this.$refs.media.openBoxs();
+        }, 1500);
+        return;
+      }
+      let compareFaceData = await this.faceRecognitionVideo(photoUrl);
+      if (compareFaceData < 70) {
+        this.$message({
+          type: "warning",
+          message:
+            "人脸匹配不通过,请保证开始录制前人脸出现在画面中,请重新录制上传",
+        });
+        setTimeout(() => {
+          this.$refs.media.openBoxs();
+        }, 1500);
+        return;
+      }
+      //再上传视频
+      //let file = this.$tools.convertBase64UrlToBlob(url);
+      try {
+        var videoUrl = await this.$upload.upload(url, 6, {
+          gradeId: this.goodsData.gradeId,
+          orderGoodsId: this.goodsData.orderGoodsId,
+        });
+      } catch (err) {
+        this.$message({
+          type: "warning",
+          message: "上传接口报错,请重新录制上传",
+        });
+        setTimeout(() => {
+          this.$refs.media.openBoxs();
+        }, 1500);
+        return;
+      }
+      this.HideVideo = false;
+      this.postCourseVideoRecord(videoUrl)
+        .then(async (res) => {
+          this.needtoTakeVideo = false;
+          if(this.curPlayOver){
+            this.onPlayOver();
+          }
+          //恢复播放
+          if (this.viewSign == 2) {
+            var polyvPlayerContext = this.player_tencent;
+            if (polyvPlayerContext && this.openPhotoStatus !== 1) {
+              polyvPlayerContext.play();
+            }
+          } else {
+            var polyvPlayerContext = this.player;
+            if (polyvPlayerContext && this.openPhotoStatus !== 1) {
+              polyvPlayerContext.j2s_resumeVideo();
+            }
+          }
+        })
+        .catch((err) => {
+          console.log(err, "err");
+          this.$message({
+            type: "warning",
+            message: "上传接口报错,请重新拍照上传",
+          });
+          setTimeout(() => {
+            this.$refs.media.openBoxs();
+          }, 1500);
+        });
+    },
+    //录制视频人脸校验
+    faceRecognitionVideo(url) {
+      return new Promise((resolve) => {
+        this.$request
+          .faceCertificationCompareFace({
+            urlA: url,
+            // imageA: url,
+            orderGoodsId: this.goodsData.orderGoodsId,
+            gradeId: this.goodsData.gradeId,
+            deviceName:this.picDeviceName,
+          })
+          .then((res) => {
+            resolve(Number(res.data));
+          })
+          .catch((err) => {
+            if (err.toString().indexOf("timeout") != -1) {
+              err = {
+                msg: "录制视频超时,请重新录制",
+              };
+            }
+            this.$message({
+              type: "warning",
+              message: err.msg,
+            });
+            setTimeout(() => {
+              this.$refs.media.openBoxs();
+            }, 1500);
+          });
+      });
+    },
+    //提交录制视频结果
+    postCourseVideoRecord(videoUrl) {
+      return new Promise((resolve, reject) => {
+        if (this.viewSign == 2) {
+          var currentTime = this.player_tencent.currentTime();
+        } else {
+          var currentTime = this.player.j2s_getCurrentTime();
+        }
+        let data = {
+          goodsId: this.goodsData.goodsId,
+          gradeId: this.goodsData.gradeId,
+          orderGoodsId: this.goodsData.orderGoodsId,
+          courseId: this.activeSection.courseId,
+          moduleId: this.activeSection.moduleId||0,
+          chapterId: this.activeSection.chapterId||0,
+          sectionId: this.activeSection.sectionId,
+          videoUrl: videoUrl,
+          videoCurrentTime: parseInt(currentTime > 0 ? currentTime : 0),
+          fromPlat: 2, //	来源平台 1小程序 2PC网站 3h5
+        };
+        this.$request
+          .courseTakeVideoRecord(data)
+          .then((res) => {
+            resolve(res);
+          })
+          .catch((err) => {
+            reject();
+          });
+      });
+    },
+    //获取是否需要随机录制2秒视频
+    async getCheckTakeVideo() {
+      return new Promise((resolve) => {
+        var data = {
+          sectionId: this.activeSection.sectionId,
+          goodsId: this.goodsData.goodsId,
+          courseId: this.activeSection.courseId,
+          gradeId: this.goodsData.gradeId,
+          orderGoodsId: this.goodsData.orderGoodsId,
+          chapterId: this.activeSection.chapterId,
+          moduleId: this.activeSection.moduleId,
+        };
+        this.$request.getCheckTakeVideo(data).then((res) => {
+          this.needtoTakeVideo = res.data > 0;
+          resolve();
+        });
+      });
+    },
     /**
      * 提交观看记录
      * status 1 学完 0未学完
@@ -803,6 +1031,7 @@ export default {
           studyDuration: parseInt(PlayDuration > 0 ? PlayDuration : 0),
           videoCurrentTime: parseInt(currentTime > 0 ? currentTime : 0),
           erJianErZao: this.goodsData.erJianErZao,
+          deviceName:this.picDeviceName,
         };
 
         if (imgUrl) {
@@ -852,7 +1081,16 @@ export default {
                   //停止执行-退出页面
                   this.$router.back(-1);
                 });
-            } else if (err.code === 559) {
+            } 
+            else if (err.code === 557||err.code === 5581||err.code === 5591) {
+              if (this.viewSign == 2) {
+                polyvPlayerContext.pause();
+              } else {
+                polyvPlayerContext.j2s_pauseVideo();
+              }
+              this.$refs.countDown.openBoxsRestart(err.code);
+            }
+            else if (err.code === 559) {
               console.log("拍照不够触发");
               this.$message.error(err.msg);
               this.openPhotoStatus = 1;
@@ -861,7 +1099,8 @@ export default {
               }, 1500);
             } else if (err.code === 558) {
               this.$refs.countDown.openBoxs(parseInt(err.msg.split(",")[1]));
-            } else if (err.code === 601) {
+            }
+             else if (err.code === 601) {
               this.onPlayerError("提交异常", err.msg);
             } else {
               this.$message.error(err.msg || "未知错误");
@@ -869,6 +1108,28 @@ export default {
           });
       });
     },
+    //重置视频学习
+    resetSection(errcode){
+      let data = {
+          orderGoodsId: parseInt(this.goodsData.orderGoodsId),
+          courseId: this.activeSection.courseId,
+          sectionId: this.activeSection.sectionId,
+          errorCode:errcode
+        };
+      this.$request
+          .resetSection(data)
+        .then((res) => {
+          location.reload();
+        })
+        .catch((err) => {
+          console.log(err, "err");
+          this.$message({
+            type: "warning",
+            message: "上传接口报错,请刷新重学",
+          });
+          // location.reload();
+        });
+    },
     //人脸校验
     faceRecognition(url) {
       return new Promise((resolve) => {
@@ -878,6 +1139,7 @@ export default {
             // imageA: url,
             orderGoodsId: this.goodsData.orderGoodsId,
             gradeId: this.goodsData.gradeId,
+            deviceName:this.picDeviceName,
           })
           .then((res) => {
             resolve(Number(res.data));

+ 10 - 10
src/pages/bank-exam-all-explain/index.vue

@@ -227,9 +227,9 @@
                             class="radio"
                             :class="{
                               right:
-                                index == question.ques || index == question.ans,
+                              Math.abs(index-1)  == question.ques || Math.abs(index-1)  == question.ans,
                               wrong:
-                                index == question.ques &&
+                              Math.abs(index-1)  == question.ques &&
                                 question.ques != question.ans,
                             }"
                             v-for="(item, index) in judge"
@@ -249,10 +249,10 @@
                         </div>
                         <div class="answer-list">
                           <div class="answer-list__left">
-                            题目答案:{{ ast[question.ans] }}
+                            题目答案:{{ ast[Math.abs(question.ans-1)] }}
                           </div>
                           <div class="answer-list__left">
-                            我的答案:{{ ast[question.ques] }}
+                            我的答案:{{ ast[Math.abs(question.ques-1)] }}
                           </div>
                         </div>
                         <div class="explain-list">
@@ -537,10 +537,10 @@
                                     class="radio"
                                     :class="{
                                       right:
-                                        index == question.ques[jsonIndex] ||
-                                        index == question.ans[jsonIndex],
+                                      Math.abs(index-1)  == question.ques[jsonIndex] ||
+                                      Math.abs(index-1)  == question.ans[jsonIndex],
                                       wrong:
-                                        index == question.ques[jsonIndex] &&
+                                      Math.abs(index-1)  == question.ques[jsonIndex] &&
                                         question.ques[jsonIndex] !=
                                           question.ans[jsonIndex],
                                     }"
@@ -563,11 +563,11 @@
                                 </div>
                                 <div class="answer-list">
                                   <div class="answer-list__left">
-                                    题目答案:{{ ast[question.ans[jsonIndex]] }}
+                                    题目答案:{{ ast[Math.abs(question.ans[jsonIndex]-1)] }}
                                   </div>
                                   <div class="answer-list__left">
                                     我的答案:{{
-                                      ast[question.ques[jsonIndex]]
+                                      ast[Math.abs(question.ques[jsonIndex]-1)]
                                     }}
                                   </div>
                                 </div>
@@ -775,7 +775,7 @@ export default {
       questionIndex: 0,
       checked: false,
       questionList: [],
-      judge: ["错误", "正确"],
+      judge: ["正确","错误"],
       ast: [
         "A",
         "B",

+ 8 - 8
src/pages/bank-exam-explain/index.vue

@@ -223,9 +223,9 @@
                             class="radio"
                             :class="{
                               right:
-                                index == question.ques || index == question.ans,
+                              Math.abs(index-1) == question.ques || Math.abs(index-1) == question.ans,
                               wrong:
-                                index == question.ques &&
+                              Math.abs(index-1) == question.ques &&
                                 question.ques != question.ans,
                             }"
                             v-for="(item, index) in judge"
@@ -245,7 +245,7 @@
                         </div>
                         <div class="answer-list">
                           <div class="answer-list__left">
-                            题目答案:{{ ast[question.ans] }}
+                            题目答案:{{ ast[Math.abs(question.ans-1)] }}
                           </div>
                           <!-- <div class="answer-list__left">
                             我的答案:{{ ast[question.ques] }}
@@ -531,10 +531,10 @@
                                     class="radio"
                                     :class="{
                                       right:
-                                        index == question.ques[jsonIndex] ||
-                                        index == question.ans[jsonIndex],
+                                      Math.abs(index-1)  == question.ques[jsonIndex] ||
+                                      Math.abs(index-1)  == question.ans[jsonIndex],
                                       wrong:
-                                        index == question.ques[jsonIndex] &&
+                                      Math.abs(index-1)  == question.ques[jsonIndex] &&
                                         question.ques[jsonIndex] !=
                                           question.ans[jsonIndex],
                                     }"
@@ -557,7 +557,7 @@
                                 </div>
                                 <div class="answer-list">
                                   <div class="answer-list__left">
-                                    题目答案:{{ ast[question.ans[jsonIndex]] }}
+                                    题目答案:{{ ast[Math.abs(question.ans[jsonIndex]-1)] }}
                                   </div>
                                   <!-- <div class="answer-list__left">
                                     我的答案:{{
@@ -763,7 +763,7 @@ export default {
     return {
       checked: false,
       questionList: [],
-      judge: ["错误", "正确"],
+      judge: ["正确", "错误"],
       ast: [
         "A",
         "B",

+ 10 - 10
src/pages/bank-exam-wrong-explain/index.vue

@@ -227,9 +227,9 @@
                             class="radio"
                             :class="{
                               right:
-                                index == question.ques || index == question.ans,
+                              Math.abs(index-1) == question.ques || Math.abs(index-1) == question.ans,
                               wrong:
-                                index == question.ques &&
+                              Math.abs(index-1) == question.ques &&
                                 question.ques != question.ans,
                             }"
                             v-for="(item, index) in judge"
@@ -249,10 +249,10 @@
                         </div>
                         <div class="answer-list">
                           <div class="answer-list__left">
-                            题目答案:{{ ast[question.ans] }}
+                            题目答案:{{ ast[Math.abs(question.ans-1)] }}
                           </div>
                           <div class="answer-list__left">
-                            我的答案:{{ ast[question.ques] }}
+                            我的答案:{{ ast[Math.abs(question.ques-1)] }}
                           </div>
                         </div>
                         <div class="explain-list">
@@ -537,10 +537,10 @@
                                     class="radio"
                                     :class="{
                                       right:
-                                        index == question.ques[jsonIndex] ||
-                                        index == question.ans[jsonIndex],
+                                      Math.abs(index-1) == question.ques[jsonIndex] ||
+                                      Math.abs(index-1) == question.ans[jsonIndex],
                                       wrong:
-                                        index == question.ques[jsonIndex] &&
+                                      Math.abs(index-1) == question.ques[jsonIndex] &&
                                         question.ques[jsonIndex] !=
                                           question.ans[jsonIndex],
                                     }"
@@ -563,11 +563,11 @@
                                 </div>
                                 <div class="answer-list">
                                   <div class="answer-list__left">
-                                    题目答案:{{ ast[question.ans[jsonIndex]] }}
+                                    题目答案:{{ ast[Math.abs(question.ans[jsonIndex]-1)] }}
                                   </div>
                                   <div class="answer-list__left">
                                     我的答案:{{
-                                      ast[question.ques[jsonIndex]]
+                                      ast[Math.abs(question.ques[jsonIndex]-1)]
                                     }}
                                   </div>
                                 </div>
@@ -775,7 +775,7 @@ export default {
       questionIndex: 0,
       checked: false,
       questionList: [],
-      judge: ["错误", "正确"],
+      judge: ["正确", "错误"],
       ast: [
         "A",
         "B",

+ 129 - 2
src/pages/home1/index.vue

@@ -102,8 +102,129 @@
           </template>
         </div>
       </div>
-      <div class="swiper-wrap" :style="{ background: color }">
+      <div class="swiper-wrap" ><!--:style="{ background: color }"-->
         <div class="container" style="width:1180px;">
+          <div v-if="$store.state.TENANT_NANE == '680980002459417532'">
+            <div class="left-box">
+            <div class="left-box__header">课程导航</div>
+            <div class="left-box__body" style="width: 900px;
+    padding: 20px;
+    background: #f5f5f5;
+    border: 1px solid #dcdcdc;">
+              <!-- <div class="bg"></div> -->
+              <table class="tab-typeL" style="height: 100%;
+    width: 840px;
+    font-size: 30px;
+    border: 1px solid #ddd;
+    box-shadow: 5px 5px 5px rgba(0,0,0,0.5);">
+              <tr v-for="(item, typeItem) in typeList"
+                  :key="'type' + typeItem">
+                <td v-if="typeItem==0" :rowspan="typeList.length" style="width: 140px;background-color: rgb(127, 127, 127);color: #fff;    text-align: center;">培训项目</td>
+                <td style="background-color: rgb(127, 127, 127);color: #fff;text-align: center;width: 200px;"><span style="font-size: 24px;" @click="goCourse(item)">
+                    {{ item.educationName }}
+                  </span></td>
+                <td style="background-color:#fff">
+                  <ul class="nav table-ul list">
+                    <li>
+                    <div class="text">
+                    <div class="text__desc">
+                      <a
+                        @click="goCourse(aItem)"
+                        class="item"
+                        v-for="(aItem, aIndex) in item.list"
+                        :key="'aItem' + aIndex"
+                      style="color:unset;font-size: 16px;margin-right: 105px;">
+                        <!-- {{ aItem.projectName }}-{{ aItem.businessName }} -->
+                        {{ aItem.aliasName }}
+                      </a>
+                      <a
+                        v-if="$store.state.TENANT_NANE == '680980002459417532'"
+                        @click="goLink('https://cranesystem.gdcic.net:8080/')"
+                        class="item"  style="color:unset;font-size: 16px;margin-right: 30px;"
+                        >建筑施工特种作业人员<span
+                          v-if="item.educationName == '考前培训'"
+                          >(建筑电工、司索工、施工升降机)</span
+                        ></a
+                      >
+                    </div>
+                  </div>
+                    </li>
+                <div style="clear:both;"></div>
+              </ul>
+                </td>
+              </tr>
+            </table>
+              <div class="slide-list" style="display: none;">
+                <div
+                  class="slide-list__item"
+                  v-for="(type, typeItem) in typeList"
+                  :key="'type' + typeItem"
+                >
+                  <div class="title" @click="goCourse(type)">
+                    {{ type.educationName }}
+                  </div>
+                  <ul class="nav">
+                    <li
+                      v-for="(slideItem, slideIndex) in slideList[typeItem]"
+                      :key="'item' + slideIndex"
+                      @click="goCourse(slideItem)"
+                    >
+                      <div class="text">
+                        <!-- {{ slideItem.projectName }}-{{ slideItem.businessName }} -->
+                        {{ slideItem.aliasName }}
+                      </div>
+                    </li>
+                    <li
+                      v-if="$store.state.TENANT_NANE == '680980002459417532'"
+                      @click="goLink('https://cranesystem.gdcic.net:8080/')"
+                    >
+                      <span class="text"
+                        >建筑施工特种作业人员
+                        <span v-if="type.educationName == '考前培训'"
+                          >(建筑电工、司索工、施工升降机)</span
+                        >
+                      </span>
+                    </li>
+                  </ul>
+                </div>
+              </div>
+              <ul class="list" style="display: none;">
+                <li v-for="(item, index) in typeList" :key="index">
+                  <div class="text">
+                    <div class="text__title" @click="goCourse(item)">
+                      <span>{{ item.educationName }}</span>
+                      <i
+                        class="el-icon-arrow-right"
+                        style="float: right;margin-right: 10px;"
+                      ></i>
+                    </div>
+                    <div class="text__desc">
+                      <a
+                        @click="goCourse(aItem)"
+                        class="item"
+                        v-for="(aItem, aIndex) in item.list"
+                        :key="'aItem' + aIndex"
+                      >
+                        <!-- {{ aItem.projectName }}-{{ aItem.businessName }} -->
+                        {{ aItem.aliasName }}
+                      </a>
+                      <a
+                        v-if="$store.state.TENANT_NANE == '680980002459417532'"
+                        @click="goLink('https://cranesystem.gdcic.net:8080/')"
+                        class="item"
+                        >建筑施工特种作业人员<span
+                          v-if="item.educationName == '考前培训'"
+                          >(建筑电工、司索工、施工升降机)</span
+                        ></a
+                      >
+                    </div>
+                  </div>
+                </li>
+              </ul>
+            </div>
+          </div>
+          </div>
+          <template v-else>
           <div class="left-box">
             <div class="left-box__header">课程导航</div>
             <div class="left-box__body">
@@ -199,7 +320,7 @@
               <div class="swiper-button-next" slot="button-next"></div> -->
             </swiper>
           </div>
-
+        </template>
           <div class="right-box">
             <div class="bg"></div>
             <div class="no-login" v-if="!userInfo">
@@ -2583,4 +2704,10 @@ export default {
     }
   }
 }
+.table-ul{
+  display: flex;
+  & > li{
+    display: flex;
+  }
+}
 </style>

+ 2663 - 0
src/pages/home1/index241230.vue

@@ -0,0 +1,2663 @@
+<template>
+    <div class="home">
+      <header class="header">
+        <div class="header__header">
+          <div class="container">
+            <div class="text-list" v-if="!userInfo">
+              <a @click="go('/login', { state: 1 })">登录</a>
+              <a @click="go('/login', { state: 2 })">注册</a>
+            </div>
+  
+            <div class="icon-list" v-else>
+              <!-- <a @click="go('/person-center/my-message')">
+                <i class="el-icon-message-solid icon"></i>
+              </a> -->
+              <el-badge
+                :is-dot="msgCount > 0 ? true : false"
+                class="item"
+                style="vertical-align: baseline"
+              >
+                <el-button
+                  style="font-size: 20px; padding: 0px"
+                  icon="el-icon-message-solid"
+                  type="text"
+                  @click="go('/person-center/my-message')"
+                ></el-button>
+              </el-badge>
+              <!-- <el-tooltip placement="bottom-end" v-model="msgShow" :hide-after="0" manual popper-class="tooltipStyle">
+                <el-badge :is-dot="msgCount > 0 ? true : false" class="item" style="vertical-align: baseline">
+                  <el-button style="font-size: 20px; padding: 0px" icon="el-icon-message-solid" type="text"
+                    @click="go('/person-center/my-message')"></el-button>
+                </el-badge>
+                <div slot="content" class="dis_plays">
+                  <p style="max-width: 247px">{{ msgData.text }}</p>
+                  <div class="toolbth" @click="newGoToStudy">立即学习</div>
+                  <i style="font-size: 18px;cursor:pointer;" class="el-icon-close" @click="clearMsg"></i>
+                </div>
+              </el-tooltip> -->
+              <el-dropdown @command="handleCommand">
+                <span class="el-dropdown-link">
+                  <i
+                    class="el-icon-user-solid"
+                    style="
+                      font-size: 20px;
+                      color: #3f8dfd;
+                      cursor: pointer;
+                      margin-left: 20px;
+                    "
+                    @click="go('/person-center/my-course')"
+                  ></i>
+                </span>
+                <el-dropdown-menu slot="dropdown">
+                  <el-dropdown-item command="1">我的课程</el-dropdown-item>
+                  <el-dropdown-item command="2">我的题库</el-dropdown-item>
+                  <el-dropdown-item command="3">个人中心</el-dropdown-item>
+                  <!-- <el-dropdown-item command="5">跳小程序</el-dropdown-item> -->
+                  <el-dropdown-item command="4">退出登录</el-dropdown-item>
+                </el-dropdown-menu>
+              </el-dropdown>
+            </div>
+          </div>
+        </div>
+        <div class="header__body">
+          <div class="container clearfix topBoxy">
+            <a class="logo">
+              <img
+                v-if="header.routinelogo"
+                :src="$tools.splitImgHost(header.routinelogo)"
+                alt=""
+              />
+              <h1 v-else></h1>
+            </a>
+            <div class="search">
+              <div class="search__select">
+                <select v-model="type">
+                  <option value="1">课程</option>
+                  <option value="2">题库</option>
+                  <option value="6">直播</option>
+                </select>
+              </div>
+              <div class="search__input">
+                <input
+                  v-model="searchKey"
+                  type="text"
+                  autocomplete="new-password"
+                />
+              </div>
+              <el-button type="primary" @click="search" class="search__btn"
+                >搜索</el-button
+              >
+            </div>
+          </div>
+        </div>
+      </header>
+  
+      <section class="section">
+        <div class="container">
+          <div class="tabs">
+            <template v-for="(item, index) in showNav(nav)">
+              <a class="tab" @click="go(item.path)" :key="index">{{
+                item.name
+              }}</a>
+            </template>
+          </div>
+        </div>
+        <div class="swiper-wrap" :style="{ background: color }">
+          <div class="container" style="width:1180px;">
+            <div v-if="$store.state.TENANT_NANE == '680980002459417532'">
+              <div class="left-box">
+              <div class="left-box__header">课程导航</div>
+              <div class="left-box__body">
+                <div class="bg"></div>
+                <div class="slide-list">
+                  <div
+                    class="slide-list__item"
+                    v-for="(type, typeItem) in typeList"
+                    :key="'type' + typeItem"
+                  >
+                    <div class="title" @click="goCourse(type)">
+                      {{ type.educationName }}
+                    </div>
+                    <ul class="nav">
+                      <li
+                        v-for="(slideItem, slideIndex) in slideList[typeItem]"
+                        :key="'item' + slideIndex"
+                        @click="goCourse(slideItem)"
+                      >
+                        <div class="text">
+                          <!-- {{ slideItem.projectName }}-{{ slideItem.businessName }} -->
+                          {{ slideItem.aliasName }}
+                        </div>
+                      </li>
+                      <li
+                        v-if="$store.state.TENANT_NANE == '680980002459417532'"
+                        @click="goLink('https://cranesystem.gdcic.net:8080/')"
+                      >
+                        <span class="text"
+                          >建筑施工特种作业人员
+                          <span v-if="type.educationName == '考前培训'"
+                            >(建筑电工、司索工、施工升降机)</span
+                          >
+                        </span>
+                      </li>
+                    </ul>
+                  </div>
+                </div>
+                <ul class="list">
+                  <li v-for="(item, index) in typeList" :key="index">
+                    <div class="text">
+                      <div class="text__title" @click="goCourse(item)">
+                        <span>{{ item.educationName }}</span>
+                        <i
+                          class="el-icon-arrow-right"
+                          style="float: right;margin-right: 10px;"
+                        ></i>
+                      </div>
+                      <div class="text__desc">
+                        <a
+                          @click="goCourse(aItem)"
+                          class="item"
+                          v-for="(aItem, aIndex) in item.list"
+                          :key="'aItem' + aIndex"
+                        >
+                          <!-- {{ aItem.projectName }}-{{ aItem.businessName }} -->
+                          {{ aItem.aliasName }}
+                        </a>
+                        <a
+                          v-if="$store.state.TENANT_NANE == '680980002459417532'"
+                          @click="goLink('https://cranesystem.gdcic.net:8080/')"
+                          class="item"
+                          >建筑施工特种作业人员<span
+                            v-if="item.educationName == '考前培训'"
+                            >(建筑电工、司索工、施工升降机)</span
+                          ></a
+                        >
+                      </div>
+                    </div>
+                  </li>
+                </ul>
+              </div>
+            </div>
+            </div>
+            <template v-else>
+            <div class="left-box">
+              <div class="left-box__header">课程导航</div>
+              <div class="left-box__body">
+                <div class="bg"></div>
+                <div class="slide-list">
+                  <div
+                    class="slide-list__item"
+                    v-for="(type, typeItem) in typeList"
+                    :key="'type' + typeItem"
+                  >
+                    <div class="title" @click="goCourse(type)">
+                      {{ type.educationName }}
+                    </div>
+                    <ul class="nav">
+                      <li
+                        v-for="(slideItem, slideIndex) in slideList[typeItem]"
+                        :key="'item' + slideIndex"
+                        @click="goCourse(slideItem)"
+                      >
+                        <div class="text">
+                          <!-- {{ slideItem.projectName }}-{{ slideItem.businessName }} -->
+                          {{ slideItem.aliasName }}
+                        </div>
+                      </li>
+                      <li
+                        v-if="$store.state.TENANT_NANE == '680980002459417532'"
+                        @click="goLink('https://cranesystem.gdcic.net:8080/')"
+                      >
+                        <span class="text"
+                          >建筑施工特种作业人员
+                          <span v-if="type.educationName == '考前培训'"
+                            >(建筑电工、司索工、施工升降机)</span
+                          >
+                        </span>
+                      </li>
+                    </ul>
+                  </div>
+                </div>
+                <ul class="list">
+                  <li v-for="(item, index) in typeList" :key="index">
+                    <div class="text">
+                      <div class="text__title" @click="goCourse(item)">
+                        <span>{{ item.educationName }}</span>
+                        <i
+                          class="el-icon-arrow-right"
+                          style="float: right;margin-right: 10px;"
+                        ></i>
+                      </div>
+                      <div class="text__desc">
+                        <a
+                          @click="goCourse(aItem)"
+                          class="item"
+                          v-for="(aItem, aIndex) in item.list"
+                          :key="'aItem' + aIndex"
+                        >
+                          <!-- {{ aItem.projectName }}-{{ aItem.businessName }} -->
+                          {{ aItem.aliasName }}
+                        </a>
+                        <a
+                          v-if="$store.state.TENANT_NANE == '680980002459417532'"
+                          @click="goLink('https://cranesystem.gdcic.net:8080/')"
+                          class="item"
+                          >建筑施工特种作业人员<span
+                            v-if="item.educationName == '考前培训'"
+                            >(建筑电工、司索工、施工升降机)</span
+                          ></a
+                        >
+                      </div>
+                    </div>
+                  </li>
+                </ul>
+              </div>
+            </div>
+  
+            <div class="swiper" style="width:880px;">
+              <swiper
+                v-if="bannerList.length > 0"
+                ref="mySwiper"
+                @slideChangeTransitionStart="slideChangeTransitionStart($event)"
+                class=""
+                v-bind:options="swiperOptions"
+              >
+                <swiper-slide
+                  v-for="(item, index) in bannerList"
+                  v-bind:key="index"
+                  @click.native="swiperJump(item)"
+                >
+                  <img :src="$tools.splitImgHost(item.adverUrl)" alt="" />
+                </swiper-slide>
+  
+                <div class="swiper-pagination" slot="pagination"></div>
+                <!-- <div class="swiper-button-prev" slot="button-prev"></div>
+                <div class="swiper-button-next" slot="button-next"></div> -->
+              </swiper>
+            </div>
+          </template>
+            <div class="right-box">
+              <div class="bg"></div>
+              <div class="no-login" v-if="!userInfo">
+                <template v-if="loginType == 1">
+                  <el-form :model="loginForm" ref="loginForm" :rules="loginRules">
+                    <div class="input">
+                      <el-form-item prop="account">
+                        <el-input
+                          autocomplete="new-password"
+                          v-model="loginForm.account"
+                          @keyup.enter.native="login"
+                          :placeholder="
+                            dualStatus ? '请输入手机号' : '请输入手机号或身份证号'
+                          "
+                        ></el-input>
+                      </el-form-item>
+                    </div>
+                    <div class="input">
+                      <el-form-item prop="pwd">
+                        <el-input
+                          autocomplete="new-password"
+                          type="password"
+                          v-model="loginForm.pwd"
+                          placeholder="请输入密码"
+                          @keyup.enter.native="login"
+                        ></el-input>
+                      </el-form-item>
+                    </div>
+                    <div class="input" v-if="dualStatus">
+                      <el-form-item prop="code">
+                        <el-input
+                          autocomplete="new-password"
+                          v-model="loginForm.code"
+                          placeholder="请输入验证码"
+                        >
+                          <span
+                            slot="suffix"
+                            @click="getLoginSms(1)"
+                            class="btn"
+                            >{{
+                              countDown == 0
+                                ? "获取验证码"
+                                : `${countDown}秒重新获取`
+                            }}</span
+                          >
+                        </el-input>
+                      </el-form-item>
+                    </div>
+                    <el-button
+                      type="primary"
+                      class="submit"
+                      @click="login()"
+                      :loading="isLogin"
+                      >登录</el-button
+                    >
+                    <div class="bottom-text">
+                      <a class="text" @click="loginType = 2">手机验证码登录</a>
+                      <a class="text" @click="go('/login?state=2')">注册</a>
+                    </div>
+                    <div class="dis_flex" v-if="false">
+                      <div class="dis_flex_wxloginImg">
+                        <img src="@/assets/wx.png" alt="" @click="wxLoginFunc" />
+                      </div>
+                    </div>
+                  </el-form>
+                </template>
+  
+                <template v-if="loginType == 2">
+                  <el-form
+                    :model="loginSmsForm"
+                    ref="loginSmsForm"
+                    :rules="loginSmsRules"
+                  >
+                    <div class="input">
+                      <el-form-item prop="tel">
+                        <el-input
+                          autocomplete="new-password"
+                          v-model="loginSmsForm.tel"
+                          placeholder="请输入手机号"
+                        ></el-input>
+                      </el-form-item>
+                    </div>
+                    <div class="input">
+                      <el-form-item prop="code">
+                        <el-input
+                          autocomplete="new-password"
+                          v-model="loginSmsForm.code"
+                          placeholder="请输入验证码"
+                        >
+                          <span
+                            slot="suffix"
+                            @click="getLoginSms(2)"
+                            class="btn"
+                            >{{
+                              countDown == 0
+                                ? "获取验证码"
+                                : `${countDown}秒重新获取`
+                            }}</span
+                          >
+                        </el-input>
+                      </el-form-item>
+                    </div>
+                    <el-button
+                      type="primary"
+                      class="submit"
+                      :loading="isloginSms"
+                      @click="loginSms()"
+                      >登录</el-button
+                    >
+                    <div class="bottom-text">
+                      <a class="text" @click="loginType = 1">账号密码登录</a>
+                      <a class="text" @click="go('/login?state=2')">注册</a>
+                    </div>
+                    <div class="dis_flex" v-if="false">
+                      <div class="dis_flex_wxloginImg">
+                        <img src="@/assets/wx.png" alt="" @click="wxLoginFunc" />
+                      </div>
+                    </div>
+                  </el-form>
+                </template>
+              </div>
+  
+              <div class="has-login" v-else>
+                <div class="userinfo">
+                  <img src="@/assets/ava.png" class="avatar" alt="" />
+                  <div class="nickname">{{ userInfo && userInfo.realname }}</div>
+                </div>
+  
+                <div class="type-list">
+                  <div
+                    class="type-list__item"
+                    @click="go('/person-center/my-course')"
+                  >
+                    <img
+                      src="@/assets/kc.png"
+                      alt=""
+                      style="width:64px;height:64px;"
+                    />
+                    <div class="text">课程</div>
+                  </div>
+                  <div
+                    class="type-list__item"
+                    @click="go('/person-center/my-bank')"
+                  >
+                    <img
+                      src="@/assets/tk.png"
+                      alt=""
+                      style="width:64px;height:64px;"
+                    />
+                    <div class="text">题库</div>
+                  </div>
+                  <div
+                    class="type-list__item"
+                    @click="go('/person-center/my-order')"
+                  >
+                    <img
+                      src="@/assets/dd.png"
+                      alt=""
+                      style="width:64px;height:64px;"
+                    />
+                    <div class="text">订单</div>
+                  </div>
+                </div>
+  
+                <div class="history">
+                  <div class="btn">上次播放</div>
+                  <div class="title" @click="goLast">
+                    {{ recordList.goodsName }}
+                  </div>
+                  <div class="progress">
+                    <span
+                      >已学{{
+                        toFixed(
+                          (recordList.videoCurrentTime /
+                            recordList.durationTime) *
+                            100
+                        )
+                      }}%</span
+                    >
+                    <span>{{ recordList.date }}</span>
+                  </div>
+                </div>
+              </div>
+            </div>
+          </div>
+        </div>
+      </section>
+  
+      <section
+        class="course"
+        v-if="$store.state.other.course == 1 && courseName.length > 0"
+      >
+        <div class="container">
+          <div class="course__header">
+            <div class="lefts">
+              <div class="title">推荐课程</div>
+              <div class="tabs">
+                <template v-for="(item, index) in courseName">
+                  <div
+                    v-if="index <= 7"
+                    :key="index"
+                    class="tab"
+                    :class="couIndex === index ? 'active' : ''"
+                    @click="changeCou(item.recommendId, index)"
+                  >
+                    {{ item.name }}
+                  </div>
+                </template>
+              </div>
+            </div>
+            <div class="course__footer">
+              <div class="btn" @click="go('/course-list')">查看<br />更多</div>
+            </div>
+          </div>
+          <!-- <div class="tabs">
+            <div
+              v-for="(item, index) in goodsList1"
+              :key="index"
+              class="tab"
+              :class="active1 === index ? 'active' : ''"
+              @click="active1 = index"
+            >
+              {{ item.name }}
+            </div>
+          </div>
+          <div class="course__body">
+            <p
+              v-if="
+                !goodsList1[active1] ||
+                !goodsList1[active1].goodsList ||
+                goodsList1[active1].goodsList.length === 0
+              "
+              class="text_align"
+            >
+              该培训项目无推荐课程
+            </p>
+            <ul v-else class="list clearfix">
+              <template v-for="(item, index) in goodsList1[active1].goodsList">
+                <li class="course-item" :key="index" v-if="index < 15">
+                  <GoodsItem :item="item"></GoodsItem>
+                </li>
+              </template>
+            </ul>
+          </div> -->
+  
+          <div class="course__body">
+            <p v-if="!goodsList1.length" class="text_align">
+              该培训项目无推荐课程
+            </p>
+            <ul v-else class="list clearfix">
+              <template v-for="(item, index) in goodsList1">
+                <li class="course-item" :key="index">
+                  <GoodsItem :item="item"></GoodsItem>
+                </li>
+              </template>
+            </ul>
+          </div>
+  
+          <div class="pagination">
+            <el-pagination
+              @current-change="currentChangeCou"
+              background
+              layout="prev, pager, next"
+              :total="paramList[0].total"
+              :current-page.sync="paramList[0].currentPage"
+              :page-size="paramList[0].pageSize"
+            >
+            </el-pagination>
+          </div>
+  
+          <!-- <div class="course__footer">
+            <div class="btn" @click="go('/course-list')">查看更多</div>
+          </div> -->
+        </div>
+      </section>
+  
+      <section
+        class="bank"
+        v-if="$store.state.other.bank == 1 && bankName.length > 0"
+      >
+        <div class="container">
+          <div class="bank__header">
+            <div class="lefts">
+              <div class="title">推荐题库</div>
+              <div class="tabs">
+                <template v-for="(item, index) in bankName">
+                  <div
+                    v-if="index <= 7"
+                    :key="index"
+                    class="tab"
+                    :class="bankIndex === index ? 'active' : ''"
+                    @click="changebank(item.recommendId, index)"
+                  >
+                    {{ item.name }}
+                  </div></template
+                >
+              </div>
+            </div>
+            <div class="bank__footer">
+              <div class="btn" @click="go('/bank-list')">查看<br />更多</div>
+            </div>
+          </div>
+          <!-- <div class="tabs">
+            <div
+              v-for="(item, index) in goodsList2"
+              :key="index"
+              class="tab"
+              :class="active2 === index ? 'active' : ''"
+              @click="active2 = index"
+            >
+              {{ item.name }}
+            </div>
+          </div>
+          <div class="bank__body">
+            <p
+              v-if="
+                !goodsList2[active2] ||
+                !goodsList2[active2].goodsList ||
+                goodsList2[active2].goodsList.length === 0
+              "
+              class="text_align"
+            >
+              该培训项目无推荐题库
+            </p>
+            <ul v-else class="list clearfix">
+              <template v-for="(item, index) in goodsList2[active2].goodsList">
+                <li
+                  class="bank-item"
+                  v-if="index < 15"
+                  :key="index"
+                  @click="goodsDetail(item, 2)"
+                >
+                  <GoodsItem :item="item"></GoodsItem>
+                </li>
+              </template>
+            </ul>
+          </div> -->
+  
+          <div class="bank__body">
+            <p v-if="!goodsList2.length" class="text_align">
+              该培训项目无推荐题库
+            </p>
+            <ul v-else class="list clearfix">
+              <template v-for="(item, index) in goodsList2">
+                <!-- @click="goodsDetail(item, 2)" -->
+                <li class="bank-item" :key="index">
+                  <GoodsItem :item="item"></GoodsItem>
+                </li>
+              </template>
+            </ul>
+          </div>
+  
+          <div class="pagination">
+            <el-pagination
+              @current-change="currentChangeBank"
+              background
+              layout="prev, pager, next"
+              :total="paramList[1].total"
+              :current-page.sync="paramList[1].currentPage"
+              :page-size="paramList[1].pageSize"
+            >
+            </el-pagination>
+          </div>
+        </div>
+      </section>
+  
+      <el-dialog
+        :visible.sync="bindShow"
+        width="348px"
+        center
+        :close-on-click-modal="false"
+        :close-on-press-escape="false"
+        class="bind"
+      >
+        <a class="bind__close" @click="bindNext">X</a>
+        <div class="bind__header">关联学员身份</div>
+        <div class="bind__body">
+          <el-form
+            class="bind-form"
+            ref="bindForm"
+            :model="bindForm"
+            :rules="bindForm"
+          >
+            <el-form-item prop="realname"
+              ><el-input placeholder="真实姓名" v-model="bindForm.realname">
+              </el-input
+            ></el-form-item>
+            <el-form-item prop="idCard">
+              <el-input
+                placeholder="身份证号码"
+                v-model="bindForm.idCard"
+                maxlength="18"
+              >
+              </el-input
+            ></el-form-item>
+            <el-button
+              class="submit"
+              type="primary"
+              :loading="isBind"
+              round
+              @click="bind()"
+              >确定</el-button
+            >
+            <div class="bind-next" @click="bindNext">下次再关联</div>
+          </el-form>
+        </div>
+      </el-dialog>
+  
+      <ToolBar></ToolBar>
+      <Footer></Footer>
+      <wx-login ref="wxLogin" @wxLoginBack="wxLoginBack"></wx-login>
+  
+      <RebuildModal
+        ref="rebuildModal"
+        @rebuildSubmit="rebuildSubmit($event)"
+      ></RebuildModal>
+      <div id="packPageDialog" v-if="packPageStatus">
+        <div class="img-box">
+          <img
+            src="@/assets/img/tcs.png"
+            alt=""
+            @click="swiperJump({ jumpType: 2, jumpUrl: '/packPage' })"
+          />
+          <i class="el-icon-circle-close" @click="closePackPage"></i>
+        </div>
+      </div>
+    </div>
+  </template>
+  
+  <script>
+  import RebuildModal from "@/components/rebuildModal";
+  import wxLogin from "@/components/wxLogin/index";
+  import Footer from "@/components/footer/index";
+  import ToolBar from "@/components/toolbar/index";
+  import GoodsItem from "@/components/goodsItem/index";
+  import { swiper, swiperSlide } from "vue-awesome-swiper";
+  import { mapGetters, mapMutations } from "vuex";
+  import { checkFunc } from "@/router";
+  import "swiper/swiper-bundle.css";
+  export default {
+    name: "Home",
+    components: {
+      swiper,
+      swiperSlide,
+      Footer,
+      GoodsItem,
+      ToolBar,
+      wxLogin,
+      RebuildModal
+    },
+    computed: {
+      ...mapGetters(["userInfo", "token", "header", "nav", "msgCount", "mobile"]),
+  
+      showNav: function() {
+        return function(list) {
+          var newList = [];
+          if (list) {
+            newList = list.filter(item => {
+              return item.status === 1;
+            });
+          }
+          return newList;
+        };
+      }
+    },
+    data() {
+      return {
+        dualStatus: false, //是否双重校验
+        msgShow: false,
+        msgData: {},
+        showBox: false,
+        indexToken: "",
+        indexUserAccount: "",
+        colors: [],
+        color: "",
+        countDown: 0,
+        countDownTimer: null,
+        loginRules: {
+          account: [
+            { required: true, trigger: "blur", message: "请输入手机号/身份证号" }
+          ],
+          pwd: [{ required: true, trigger: "blur", message: "请输入密码" }]
+        },
+        loginSmsRules: {
+          code: [{ required: true, trigger: "blur", message: "请输入验证码" }],
+          tel: [{ required: true, trigger: "blur", message: "请输入手机号" }]
+        },
+        bindRules: {
+          code: [{ required: true, trigger: "blur", message: "请输入验证码" }],
+          tel: [{ required: true, trigger: "blur", message: "请输入手机号" }],
+          pwd: [{ required: true, trigger: "blur", message: "请输入密码" }],
+          read: [{ required: true, trigger: "blur", message: "请勾选服务协议" }]
+        },
+        bindShow: false,
+        loginType: 2,
+        loginForm: {},
+        loginSmsForm: {},
+        bindForm: {},
+        isLogin: false,
+        isLoginSms: false,
+        isBind: false,
+        getLoginCodeLock: false,
+  
+        isloginSms: false,
+        swiperOptions: {
+          loop: true,
+          observer: true,
+          observeParents: true,
+          speed: 300,
+          autoplayDisableOnInteraction: false,
+          autoplayStopOnLast: false,
+          autoplay: {
+            delay: 1000,
+            disableOnInteraction: false
+          },
+          // 显示分页
+          pagination: {
+            el: ".swiper-pagination",
+            clickable: true //允许分页点击跳转
+          },
+          // 设置点击箭头
+          navigation: {
+            nextEl: ".swiper-button-next",
+            prevEl: ".swiper-button-prev"
+          }
+        },
+        bannerList: [],
+        goodsList1: [{}], //推荐课程列表
+        goodsList2: [{}], //推荐题库列表
+        typeList: [],
+        slideList: [],
+        active1: 0, //推荐课程index
+        active2: 0, //推荐题库index
+        searchKey: "",
+        type: "1",
+        recordList: {},
+        params: {
+          pageNum: 1,
+          pageSize: 10
+        },
+        paramList: [
+          {
+            pageNum: 1,
+            pageSize: 15,
+            total: 0
+          },
+          {
+            pageNum: 1,
+            pageSize: 15,
+            total: 0
+          }
+        ],
+        total1: 0,
+        total2: 0,
+        courseName: [],
+        bankName: [],
+        couIndex: 0,
+        bankIndex: 0,
+        courseId: "",
+        bankId: "",
+        packPageStatus: false
+      };
+    },
+    created() {
+      this.goodsList1 = [];
+      this.goodsList2 = [];
+      this.courseLists();
+    },
+    mounted() {
+      //双重校验
+      this.$request.dualAuth().then(res => {
+        this.dualStatus = res.data === "1" ? true : false;
+        if (this.dualStatus) {
+          this.loginRules["account"][0].message = "请输入手机号";
+        }
+      });
+      if (this.userInfo) {
+        this.getRecord();
+        // this.getmsg();
+        this.getMsgCount();
+      }
+      // this.getActivityList();
+      // this.color = this.colors[0];
+      this.advertisingList();
+      this.educationTypeList();
+    },
+    watch: {
+      userInfo(val) {
+        if (val) {
+          this.getRecord();
+          // this.getmsg();
+          this.getMsgCount();
+        }
+      }
+    },
+    methods: {
+      closePackPage() {
+        this.packPageStatus = false;
+        this.$store.state.packPageStatus = false;
+      },
+      //课程
+      courseLists() {
+        this.$request
+          .appCommonActivityRecommendList({ platform: 2, status: 1 })
+          .then(async res => {
+            if (res.code == 200) {
+              let list = res.rows || [];
+              //课程
+              this.courseName = list
+                .filter(x => x.type == 1)
+                .sort((a, b) => a.sort - b.sort)
+                .map(x => {
+                  return {
+                    name: x.name,
+                    recommendId: x.recommendId
+                  };
+                });
+              console.log("couIndex", this.couIndex, this.courseName);
+              //题库
+              this.bankName = list
+                .filter(x => x.type == 2)
+                .sort((a, b) => a.sort - b.sort)
+                .map(x => {
+                  return {
+                    name: x.name,
+                    recommendId: x.recommendId
+                  };
+                });
+              if (this.courseName.length) {
+                this.courseId = this.courseName[0].recommendId;
+                let list1 = await this.getGoodsList(
+                  this.courseName[0].recommendId,
+                  0
+                );
+                console.log(list1, "list1");
+                this.goodsList1.push(...list1);
+              }
+  
+              if (this.bankName.length) {
+                this.bankId = this.bankName[0].recommendId;
+                let list2 = await this.getGoodsList(
+                  this.bankName[0].recommendId,
+                  1
+                );
+                this.goodsList2.push(...list2);
+              }
+            }
+          });
+      },
+      getGoodsList(recommendId, num) {
+        return new Promise((resolve, reject) => {
+          this.$axios({
+            url: `/app/common/activity/recommend/goodsList`,
+            method: "get",
+            params: {
+              pageNum: this.paramList[num].pageNum,
+              pageSize: this.paramList[num].pageSize,
+              recommendId: recommendId
+            },
+            noToken: true
+          }).then(res => {
+            if (res.code == 200) {
+              this.paramList[num].total = res.total;
+              resolve(res.rows);
+            }
+          });
+        });
+      },
+      async currentChangeCou(val) {
+        console.log("vallll", val);
+        this.paramList[0].pageNum = val;
+        this.goodsList1 = [];
+        let list1 = await this.getGoodsList(this.courseId, 0);
+        this.goodsList1.push(...list1);
+      },
+      async changeCou(recommendId, index) {
+        this.couIndex = index;
+        this.courseId = recommendId;
+        this.paramList[0].pageNum = 1;
+        this.paramList[0].currentPage = 1;
+        this.goodsList1 = [];
+        let list1 = await this.getGoodsList(recommendId, 0);
+        this.goodsList1.push(...list1);
+      },
+      async currentChangeBank(val) {
+        console.log("val--", val);
+        this.paramList[1].pageNum = val;
+        this.goodsList2 = [];
+        let list2 = await this.getGoodsList(this.bankId, 1);
+        this.goodsList2.push(...list2);
+      },
+      async changebank(recommendId, index) {
+        this.bankIndex = index;
+        this.bankId = recommendId;
+        this.paramList[1].pageNum = 1;
+        this.paramList[1].currentPage = 1;
+        this.goodsList2 = [];
+        let list2 = await this.getGoodsList(recommendId, 1);
+        this.goodsList2.push(...list2);
+      },
+      /**
+       * 关闭消息
+       */
+      clearMsg() {
+        let ary = {
+          userId: this.msgData.userId,
+          msgId: this.msgData.id,
+          updateTime: new Date(new Date().toLocaleDateString()).getTime()
+        };
+        localStorage.setItem("msg", JSON.stringify(ary));
+        this.msgShow = false;
+      },
+      rebuildSubmit(item) {
+        this.$router.push({
+          path: `/my-course-detail/${item.goodsId}`,
+          query: {
+            gradeId: item.gradeId,
+            orderGoodsId: item.orderGoodsId,
+            rebuild: 1
+          }
+        });
+      },
+      getGoodsData() {
+        return new Promise((resolve, reject) => {
+          this.$request.goodsDetail(this.msgData.goodsId).then(res => {
+            resolve(res.data);
+          });
+        });
+      },
+      /**
+       * 前往学习
+       */
+      async newGoToStudy() {
+        let item = await this.getGoodsData();
+        if (item.goodsType == 1) {
+          this.sysTime = this.$tools.timest();
+          item.orderGoodsId = this.msgData.orderGoodsId;
+          this.canJump(item).then(res => {
+            this.clearMsg();
+            this.$router.push({
+              path: `/my-course-detail/${item.goodsId}`,
+              query: {
+                gradeId: item.gradeId,
+                orderGoodsId: item.orderGoodsId,
+                courseId: res.rows[0].courseId || ""
+              }
+            });
+          });
+  
+          // arsty = '立刻学习';
+  
+          //题库
+        } else if (item.goodsType == 2) {
+          this.clearMsg();
+          this.$router.push({
+            path: "/person-center/my-bank/bank-detail/" + item.goodsId,
+            query: {
+              orderGoodsId: item.orderGoodsId
+            }
+          });
+        }
+      },
+      canJump(item) {
+        return new Promise(resolve => {
+          this.$request
+            .orderInfo({
+              orderGoodsId: item.orderGoodsId
+            })
+            .then(async res => {
+              let items = res.data;
+              let currentTime = this.$tools.timest();
+              if (items.interfaceAccountId > 0) {
+                //学习账号已开通
+  
+                if (items.learnStatus == 1) {
+                  //跳转第三方h5
+  
+                  const confirmText = [
+                    "您的学习账号已经开通,请按照步骤操作,进行学习。",
+                    "1.点击【跳转学习网址】按钮",
+                    "2.打开学习网址后,选择【个人用户】进行登录",
+                    "(1)账号:您个人的身份证号码",
+                    "(2)密码:身份证号码,再加111111"
+                  ];
+                  const newDatas = [];
+                  const h = this.$createElement;
+                  for (const i in confirmText) {
+                    newDatas.push(h("p", null, confirmText[i]));
+                  }
+                  this.$confirm(h("div", null, newDatas), "温馨提示", {
+                    confirmButtonText: "跳转学习网址",
+                    cancelButtonText: "关闭",
+                    closeOnClickModal: false,
+                    closeOnPressEscape: false,
+                    distinguishCancelAndClose: false,
+                    showClose: false
+                  })
+                    .then(_ => {
+                      window.open("http://admin.zhujianpeixun.com/", "_blank");
+                    })
+                    .catch(_ => {});
+  
+                  return;
+                } else {
+                  this.$message({
+                    type: "warning",
+                    message:
+                      "您的学习账号未开通,请稍后再尝试,有疑问,请联系020-87085982!"
+                  });
+                  return;
+                }
+              }
+              // //内部系统
+              // if (items.interfacePushId > 0 && items.officialStatus != 1) {
+              //   this.$message({
+              //     type: "warning",
+              //     message:
+              //       "机构正在为您报名中,请耐心等待,有疑问请联系020-87085982!",
+              //   });
+              //   return;
+              // }
+              if (items.goodsType !== 6) {
+                if (
+                  this.sysTime <= items.serviceStartTime ||
+                  this.sysTime >= items.serviceEndTime
+                ) {
+                  this.$message({
+                    type: "warning",
+                    message: "不在学习服务期,不能进入学习"
+                  });
+                  return;
+                }
+  
+                if (
+                  (items.classStartTime &&
+                    this.sysTime <= items.classStartTime) ||
+                  (items.classEndTime && this.sysTime >= items.classEndTime)
+                ) {
+                  this.$message({
+                    type: "warning",
+                    message: "不在班级有效期,不能进入学习"
+                  });
+                  return;
+                }
+  
+                if (items.learningStatus == 2) {
+                  this.$message({
+                    type: "warning",
+                    message: "开放学习时间待定,不能进入学习"
+                  });
+                  return;
+                }
+  
+                if (items.classStatus == 0) {
+                  this.$message({
+                    type: "warning",
+                    message: "尚未开班,不能进入学习"
+                  });
+                  return;
+                }
+                if (
+                  items.learningStatus == 3 &&
+                  this.sysTime < items.learningTimeStart
+                ) {
+                  this.$message({
+                    type: "warning",
+                    message: "不在开放学习时间,不能进入学习"
+                  });
+                  return;
+                }
+  
+                let rebuildStatus = await this.courseGoodsRebuildStatus(
+                  items.goodsId,
+                  items.gradeId
+                );
+  
+                if (rebuildStatus == 0) {
+                  this.$refs.rebuildModal.showModal(items);
+                  return;
+                }
+              }
+  
+              // if (item.educationName == "继续教育") {
+              this.$request
+                .lockLockStatus({
+                  action: "jxjy"
+                })
+                .then(res => {
+                  //有其他端在操作,不能学习
+                  this.$message({
+                    type: "warning",
+                    message: res.msg
+                  });
+                })
+                .catch(err => {
+                  //可以学习
+                  this.$request
+                    .courseCourseList({
+                      pageNum: 1,
+                      pageSize: 1,
+                      goodsId: items.goodsId,
+                      gradeId: items.gradeId
+                    })
+                    .then(res => {
+                      if (res.rows.length) {
+                        resolve(res);
+                      } else {
+                        this.$message({
+                          type: "warning",
+                          message: "课程内暂无可以学习的科目"
+                        });
+                      }
+                    });
+                });
+  
+              // } else {
+              //   this.$request
+              //     .courseCourseList({
+              //       pageNum: 1,
+              //       pageSize: 1,
+              //       goodsId: items.goodsId,
+              //       gradeId: items.gradeId,
+              //     })
+              //     .then((res) => {
+              //       if (res.rows.length) {
+              //         resolve(res);
+              //       } else {
+              //         this.$message({
+              //           type: "warning",
+              //           message: "课程内暂无可以学习的科目",
+              //         });
+              //       }
+              //     });
+              // }
+            });
+        });
+      },
+  
+      /**
+       * @param {Object} goodsId 商品id
+       * 查询商品重修状态
+       */
+      courseGoodsRebuildStatus(goodsId, gradeId) {
+        return new Promise(resolve => {
+          this.$request
+            .courseGoodsRebuildStatus({
+              goodsId: goodsId,
+              gradeId: gradeId
+            })
+            .then(res => {
+              resolve(res.data);
+            });
+        });
+      },
+      /**
+       * 微信登入
+       */
+      wxLoginFunc() {
+        this.$refs.wxLogin.openBoxs();
+      },
+      /**
+       * 微信登入—返回数据
+       */
+      wxLoginBack(res) {
+        localStorage.setItem("user_account", res.data.user_account);
+        localStorage.setItem("token", res.data.token);
+        if (res.data.full_info) {
+          this.getInfo();
+        } else {
+          this.indexUserAccount = res.data.user_account;
+          this.indexToken = res.data.token;
+          this.isLogin = false;
+          // 弹窗
+          this.bindShow = true;
+        }
+      },
+      goLast() {
+        if (this.recordList.goodsType == 6) {
+          this.go("/my-live-detail/" + this.recordList.goodsId, {
+            gradeId: this.recordList.gradeId,
+            orderGoodsId: this.recordList.orderGoodsId,
+            courseId: this.recordList.courseId
+          });
+        } else if (this.recordList.goodsType == 1) {
+          this.$router.push({
+            path: `/my-course-detail/${this.recordList.goodsId}`,
+            query: {
+              gradeId: this.recordList.gradeId,
+              orderGoodsId: this.recordList.orderGoodsId,
+              courseId: this.recordList.courseId,
+              chapterId: this.recordList.chapterId,
+              moduleId: this.recordList.moduleId,
+              sectionId: this.recordList.sectionId,
+              recordingUrl: this.recordList.recordingUrl,
+              liveUrl: this.recordList.liveUrl,
+              sectionType: this.recordList.sectionType,
+              liveStartTime: this.recordList.liveStartTime,
+              liveEndTime: this.recordList.liveEndTime
+            }
+          });
+        }
+      },
+      swiperJump(swiper) {
+        if (swiper.jumpType == 1) {
+          //无跳转
+          return;
+        } else if (swiper.jumpType == 2) {
+          //url
+          window.open(swiper.jumpUrl, "_blank");
+        } else if (swiper.jumpType == 3) {
+          //内部接口
+          this.$router.push({
+            path: swiper.jumpUrl
+          });
+        }
+      },
+      handleCommand(command) {
+        switch (command) {
+          case "1":
+            this.go("/person-center/my-course");
+            break;
+          case "2":
+            this.go("/person-center/my-bank");
+            break;
+  
+          case "3":
+            this.go("/person-center/my-info");
+            break;
+          case "4":
+            this.$tools.exit();
+            break;
+          case "5":
+            console.log("------command:", command);
+            break;
+          default:
+            break;
+        }
+      },
+      toFixed(num) {
+        if (num) {
+          let str = String(num).indexOf(".");
+  
+          if (str != -1) {
+            return +num.toFixed(2);
+          } else {
+            return num;
+          }
+        } else {
+          return 0;
+        }
+      },
+      ...mapMutations(["setUserInfo", "getMsgCount"]),
+      /**
+       * 播放记录
+       */
+      getRecord() {
+        this.$request
+          .studRrecordListUserRecord({
+            pageNum: 1,
+            pageSize: 1
+          })
+          .then(res => {
+            if (res.rows.length) {
+              this.recordList = res.rows[0];
+            }
+          });
+      },
+      search() {
+        if (!this.searchKey.trim()) {
+          this.$message({
+            type: "warning",
+            duration: 2000,
+            message: "请输入搜索内容"
+          });
+  
+          return;
+        }
+        let type = this.type;
+  
+        //根据类型跳转题库或者列表页面
+        if (type == "1") {
+          this.$router.push({
+            path: "/course-list",
+            query: {
+              searchKey: this.searchKey
+            }
+          });
+        } else if (type == "6") {
+          this.$router.push({
+            path: "/live-list",
+            query: {
+              searchKey: this.searchKey
+            }
+          });
+        } else {
+          this.$router.push({
+            path: "/bank-list",
+            query: {
+              searchKey: this.searchKey
+            }
+          });
+        }
+      },
+      /**
+       * 查看商品详情
+       */
+      goodsDetail(item, type) {
+        if (type === 1) {
+          this.$router.push({
+            path: "/course-detail/" + item.goodsId
+          });
+        }
+        if (type === 2) {
+          this.$router.push({
+            path: "/bank-detail/" + item.goodsId
+          });
+        }
+      },
+      educationTypeList() {
+        this.$request.educationTypeList().then(res => {
+          this.typeList = res.rows.slice(0, 5);
+          this.typeList.forEach((typeItem, index) => {
+            this.businessList(typeItem.id, index);
+          });
+        });
+      },
+  
+      businessList(educationId, index) {
+        this.$request
+          .businessList({ educationId })
+          .then(res => {
+            let rows = res.rows.filter(item => item.aliasName);
+            this.$set(this.slideList, index, rows);
+            if (rows.length >= 2) {
+              let newRows = rows.slice(0, 2);
+              let length = 0;
+              newRows.forEach(row => {
+                let str = row.projectName + "-" + row.businessName;
+                length = length + str.length;
+              });
+  
+              if (length >= 7) {
+                this.$set(this.typeList[index], "list", rows.slice(0, 5));
+              } else {
+                this.$set(this.typeList[index], "list", rows.slice(0, length));
+              }
+            } else {
+              this.$set(this.typeList[index], "list", rows);
+            }
+          })
+          .catch(err => {
+            console.log(err, "err");
+          });
+      },
+  
+      /**
+       * 加入购物车
+       */
+      addCart(item) {
+        this.$request
+          .addCart({ goodsId: item.goodsId })
+          .then(res => {
+            if (res) {
+              this.getCartCount();
+              this.$message({
+                message: "加入购物车成功",
+                type: "success"
+              });
+            }
+          })
+          .catch(err => {
+            if (err.code == 500) {
+              this.$message({
+                message: err.msg,
+                type: "warning"
+              });
+            }
+          });
+      },
+      /**
+       * 获取推荐商品
+       */
+      getActivityList() {
+        this.$request
+          .appCommonActivityRecommendList({ platform: 2, status: 1 })
+          .then(res => {
+            let goodsList1 = []; //推荐视频商品
+            let goodsList2 = []; //推荐题库商品
+            res.rows.forEach(item => {
+              if (item.type === 1) {
+                goodsList1.push(item);
+              }
+              if (item.type === 2) {
+                goodsList2.push(item);
+              }
+            });
+            this.goodsList1 = goodsList1.sort((a, b) => a.sort - b.sort);
+            this.goodsList2 = goodsList2.sort((a, b) => a.sort - b.sort);
+          });
+      },
+      goCourse(item) {
+        console.log("sdsf", item);
+        if (item.topicId) {
+          this.$router.push({
+            path: "/goodsTopic",
+            query: {
+              topicId: item.topicId
+            }
+          });
+          return;
+        }
+  
+        this.$router.push({
+          path: "/course-list",
+          query: {
+            educationId: item.educationId ? item.educationId : item.id || "",
+            projectId: item.projectId || "",
+            businessId: item.educationId ? item.id : ""
+          }
+        });
+      },
+      slideChangeTransitionStart(e) {
+        this.color = this.colors[this.$refs.mySwiper.swiper.realIndex];
+      },
+      advertisingList() {
+        this.$request
+          .advertisinghomeLocationList({
+            platform: 2, //1小程序2PC网站
+            status: 1,
+            locationKey: "home-banner" //首页轮播KEY
+          })
+          .then(res => {
+            this.swiperOptions.autoplay.delay = res.data[0].intervalTime * 1000;
+            /**
+             * 如果存在-调用轮播图列表
+             */
+            if (res.data.length) {
+              this.$request
+                .advertisingList({ locationId: res.data[0].locationId })
+                .then(res => {
+                  if (res.rows.length < 2) {
+                    this.swiperOptions.loop = false;
+                  }
+                  this.bannerList = res.rows;
+                  this.colors = res.rows.map(item => {
+                    if (
+                      item.jumpUrl == "/packPage" &&
+                      this.$store.state.packPageStatus
+                    ) {
+                      this.packPageStatus = true;
+                    }
+                    return item.color ? item.color : "rgba(225,225,225,0.1)";
+                  });
+                  this.color = this.colors[0];
+                });
+            }
+          });
+      },
+      go(path, query) {
+        this.$router.push({
+          path,
+          query
+        });
+      },
+      goLink(path) {
+        window.open(path);
+      },
+      mouseover() {
+        clearTimeout(this.timer);
+        this.showBox = true;
+      },
+  
+      mouseLeave() {
+        clearTimeout(this.timer);
+        this.timer = setTimeout(() => {
+          this.showBox = false;
+        }, 500);
+      },
+      login() {
+        this.$refs.loginForm.validate(valid => {
+          if (valid) {
+            this.isLogin = true;
+            let loginForm = JSON.parse(JSON.stringify(this.loginForm));
+            loginForm.pwd = this.$tools.encryptor(loginForm.pwd);
+            console.log(this.loginForm);
+            if (this.dualStatus) {
+              loginForm.tel = loginForm.account;
+            }
+            this.$request
+              .login(loginForm)
+              .then(res => {
+                localStorage.setItem("user_account", res.data.user_account);
+                localStorage.setItem("token", res.data.token);
+                if (res.data.full_info) {
+                  // localStorage.setItem("user_account", res.data.user_account);
+                  // localStorage.setItem("token", res.data.token);
+  
+                  this.getInfo();
+                } else {
+                  this.indexUserAccount = res.data.user_account;
+                  this.indexToken = res.data.token;
+                  this.isLogin = false;
+                  // 弹窗
+                  this.bindShow = true;
+                }
+              })
+              .catch(err => {
+                this.isLogin = false;
+                this.$message({
+                  message: err.msg,
+                  type: "error"
+                });
+              });
+          }
+        });
+      },
+      /**
+       * 获取登录短信
+       */
+      getLoginSms(int) {
+        this.$refs[int === 1 ? "loginForm" : "loginSmsForm"].validateField(
+          int === 1 ? "account" : "tel",
+          valid => {
+            if (!valid) {
+              if (this.countDown == 0) {
+                if (this.getLoginCodeLock) {
+                  return;
+                }
+                this.getLoginCodeLock = true;
+                this.$request
+                  .getLoginSms({
+                    tel:
+                      int === 1 ? this.loginForm.account : this.loginSmsForm.tel
+                  })
+                  .then(res => {
+                    this.getLoginCodeLock = false;
+                    this.$message({
+                      message: `验证码已发送`,
+                      type: "success"
+                    });
+                    this.countDown = 60;
+                    this.countDownTimer = setInterval(() => {
+                      if (this.countDown == 0) {
+                        clearInterval(this.countDownTimer);
+                      } else {
+                        this.countDown--;
+                      }
+                    }, 1000);
+                  })
+                  .catch(err => {
+                    this.$message.error(err.msg);
+                    this.getLoginCodeLock = false;
+                  });
+              }
+            }
+          }
+        );
+      },
+      /**
+       * 手机号登录
+       */
+      loginSms() {
+        this.$refs.loginSmsForm.validate(valid => {
+          if (valid) {
+            this.isloginSms = true;
+            this.$request
+              .loginSms(this.loginSmsForm)
+              .then(res => {
+                this.isloginSms = false;
+                localStorage.setItem("user_account", res.data.user_account);
+                localStorage.setItem("token", res.data.token);
+                this.$tools.setUuid(new Date().valueOf() + "");
+                if (res.data.full_info) {
+                  this.getInfo();
+                } else {
+                  this.indexUserAccount = res.data.user_account;
+                  this.indexToken = res.data.token;
+                  this.bindShow = true;
+                }
+              })
+              .catch(err => {
+                this.isloginSms = false;
+                this.$message({
+                  message: err.msg,
+                  type: "error"
+                });
+              });
+          }
+        });
+      },
+      /**
+       * 消息提示
+       */
+      getmsg() {
+        this.$request.informUserselectLastUnStudyMsg().then(res => {
+          if (res.data && res.data.id) {
+            let today = new Date(new Date().toLocaleDateString()).getTime();
+            if (localStorage.getItem("msg")) {
+              let ary = JSON.parse(localStorage.getItem("msg"));
+              if (ary.updateTime === today) {
+                this.msgShow = false;
+                return;
+              }
+            }
+            this.$nextTick(() => {
+              this.msgData = res.data;
+              this.msgShow = true;
+            });
+          } else {
+            this.msgShow = false;
+          }
+        });
+      },
+      /**
+       * 获取用户登录信息
+       */
+      getInfo() {
+        this.$request
+          .getInfo({ fromPlat: 2 })
+          .then(res => {
+            this.loginForm = {};
+            this.loginSmsForm = {};
+            this.isLogin = false;
+            this.isloginSms = false;
+            this.setUserInfo(res.data);
+            checkFunc();
+            // this.getmsg();
+          })
+          .catch(err => {
+            this.isLogin = false;
+            this.isloginSms = false;
+            this.$message({
+              message: err.msg,
+              type: "error"
+            });
+          });
+      },
+      bind() {
+        this.$refs.bindForm.validate(valid => {
+          if (valid) {
+            this.isBind = true;
+            let bindForm = JSON.parse(JSON.stringify(this.bindForm));
+            bindForm.token = this.indexToken;
+            this.$request
+              .bindIdCard(bindForm)
+              .then(res => {
+                this.isBind = false;
+                this.bindShow = false;
+                this.$message({
+                  message: "关联成功",
+                  type: "success"
+                });
+                localStorage.setItem("user_account", this.indexUserAccount);
+                localStorage.setItem("token", this.indexToken);
+                this.$tools.setUuid(new Date().valueOf() + "");
+                this.getInfo();
+              })
+              .catch(err => {
+                this.isBind = false;
+                this.$message({
+                  message: err.msg,
+                  type: "error"
+                });
+              });
+          }
+        });
+      },
+  
+      bindNext() {
+        this.bindShow = false;
+        this.indexToken = "";
+        this.indexUserAccount = "";
+        this.getInfo();
+      }
+    }
+  };
+  </script>
+  
+  <!-- Add "scoped" attribute to limit CSS to this component only -->
+  <style scoped lang="scss">
+  /deep/ .el-input__inner::placeholder {
+    color: #777 !important;
+  }
+  .text_align {
+    text-align: center;
+    font-size: 18px;
+    margin: 40px 0px;
+  }
+  
+  .home {
+    .header {
+      background: #ffffff;
+  
+      &__header {
+        box-shadow: 0px 4px 4px 0px rgba(0, 0, 0, 0.04);
+  
+        .text-list {
+          height: 26px;
+          line-height: 26px;
+          text-align: right;
+          font-size: 0;
+  
+          a {
+            color: #3f8dfd;
+            font-size: 14px;
+            padding: 0 14px;
+  
+            &:nth-last-of-type(1) {
+              padding-right: 0;
+              border-left: 1px solid #3f8dfd;
+            }
+          }
+        }
+  
+        .icon-list {
+          height: 26px;
+          line-height: 26px;
+          text-align: right;
+          font-size: 0;
+  
+          a {
+            color: #3f8dfd;
+            font-size: 14px;
+            padding: 0 14px;
+            position: relative;
+  
+            .icon {
+              font-size: 20px;
+            }
+  
+            .modal-box {
+              width: 162px;
+              background: #ffffff;
+              box-shadow: 0px 4px 4px 0px rgba(0, 0, 0, 0.1);
+              border-radius: 8px;
+              position: absolute;
+              top: 34px;
+              left: -40px;
+  
+              li {
+                margin-left: 10px;
+                border-bottom: 1px solid #eeeeee;
+                height: 26px;
+                line-height: 26px;
+                cursor: pointer;
+                padding-left: 5px;
+                color: #666666;
+                text-align: left;
+  
+                &:hover {
+                  background: #eeeeee;
+                  color: #3f8dfd;
+                }
+  
+                &:nth-last-of-type(1) {
+                  border: 0;
+                }
+              }
+            }
+          }
+        }
+      }
+  
+      &__body {
+        margin-top: 16px;
+        .topBoxy {
+          display: flex;
+          align-items: center;
+          .logo {
+            width: 300px;
+            // float: left;
+  
+            img {
+              max-width: 300px;
+              // height: 33px;
+            }
+  
+            h1 {
+              background: url("~@/assets/logo.png") no-repeat center;
+              width: 162px;
+              height: 33px;
+            }
+          }
+  
+          .search {
+            flex-shrink: 0;
+            // float: left;
+            margin-left: 30px;
+            width: 648px;
+            background: #fafbfc;
+            border: 1px solid #3f8dfd;
+            border-radius: 8px;
+            display: flex;
+            overflow: hidden;
+  
+            &__select {
+              width: 76px;
+              border-right: 1px solid #fff;
+  
+              select {
+                text-align: center;
+                width: 100%;
+                height: 100%;
+                border: 0;
+                outline: none;
+              }
+            }
+  
+            &__input {
+              flex: 1;
+  
+              input {
+                width: 100%;
+                height: 100%;
+              }
+            }
+  
+            &__btn {
+              padding: 0;
+              text-align: center;
+              width: 80px;
+              height: 40px;
+              line-height: 40px;
+              font-size: 14px;
+              border-radius: 0;
+            }
+          }
+  
+          .contact {
+            // float: right;
+            padding-left: 45px;
+            background: url("~@/assets/cus.png") no-repeat left top;
+  
+            &__phone {
+              font-size: 18px;
+              font-family: Microsoft YaHei;
+              font-weight: bold;
+              color: #666666;
+            }
+  
+            &__time {
+              font-size: 14px;
+              font-family: Microsoft YaHei;
+              font-weight: 400;
+              color: #666666;
+            }
+          }
+        }
+      }
+    }
+  
+    .section {
+      margin-top: 10px;
+  
+      .tabs {
+        margin-left: 324px;
+  
+        .tab {
+          display: inline-block;
+          width: 138px;
+          height: 40px;
+          font-size: 16px;
+          text-align: center;
+          line-height: 40px;
+          color: #333;
+  
+          &.active {
+            color: #3f8dfd;
+            background: #f0f5fc;
+          }
+        }
+      }
+  
+      .swiper-wrap {
+        transition: background 0.3s;
+        height: 400px;
+        position: relative;
+  
+        .container {
+          position: relative;
+          height: 400px;
+  
+          .left-box {
+            position: absolute;
+            top: -40px;
+            left: 0;
+            height: 440px;
+            width: 300px;
+            z-index: 10;
+  
+            &__header {
+              height: 40px;
+              line-height: 40px;
+              color: #fff;
+              font-size: 16px;
+              background: #3f8dfd;
+              text-align: center;
+            }
+  
+            &__body {
+              position: relative;
+              height: 400px;
+              background: rgba(0, 0, 0, 0.5);
+              overflow: hidden;
+  
+              &:hover {
+                overflow: visible;
+  
+                .slide-list {
+                  opacity: 1;
+                  left: 100%;
+                }
+              }
+  
+              .slide-list {
+                height: 100%;
+                opacity: 0;
+                transition: all 0.3s;
+                width: 580px;
+                padding: 0;
+                background: rgba(255, 255, 255, 1);
+                position: absolute;
+                top: 0;
+                left: 0;
+                padding-left: 24px;
+                z-index: 10;
+  
+                &__item {
+                  min-height: 80px;
+                  display: flex;
+                  align-items: center;
+                  border-bottom: 1px solid #ddd;
+  
+                  &:nth-last-of-type(1) {
+                    border: 0;
+                  }
+  
+                  .title {
+                    cursor: pointer;
+                    color: #fff;
+                    width: 120px;
+                    height: 28px;
+                    border: 1px solid #ffffff;
+                    border-radius: 14px;
+                    background: #3f8dfd;
+                    line-height: 26px;
+                    text-align: center;
+                    border-radius: 15px;
+                    margin-right: 10px;
+                  }
+  
+                  .nav {
+                    flex: 1;
+                    display: flex;
+                    flex-wrap: wrap;
+  
+                    li {
+                      margin: 9px 24px 9px 0;
+                      display: flex;
+  
+                      .text {
+                        cursor: pointer;
+                        font-size: 14px;
+                        font-family: Microsoft YaHei;
+                        font-weight: 400;
+                        color: #666;
+                      }
+                    }
+                  }
+                }
+              }
+  
+              .bg {
+                backdrop-filter: blur(10px);
+                position: absolute;
+                left: 0;
+                top: 0;
+                width: 100%;
+                height: 100%;
+                z-index: 12;
+              }
+  
+              .list {
+                position: relative;
+                z-index: 22;
+                padding-left: 16px;
+                height: 100%;
+                overflow-y: auto;
+                &::-webkit-scrollbar {
+                  width: 5px;
+                  height: 9px;
+                }
+  
+                /*定义滚动条轨道 内阴影+圆角*/
+                &::-webkit-scrollbar-track {
+                  background-color: inherit;
+                  border: none;
+                  /* margin: 6px; */
+                  border-radius: 10px;
+                  /* -webkit-box-shadow: inset 0 0 6px rgba(0,0,0,0.3); 
+      background-color: #F5F5F5; */
+                }
+  
+                /*定义滑块 内阴影+圆角*/
+                &::-webkit-scrollbar-thumb {
+                  border-radius: 10px;
+                  position: relative;
+                  right: 2px;
+                  /*-webkit-box-shadow: inset 0 0 6px rgba(0,0,0,.3);*/
+                  background-color: #c6c6cd;
+                  width: 6px;
+                }
+                li {
+                  padding: 12px 0;
+                  min-height: 80px;
+                  max-height: 200px;
+                  // overflow-y: auto;
+                  border-bottom: 1px solid rgba(255, 255, 255, 0.6);
+                  display: flex;
+  
+                  &:nth-last-of-type(1) {
+                    border: 0;
+                  }
+  
+                  .text {
+                    flex: 1;
+  
+                    &__title {
+                      cursor: pointer;
+                      font-size: 16px;
+                      font-family: Microsoft YaHei;
+                      font-weight: 400;
+                      color: #ffffff;
+                    }
+  
+                    &__desc {
+                      display: flex;
+                      align-items: center;
+                      flex-wrap: wrap;
+                      margin-top: 16px;
+  
+                      .item {
+                        // flex-shrink: 0;
+                        font-size: 14px;
+                        font-family: Microsoft YaHei;
+                        font-weight: 400;
+                        color: rgba(225, 225, 225, 0.8);
+                        margin-right: 30px;
+                        margin-bottom: 10px;
+                        &:hover {
+                          color: #fff;
+                        }
+                      }
+                    }
+                  }
+                }
+              }
+            }
+          }
+  
+          .swiper {
+            .swiper-slide {
+              cursor: pointer;
+              height: 400px;
+  
+              img {
+                width: 100%;
+                height: 100%;
+              }
+            }
+  
+            .swiper-pagination {
+              text-align: right;
+              padding-right: 324px;
+  
+              /deep/ .swiper-pagination-bullet {
+                background: rgba(255, 255, 255, 0.4);
+  
+                &-active {
+                  background: rgba(255, 255, 255, 1);
+                }
+              }
+            }
+          }
+  
+          .right-box {
+            width: 300px;
+            background: rgba(0, 0, 0, 0.5);
+            position: absolute;
+            right: 0;
+            bottom: 0;
+            top: 0;
+            z-index: 10;
+  
+            .bg {
+              backdrop-filter: blur(10px);
+              position: absolute;
+              left: 0;
+              top: 0;
+              width: 100%;
+              height: 100%;
+              z-index: 2;
+            }
+  
+            .no-login {
+              position: relative;
+              z-index: 10;
+  
+              .input {
+                margin: 16px;
+                height: 40px;
+                background: #ffffff;
+                border-radius: 8px;
+  
+                input {
+                  padding: 0 16px;
+                  width: 100%;
+                  height: 100%;
+                  font-size: 14px;
+                  color: #333;
+  
+                  &::placeholder {
+                    color: #999;
+                  }
+                }
+  
+                .btn {
+                  font-size: 14px;
+                  font-family: Microsoft YaHei;
+                  font-weight: 400;
+                  color: #3f8dfd;
+                  white-space: nowrap;
+                  cursor: pointer;
+                }
+              }
+  
+              .submit {
+                margin: 16px;
+                font-size: 16px;
+                margin-top: 16px;
+                box-shadow: 0px 0px 4px 0px rgba(0, 0, 0, 0.08);
+                display: block;
+                width: 268px;
+              }
+  
+              .bottom-text {
+                margin: 16px;
+                display: flex;
+                justify-content: space-between;
+  
+                .text {
+                  color: #fff;
+                }
+              }
+            }
+  
+            .has-login {
+              position: relative;
+              z-index: 10;
+              padding: 14px 0 0 14px;
+  
+              .userinfo {
+                display: flex;
+                align-items: center;
+  
+                .avatar {
+                  width: 40px;
+                  height: 40px;
+                }
+  
+                .nickname {
+                  font-size: 16px;
+                  font-family: Microsoft YaHei;
+                  font-weight: bold;
+                  color: #ffffff;
+                  margin-left: 7px;
+                }
+              }
+  
+              .type-list {
+                display: flex;
+                margin-top: 28px;
+                padding-bottom: 14px;
+                border-bottom: 1px solid #fff;
+  
+                &__item {
+                  cursor: pointer;
+                  margin-right: 38px;
+  
+                  .img {
+                    width: 64px;
+                    height: 64px;
+                  }
+  
+                  .text {
+                    text-align: center;
+                    margin-top: 10px;
+                    font-size: 14px;
+                    font-family: Microsoft YaHei;
+                    font-weight: 400;
+                    color: #ffffff;
+                  }
+  
+                  &:nth-last-of-type(1) {
+                    margin-right: 0;
+                  }
+                }
+              }
+  
+              .history {
+                border-bottom: 1px solid #fff;
+                padding-bottom: 15px;
+  
+                .btn {
+                  margin-top: 15px;
+                  width: 64px;
+                  height: 24px;
+                  border: 1px solid #ffffff;
+                  border-radius: 8px;
+                  text-align: center;
+                  line-height: 24px;
+                  color: #fff;
+                }
+  
+                .title {
+                  cursor: pointer;
+                  margin-top: 15px;
+                  padding-right: 15px;
+                  font-size: 14px;
+                  font-family: Microsoft YaHei;
+                  font-weight: 400;
+                  color: #ffffff;
+                }
+  
+                .progress {
+                  margin-top: 15px;
+                  display: flex;
+                  justify-content: space-between;
+                  padding-right: 15px;
+  
+                  span {
+                    font-size: 14px;
+                    font-family: Microsoft YaHei;
+                    font-weight: 400;
+                    color: #ffffff;
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  
+    .course {
+      background: #f5f7fa;
+      padding-top: 40px;
+  
+      &__header {
+        display: flex;
+        align-items: center;
+        justify-content: space-between;
+        padding-bottom: 15px;
+        border-bottom: 1px solid #dcdcdc;
+  
+        .lefts {
+          display: flex;
+        }
+  
+        .title {
+          background: url("~@/assets/video.png") no-repeat left center;
+          padding-left: 36px;
+          font-size: 24px;
+          font-family: YouSheBiaoTiHei;
+          font-weight: 400;
+          color: #333333;
+          text-shadow: 0px 6px 6px rgba(249, 113, 13, 0.08);
+          flex-shrink: 0;
+        }
+      }
+  
+      .tabs {
+        margin-left: 28px;
+        display: flex;
+        align-items: center;
+  
+        .tab {
+          cursor: pointer;
+          color: #888888;
+          font-size: 14px;
+          margin-right: 32px;
+          overflow: hidden;
+          word-break: break-all;
+          text-overflow: ellipsis;
+          display: -webkit-box;
+          -webkit-line-clamp: 1;
+          -webkit-box-orient: vertical;
+  
+          &.active {
+            font-weight: 600;
+            color: #222222;
+          }
+        }
+      }
+  
+      .pagination {
+        padding: 30px 0;
+        text-align: center;
+      }
+  
+      &__body {
+        .list {
+          width: 100%;
+  
+          .course-item {
+            float: left;
+          }
+        }
+      }
+  
+      &__footer {
+        overflow: hidden;
+        flex-shrink: 0;
+  
+        .btn {
+          cursor: pointer;
+          width: 72px;
+          // height: 28px;
+          line-height: 28px;
+          background: #d5e4ff;
+          border-radius: 4px;
+          // margin: 20px auto 40px;
+          color: #3f8dfd;
+          text-align: center;
+          transition: all 0.2s;
+  
+          &:hover {
+            color: #fff;
+            box-shadow: 0px 8px 4px 0px rgba(7, 82, 208, 0.08);
+            background: #3f8dfd;
+          }
+        }
+      }
+    }
+  
+    .bank {
+      background: #fff;
+      padding-top: 40px;
+  
+      &__header {
+        display: flex;
+        align-items: center;
+        justify-content: space-between;
+        padding-bottom: 15px;
+        border-bottom: 1px solid #dcdcdc;
+  
+        .lefts {
+          display: flex;
+        }
+  
+        .title {
+          background: url("~@/assets/exercise.png") no-repeat left center;
+          padding-left: 36px;
+          font-size: 24px;
+          font-family: YouSheBiaoTiHei;
+          font-weight: 400;
+          color: #333333;
+          text-shadow: 0px 6px 6px rgba(249, 113, 13, 0.08);
+          flex-shrink: 0;
+        }
+      }
+      .tabs {
+        margin-left: 40px;
+        display: flex;
+        align-items: center;
+  
+        .tab {
+          cursor: pointer;
+          color: #888888;
+          font-size: 14px;
+          margin-right: 32px;
+          overflow: hidden;
+          word-break: break-all;
+          text-overflow: ellipsis;
+          display: -webkit-box;
+          -webkit-line-clamp: 1;
+          -webkit-box-orient: vertical;
+          &.active {
+            font-weight: 600;
+            color: #222222;
+          }
+        }
+      }
+      .pagination {
+        padding: 30px 0;
+        text-align: center;
+      }
+  
+      &__body {
+        .list {
+          width: 100%;
+  
+          .bank-item {
+            float: left;
+          }
+        }
+      }
+  
+      &__footer {
+        overflow: hidden;
+        flex-shrink: 0;
+        .btn {
+          cursor: pointer;
+          width: 72px;
+          // height: 28px;
+          line-height: 28px;
+          background: #d5e4ff;
+          border-radius: 4px;
+          // margin: 20px auto 40px;
+          color: #3f8dfd;
+          text-align: center;
+          transition: all 0.2s;
+  
+          &:hover {
+            color: #fff;
+            box-shadow: 0px 8px 4px 0px rgba(7, 82, 208, 0.08);
+            background: #3f8dfd;
+          }
+        }
+      }
+    }
+  
+    .bind {
+      /deep/ .el-dialog__header {
+        display: none;
+      }
+  
+      /deep/ .el-dialog__body {
+        padding: 0;
+        overflow: unset;
+      }
+  
+      &__close {
+        position: absolute;
+        right: 0;
+        top: -28px;
+        width: 24px;
+        height: 24px;
+        line-height: 24px;
+        text-align: center;
+        color: #eee;
+        border: 1px solid #eee;
+        border-radius: 50%;
+      }
+  
+      &__header {
+        height: 40px;
+        text-align: center;
+        line-height: 40px;
+        border-bottom: 1px solid #eeeeee;
+      }
+  
+      &__body {
+        height: 248px;
+        padding: 24px;
+        position: relative;
+        box-shadow: 0px 2px 2px 0px rgba(0, 0, 0, 0.04);
+        border-radius: 8px;
+  
+        .submit {
+          width: 100%;
+        }
+  
+        .bind-next {
+          font-size: 14px;
+          text-align: center;
+          color: #999;
+          margin-top: 10px;
+          cursor: pointer;
+        }
+      }
+    }
+  }
+  
+  .fade-enter,
+  .fade-leave-to {
+    opacity: 0;
+    height: 0;
+  }
+  
+  .fade-enter-to,
+  .fade-leave {
+    opacity: 1;
+    height: 122px;
+  }
+  
+  .fade-enter-active,
+  .fade-leave-active {
+    transition: all 0.3s;
+  }
+  
+  .dis_flex {
+    user-select: none;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+  
+    .dis_flex_wxloginImg {
+      cursor: pointer;
+      width: 76px;
+      height: 76px;
+      border-radius: 50%;
+      overflow: hidden;
+      background-color: #fff;
+      line-height: 76px;
+      text-align: center;
+  
+      img {
+        vertical-align: middle;
+        width: 40px;
+        height: 40px;
+      }
+    }
+  }
+  
+  /deep/ .el-badge__content.is-fixed {
+    top: 7px;
+  }
+  
+  .dis_plays {
+    display: flex;
+    align-items: center;
+  }
+  
+  .toolbth {
+    border-radius: 55px;
+    background-color: #fff;
+    color: #3f8dfd;
+    font-size: 14px;
+    padding: 5px 14px;
+    margin-right: 16px;
+    user-select: none;
+    cursor: pointer;
+  }
+  </style>
+  <style lang="scss">
+  .tooltipStyle {
+    background-color: #3f8dfd !important;
+    color: #fff;
+  }
+  
+  .tooltipStyle .popper__arrow {
+    border-bottom-color: #3f8dfd !important;
+  }
+  
+  .tooltipStyle .popper__arrow::after {
+    border-bottom-color: #3f8dfd !important;
+  }
+  #packPageDialog {
+    z-index: 9999;
+    position: fixed;
+    top: 0;
+    left: 0;
+    right: 0;
+    bottom: 0;
+    background-color: rgba(0, 0, 0, 0.5);
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    & > .img-box {
+      position: relative;
+      text-align: center;
+      & > img {
+        cursor: pointer;
+      }
+      & > i {
+        vertical-align: top;
+        color: #fff;
+        cursor: pointer;
+        font-size: 40px;
+      }
+    }
+  }
+  </style>
+  

+ 6 - 3
src/pages/home2/index.vue

@@ -32,7 +32,8 @@
           <p>精准课程过关VIP<br />任你挑选</p>
           <i>GO ></i>
         </div>
-        <img src="@/assets/new1/course.png" alt="" />
+        <img v-if="$store.state.TENANT_NANE == '200459300052468'" src="@/assets/new1/course2.png" alt="" />
+        <img v-else src="@/assets/new1/course.png" alt="" />
       </div>
       <div
         class="second"
@@ -44,7 +45,8 @@
           <p>一道好题胜百道<br />在线刷题</p>
           <i>GO ></i>
         </div>
-        <img src="@/assets/new1/tkbank.png" alt="" />
+        <img v-if="$store.state.TENANT_NANE == '200459300052468'" src="@/assets/new1/tkbank2.png" alt="" />
+        <img v-else src="@/assets/new1/tkbank.png" alt="" />
       </div>
       <div
         class="second"
@@ -56,7 +58,8 @@
           <p>讲义资料助你一力<br />快速获取</p>
           <i>GO ></i>
         </div>
-        <img src="@/assets/new1/zlps.png" alt="" />
+        <img v-if="$store.state.TENANT_NANE == '200459300052468'" src="@/assets/new1/zlps2.png" alt="" />
+        <img v-else src="@/assets/new1/zlps.png" alt="" />
       </div>
     </div>
     <div class="content_main tj_main" v-if="$store.state.other.course == 1 && courseName.length > 0">

+ 8 - 2
src/pages/home2/top.vue

@@ -1,5 +1,5 @@
 <template>
-  <div id="top">
+  <div id="top" :class="$store.state.TENANT_NANE == '200459300052468'?'top22':'top11'">
     <div class="n_box">
       <div class="left">
         <div class="tab_main">
@@ -352,9 +352,15 @@ export default {
     width: 6px;
   }
 }
+.top11{
+  background: url("../../assets/new1/banner.png");
+}
+.top22{
+  background: url("../../assets/new1/banner2.png");
+}
 #top {
   height: 600px;
-  background: url("../../assets/new1/banner.png");
+  // background: url("../../assets/new1/banner.png");
   position: relative;
   .n_box {
     position: absolute;

+ 123 - 7
src/pages/login/index.vue

@@ -28,7 +28,7 @@
                   >
                     普通登录
                   </div>
-                  <div
+                  <div v-if="dualStatus!=1"
                     class="tab"
                     :class="{ active: tabIndex == 1 }"
                     @click="tabIndex = 1"
@@ -1075,7 +1075,32 @@
         </div>
       </div>
     </el-dialog>
-
+    <el-dialog
+      title="获取手机验证码"
+      :visible.sync="codeModal"
+      width="400px"
+      class="showconfirm"
+      :close-on-click-modal="false"
+      :close-on-press-escape="false"
+      ><div
+        class="ql-editor"
+        style="white-space: pre-wrap;display: inline-flex;"
+      >
+      
+                      <el-input
+                        clearable
+                        class="input_300"
+                        placeholder="短信验证码"
+                        v-model="imageCode"
+                      >
+                        </el-input
+                      >
+                          <img slot="right" style="width: 106px;height: 40px;"  :src="codeUrl" @click="getCodepre" />
+    </div>
+      <span slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="getsmscodepub()">获取手机验证码</el-button>
+      </span></el-dialog
+    >
     <wx-login ref="wxLogin" @wxLoginBack="wxLoginBack"></wx-login>
     <Footer></Footer>
   </div>
@@ -1224,7 +1249,12 @@ export default {
       registerPwdShow: false,
       forgetPwdShow: false,
       showAgreementModal: false,
-      dualStatus: false //是否需要双重校验
+      dualStatus: false, //是否需要双重校验
+      showtabIndex1:true,
+      codeModal: false,
+				imageCode:"",
+				imageUuid:"",
+				codeUrl:"",
     };
   },
   computed: {
@@ -1237,12 +1267,19 @@ export default {
     }
   },
   mounted() {
+    if(!this.$route.query.state){
+    this.$router.push({
+        path: '/home',
+        query: {}
+      });return
+    }
     this.state = this.$route.query.state || 1;
     //双重校验
     this.$request.dualAuth().then(res => {
       this.dualStatus = res.data === "1" ? true : false;
       if (this.dualStatus) {
         this.loginRules["account"][0].message = "请输入手机号";
+        this.tabIndex=0;
       }
     });
   },
@@ -1293,6 +1330,27 @@ export default {
               this.$tools.setUuid(new Date().valueOf() + "");
               if (res.data.full_info) {
                 this.getInfo();
+                if(res.data.pwd_sign==1)//需修改密码
+                {
+                  console.log("dsad",res.data.pwd_sign);
+                  this.$confirm("您的密码已长时间未变更,为了您的账号安全,请前往更改密码。", "提示", {
+              confirmButtonText: "确定",
+              closeOnClickModal: false,
+              closeOnPressEscape: false,
+              showCancelButton: false,
+              distinguishCancelAndClose: false,
+              showClose: true,
+            })
+              .then((_) => {
+                this.$router.push({
+        path: '/person-center/my-info/index',
+        query: {
+          showUsername: true,
+            }
+      });
+              })
+              .catch((_) => {});
+                }
               } else {
                 this.user_account = res.data.user_account;
                 this.token = res.data.token;
@@ -1338,17 +1396,53 @@ export default {
       setTimeout(() => {
         this.showHk = false;
         this.isPassing = false;
-        this[this.funcStr]();
+        this.getCodepre();
+        // this[this.funcStr]();
       }, 500);
     },
+    //获取图形验证码
+			getCodepre(){
+				this.codeModal=true;
+        this.imageCode="";
+				this.$request.captchaImage({}).then(
+					(res) => {
+						if (res.code == 200) {
+							this.codeUrl = "data:image/gif;base64," + res.data.img;
+							this.imageUuid= res.data.uuid;
+						} else {
+              this.$message({
+            message: res.msg,
+            type: "error",
+          });
+						}
+					},
+					(err) => {
+						console.log(err);
+					}
+				);
+			},
+      getsmscodepub(){
+        this[this.funcStr]();
+      },
     getLoginSms_s() {
+      if(!this.imageCode)
+				{
+          this.$message({
+            message: "请输入图形验证码",
+            type: "error",
+          });
+					return;
+				}
       let int = this.intStatus;
       this.getLoginCodeLock = true;
       this.$request
         .getLoginSms({
-          tel: int === 1 ? this.loginForm.account : this.loginSmsForm.tel
+          tel: int === 1 ? this.loginForm.account : this.loginSmsForm.tel,
+          imageCode:this.imageCode,
+							imageUuid:this.imageUuid
         })
         .then(res => {
+          this.codeModal=false;
           this.getLoginCodeLock = false;
           this.$message({
             message: `验证码已发送`,
@@ -1385,10 +1479,21 @@ export default {
       });
     },
     getCode_s() {
+      if(!this.imageCode)
+				{
+          this.$message({
+            message: "请输入图形验证码",
+            type: "error",
+          });
+					return;
+				}
       this.getForgetCodeLock = true;
       this.$request
-        .getRegisterSmsforget({ tel: this.forgetForm.tel })
+        .getRegisterSmsforget({ tel: this.forgetForm.tel,
+          imageCode:this.imageCode,
+							imageUuid:this.imageUuid })
         .then(res => {
+          this.codeModal=false;
           this.getForgetCodeLock = false;
           this.$message({
             message: `验证码已发送`,
@@ -1505,11 +1610,22 @@ export default {
       });
     },
     getRegisterSms_s() {
+      if(!this.imageCode)
+				{
+          this.$message({
+            message: "请输入图形验证码",
+            type: "error",
+          });
+					return;
+				}
       var self = this;
       this.getRegisterCodeLock = true;
       this.$request
-        .getRegisterSms({ tel: this.registerForm.tel })
+        .getRegisterSms({ tel: this.registerForm.tel,
+          imageCode:this.imageCode,
+							imageUuid:this.imageUuid })
         .then(res => {
+          this.codeModal=false;
           this.getRegisterCodeLock = false;
           this.$message({
             message: `验证码已发送`,

+ 1082 - 0
src/pages/notice-list/index.vue

@@ -0,0 +1,1082 @@
+<template>
+    <div class="payment my-message">
+      <Header @search="search($event)"></Header>
+      <div class="bgImg">
+        <div class="tits">
+          <h1>通知公告</h1>
+          <p>最新消息,敬请关注<br/>快速获取</p>
+        </div>
+        <img src="@/assets/new1/handoutBGC.png" alt="" />
+      </div>
+      <div class="container" style="padding: 10px 0px;">
+      <el-breadcrumb separator="/">
+        <el-breadcrumb-item :to="{ path: '/index' }">首页</el-breadcrumb-item>
+        <el-breadcrumb-item>通知公告</el-breadcrumb-item>
+      </el-breadcrumb>
+      <el-main
+      class="container"
+      style="width:1310px!important"
+    >
+    <div class="my-message__body">
+    <div class="content__body">
+      <el-empty
+          v-if="list.length == 0"
+          description="暂无消息"
+        ></el-empty>
+          <template v-else>
+            <div class="message-list">
+              <div
+                class="message-list__item"
+                v-for="(item, index) in list"
+                :key="index"
+              >
+                <div
+                  class="icon"
+                  :class="{ 'icon--blue': item.systemStatus === 1 ? '' : true }"
+                >
+                  <i
+                    v-if="item.systemStatus === 1"
+                    class="el-icon-message-solid"
+                  ></i>
+
+                  <i v-else class="el-icon-s-custom"></i>
+                </div>
+                <div class="text">
+                  <div class="desc">
+                    {{ $tools.timestampToTime(item.sendTime, false) }}
+                  </div>
+                  <div
+                    class="title"
+                    :style="item.receiptStatus == 1 ? 'color:#999' : ''"
+                  >
+                    {{
+                      item.systemStatus === 2
+                        ? item.informVo.informName
+                        : item.systemStatus === 1
+                        ? item.text
+                        : "接口异常"
+                    }}
+                  </div>
+                </div>
+                <el-button type="primary" class="btn" @click="showDetail(item)"
+                  >查看详情</el-button
+                >
+              </div>
+            </div>
+
+            <div class="pagination">
+              <el-pagination
+                @current-change="currentChange"
+                background
+                layout="prev, pager, next"
+                :total="total"
+                :pager-count="5"
+                :page-size="formData.pageSize"
+              >
+              </el-pagination>
+            </div>
+          </template>
+        </div>
+      </div>
+    </el-main>
+    <el-dialog
+      width="600px"
+      class="my-message-modal"
+      :visible.sync="showDetailModal"
+      :close-on-click-modal="false"
+      :close-on-press-escape="false"
+      :show-close="false"
+    >
+      <div class="my-message-modal__content">
+        <div class="my-message-modal__close" @click="showDetailModal = false">
+          X
+        </div>
+        <div class="my-message-modal__header">通知详情</div>
+        <div class="my-message-modal__body">
+          <div class="content">
+            <div class="content__body">
+              <div class="title">
+                {{
+                  listData.systemStatus === 2
+                    ? listData.informVo.informName
+                    : listData.systemStatus === 1
+                    ? listData.remind
+                    : ""
+                }}
+              </div>
+              <div class="desc">
+                {{ $tools.timestampToTime(listData.sendTime, false) }}
+              </div>
+
+              <div
+                class="content" id="html1"
+                v-if="listData.systemStatus === 2"
+                v-html="listData.informVo.affiche"
+              ></div>
+              <!-- <div id="html1">
+
+              </div> -->
+              <div class="content" v-if="listData.systemStatus === 1">
+                {{ listData.text }}
+              </div>
+
+              <div class="list" v-if="listData.informVo">
+                <div
+                  class="item"
+                  v-for="(item, index) in listData.informVo.informCourseVo"
+                  :key="'informVo' + index"
+                >
+                  <div class="item__title">{{ item.goodsName }}</div>
+                  <div class="item__desc">
+                    {{ item.courseName
+                    }}{{ item.moduleName ? "/" + item.moduleName : ""
+                    }}{{ item.chapterName ? "/" + item.chapterName : ""
+                    }}{{ item.sectionName }}
+                  </div>
+                  <div v-if="false" class="item__content" @click="jumpSection(item)">
+                    {{
+                      $tools.secondToTime(item.topicNum, false)
+                    }}(点击可直接跳转)
+                  </div>
+                </div>
+                <div
+                  class="item"
+                  v-for="(item, index) in listData.informVo.informExamVo"
+                  :key="'informExamVo' + index"
+                >
+                  <div class="item__title">{{ item.goodsName }}</div>
+                  <div class="item__desc">
+                    {{ item.moduleName ? "/" + item.moduleName : ""
+                    }}{{ item.chapterName ? "/" + item.chapterName : ""
+                    }}{{ item.examName }}
+                  </div>
+                  <div v-if="false" class="item__content" @click="jumpExam(item)">
+                    第{{ item.topicNum }}道题(点击可直接跳转)
+                  </div>
+                </div>
+              </div>
+            </div>
+          </div>
+        </div>
+
+        <div
+          class="my-message-modal__footer"
+        >
+        </div>
+      </div>
+    </el-dialog>
+
+    </div>
+      <ToolBar></ToolBar>
+      <Footer></Footer>
+    </div>
+  </template>
+  
+  <script>
+  import { mapGetters } from "vuex";
+  import Footer from "@/components/footer/index";
+  import Header from "@/components/header/index";
+  import ToolBar from "@/components/toolbar/index";
+  export default {
+    name: "noticelist",
+    components: {
+      Footer,
+      Header,
+      ToolBar
+    },
+    data() {
+      return {
+        showDetailModal: false,
+        formData: {
+        systemStatusList: "2", //1系统消息2教务消息
+        pageNum: 1,
+        pageSize: 10,
+      },
+        listData: {},
+        total: 0,
+      goodsData: {},
+      list: [],
+    };
+    },
+    computed: {
+      ...mapGetters(["header"]),
+      currentComponent: function() {
+        return function(int) {
+          var str = "";
+          switch (int) {
+            case 1:
+              str = "listOption1";
+              break;
+            case 2:
+              str = "listOption2";
+              break;
+  
+            default:
+              str = "listOption1";
+              break;
+          }
+          return str;
+        };
+      }
+    },
+  mounted() {
+    this.getappinformUserlist();
+  },
+    methods: {
+      currentChange(e) {
+      this.formData.pageNum = e;
+      this.getappinformUserlist();
+    },
+      showDetail(item) {
+      this.sysTime = this.$tools.timest();
+      this.messageId = item.id;
+      this.orderGoodsId = item.orderGoodsId;
+      if (item.informVo && item.informVo.affiche) {
+        item.informVo.affiche = item.informVo.affiche.replace(
+            /<img/gi,
+            '<img style="max-width:100%;"'
+          );
+          item.informVo.affiche = item.informVo.affiche.replace(
+            /\\t/gi,
+            '&nbsp;'
+          );
+          // item.informVo.affiche = item.informVo.affiche.replace(
+          //   /\\"/gi,
+          //   ''
+          // );
+        }
+        this.showDetailModal = true;
+        this.listData = item;
+        // setTimeout(() => {
+        // document.getElementById("html1").innerHTML= item.informVo.affiche ;
+        // }, 3000);
+    },
+        getappinformUserlist() {
+      this.$request
+        .systemannouncemen(this.formData)
+        .then(res => {
+          if(res.code==200 &&res.data){
+            this.list = [{className: null,
+goodsId: null,
+gradeId: null,
+id: 14408,
+idCard: null,
+informId: 10,
+informVo: {
+affiche: res.data,
+classifyId: null,
+classifyName: null,
+createBy: "admin",
+informCourseVo: [],
+informExamVo: [],
+informId: 10,
+informName: "停课停班通知",
+informType: 1,
+informWay: 1,
+issueStatus: 1,
+issueTime: null,
+receiptNum: null,
+receiptStatus: 1,
+sendTime: null,
+status: 1,
+userFrom: 1,
+userId: null,
+userNum: null,
+userStatus: null},
+orderGoodsId: null,
+planId: null,
+realName: null,
+receiptStatus: 0,
+remind: null,
+remindId: null,
+sendStatus: 1,
+sendTime: 1735228800,
+systemStatus: 2,
+telPhone: null,
+text: null,
+userId: 219}];
+            this.total = 1;
+          }
+          // this.list = res.rows;
+          // this.total = res.total;
+        })
+        .finally(() => {
+        });
+    },
+    }
+  };
+  </script>
+  
+  <!-- Add "scoped" attribute to limit CSS to this component only -->
+  <style scoped lang="scss">
+  .payment {
+    background-color: rgb(245, 247, 249);
+  }
+  .bgImg {
+    position: relative;
+    height: 300px;
+    background: repeating-linear-gradient(to right, #00A3FF, #AC00BF);
+    & > .tits {
+      position: absolute;
+      left: 20%;
+      top: 50%;
+      transform: translateY(-50%);
+      width: 300px;
+      h1 {
+        font-size: 40px;
+        font-weight: bold;
+        color: #fff;
+        margin-bottom: 14px;
+      }
+      p {
+        line-height: 25px;
+        color: #fff;
+        letter-spacing: 1px;
+      }
+    }
+    & > img {
+      height: 238px;
+      position: absolute;
+      right: 20%;
+      top: 50%;
+      transform: translateY(-50%);
+    }
+  }
+  .my-message {
+  &__header {
+    /deep/ .el-tabs__header {
+      margin-bottom: 0;
+    }
+  }
+  &__body {
+    .content {
+      &__header {
+        height: 64px;
+        display: flex;
+        align-items: center;
+
+        .text {
+          flex: 1;
+          padding-left: 28px;
+          font-size: 14px;
+          font-family: Microsoft YaHei;
+          font-weight: 400;
+          color: #999999;
+          .note {
+            font-size: 14px;
+            font-family: Microsoft YaHei;
+            font-weight: 400;
+            color: #3f8dfd;
+          }
+        }
+
+        .btn {
+          cursor: pointer;
+          margin: 0 14px;
+          width: 122px;
+          height: 32px;
+          border-radius: 16px;
+          padding: 0;
+          text-align: center;
+          line-height: 30px;
+          font-size: 16px;
+          &--red {
+            border-color: #ff3b30;
+          }
+        }
+      }
+
+      &__body {
+        .message-list {
+          &__item {
+            margin-bottom: 24px;
+            display: flex;
+            border: 1px solid #eee;
+            padding: 30px 24px;
+            align-items: center;
+            border-radius: 8px;
+
+            .icon {
+              width: 40px;
+              height: 40px;
+              background: rgba(255, 209, 0, 1);
+              border-radius: 50%;
+              display: flex;
+              align-items: center;
+              justify-content: center;
+              center &--blue {
+                background: rgba(0, 122, 255, 1);
+              }
+
+              i {
+                font-size: 24px;
+                color: #fff;
+              }
+            }
+
+            .text {
+              flex: 1;
+              padding-left: 16px;
+              .title {
+                font-size: 16px;
+                font-family: Microsoft YaHei;
+                font-weight: 400;
+                color: #333333;
+                margin-top: 10px;
+              }
+
+              .desc {
+                font-size: 12px;
+                font-family: Microsoft YaHei;
+                font-weight: 400;
+                color: #999999;
+              }
+
+              .content {
+                font-size: 14px;
+                font-family: Microsoft YaHei;
+                font-weight: 400;
+                color: #666;
+              }
+            }
+
+            .btn {
+              cursor: pointer;
+              width: 122px;
+              height: 32px;
+              padding: 0;
+              border-radius: 16px;
+              text-align: center;
+              line-height: 32px;
+              font-size: 16px;
+            }
+          }
+        }
+
+        .no-data {
+          text-align: center;
+          padding: 50px 0;
+          color: #666;
+          font-size: 16px;
+        }
+
+        .pagination {
+          padding: 30px 0;
+          text-align: center;
+        }
+      }
+    }
+  }
+
+  .rebuild {
+    /deep/ .el-dialog__header {
+      display: none;
+    }
+    /deep/ .el-dialog__body {
+      padding: 0;
+      overflow: unset;
+    }
+
+    &__close {
+      cursor: pointer;
+      position: absolute;
+      right: 0;
+      top: -28px;
+      width: 24px;
+      height: 24px;
+      line-height: 24px;
+      text-align: center;
+      color: #eee;
+      border: 1px solid #eee;
+      border-radius: 50%;
+    }
+
+    &__header {
+      height: 40px;
+      border-bottom: 1px solid #eee;
+      line-height: 40px;
+      font-size: 16px;
+      font-family: Microsoft YaHei;
+      font-weight: bold;
+      color: #333333;
+      padding-left: 24px;
+    }
+
+    &__body {
+      height: 400px;
+      padding: 0 24px;
+
+      .content {
+        height: 100%;
+        overflow-y: auto;
+
+        &__header {
+          padding: 16px 0;
+          border-bottom: 1px solid #eee;
+
+          .title {
+            font-size: 16px;
+            font-family: Microsoft YaHei;
+            font-weight: bold;
+            color: #ff3b30;
+            line-height: 24px;
+          }
+
+          .desc {
+            margin-top: 10px;
+            font-size: 16px;
+            font-family: Microsoft YaHei;
+            font-weight: 400;
+            color: #ff3b30;
+            line-height: 24px;
+          }
+        }
+
+        &__body {
+          .list {
+            &__item {
+              padding: 16px 0;
+              border-bottom: 1px solid #eee;
+
+              .title {
+                font-size: 14px;
+                font-family: Microsoft YaHei;
+                font-weight: 400;
+                color: #333333;
+
+                .note {
+                  width: 32px;
+                  height: 20px;
+                  border: 1px solid #3f8dfd;
+                  border-radius: 4px;
+                  color: #3f8dfd;
+                  font-size: 12px;
+
+                  &--yellow {
+                    border: 1px solid #ff9500;
+                    color: #ff9500;
+                  }
+                }
+              }
+
+              .desc {
+                margin-top: 10px;
+                font-size: 14px;
+                font-family: Microsoft YaHei;
+                font-weight: 400;
+                color: #333333;
+
+                .note {
+                  color: #ff3b30;
+                  line-height: 20px;
+                }
+
+                .img {
+                  width: 100px;
+                  height: 100px;
+                  display: inline-block;
+                  text-align: center;
+
+                  img {
+                    max-width: 100%;
+                    max-height: 100%;
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+
+    &__footer {
+      height: 90px;
+      border-top: 1px solid #eee;
+      text-align: center;
+      .confirm {
+        width: 200px;
+        height: 40px;
+        padding: 0;
+        border-radius: 20px;
+        text-align: center;
+        line-height: 40px;
+        color: #fff;
+        margin: 24px auto;
+      }
+    }
+  }
+
+  .my-message-modal {
+    /deep/ .el-dialog__header {
+      display: none;
+    }
+    /deep/ .el-dialog__body {
+      padding: 0;
+      overflow: unset;
+    }
+
+    &__close {
+      cursor: pointer;
+      position: absolute;
+      right: 0;
+      top: -24px;
+      width: 24px;
+      height: 24px;
+      line-height: 24px;
+      text-align: center;
+      color: #fff;
+      border: 1px solid #eee;
+      border-radius: 50%;
+    }
+
+    &__header {
+      height: 40px;
+      line-height: 40px;
+      font-size: 16px;
+      font-family: Microsoft YaHei;
+      font-weight: bold;
+      color: #333333;
+      padding-left: 24px;
+      border-bottom: 1px solid #eee;
+    }
+
+    &__body {
+      height: auto;
+      padding: 0 24px 24px;
+
+      .content {
+        &__body {
+          .title {
+            margin-top: 10px;
+            font-size: 16px;
+            font-family: Microsoft YaHei;
+            font-weight: 400;
+            color: #333333;
+            line-height: 24px;
+          }
+
+          .desc {
+            margin-top: 8px;
+            font-size: 12px;
+            font-family: Microsoft YaHei;
+            font-weight: 400;
+            color: #999999;
+            line-height: 24px;
+          }
+
+          .list {
+            .item {
+              margin-top: 18px;
+              font-size: 14px;
+              font-family: Microsoft YaHei;
+              font-weight: 400;
+              line-height: 28px;
+
+              &__title {
+                color: #333;
+                font-size: 16px;
+              }
+
+              &__desc {
+                color: #666;
+                font-size: 16px;
+              }
+
+              &__content {
+                font-size: 14px;
+                cursor: pointer;
+                color: #3f8dfd;
+              }
+            }
+          }
+        }
+      }
+    }
+
+    &__footer {
+      height: 90px;
+      overflow: hidden;
+      border-top: 1px solid #eee;
+      .confirm {
+        display: block;
+        margin: 25px auto 0;
+        width: 200px;
+        height: 40px;
+        padding: 0;
+        border-radius: 20px;
+        text-align: center;
+        line-height: 40px;
+      }
+    }
+  }
+}
+.my-message {
+  &__header {
+    /deep/ .el-tabs__header {
+      margin-bottom: 0;
+    }
+  }
+  &__body {
+    .content {
+      &__header {
+        height: 64px;
+        display: flex;
+        align-items: center;
+
+        .text {
+          flex: 1;
+          padding-left: 28px;
+          font-size: 14px;
+          font-family: Microsoft YaHei;
+          font-weight: 400;
+          color: #999999;
+          .note {
+            font-size: 14px;
+            font-family: Microsoft YaHei;
+            font-weight: 400;
+            color: #3f8dfd;
+          }
+        }
+
+        .btn {
+          cursor: pointer;
+          margin: 0 14px;
+          width: 122px;
+          height: 32px;
+          border-radius: 16px;
+          padding: 0;
+          text-align: center;
+          line-height: 30px;
+          font-size: 16px;
+          &--red {
+            border-color: #ff3b30;
+          }
+        }
+      }
+
+      &__body {
+        .message-list {
+          &__item {
+            margin-bottom: 24px;
+            display: flex;
+            border: 1px solid #eee;
+            padding: 30px 24px;
+            align-items: center;
+            border-radius: 8px;
+
+            .icon {
+              width: 40px;
+              height: 40px;
+              background: rgba(255, 209, 0, 1);
+              border-radius: 50%;
+              display: flex;
+              align-items: center;
+              justify-content: center;
+              center &--blue {
+                background: rgba(0, 122, 255, 1);
+              }
+
+              i {
+                font-size: 24px;
+                color: #fff;
+              }
+            }
+
+            .text {
+              flex: 1;
+              padding-left: 16px;
+              .title {
+                font-size: 16px;
+                font-family: Microsoft YaHei;
+                font-weight: 400;
+                color: #333333;
+                margin-top: 10px;
+              }
+
+              .desc {
+                font-size: 12px;
+                font-family: Microsoft YaHei;
+                font-weight: 400;
+                color: #999999;
+              }
+
+              .content {
+                font-size: 14px;
+                font-family: Microsoft YaHei;
+                font-weight: 400;
+                color: #666;
+              }
+            }
+
+            .btn {
+              cursor: pointer;
+              width: 122px;
+              height: 32px;
+              padding: 0;
+              border-radius: 16px;
+              text-align: center;
+              line-height: 32px;
+              font-size: 16px;
+            }
+          }
+        }
+
+        .no-data {
+          text-align: center;
+          padding: 50px 0;
+          color: #666;
+          font-size: 16px;
+        }
+
+        .pagination {
+          padding: 30px 0;
+          text-align: center;
+        }
+      }
+    }
+  }
+
+  .rebuild {
+    /deep/ .el-dialog__header {
+      display: none;
+    }
+    /deep/ .el-dialog__body {
+      padding: 0;
+      overflow: unset;
+    }
+
+    &__close {
+      cursor: pointer;
+      position: absolute;
+      right: 0;
+      top: -28px;
+      width: 24px;
+      height: 24px;
+      line-height: 24px;
+      text-align: center;
+      color: #eee;
+      border: 1px solid #eee;
+      border-radius: 50%;
+    }
+
+    &__header {
+      height: 40px;
+      border-bottom: 1px solid #eee;
+      line-height: 40px;
+      font-size: 16px;
+      font-family: Microsoft YaHei;
+      font-weight: bold;
+      color: #333333;
+      padding-left: 24px;
+    }
+
+    &__body {
+      height: 400px;
+      padding: 0 24px;
+
+      .content {
+        height: 100%;
+        overflow-y: auto;
+
+        &__header {
+          padding: 16px 0;
+          border-bottom: 1px solid #eee;
+
+          .title {
+            font-size: 16px;
+            font-family: Microsoft YaHei;
+            font-weight: bold;
+            color: #ff3b30;
+            line-height: 24px;
+          }
+
+          .desc {
+            margin-top: 10px;
+            font-size: 16px;
+            font-family: Microsoft YaHei;
+            font-weight: 400;
+            color: #ff3b30;
+            line-height: 24px;
+          }
+        }
+
+        &__body {
+          .list {
+            &__item {
+              padding: 16px 0;
+              border-bottom: 1px solid #eee;
+
+              .title {
+                font-size: 14px;
+                font-family: Microsoft YaHei;
+                font-weight: 400;
+                color: #333333;
+
+                .note {
+                  width: 32px;
+                  height: 20px;
+                  border: 1px solid #3f8dfd;
+                  border-radius: 4px;
+                  color: #3f8dfd;
+                  font-size: 12px;
+
+                  &--yellow {
+                    border: 1px solid #ff9500;
+                    color: #ff9500;
+                  }
+                }
+              }
+
+              .desc {
+                margin-top: 10px;
+                font-size: 14px;
+                font-family: Microsoft YaHei;
+                font-weight: 400;
+                color: #333333;
+
+                .note {
+                  color: #ff3b30;
+                  line-height: 20px;
+                }
+
+                .img {
+                  width: 100px;
+                  height: 100px;
+                  display: inline-block;
+                  text-align: center;
+
+                  img {
+                    max-width: 100%;
+                    max-height: 100%;
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+
+    &__footer {
+      height: 90px;
+      border-top: 1px solid #eee;
+      text-align: center;
+      .confirm {
+        width: 200px;
+        height: 40px;
+        padding: 0;
+        border-radius: 20px;
+        text-align: center;
+        line-height: 40px;
+        color: #fff;
+        margin: 24px auto;
+      }
+    }
+  }
+
+  .my-message-modal {
+    /deep/ .el-dialog__header {
+      display: none;
+    }
+    /deep/ .el-dialog__body {
+      padding: 0;
+      overflow: unset;
+    }
+
+    &__close {
+      cursor: pointer;
+      position: absolute;
+      right: 0;
+      top: -24px;
+      width: 24px;
+      height: 24px;
+      line-height: 24px;
+      text-align: center;
+      color: #fff;
+      border: 1px solid #eee;
+      border-radius: 50%;
+    }
+
+    &__header {
+      height: 40px;
+      line-height: 40px;
+      font-size: 16px;
+      font-family: Microsoft YaHei;
+      font-weight: bold;
+      color: #333333;
+      padding-left: 24px;
+      border-bottom: 1px solid #eee;
+    }
+
+    &__body {
+      height: auto;
+      padding: 0 24px 24px;
+
+      .content {
+        &__body {
+          .title {
+            margin-top: 10px;
+            font-size: 16px;
+            font-family: Microsoft YaHei;
+            font-weight: 400;
+            color: #333333;
+            line-height: 24px;
+          }
+
+          .desc {
+            margin-top: 8px;
+            font-size: 12px;
+            font-family: Microsoft YaHei;
+            font-weight: 400;
+            color: #999999;
+            line-height: 24px;
+          }
+
+          .list {
+            .item {
+              margin-top: 18px;
+              font-size: 14px;
+              font-family: Microsoft YaHei;
+              font-weight: 400;
+              line-height: 28px;
+
+              &__title {
+                color: #333;
+                font-size: 16px;
+              }
+
+              &__desc {
+                color: #666;
+                font-size: 16px;
+              }
+
+              &__content {
+                font-size: 14px;
+                cursor: pointer;
+                color: #3f8dfd;
+              }
+            }
+          }
+        }
+      }
+    }
+
+    &__footer {
+      height: 90px;
+      overflow: hidden;
+      border-top: 1px solid #eee;
+      .confirm {
+        display: block;
+        margin: 25px auto 0;
+        width: 200px;
+        height: 40px;
+        padding: 0;
+        border-radius: 20px;
+        text-align: center;
+        line-height: 40px;
+      }
+    }
+  }
+}
+  </style>
+  

+ 1 - 1
src/pages/payment/index.vue

@@ -14,7 +14,7 @@
             <div class="order-msg__header" v-if="orderSn">
               <!-- <div class="icon">✔</div> -->
               <!-- <div class="title">订单提交成功!订单编号:20220305100636</div> -->
-              <div class="title">订单编号:{{ orderSn }}</div>
+              <div class="title">订单编号:{{ orderSn }}</div> 
               <!-- <div class="desc">订单详情▼</div> -->
             </div>
 

+ 6 - 2
src/pages/person-center/handle-order/order/index.vue

@@ -70,9 +70,11 @@ export default {
         educationTypeId: "",
         projectId: "",
         businessId: "",
+        configId: "",
         inputFrom: 1,
         payType: 1,
-        userGoodsList: []
+        userGoodsList: [],
+        configGoodsList:[]
       }
     };
   },
@@ -110,9 +112,11 @@ export default {
         educationTypeId: "",
         projectId: "",
         businessId: "",
+        configId:"",
         inputFrom: 1,
         payType: 1,
-        userGoodsList: []
+        userGoodsList: [],
+        configGoodsList:[]
       };
       if (index == 2) {
         this.title = "支付";

+ 67 - 3
src/pages/person-center/handle-order/order/step-0.vue

@@ -31,7 +31,8 @@
       :disabled="apiData.educationTypeId ? false : true"
       v-model="apiData.businessId"
       placeholder="培训项目"
-    >
+      @change="changeBusiness"
+    ><!-- @change="changeBusiness" -->
       <el-option
         v-for="item in computedList(apiData.educationTypeId)"
         :key="item.id"
@@ -40,6 +41,20 @@
       >
       </el-option>
     </el-select>
+    <el-select
+      :disabled="apiData.businessId ? false : true"
+      v-model="apiData.configId"
+      placeholder="课程包"
+      @change="changeConfigId"
+    >
+      <el-option
+        v-for="item in configList"
+        :key="item.id"
+        :label="item.configName"
+        :value="item.id"
+      >
+      </el-option>
+    </el-select>
     <el-button type="warning" @click="next" size="small" :loading="loading"
       >下一步</el-button
     >
@@ -63,7 +78,8 @@ export default {
       goodsTypeOptions: [
         { label: "课程", value: 1 },
         { label: "题库", value: 2 }
-      ]
+      ],
+      configList:[]
     };
   },
   computed: {
@@ -82,9 +98,36 @@ export default {
     changeType() {
       this.apiData.educationTypeId = "";
       this.apiData.businessId = "";
+      this.apiData.configId = "";
     },
     changeEdu() {
       this.apiData.businessId = "";
+      this.apiData.configId = "";
+    },
+    changeBusiness(){
+      this.apiData.configId = "";
+      this.configList=[];
+      this.getconfigs();
+    },
+    changeConfigId(value){
+      this.$set(this.apiData,this.apiData.configId,value)
+      // console.log("sda",this.apiData.configId)
+      this.getConfigGoodsList();
+    },
+    getConfigGoodsList() {
+      this.apiData.configGoodsList = [];
+      if(!this.apiData.configId){return;}
+      // this.loading = true;
+      var paras={configId:this.apiData.configId};
+      // console.log("sda",paras)
+      this.$request
+        .orderbusinessgoodslist(paras)
+        .then(res => {
+          this.apiData.configGoodsList = res.rows || [];
+        })
+        .finally(() => {
+          this.loading = false;
+        });
     },
     next() {
       if (
@@ -118,7 +161,28 @@ export default {
         this.$message.error("请选择类别");
         return;
       }
-    }
+    },
+    getconfigs(){
+      this.$request
+          .orderbusinessconfiglist({
+            pagesize: 30,
+            pageNum: 1,
+            status: '0,1',
+            businessId: this.apiData.businessId
+          })
+          .then(res => {
+            if (res.total > 0) {
+              this.configList=res.rows
+              this.configList.splice(0, 0, {id:"",configName:'选择课程包'});
+             
+            } else {
+              this.configList=[{id:"",configName:'选择课程包'}];
+            }
+          })
+          .finally(() => {
+            this.loading = false;
+          });
+    },
   }
 };
 </script>

+ 38 - 2
src/pages/person-center/handle-order/order/step-1/index.vue

@@ -286,6 +286,18 @@ export default {
           options: edu_level(),
           width: "140px"
         },
+        {
+          label: "专业",
+          prop: "majorName",
+          scope: "input",
+          width: "140px"
+        },
+        {
+          label: "年份",
+          prop: "yearName",
+          scope: "input",
+          width: "140px"
+        },
         {
           label: "所属公司",
           prop: "companyName",
@@ -301,7 +313,7 @@ export default {
           label: "金额",
           scope: "price"
         }
-      ]
+      ],
     };
   },
   computed: {
@@ -365,7 +377,8 @@ export default {
       };
     }
   },
-  mounted() {},
+  mounted() {
+  },
   methods: {
     submit() {
       if (this.apiData.userGoodsList.length == 0) {
@@ -484,6 +497,29 @@ export default {
       row.forEach(i => {
         i.goodsList = [];
         i.code = this.getCode();
+        //选了课程包的自动匹配商品
+        if(this.apiData.configGoodsList&&this.apiData.configGoodsList.length>0&&i.majorName){
+            var curgood=this.apiData.configGoodsList.find(f=>f.subjectName.indexOf(i.majorName)>-1);
+            console.log("1",curgood)
+            if(curgood){
+              if(i.yearName){
+                curgood=curgood.goodsList.find(f=>f.year==i.yearName);
+                
+              }
+              else{
+                curgood=curgood.goodsList[0];
+              }
+              if(curgood){
+            i.goodsList.push({
+            goodsId: curgood.goodsId,
+            goodsName: curgood.goodsName,
+            year: curgood.year,
+            subjectNames: curgood.subjectNames,
+            standPrice: curgood.standPrice
+          });
+        }
+        }
+        }
       });
       this.apiData.userGoodsList.push(...row);
     },

+ 13 - 1
src/pages/person-center/handle-rollCall/importStudent.vue

@@ -347,12 +347,24 @@ export default {
           options: edu_level(),
           width: "140px"
         },
+        {
+          label: "专业",
+          prop: "majorName",
+          scope: "input",
+          width: "140px"
+        },
+        {
+          label: "年份",
+          prop: "yearName",
+          scope: "input",
+          width: "140px"
+        },
         {
           label: "所属公司",
           prop: "companyName",
           scope: "input",
           width: "220px"
-        }
+        },
       ]
     };
   },

+ 152 - 0
src/pages/person-center/handle-student/index.vue

@@ -0,0 +1,152 @@
+<template>
+    <div id="">
+      <div class="header">
+        <h2>经办订单学员学习信息</h2>
+      </div>
+      <el-divider></el-divider>
+      <search
+        :formSet="formSet"
+        :formData.sync="formData"
+        @search="search"
+        @init="init"
+      ></search>
+      <el-table
+        v-loading="loading"
+        ref="table"
+        size="small"
+        :data="tableData"
+        style="width: 100%"
+        border
+        :header-cell-style="{
+          'background-color': '#eee',
+          color: '#333',
+          fontSize: '14px'
+        }"
+      >
+        <el-table-column align="center" type="selection" width="55">
+        </el-table-column>
+        <el-table-column align="center" type="index" width="50" label="序号">
+        </el-table-column>
+        <el-table-column
+          align="center"
+          v-for="(item, index) in tableSet"
+          :key="index"
+          :label="item.label"
+          :prop="item.prop"
+        >
+          <template slot-scope="scope">
+            <span>{{ scope.row[item.prop] }}</span>
+          </template>
+        </el-table-column>
+      </el-table>
+      <div style="text-align:center;">
+        <el-pagination
+          @current-change="handleCurrentChange"
+          :current-page="formData.pageNum"
+          :page-size="formData.pageSize"
+          layout="total,  prev, pager, next, jumper"
+          :total="total"
+        >
+        </el-pagination>
+      </div>
+    </div>
+  </template>
+  
+  <script>
+  export default {
+    data() {
+      const edu_level = () => {
+        let ary = this.$store.state.dictList["edu_level"].map(i => {
+          return {
+            label: i,
+            value: i
+          };
+        });
+        return ary;
+      };
+      return {
+        loading: false,
+        size: "small",
+        formData: {
+          pageNum: 1,
+          pageSize: 10
+        },
+        formSet: [
+          {
+            prop: "userName",
+            placeholder: "输入姓名"
+          },
+          {
+            prop: "userCard",
+            placeholder: "输入身份证号"
+          },
+          {
+            prop: "userTel",
+            placeholder: "输入手机号码"
+          },
+          {
+            prop: "orderSn",
+            placeholder: "输入订单号"
+          }
+        ],
+        tableData: [],
+        tableSet: [
+          { label: "姓名", prop: "userName" },
+          { label: "身份证号", prop: "userCard" },
+          { label: "手机号码", prop: "userTel" },
+          { label: "课程名称", prop: "goodsName" },
+          { label: "班级名称", prop: "className" },
+          // { label: "班级状态", prop: "classstart" },
+          { label: "年份", prop: "sevenYear" },
+          { label: "学习进度", prop: "studySchedule" },
+          { label: "所属公司", prop: "companyName" }
+        ],
+        total: 0
+      };
+    },
+    mounted() {
+      this.search();
+    },
+    methods: {
+      importStudent() {
+        this.$refs.importStudent.openBoxs();
+      },
+      search() {
+        this.loading = true;
+        this.$request
+          .orderhandlestudy(this.formData)
+          .then(res => {
+            this.tableData = res.rows || [];
+            this.total = res.total;
+          })
+          .finally(() => {
+            this.loading = false;
+          });
+      },
+      init() {
+        this.formData = {
+          pageNum: 1,
+          pageSize: 10
+        };
+        this.search();
+      },
+      handleCurrentChange(e) {
+        this.formData.pageNum = e;
+        this.search();
+      }
+    }
+  };
+  </script>
+  
+  <style lang="scss" scoped>
+  .header {
+    margin-top: 10px;
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+    & > h2 {
+      font-size: 18px;
+    }
+  }
+  </style>
+  

+ 6 - 0
src/pages/person-center/index.vue

@@ -139,6 +139,9 @@
                 <router-link to="/person-center/handle-rollCall">
                   <div class="item">经办名单</div>
                 </router-link>
+                <router-link to="/person-center/handle-student">
+                  <div class="item">学习进度</div>
+                </router-link>
               </div>
             </div>
             <div class="nav__section">
@@ -168,6 +171,9 @@
                 <router-link to="/person-center/my-info">
                   <div class="item">个人信息</div>
                 </router-link>
+                <router-link to="/person-center/my-log">
+                  <div class="item">操作日志</div>
+                </router-link>
                 <!-- <router-link to="/">
                   <div class="item">学习计划</div>
                 </router-link> -->

+ 1 - 1
src/pages/person-center/my-classhour/index/index.vue

@@ -318,7 +318,7 @@ export default {
       appointItem: {},
       applyId: "",
       appointModal: false,
-      copyUrl: "http://gdzczx.gdcic.net/",
+      copyUrl: this.$store.state.TENANT_NANE == '779352047136603'?"https://jypt.gdcic.net/pubsearch":"http://gdzczx.gdcic.net/",
       showViewer: false,
       rebuildShow: false,
       showDetailModal: false,

+ 32 - 5
src/pages/person-center/my-course/index.vue

@@ -527,7 +527,7 @@
                       item.classEndTime &&
                       item.classEndTime < sysTime &&
                       (item.periodStatus == 0 || item.periodStatus == -1) &&
-                      item.studyCount > 0
+                      item.studyCount > 0  && userInfo.studentRestudy!=1
                     "
                   >
                     选班重学
@@ -697,7 +697,7 @@
                 (item.periodStatus == 0 || item.periodStatus == -1)
               "
             >
-              <span v-if="item.studyCount > 0"
+              <span v-if="item.studyCount > 0 && userInfo.studentRestudy!=1"
                 >温馨提示:班级已过期,如需重新学习,请点击右侧“选班重学”按钮。</span
               >
               <span v-else
@@ -721,9 +721,9 @@
               style="color: red"
               v-if="item.periodStatus === 1 && isTwoEducation(item)"
             >
-              温馨提示:您的学时{{
-                $tools.timestampToTime(item.periodTime)
-              }}机构审核通过,
+              温馨提示:您的学时
+              <!-- {{$tools.timestampToTime(item.periodTime)}}机构 -->
+              已通过初审
               需等待信息中心约15个工作日复审通过后即可获得继续教育学时,届时请前往信息中心官网查看学时及申请证书延期。
               <span
                 style="color: #2f9aff; cursor: pointer"
@@ -1335,6 +1335,30 @@ export default {
             .catch(() => {});
         })
         .catch((err) => {
+           //提示
+        this.$request.sys_study_prompt().then((res) => {
+          if (res.code==200&&res.data) {
+            this.$confirm(res.data, "提示", {
+              confirmButtonText: "确定",
+              cancelButtonText: "取消",
+              showCancelButton: false,
+              closeOnClickModal: false,
+              closeOnPressEscape: false,
+              showClose: false,
+              type: "warning",
+            })
+              .then(() => {
+          this.$router.push({
+            path: `/my-course-detail/${item.goodsId}`,
+            query: {
+              gradeId: item.gradeId,
+              orderGoodsId: item.orderGoodsId,
+            },
+          });
+              })
+              .catch(() => {});
+          }
+          else{
           this.$router.push({
             path: `/my-course-detail/${item.goodsId}`,
             query: {
@@ -1342,7 +1366,10 @@ export default {
               orderGoodsId: item.orderGoodsId,
             },
           });
+          }
+        });
         });
+       
     },
     go(item) {
       this.$router.push({

+ 7 - 0
src/pages/person-center/my-info/index.vue

@@ -227,6 +227,13 @@ export default {
   },
   mounted() {
     this.getUserInfo();
+    if(this.$route.query)
+    {
+      if(this.$route.query.showUsername)
+      {
+        this.showUsername=this.$route.query.showUsername;
+      }
+    }
   },
   methods: {
     getCode() {

+ 147 - 0
src/pages/person-center/my-log/index.vue

@@ -0,0 +1,147 @@
+<template>
+    <div class="my-invoice">
+      <div class="my-invoice__body">
+        <el-table :data="tableData" style="width: 100%">
+          <el-table-column
+            align="center"
+            header-align="center"
+            type="index"
+            label="序号"
+          />
+          <el-table-column
+            align="center"
+            header-align="center"
+            prop="invoiceTitle"
+            label="操作类型"
+          >
+          <template slot-scope="scope">
+              {{ scope.row.type==1||scope.row.type==2?"登录日志":"操作日志"}}
+            </template>
+          </el-table-column>
+          <el-table-column
+            align="center"
+            header-align="center"
+            prop="type"
+            label="日志内容"
+          >
+          <template slot-scope="scope">
+              {{ scope.row.type==1?"登录":scope.row.type==2?"退出登录":scope.row.type==3?"修改密码":scope.row.type==4?"修改个人信息":"其他"}}
+            </template>
+          </el-table-column>
+         
+          <el-table-column align="center" header-align="center" label="操作时间">
+            <template slot-scope="scope">
+              {{ $tools.timestampToTime(scope.row.createTime, false, false) }}
+            </template>
+          </el-table-column>
+         
+        </el-table>
+  
+        <div class="pagination">
+          <el-pagination
+            @current-change="currentChange"
+            background
+            layout="prev, pager, next"
+            :total="total"
+            :pager-count="5"
+            :page-size="params.pageSize"
+          >
+          </el-pagination>
+        </div>
+      </div>
+  
+    </div>
+  </template>
+  
+  <script>
+  import axios from "@/axios";
+  export default {
+    name: "MyLog",
+    data() {
+      return {
+        tableData: [],
+        params: {
+          pageNum: 1,
+          pageSize: 10
+        },
+        total: 0
+      };
+    },
+    mounted() {
+      this.orderInvoiceList();
+    },
+    methods: {
+      currentChange(e) {
+        this.params.pageNum = e;
+        this.orderInvoiceList();
+      },
+      orderInvoiceList() {
+        this.$request
+          .userloglist(this.params)
+          .then(res => {
+            this.tableData = res.rows;
+            this.total = res.total;
+          })
+          .catch(err => {
+            this.$message({
+              type: "error",
+              message: err.msg
+            });
+          });
+      },
+  
+    }
+  };
+  </script>
+  
+  <!-- Add "scoped" attribute to limit CSS to this component only -->
+  <style scoped lang="scss">
+  .my-invoice {
+    overflow: hidden;
+    &__header {
+      margin-top: 24px;
+    }
+    &__body {
+      margin-top: 20px;
+  
+      /deep/ .el-table {
+        border: 1px solid #eeeeee;
+        box-shadow: 0px 0px 7px 1px rgba(0, 0, 0, 0.04);
+        border-radius: 8px;
+      }
+  
+      .pagination {
+        padding: 30px 0;
+        text-align: center;
+      }
+    }
+  
+    .invoice-modal {
+      .preview-wrap {
+        /deep/ img {
+          max-width: 200px;
+        }
+      }
+  
+      .text {
+        &.wait {
+          color: #007aff;
+        }
+        &.refuse {
+          color: #ff3b30;
+        }
+        &.agree {
+          color: #34c759;
+        }
+      }
+  
+      .order-item {
+        background: #ccc;
+        padding: 5px 10px;
+        border-radius: 10px;
+        margin-top: 10px;
+      }
+    }
+  }
+  </style>
+  

+ 1 - 0
src/pages/person-center/my-order/index.vue

@@ -71,6 +71,7 @@
                         item.orderStatus === 3) &&
                       (items.goodsType == '1' ||
                         items.goodsType == '2' ||
+                        items.goodsType == '3'||
                         items.goodsType == '6') &&
                       items.goodsPrice > 0
                     "

+ 2 - 4
src/pages/person-center/play-record/index.vue

@@ -88,17 +88,14 @@
       ref="rebuildModal"
       @rebuildSubmit="rebuildSubmit($event)"
     ></RebuildModal>
-    <media ref="media"></media>
   </div>
 </template>
 
 <script>
-import media from "./media"
 import RebuildModal from "@/components/rebuildModal";
 export default {
   name: "MyCourse",
   components: {
-    media,
     RebuildModal,
   },
   data() {
@@ -113,11 +110,12 @@ export default {
         pageSize: 10,
       },
       sysTime: 0,
+      orderGoodsId:111,
+      gradeId:221,
     };
   },
   mounted() {
     this.studRrecordListUserRecord();
-    this.$refs.media.openBoxs()
   },
   methods: {
     toFixed(num) {

+ 23 - 1
src/router/index.js

@@ -11,7 +11,7 @@ let canToBank = null;
 let courseAdmin = ['/my-course-detail/', '/course-exam/']
 let canToCourse = null;
 let doScrollRouterList = ['/course-list', '/bank-list', '/live-list', '/handout-list', '/points-list']
-const signLoginPage = ['/my-course-detail', '/my-course', '/my-bank', '/my-live', '/living-room']
+const signLoginPage = ['/my-course-detail', '/my-course', '/my-bank', '/my-live', '/living-room','/notice-list']
 const router = new Router({
   mode: 'history',
   scrollBehavior(to, from, savedPosition) {
@@ -83,6 +83,18 @@ const router = new Router({
         }
       }
     },
+    {
+      path: '/notice-list',
+      name: '通知公告',
+      component: resolve => require(['@/pages/notice-list/index'], resolve),
+      meta: {
+        title: '-建造师造价师在线教育培训报名报考平台',
+        content: {
+          keywords: + '-建造师造价师在线教育培训平台报名报考',
+          description: + '-建造师造价师在线教育培训平台报名报考'
+        }
+      }
+    },
     {
       path: '/packPage',
       name: '冲刺秘籍大礼包',
@@ -671,6 +683,11 @@ const router = new Router({
           component: resolve => require(['@/pages/person-center/handle-rollCall/index'], resolve),
           name: '经办名单'
         },
+        {
+          path: 'handle-student',
+          component: resolve => require(['@/pages/person-center/handle-student/index'], resolve),
+          name: '经办订单学习进度'
+        },
         {
           path: 'my-mock',
           component: resolve => require(['@/pages/person-center/my-mock/index'], resolve),
@@ -681,6 +698,11 @@ const router = new Router({
           component: resolve => require(['@/pages/person-center/my-message/index'], resolve),
           name: '我的消息'
         },
+        {
+          path: 'my-log',
+          component: resolve => require(['@/pages/person-center/my-log/index'], resolve),
+          name: '操作日志'
+        },
         {
           path: 'my-info',
           component: resolve => require(['@/pages/person-center/my-info/index'], resolve),

+ 1 - 1
src/store/index.js

@@ -169,7 +169,7 @@ export default new Vuex.Store({
             favicon.href = response.data.data == '867735392558919680' ? '/static/favicon.ico' : '/static/favicons.ico'
             document.head.appendChild(favicon)
             // const ps = prompt()
-            // commit('setTENANT_NANE', ps)
+            // commit('setTENANT_NANE',"680980002459417532")//"480813706424615769")// 779352047136603
             commit('setTENANT_NANE', response.data.data)
             resolve()
           })