liurongli il y a 2 semaines
Parent
commit
5487a4173f
4 fichiers modifiés avec 135 ajouts et 4 suppressions
  1. 62 0
      src/main.js
  2. 7 0
      src/router/index.js
  3. 8 4
      src/utils/auth.js
  4. 58 0
      src/views/login/padLogin.vue

+ 62 - 0
src/main.js

@@ -65,6 +65,68 @@ Vue.prototype.$axios = axios;
 Vue.prototype.$api = api;
 Vue.prototype.$echarts = echarts;
 
+//=======从pad App接收消息 start
+window.receiveAppMsg = function(payload) {
+  console.log('【网页收到壳消息】', payload)
+  if (!payload || !payload.type) return
+  switch (payload.type) {
+    case 'setToken':
+      window.__IS_PAD_APP__ = true;
+      window.__PAD_APP_TOKEN__ = payload.token;// 保存token到全局变量
+      const rootEl = document.querySelector('#app') // vue项目根容器
+      const cls = 'pad_container_layout';// pad容器样式
+			if (rootEl && !rootEl.classList.contains(cls)) {
+				rootEl.classList.add(cls)
+			}
+      // if (payload.token) {
+      //   axios.defaults.headers.common['Authorization'] = `${payload.token}`
+      // }
+      // 触发自定义事件,通知登录页面token准备好了!
+      const tokenReadyEvent = new CustomEvent('padAppTokenReady', {
+        detail: { token: payload.token }
+      })
+      window.dispatchEvent(tokenReadyEvent)
+      break
+    case 'goPage':
+      router.push(payload.path)
+      break
+    case 'openHeaderDropdown':
+      // 通知 Header 组件打开用户下拉(el-dropdown)弹框
+      window.dispatchEvent(new CustomEvent('openHeaderDropdown'))
+      break
+    default:  
+      console.log('未知消息类型', payload)
+      break
+  }
+}
+
+// H5 iframe监听壳消息
+window.addEventListener('message', function(e) {
+  // console.log('【收到壳消息】', JSON.stringify(e.data))
+  // ==========重点:APP‑PLUS环境直接退出,不要处理postMessage消息==========
+  // uni-app webview中,window.plus 存在代表是安卓/ios app环境
+  if(window.plus){
+    console.log("【APP环境,跳过postMessage消息】")
+    return
+  }
+  // 过滤webpack内部热更新消息
+  if (e.data?.type === 'webpackWarnings' || e.data?.type === 'webpackHotUpdate') {
+    return
+  }
+  // 白名单,只允许这些域名发送消息
+  const baseUrl = process.env.VUE_APP_BASE;
+  const allowOrigin = [
+    'http://localhost:8080',
+    'http://192.168.1.18:8080',
+    baseUrl
+  ];
+  if (!allowOrigin.includes(e.origin)) return
+  const data = e.data;
+  if (!data || !data.type) return
+  window.receiveAppMsg(data)
+})
+//=======从pad App接收消息 end
+
 new Vue({
   el: "#app",
   router,

+ 7 - 0
src/router/index.js

@@ -30,6 +30,13 @@ let constantRoutes = [
             title: "logins",
         },//工作台登录
     },
+    {
+        path: "/padLogin",
+        component: () => import("@/views/login/padLogin.vue"),
+        meta: {
+            title: "padLogin",
+        },//pad登录
+    },
     //靶向提升
     {
         path:'/targetImprove',

+ 8 - 4
src/utils/auth.js

@@ -4,15 +4,19 @@ const TokenKey = 'x-jt-student-admin-token'
 const MenuKey = 'x-jt-admin-Menu'
 const TokenAdminKey = 'x-jt-adminUser-token'
 export function getToken() {
-  return Cookies.get(TokenKey)
+  return Cookies.get(TokenKey) || localStorage.getItem(TokenKey) || ''
 }
 export function getAdminToken() {
   return Cookies.get(TokenAdminKey)
 }
 
-export function setToken(token) {
-  const expires = new Date(new Date(new Date().getTime() + 24 * 60 * 60 * 1000).setHours(0, 0, 0, 0))
-  return Cookies.set(TokenKey, token, { expires: expires })
+export function setToken(token,isPad = false) {
+  if(isPad){
+    localStorage.setItem(TokenKey, token)
+  }else{
+    const expires = new Date(new Date(new Date().getTime() + 24 * 60 * 60 * 1000).setHours(0, 0, 0, 0))
+    return Cookies.set(TokenKey, token, { expires: expires })
+  }
 }
 
 export function setAdminToken(token) {

+ 58 - 0
src/views/login/padLogin.vue

@@ -0,0 +1,58 @@
+<template>
+
+</template>
+<script>
+// pad过来的登录跳转
+import { setToken } from '@/utils/auth'
+
+export default {
+  data() {
+    return {}
+  },
+  mounted() {
+    //先清空本地存储
+    localStorage.clear();
+    sessionStorage.clear();
+    // pad端 监听全局事件,等待壳下发token
+    window.addEventListener('padAppTokenReady', this.onFromPadTokenReady);
+  },
+  beforeDestroy() {
+    // 组件销毁,移除监听,防止重复执行
+    window.removeEventListener('padAppTokenReady', this.onFromPadTokenReady)
+  },
+  methods: {
+    // 监听从pad App壳下发的token
+    onFromPadTokenReady(event) {
+      const token = event.detail.token;//token
+      this.onPadAppLogin(token);//登录成功
+    },
+    // 监听从pad App壳下发的登录事件 进入登录流程
+    onPadAppLogin(token) {
+      // 从pad App获取token
+      if (token) {
+        this.GetUserInfo(token, true);//登录成功
+      }
+    },
+    //获取用户信息
+    GetUserInfo(token, isPad = true) {
+      setToken(token, isPad);
+      this.$store.commit('user/SET_TOKEN', token); // 同步更新 store 状态,否则请求拦截器中 store.getters.token 为空,不会携带 Authorization 头
+      this.$store.dispatch('user/getUserInfoByToken').then(user => {
+
+        sessionStorage.setItem('schoolType', 2) //1:单校 2:联校
+
+        let userInfos = this.$store.state.user.userInfo
+        if (userInfos.phone) {
+          const directUrl = '/jointStudentAnalysisReport/list'
+
+          this.$router.push({ path: directUrl })
+        } else {
+          this.$router.push({ path: '/userInfo/personInfo' })
+
+        }
+      }) //获取用户登录信息
+
+    }
+  }
+}
+</script>