Răsfoiți Sursa

学生端增加个人中心界面 绑定手机号 绑定微信登功能

dengshaobo 7 luni în urmă
părinte
comite
b1b73ec554

+ 13 - 1
src/http/api/user.js

@@ -17,7 +17,19 @@ const user = {
   // 邮箱密码登录
   loginEmailPass(data) {
     return post(base.prefix + '/api/v1/student/login', data)
-  }
+  },
+
+  //学生端登录
+  studentLogin(data) {
+    
+      return post(base.prefix + '/api/v1/student/login', data)
+    
+  },
+  // 个人中心-绑定手机号获取验证码
+  getBindPhoneValidCode (data) {
+    return post(base.prefix + '/api/v1/duanx/bind_phone_obtain_code ', data)
+  },
+
 }
 
 export default user

+ 25 - 0
src/router/index.js

@@ -11,11 +11,36 @@ Router.prototype.push = function push(location) {
 let constantRoutes = [
   {
     path: "/",
+    component: () => import("@/views/login/login.vue"),
+    meta: {
+      title: "login",
+    },
+  },
+  {
+    path: "/login",
     component: () => import("@/views/login/login_ruoyan.vue"),
     meta: {
       title: "login",
     },
   },
+  // 个人中心
+  {
+    path: "/userInfo",
+    redirect: "/userInfo/personInfo",
+    component: () => import("@/views/userInfo/index"),
+    meta: {
+      title: "个人中心",
+    },
+    children: [
+      {
+        path: "personInfo",
+        component: () => import("@/views/userInfo/personInfo"),
+        meta: {
+          title: "个人信息",
+        },
+      },
+    ],
+  },
 ];
 // 学生端分析报告
 let studentAnalysisReport = {

+ 30 - 61
src/views/layout/components/Header.vue

@@ -96,7 +96,7 @@
         <div class="top_title_blod">大数据精准教学诊断平台</div>
         <img class="version_icon" src="@/assets/version.webp" alt="">
       </div>
-      <!-- <div class="headerMenu">
+      <div class="headerMenu">
         <div class="menuList">
           <el-menu
             :default-active="activeMenuName"
@@ -116,7 +116,7 @@
             >
           </el-menu>
         </div>
-      </div> -->
+      </div>
       <div class="user_info">
         <el-dropdown
           @command="UserCommand"
@@ -197,31 +197,19 @@ export default {
 
     this.activeMenu();
 
-    this.menuList = this.$store.state.user.menuList || [];
-    if (this.menuList.length > 0) 
-    {
-
-    } else 
-    {
-      this.menuList = [
-        {
-          menuName: "考试阅卷",
-          externalLink: "/examMarking",
-        },
-        {
-          menuName: "分析报告",
-          externalLink: "/analysisReportList/list",
-        },
-        {
-          menuName: "校本题库",
-          externalLink: "/knowTopic/list",
-        },
-        {
-          menuName: "个人中心",
-          externalLink: "/userInfo",
-        },
-      ];
-    }
+    //学生端默认 个人中心 和分析报告两个菜单
+    this.menuList = [
+     
+      {
+        menuName: "分析报告",
+        externalLink: "/studentAnalysisReport/list",
+      },
+      {
+        menuName: "个人中心",
+        externalLink: "/userInfo",
+      },
+    ];
+    
   },
   methods: {
 
@@ -265,40 +253,16 @@ export default {
       }, 500);
     },
     activeMenu() {
-      const route = this.$route;
-      const { path } = route;
-      let pathMenu = [
-        "/examMarking",
-        "/userInfo",
-        "/analysisReportList/list",
-        "/knowTopic",
-        "/analysisReportList/reportDetails",
-        "/jointExamination/list",
-        "/jointExamination/schoolReportDetails"
-      ];
-      let pathArr = pathMenu.filter((item) => path.indexOf(item) >= 0);
-      console.log(pathArr)
-      if (
-        pathArr[0] !== "/analysisReportList/list" &&
-        pathArr[0] !== "/analysisReportList/reportDetails"
-      ) {
-        this.activeMenuName = pathArr[0];
-      } else {
-        this.activeMenuName = "/analysisReportList/list";
-      }
-      if (
-        pathArr[0] !== "/jointExamination/list" &&
-        pathArr[0] !== "/jointExamination/schoolReportDetails"
-      ) {
-        this.activeMenuName = pathArr[0];
+      const path = this.$route.path;
+
+      // 按优先级匹配
+      if (path === '/studentAnalysisReport' || path.startsWith('/studentAnalysisReport/')) {
+        this.activeMenuName = '/studentAnalysisReport/list';
+      } else if (path === '/userInfo' || path.startsWith('/userInfo/')) {
+        this.activeMenuName = '/userInfo';
       } else {
-        this.activeMenuName = "/jointExamination/list";
-      }
-      if (path.includes("/analysisReport/")) {
-        this.activeMenuName = "/analysisReportList/list";
-      }
-      if (path.includes("/jointExamination/")) {
-        this.activeMenuName = "/jointExamination/list";
+        // 默认选中分析报告
+        this.activeMenuName = '/studentAnalysisReport/list';
       }
     },
     menuSelect(key, keyPath) {
@@ -319,7 +283,12 @@ export default {
       }
     },
     logout() {
-      this.$store.dispatch("user/logout");//暂不调用退出接口,直接跳转到登录页面
+      // this.$store.dispatch("user/logout");//暂不调用退出接口,直接跳转到登录页面
+      // window.location.href = `${process.env.VUE_APP_BASE}`;
+      // 跳出 iframe,跳转到顶级窗口
+      // window.top.location.href = `${process.env.VUE_APP_BASE}`;
+
+      window.parent.location.href = `${process.env.VUE_APP_BASE}`;
     },
 
     //打开修改密码弹窗

+ 0 - 112
src/views/layout/components/HeaderAdmin.vue

@@ -1,112 +0,0 @@
-<template>
-  <div class="header" ref="headerMenu">
-    <div class="headerBox">
-      <div class="logo">后台管理系统</div>
-      <div class="adminInfo" v-if="adminInfo">
-        <el-dropdown @command="UserCommand" :popper-append-to-body="false">
-          <span class="userName"
-            >{{ adminInfo.username
-            }}<i class="el-icon-caret-bottom userIconSty"></i
-          ></span>
-          <el-dropdown-menu slot="dropdown">
-            <el-dropdown-item command="logout">退出登录</el-dropdown-item>
-          </el-dropdown-menu>
-        </el-dropdown>
-      </div>
-    </div>
-  </div>
-</template>
-<script>
-import { mapGetters } from "vuex";
-import { getToken } from "@/utils/auth";
-export default {
-  computed: {
-    ...mapGetters("adminUser", ["adminInfo"]),
-  },
-  components: {},
-  data() {
-    return {};
-  },
-  created() {},
-  methods: {
-    UserCommand(command) {
-      if (command == "logout") {
-        this.logout();
-      }
-    },
-    logout() {
-      this.$store.dispatch("adminUser/adminLogout");
-    },
-  },
-};
-</script>
-<style lang="scss" scoped>
-.header {
-  width: 100%;
-  height: 60px;
-  font-size: 22px;
-  color: #fff;
-  box-sizing: border-box;
-  z-index: 600;
-  position: fixed;
-  top: 0;
-  left: 0;
-  // background-color: #2365ae;
-  background-color: #2e64fa;
-}
-.headerBox {
-  margin: 0 auto;
-  height: 60px;
-  display: flex;
-  flex-direction: row;
-  justify-content: space-between;
-  align-items: center;
-  .logo {
-    padding-left: 25px;
-    line-height: 60px;
-    font-size: 28px;
-  }
-  .headerMenu {
-    // margin-left:100px;
-    // width:816px;
-    display: flex;
-  }
-  .el-menu-wrap {
-    height: 60px;
-    li {
-      font-size: 20px;
-      border-bottom: 0;
-      &.is-active {
-        font-weight: bold;
-        background-color: rgba(0, 0, 0, 0.2) !important;
-      }
-    }
-  }
-  .userName {
-    font-size: 18px;
-    margin-right: 30px;
-    white-space: nowrap;
-    overflow: hidden;
-    text-overflow: ellipsis;
-    line-height: 24px;
-    color: #fff;
-    cursor: pointer;
-    .userIconSty {
-      margin-left: 6px;
-    }
-  }
-}
-:deep() .el-dialog__headerbtn .el-dialog__close {
-  color: #909399;
-}
-:deep() .el-dialog__header {
-  text-align: left;
-}
-:deep() .dialog-footer {
-  text-align: right;
-}
-.el-dropdown-menu {
-  left: auto !important; /* 取消默认左对齐 */
-  right: 0 !important; /* 右对齐 */
-}
-</style>

+ 41 - 1
src/views/login/login.vue

@@ -20,7 +20,8 @@ export default {
     // }else{
       
     // }
-    this.SubmitLogin();
+    // this.SubmitLogin();
+    this.GetUserInfo();
   },
   methods: {
     //登录提交
@@ -57,6 +58,45 @@ export default {
         }
       });
     },
+
+    //获取用户信息
+    GetUserInfo()
+    {
+      const messageHandler=(event)=>{
+        console.log("打印父窗口传来的数据",event.data);
+        console.log("打印父窗口的源",event.origin);
+        console.log("打印当前窗口的源",window.location.origin);
+        //安全检查 验证消息来源
+        if(event.origin!== window.location.origin)
+        {
+          return;
+        }
+
+        if(event.data.type === "STU_TOKEN")
+        {
+          const userInfo = event.data.userInfo;
+          console.log("打印用户信息",userInfo);
+          this.$store.dispatch("user/CLEAR_LOCAL_STORAGE");//清空本地存储
+          setToken(userInfo.tokenValue);
+
+          this.$store.dispatch("user/SET_TOKEN", userInfo.tokenValue);
+          this.$store.dispatch("user/SET_SCHOOL_LOGO",userInfo.schoolLogoUrl);//设置学校logo
+          this.$store.dispatch("user/SET_SCHOOL_WEB_SITE_ID",userInfo.cloudMonitorSiteId || '');//设置学校网站id
+          this.$store.dispatch("user/getUserInfoByToken");//获取用户登录信息
+
+          const directUrl = "/studentAnalysisReport/list";
+          // 移除事件监听器,避免重复处理
+          window.removeEventListener('message', messageHandler);
+          this.$router.push({ path: directUrl });
+        }
+
+      };
+
+      // 添加消息监听器
+      window.addEventListener('message', messageHandler);
+
+
+    },
   }
 
 }

+ 26 - 5
src/views/login/login_ruoyan.vue

@@ -215,6 +215,14 @@ export default {
   methods:{
     TabChange(value){
       this.actived = value;
+      if(this.actived == 'teacher')
+      {
+        //跳转到学生登录界面
+        console.log('跳转到教师登录界面',process.env.VUE_APP_BASE);
+        window.location.href = `${process.env.VUE_APP_BASE}`;
+        // window.parent.location.href = `${process.env.VUE_APP_BASE}`;
+
+      }
     },
     // 恢复记住的用户名和密码
     RestoreRememberedCredentials() 
@@ -436,14 +444,27 @@ export default {
       this.loadingLogin=true;
       if(this.actived == 'student'){//跳转学生端地址
         user.studentLogin({
-          password:this.passWord.trim(),
+          password:encrypt(this.passWord.trim()),
           username:this.userName.trim()
         }).then((res) => {
           this.loadingLogin=false;
-          if (res.code === 200) {
-            //跳转到学生端  code:账号 pw:密码 type:1单校 2联校
-            window.location.href = `${base.STUDENT_LOGIN}index?code=${this.userName.trim()}&pw=${encodeURIComponent(this.passWord.trim())}&type=1`;
-          }else{
+          if (res.code === 200) 
+          {
+            let userInfo = res.data;
+            this.$store.dispatch("user/CLEAR_LOCAL_STORAGE");//清空本地存储
+            setToken(userInfo.tokenValue);
+
+            this.$store.dispatch("user/SET_TOKEN", userInfo.tokenValue);
+            this.$store.dispatch("user/SET_SCHOOL_LOGO",userInfo.schoolLogoUrl);//设置学校logo
+            this.$store.dispatch("user/SET_SCHOOL_WEB_SITE_ID",userInfo.cloudMonitorSiteId || '');//设置学校网站id
+            this.$store.dispatch("user/getUserInfoByToken");//获取用户登录信息
+
+            const directUrl = "/studentAnalysisReport/list";
+            this.$router.push({ path: directUrl });
+           
+          }
+          else
+          {
             this.$message({
               message:res.msg,
               type: "error",

+ 35 - 11
src/views/userInfo/index.vue

@@ -1,20 +1,44 @@
 <template>
-  <userPersion />
+  <div class="layout">
+    <Header />
+    <el-container direction="vertical">
+      <div class="container_main">
+        <router-view></router-view>
+      </div>
+      <Footer />
+    </el-container>
+  </div>
 </template>
 <script>
-import userPersion from "./user.vue";
-import { mapGetters } from "vuex";
+import Footer from "../layout/components/Footer.vue"
+import Header from "../layout/components/Header.vue"
 export default {
-  computed: {
-    ...mapGetters(["userInfo"]),
-  },
   components: {
-    userPersion,
+
+    Footer,
+    Header
   },
   data() {
-    return {};
+    return {
+      userInfo: {}
+    }
+  },
+  mounted() {
+    
+     
   },
-  mounted() {},
-};
+}
 </script>
-<style lang="scss" scoped></style>
+<style lang="scss" scoped>
+.container_main
+{
+  width: 80%;
+  min-width: 1200px;
+  margin: auto;
+  background: #fff;
+  border-radius: 10px;
+  margin-top:80px;
+  height:auto;
+  overflow-y: auto;
+}
+</style>

+ 9 - 114
src/views/userInfo/personInfo.vue

@@ -19,7 +19,7 @@
         <div class="info_item" >
           <div class="item_row">
             <span class="span_label">账号:</span>
-            <span class="span_value">{{ userInfo.loginName }}</span>
+            <span class="span_value">{{ userInfo.registrationCode }}</span>
           </div>
           <div  class="item_row">
             <span class="span_label">姓名:</span>
@@ -28,16 +28,16 @@
           
           
         </div>
-        <div class="info_item">
+        <!-- <div class="info_item">
           <div  class="item_row">
             <span class="span_label">学校:</span>
             <span class="span_value">{{ userInfo.schoolName }}</span>
           </div>
           <div  class="item_row">
-            <span class="span_label">角色:</span>
+            <span class="span_label">班级:</span>
             <span class="span_value">{{roleNames}}</span>
           </div>
-        </div>
+        </div> -->
         <div class="info_item">
           <div  class="item_row">
             <span class="span_label">手机号:</span>
@@ -56,71 +56,6 @@
       
     </div>
     <div class="page_jg_20"></div>
-    <div class="page_jg_20"></div>
-    <div class="user_title">
-        <span>我的任课关系</span>
-        <el-checkbox v-model="checkedRenKe"  @change="CheckedRenKeChange">仅显示有效任课信息</el-checkbox>
-    </div>
-    <div class="page_table">
-        <el-table :data="teacherClassData" border>
-          <el-table-column prop="schoolYearName" label="学年" align="center">
-          </el-table-column>
-          <el-table-column prop="gradeName" label="年级" align="center">
-          </el-table-column>
-          <el-table-column prop="className" label="班级" align="center">
-          </el-table-column>
-          <el-table-column prop="courseName" label="科目" align="center">
-          </el-table-column>
-          <el-table-column
-            prop="classManager"
-            label="是否班主任"
-            align="center"
-          >
-            <template slot-scope="scope">
-              <div>
-                {{ scope.row.roleName=='班主任' ? "是" : "否" }}
-              </div>
-            </template>
-          </el-table-column>
-          <el-table-column
-            prop="gradeStartDate"
-            label="开始时间"
-            align="center"
-          >
-          </el-table-column>
-          <el-table-column
-            prop="gradeEndDate"
-            label="结束时间"
-            align="center"
-          >
-          </el-table-column>
-          
-          
-        </el-table>
-    </div>
-    <div class="page_jg_20"></div>
-    <div class="page_jg_20"></div>
-    <div class="user_title" >
-        <span class="cardName">我的管理权限</span>
-        <el-checkbox v-model="checkedMana"  @change="CheckedManaChange">仅显示有效管理权限</el-checkbox>
-    </div>
-    <div class="page_table">
-        <el-table  :data="teacherManaData"  border >
-          <el-table-column prop="schoolYearName" label="学年" align="center">
-          </el-table-column>
-          <el-table-column prop="roleName" label="角色" align="center">
-          </el-table-column>
-          <el-table-column prop="gradeName" label="年级" align="center">
-          </el-table-column>
-          <el-table-column prop="courseName" label="科目" align="center">
-          </el-table-column>
-          <el-table-column prop="gradeStartDate" label="开始时间" align="center">
-          </el-table-column>
-          <el-table-column prop="gradeEndDate" label="结束时间" align="center">
-          </el-table-column>
-        </el-table>
-    </div>
-    <div class="page_jg_20"></div>
     <div class="page_dialog">
       <el-dialog title="绑定手机号" center :visible.sync="bindingPhoneData.showDialog" width="400px">
         <div class="dialog_center padding_20">
@@ -152,7 +87,7 @@
 </template>
 <script>
 import { mapGetters } from "vuex";
-import bindEmail from "./components/userSetting/bindEmail.vue";
+
 import heada_Image from "../../assets/user_img.png";
 
 export default {
@@ -160,7 +95,7 @@ export default {
     ...mapGetters(["userInfo"]),
   },
   components: {
-    bindEmail,
+
   },
   data() {
     return {
@@ -201,8 +136,7 @@ export default {
       this.roleNames=this.userInfo.roleNames.join("、");
     }
    
-    this.GetUserCourse();//获取任课关系
-    this.GetUserPersonal();//获取权限管理
+   
     this.LoadSdk() //加载微信sdk
     // 监听微信中间页面传递参数
     window.addEventListener('message', this.WechatBind);
@@ -213,49 +147,10 @@ export default {
   },
   methods: {
 
-    // 我的任课关系
-    GetUserCourse() {
-      let param = {
-        dataType: 0,// 0-任课关系 1-管理权限
-        effective:this.checkedRenKe,//是否有效学年
-        pageNum:'1',
-        pageSize:'1000',
-      };
-      this.$api.user.getUserCoursePersonal(param).then((res) => {
-        console.log("打印我的任课关系", res);
-        if (res.code == 200) {
-          this.teacherClassData = res.data.records || [] ;
-          console.log("打印我的任课关系", this.teacherClassData);
-        }
-      });
-    },
-    // 我的管理权限
-    GetUserPersonal() {
-      let param = {
-        dataType: 1,// 0-任课关系 1-管理权限
-        effective:this.checkedMana,//是否有效学年
-        pageNum:'1',
-        pageSize:'1000',
-      };
-      this.$api.user.getUserCoursePersonal(param).then((res) => {
-        console.log("打印我的管理权限", res);
-        if (res.code == 200) {
-          this.teacherManaData = res.data.records || [] ;
-         
-        }
-      });
-    },
 
-    //是否显示有效任课信息
-    CheckedRenKeChange() {
-      this.GetUserCourse();
-    },
 
-    //是否显示有效管理权限
-    CheckedManaChange() 
-    {
-      this.GetUserPersonal();
-    },
+
+
 
     //打开绑定手机号弹窗
     OpenPhoneDialog() 

+ 1 - 1
version.json

@@ -1,5 +1,5 @@
 {
-  "version": "0.1.3_2025_11_14_0",
+  "version": "0.1.3_2025_11_20_0",
   "content": [
     {
       "time": "2024-11-1",

+ 1 - 1
vue.config.js

@@ -18,7 +18,7 @@ module.exports = {
       return args
     }) 
   },
-  publicPath: process.env.NODE_ENV === 'production' ? '/studata/' : '/',// /studata/ 生产环境(打包后)使用目标路径;/ 开发环境(npm run serve)使用根路径,不影响本地开发
+  publicPath: process.env.NODE_ENV === 'production' ? '/stu/' : '/',// /studata/ 生产环境(打包后)使用目标路径;/ 开发环境(npm run serve)使用根路径,不影响本地开发
   configureWebpack: {
     optimization: {
       minimize: true,