Explorar o código

增加统一认证

dedsudiyu hai 2 meses
pai
achega
219381c473

+ 7 - 0
.env.development

@@ -55,4 +55,11 @@ VUE_APP_BASE_LOCAL_API = '172.16.0.65/api'
 # VUE_APP_BASE_LOCAL_API = '192.168.1.20:8080'
 
 
+# #################### 认证平台版本退出接口 ####################
+
+VUE_APP_OUT_URL = 'http://192.168.1.43/labSystem/cas/logout/college'
+
+# #################### 认证平台版本退出接口-PC端 ####################
+
+VUE_APP_OUT_URL_PC = 'http://192.168.1.43/labSystem/auth/logout'
 

+ 13 - 4
.env.production

@@ -12,10 +12,10 @@ VUE_APP_RENEWAL_ENCODING = ''
 # ####################外网接口配置####################
 
 # 现场
-VUE_APP_BASE_API = 'labcontrol.nwafu.edu.cn/api'
+# VUE_APP_BASE_API = 'labcontrol.nwafu.edu.cn/api'
 
 # 1.8外网地址
-# VUE_APP_BASE_API = 'lab.zjznai.com/labTest'
+VUE_APP_BASE_API = 'lab.zjznai.com/labTest'
 
 # 43外网地址
 # VUE_APP_BASE_API = 'lab.zjznai.com/labapp'
@@ -26,10 +26,10 @@ VUE_APP_BASE_API = 'labcontrol.nwafu.edu.cn/api'
 # ####################内网接口配置####################
 
 # 现场
-VUE_APP_BASE_LOCAL_API = '172.16.0.65/api'
+# VUE_APP_BASE_LOCAL_API = '172.16.0.65/api'
 
 # 1.8内网地址
-# VUE_APP_BASE_LOCAL_API = '192.168.1.8/api'
+VUE_APP_BASE_LOCAL_API = '192.168.1.8/api'
 
 # 43内网地址
 # VUE_APP_BASE_LOCAL_API = '192.168.1.43/api'
@@ -38,4 +38,13 @@ VUE_APP_BASE_LOCAL_API = '172.16.0.65/api'
 # VUE_APP_BASE_LOCAL_API = '192.168.1.24:8080'
 
 
+# #################### 认证平台版本退出接口 ####################
+
+VUE_APP_OUT_URL = 'http://192.168.1.43/labSystem/cas/logout/college'
+
+# #################### 认证平台版本退出接口-PC端 ####################
+
+VUE_APP_OUT_URL_PC = 'http://192.168.1.43/labSystem/auth/logout'
+
+
 

+ 18 - 0
package-lock.json

@@ -2132,6 +2132,11 @@
         }
       }
     },
+    "@vue/devtools-api": {
+      "version": "6.6.4",
+      "resolved": "https://mirrors.huaweicloud.com/repository/npm/@vue/devtools-api/-/devtools-api-6.6.4.tgz",
+      "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g=="
+    },
     "@vue/vue-loader-v15": {
       "version": "npm:vue-loader@15.11.1",
       "resolved": "https://r.cnpmjs.org/vue-loader/-/vue-loader-15.11.1.tgz",
@@ -6263,6 +6268,11 @@
       "resolved": "https://registry.npmmirror.com/jsbn/-/jsbn-0.1.1.tgz",
       "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg=="
     },
+    "jsencrypt": {
+      "version": "3.3.2",
+      "resolved": "https://mirrors.huaweicloud.com/repository/npm/jsencrypt/-/jsencrypt-3.3.2.tgz",
+      "integrity": "sha512-arQR1R1ESGdAxY7ZheWr12wCaF2yF47v5qpB76TtV64H1pyGudk9Hvw8Y9tb/FiTIaaTRUyaSnm5T/Y53Ghm/A=="
+    },
     "jsesc": {
       "version": "2.5.2",
       "resolved": "https://registry.npmmirror.com/jsesc/-/jsesc-2.5.2.tgz",
@@ -10389,6 +10399,14 @@
       "integrity": "sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw==",
       "dev": true
     },
+    "vuex": {
+      "version": "4.1.0",
+      "resolved": "https://mirrors.huaweicloud.com/repository/npm/vuex/-/vuex-4.1.0.tgz",
+      "integrity": "sha512-hmV6UerDrPcgbSy9ORAtNXDr9M4wlNP4pEFKye4ujJF8oqgFFuxDCdOLS3eNoRTtq5O3hoBDh9Doj1bQMYHRbQ==",
+      "requires": {
+        "@vue/devtools-api": "^6.0.0-beta.11"
+      }
+    },
     "watchpack": {
       "version": "2.4.0",
       "resolved": "https://registry.npmmirror.com/watchpack/-/watchpack-2.4.0.tgz",

+ 3 - 1
package.json

@@ -17,6 +17,7 @@
     "jquery": "^3.6.1",
     "js-cookie": "^3.0.5",
     "js-md5": "^0.8.3",
+    "jsencrypt": "^3.3.2",
     "mpegts.js": "^1.7.3",
     "mqtt": "^4.2.8",
     "node-polyfill-webpack-plugin": "^4.1.0",
@@ -26,7 +27,8 @@
     "script-ext-html-webpack-plugin": "^2.1.5",
     "swiper": "^4.3.3",
     "vue": "^2.6.14",
-    "vue-router": "^3.5.2"
+    "vue-router": "^3.5.2",
+    "vuex": "^4.1.0"
   },
   "devDependencies": {
     "@babel/core": "^7.12.16",

BIN=BIN
src/assets/ZDimages/basicsModules/icon_dl_bbg.png


BIN=BIN
src/assets/ZDimages/basicsModules/tx_cion.png


BIN=BIN
src/assets/ZDimages/plan_img_1.png


BIN=BIN
src/assets/ZDimages/plan_img_2.png


+ 11 - 2
src/router/index.js

@@ -1,5 +1,6 @@
 import index from '../views/index.vue';
 import login from '../views/login.vue';
+import ssoLogin from '../views/ssoLogin.vue';
 import CourtyardHome from '../views/courtyardManage/courtyardHome.vue';
 import AdmittanceDetail from '../views/courtyardManage/admittanceDetail.vue';
 import ControlDetail from '../views/courtyardManage/controlDetail.vue';
@@ -19,7 +20,15 @@ import VideoSurveillance from '../views/videoSurveillance/index.vue';
 
 const router = [
     {
-      path: '/',
+      path: '/login',
+      component: ssoLogin,
+      name: 'ssoLogin',
+      meta: {
+         title: '实验室安全智能监测与控制系统',
+      },
+    },
+    {
+      path: '/adminLogin',
       component: login,
       name: 'login',
       meta: {
@@ -27,7 +36,7 @@ const router = [
       },
     },
     {
-      path: '/home',
+      path: '/',
       component: index,
       name: 'index',
       meta: {

+ 44 - 0
src/settings.js

@@ -0,0 +1,44 @@
+module.exports = {
+  /**
+   * 侧边栏主题 深色主题theme-dark,浅色主题theme-light
+   */
+  sideTheme: 'theme-dark',
+
+  /**
+   * 是否系统布局配置
+   */
+  showSettings: false,
+
+  /**
+   * 是否显示顶部导航
+   */
+  topNav: true,
+
+  /**
+   * 是否显示 tagsView
+   */
+  tagsView: true,
+
+  /**
+   * 是否固定头部
+   */
+  fixedHeader: false,
+
+  /**
+   * 是否显示logo
+   */
+  sidebarLogo: true,
+
+  /**
+   * 是否显示动态标题
+   */
+  dynamicTitle: false,
+
+  /**
+   * @type {string | array} 'production' | ['production', 'development']
+   * @description Need show err logs component.
+   * The default is only used in the production env
+   * If you want to also use it in dev, you can pass ['production', 'development']
+   */
+  errorLog: 'production'
+}

+ 18 - 0
src/store/getters.js

@@ -0,0 +1,18 @@
+const getters = {
+  sidebar: state => state.app.sidebar,
+  size: state => state.app.size,
+  device: state => state.app.device,
+  visitedViews: state => state.tagsView.visitedViews,
+  cachedViews: state => state.tagsView.cachedViews,
+  token: state => state.user.token,
+  avatar: state => state.user.avatar,
+  name: state => state.user.name,
+  introduction: state => state.user.introduction,
+  roles: state => state.user.roles,
+  permissions: state => state.user.permissions,
+  permission_routes: state => state.permission.routes,
+  topbarRouters:state => state.permission.topbarRouters,
+  defaultRoutes:state => state.permission.defaultRoutes,
+  sidebarRouters:state => state.permission.sidebarRouters,
+}
+export default getters

+ 21 - 0
src/store/index.js

@@ -0,0 +1,21 @@
+import Vue from 'vue'
+import Vuex from 'vuex'
+import app from './modules/app'
+import user from './modules/user'
+import tagsView from './modules/tagsView'
+import settings from './modules/settings'
+import getters from './getters'
+
+Vue.use(Vuex)
+
+const store = new Vuex.Store({
+  modules: {
+    app,
+    user,
+    tagsView,
+    settings,
+  },
+  getters
+})
+
+export default store

+ 56 - 0
src/store/modules/app.js

@@ -0,0 +1,56 @@
+import Cookies from 'js-cookie'
+
+const state = {
+  sidebar: {
+    opened: Cookies.get('sidebarStatus') ? !!+Cookies.get('sidebarStatus') : true,
+    withoutAnimation: false
+  },
+  device: 'desktop',
+  size: Cookies.get('size') || 'medium'
+}
+
+const mutations = {
+  TOGGLE_SIDEBAR: state => {
+    state.sidebar.opened = !state.sidebar.opened
+    state.sidebar.withoutAnimation = false
+    if (state.sidebar.opened) {
+      Cookies.set('sidebarStatus', 1)
+    } else {
+      Cookies.set('sidebarStatus', 0)
+    }
+  },
+  CLOSE_SIDEBAR: (state, withoutAnimation) => {
+    Cookies.set('sidebarStatus', 0)
+    state.sidebar.opened = false
+    state.sidebar.withoutAnimation = withoutAnimation
+  },
+  TOGGLE_DEVICE: (state, device) => {
+    state.device = device
+  },
+  SET_SIZE: (state, size) => {
+    state.size = size
+    Cookies.set('size', size)
+  }
+}
+
+const actions = {
+  toggleSideBar({ commit }) {
+    commit('TOGGLE_SIDEBAR')
+  },
+  closeSideBar({ commit }, { withoutAnimation }) {
+    commit('CLOSE_SIDEBAR', withoutAnimation)
+  },
+  toggleDevice({ commit }, device) {
+    commit('TOGGLE_DEVICE', device)
+  },
+  setSize({ commit }, size) {
+    commit('SET_SIZE', size)
+  }
+}
+
+export default {
+  namespaced: true,
+  state,
+  mutations,
+  actions
+}

+ 20 - 0
src/store/modules/plan.js

@@ -0,0 +1,20 @@
+const state = {
+  planSensorList: [],
+}
+const mutations = {
+
+}
+
+const actions = {
+  setTitle({ commit }, list) {
+    state.planSensorList = list
+  },
+}
+
+export default {
+  namespaced: true,
+  state,
+  mutations,
+  actions
+}
+

+ 58 - 0
src/store/modules/settings.js

@@ -0,0 +1,58 @@
+import defaultSettings from '@/settings'
+
+const { sideTheme, showSettings, topNav, tagsView, fixedHeader, sidebarLogo, dynamicTitle } = defaultSettings
+
+const storageSetting = JSON.parse(localStorage.getItem('layout-setting')) || ''
+const state = {
+  title: '',
+  pageName:"",
+  smartAlarmType:0,//柜锁开关 1开启 0关闭
+  theme: storageSetting.theme,
+  sideTheme: storageSetting.sideTheme || sideTheme,
+  showSettings: showSettings,
+  topNav:  storageSetting.topNav === undefined ? topNav : storageSetting.topNav,
+  tagsView: storageSetting.tagsView === undefined ? tagsView : storageSetting.tagsView,
+  fixedHeader: storageSetting.fixedHeader === undefined ? fixedHeader : storageSetting.fixedHeader,
+  sidebarLogo: storageSetting.sidebarLogo === undefined ? sidebarLogo : storageSetting.sidebarLogo,
+  dynamicTitle: storageSetting.dynamicTitle === undefined ? dynamicTitle : storageSetting.dynamicTitle,
+  planData:{},
+}
+const mutations = {
+  CHANGE_SETTING: (state, { key, value }) => {
+    if (state.hasOwnProperty(key)) {
+      state[key] = value
+    }
+  }
+}
+
+const actions = {
+  // 修改布局设置
+  changeSetting({ commit }, data) {
+    commit('CHANGE_SETTING', data)
+  },
+  // 设置网页标题
+  setTitle({ commit }, title) {
+    state.title = title
+  },
+  // 设置网页标题
+  setPageName({ commit }, title) {
+    state.pageName = title
+  },
+  // 设置预案数据
+  setPlanData({ commit }, data) {
+    state.planData = data
+  },
+  //锁柜启用状态修改
+  // 设置网页标题
+  setSmartAlarmType({ commit }, title) {
+    state.smartAlarmType = title
+  }
+}
+
+export default {
+  namespaced: true,
+  state,
+  mutations,
+  actions
+}
+

+ 183 - 0
src/store/modules/tagsView.js

@@ -0,0 +1,183 @@
+const state = {
+  visitedViews: [],
+  cachedViews: []
+}
+
+const mutations = {
+  ADD_VISITED_VIEW: (state, view) => {
+    if (state.visitedViews.some(v => v.path === view.path)) return
+    state.visitedViews.push(
+      Object.assign({}, view, {
+        title: view.meta.title || 'no-name'
+      })
+    )
+  },
+  ADD_CACHED_VIEW: (state, view) => {
+    if (state.cachedViews.includes(view.name)) return
+    if (!view.meta.noCache) {
+      state.cachedViews.push(view.name)
+    }
+  },
+
+  DEL_VISITED_VIEW: (state, view) => {
+    for (const [i, v] of state.visitedViews.entries()) {
+      if (v.path === view.path) {
+        state.visitedViews.splice(i, 1)
+        break
+      }
+    }
+  },
+  DEL_CACHED_VIEW: (state, view) => {
+    const index = state.cachedViews.indexOf(view.name)
+    index > -1 && state.cachedViews.splice(index, 1)
+  },
+
+  DEL_OTHERS_VISITED_VIEWS: (state, view) => {
+    state.visitedViews = state.visitedViews.filter(v => {
+      return v.meta.affix || v.path === view.path
+    })
+  },
+  DEL_OTHERS_CACHED_VIEWS: (state, view) => {
+    const index = state.cachedViews.indexOf(view.name)
+    if (index > -1) {
+      state.cachedViews = state.cachedViews.slice(index, index + 1)
+    } else {
+      state.cachedViews = []
+    }
+  },
+
+  DEL_ALL_VISITED_VIEWS: state => {
+    // keep affix tags
+    const affixTags = state.visitedViews.filter(tag => tag.meta.affix)
+    state.visitedViews = affixTags
+  },
+  DEL_ALL_CACHED_VIEWS: state => {
+    state.cachedViews = []
+  },
+
+  UPDATE_VISITED_VIEW: (state, view) => {
+    for (let v of state.visitedViews) {
+      if (v.path === view.path) {
+        v = Object.assign(v, view)
+        break
+      }
+    }
+  },
+  
+  DEL_RIGHT_VIEWS: (state, view) => {
+    const index = state.visitedViews.findIndex(v => v.path === view.path)
+    if (index === -1) {
+      return
+    }
+    state.visitedViews = state.visitedViews.filter((item, idx) => {
+      if (idx <= index || (item.meta && item.meta.affix)) {
+        return true
+      }
+      const i = state.cachedViews.indexOf(item.name)
+      if (i > -1) {
+        state.cachedViews.splice(i, 1)
+      }
+      return false
+    })
+  }
+}
+
+const actions = {
+  addView({ dispatch }, view) {
+    dispatch('addVisitedView', view)
+    dispatch('addCachedView', view)
+  },
+  addVisitedView({ commit }, view) {
+    commit('ADD_VISITED_VIEW', view)
+  },
+  addCachedView({ commit }, view) {
+    commit('ADD_CACHED_VIEW', view)
+  },
+
+  delView({ dispatch, state }, view) {
+    return new Promise(resolve => {
+      dispatch('delVisitedView', view)
+      dispatch('delCachedView', view)
+      resolve({
+        visitedViews: [...state.visitedViews],
+        cachedViews: [...state.cachedViews]
+      })
+    })
+  },
+  delVisitedView({ commit, state }, view) {
+    return new Promise(resolve => {
+      commit('DEL_VISITED_VIEW', view)
+      resolve([...state.visitedViews])
+    })
+  },
+  delCachedView({ commit, state }, view) {
+    return new Promise(resolve => {
+      commit('DEL_CACHED_VIEW', view)
+      resolve([...state.cachedViews])
+    })
+  },
+
+  delOthersViews({ dispatch, state }, view) {
+    return new Promise(resolve => {
+      dispatch('delOthersVisitedViews', view)
+      dispatch('delOthersCachedViews', view)
+      resolve({
+        visitedViews: [...state.visitedViews],
+        cachedViews: [...state.cachedViews]
+      })
+    })
+  },
+  delOthersVisitedViews({ commit, state }, view) {
+    return new Promise(resolve => {
+      commit('DEL_OTHERS_VISITED_VIEWS', view)
+      resolve([...state.visitedViews])
+    })
+  },
+  delOthersCachedViews({ commit, state }, view) {
+    return new Promise(resolve => {
+      commit('DEL_OTHERS_CACHED_VIEWS', view)
+      resolve([...state.cachedViews])
+    })
+  },
+
+  delAllViews({ dispatch, state }, view) {
+    return new Promise(resolve => {
+      dispatch('delAllVisitedViews', view)
+      dispatch('delAllCachedViews', view)
+      resolve({
+        visitedViews: [...state.visitedViews],
+        cachedViews: [...state.cachedViews]
+      })
+    })
+  },
+  delAllVisitedViews({ commit, state }) {
+    return new Promise(resolve => {
+      commit('DEL_ALL_VISITED_VIEWS')
+      resolve([...state.visitedViews])
+    })
+  },
+  delAllCachedViews({ commit, state }) {
+    return new Promise(resolve => {
+      commit('DEL_ALL_CACHED_VIEWS')
+      resolve([...state.cachedViews])
+    })
+  },
+
+  updateVisitedView({ commit }, view) {
+    commit('UPDATE_VISITED_VIEW', view)
+  },
+
+  delRightTags({ commit }, view) {
+    return new Promise(resolve => {
+      commit('DEL_RIGHT_VIEWS', view)
+      resolve([...state.visitedViews])
+    })
+  }
+}
+
+export default {
+  namespaced: true,
+  state,
+  mutations,
+  actions
+}

+ 70 - 0
src/store/modules/user.js

@@ -0,0 +1,70 @@
+import { getToken, setToken, setExpiresIn, removeToken } from '@/utils/auth'
+import store from '@/store'
+import router from '@/router'
+import md5 from 'js-md5';
+
+const user = {
+  state: {
+    token: getToken(),
+    name: '',
+    avatar: '',
+    roles: [],
+    permissions: [],
+    messageNum:0,
+  },
+
+  mutations: {
+    SET_TOKEN: (state, token) => {
+      state.token = token
+    },
+    SET_EXPIRES_IN: (state, time) => {
+      state.expires_in = time
+    },
+    SET_NAME: (state, name) => {
+      state.name = name
+    },
+    SET_AVATAR: (state, avatar) => {
+      state.avatar = avatar
+    },
+    SET_ROLES: (state, roles) => {
+      state.roles = roles
+    },
+    SET_PERMISSIONS: (state, permissions) => {
+      state.permissions = permissions
+    },
+    SET_MESSAGE_NUM: (state, num) => {
+      state.messageNum = num
+    }
+  },
+
+  actions: {
+    //不调用退出接口直接清除token
+    LogOutNoData({ commit, state }) {
+      return new Promise((resolve, reject) => {
+        commit('SET_TOKEN', '')
+        commit('SET_ROLES', [])
+        commit('SET_PERMISSIONS', [])
+        removeToken()
+        resolve()
+      })
+    },
+    // 前端 登出
+    FedLogOut({ commit }) {
+      return new Promise(resolve => {
+        commit('SET_TOKEN', '')
+        removeToken()
+        resolve()
+      })
+    },
+    //清除登录数据
+    delToken({ commit, state }){
+      localStorage.clear();
+      commit('SET_TOKEN', '')
+      commit('SET_ROLES', [])
+      commit('SET_PERMISSIONS', [])
+      removeToken()
+    },
+  }
+}
+
+export default user

+ 29 - 0
src/utils/auth.js

@@ -0,0 +1,29 @@
+import Cookies from 'js-cookie'
+
+const TokenKey = 'System-Platform-Token'
+
+const ExpiresInKey = 'System-Platform-Expires-In'
+
+export function getToken() {
+  return Cookies.get(TokenKey)
+}
+
+export function setToken(token) {
+  return Cookies.set(TokenKey, token)
+}
+
+export function removeToken() {
+  return Cookies.remove(TokenKey)
+}
+
+export function getExpiresIn() {
+  return Cookies.get(ExpiresInKey) || -1
+}
+
+export function setExpiresIn(time) {
+  return Cookies.set(ExpiresInKey, time)
+}
+
+export function removeExpiresIn() {
+  return Cookies.remove(ExpiresInKey)
+}

+ 30 - 0
src/utils/jsencrypt.js

@@ -0,0 +1,30 @@
+import JSEncrypt from 'jsencrypt/bin/jsencrypt.min'
+
+// 密钥对生成 http://web.chacuo.net/netrsakeypair
+
+const publicKey = 'MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKoR8mX0rGKLqzcWmOzbfj64K8ZIgOdH\n' +
+  'nzkXSOVOZbFu/TJhZ7rFAN+eaGkl3C4buccQd/EjEsj9ir7ijT7h96MCAwEAAQ=='
+
+const privateKey = 'MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAqhHyZfSsYourNxaY\n' +
+  '7Nt+PrgrxkiA50efORdI5U5lsW79MmFnusUA355oaSXcLhu5xxB38SMSyP2KvuKN\n' +
+  'PuH3owIDAQABAkAfoiLyL+Z4lf4Myxk6xUDgLaWGximj20CUf+5BKKnlrK+Ed8gA\n' +
+  'kM0HqoTt2UZwA5E2MzS4EI2gjfQhz5X28uqxAiEA3wNFxfrCZlSZHb0gn2zDpWow\n' +
+  'cSxQAgiCstxGUoOqlW8CIQDDOerGKH5OmCJ4Z21v+F25WaHYPxCFMvwxpcw99Ecv\n' +
+  'DQIgIdhDTIqD2jfYjPTY8Jj3EDGPbH2HHuffvflECt3Ek60CIQCFRlCkHpi7hthh\n' +
+  'YhovyloRYsM+IS9h/0BzlEAuO0ktMQIgSPT3aFAgJYwKpqRYKlLDVcflZFCKY7u3\n' +
+  'UP8iWi1Qw0Y='
+
+// 加密
+export function encrypt(txt) {
+  const encryptor = new JSEncrypt()
+  encryptor.setPublicKey(publicKey) // 设置公钥
+  return encryptor.encrypt(txt) // 对数据进行加密
+}
+
+// 解密
+export function decrypt(txt) {
+  const encryptor = new JSEncrypt()
+  encryptor.setPrivateKey(privateKey) // 设置私钥
+  return encryptor.decrypt(txt) // 对数据进行解密
+}
+

+ 26 - 13
src/utils/request.js

@@ -1,5 +1,6 @@
 import axios from "axios";
 import { MessageBox, Message, Loading } from 'element-ui'
+import { getToken,removeToken } from '@/utils/auth'
 import {tansParams,judgmentNetworkReturnAddress} from "@/utils/public";
 
 
@@ -31,9 +32,9 @@ const serviceAxios = axios.create({
 // 创建请求拦截
 serviceAxios.interceptors.request.use(config => {
         // 弹层相关
-        loadingInstance = Loading.service(options)
-        if (localStorage.getItem('instituteToken')) {
-            config.headers['Authorization'] = localStorage.getItem('instituteToken') // 让每个请求携带自定义token 请根据实际情况自行修改
+        const isToken = (config.headers || {}).isToken === false
+        if (getToken() && !isToken) {
+            config.headers['Authorization'] = getToken() // 让每个请求携带自定义token 请根据实际情况自行修改
         }
         // get请求映射params参数
         if (config.method === 'get' && config.params) {
@@ -68,8 +69,8 @@ serviceAxios.interceptors.response.use(res => {
         const code = res.data.code || 200;
         // 获取错误信息
         if(code == 5002){
-            if(localStorage.getItem('instituteToken')){
-                localStorage.removeItem('instituteToken')
+            if(getToken()){
+                removeToken();
                 MessageBox.confirm('登录状态已过期,请重新登录', '系统提示', {
                         confirmButtonText: '确定',
                         showCancelButton:false,
@@ -78,13 +79,17 @@ serviceAxios.interceptors.response.use(res => {
                         type: 'warning'
                     }
                 ).then(() => {
-                    window.location.href='#/';
+                    if(localStorage.getItem('entranceJumpType') == 'SCHOOL'){
+                        window.location.href = process.env.VUE_APP_OUT_URL;
+                    }else if(localStorage.getItem('entranceJumpType') == 'PC'){
+                        window.location.href = process.env.VUE_APP_OUT_URL_PC;
+                    }
                 }).catch(() => {});
             }
         }else if (code == 5005) {
-            if(localStorage.getItem('instituteToken')){
+            if(getToken()){
                 //无权限
-                localStorage.removeItem('instituteToken')
+                removeToken();
                 MessageBox.confirm('没有相关权限,请联系管理员', '系统提示', {
                         confirmButtonText: '确定',
                         showCancelButton:false,
@@ -93,7 +98,11 @@ serviceAxios.interceptors.response.use(res => {
                         type: 'warning'
                     }
                 ).then(() => {
-                    window.location.href='#/';
+                    if(localStorage.getItem('entranceJumpType') == 'SCHOOL'){
+                        window.location.href = process.env.VUE_APP_OUT_URL;
+                    }else if(localStorage.getItem('entranceJumpType') == 'PC'){
+                        window.location.href = process.env.VUE_APP_OUT_URL_PC;
+                    }
                 }).catch(() => {});
             }
         }else if(code == 5007){
@@ -130,8 +139,8 @@ serviceAxios.interceptors.response.use(res => {
         }
         else if (message.includes("Request failed with status code")) {
             if(message.substr(message.length - 3) == 401){
-                if(localStorage.getItem('instituteToken')){
-                    // localStorage.removeItem('instituteToken')
+                if(getToken()){
+                    removeToken();
                     MessageBox.confirm('登录状态已过期,请重新登录', '系统提示', {
                             confirmButtonText: '确定',
                             showCancelButton:false,
@@ -140,7 +149,11 @@ serviceAxios.interceptors.response.use(res => {
                             type: 'warning'
                         }
                     ).then(() => {
-                        window.location.href='#/';
+                        if(localStorage.getItem('entranceJumpType') == 'SCHOOL'){
+                            window.location.href = process.env.VUE_APP_OUT_URL;
+                        }else if(localStorage.getItem('entranceJumpType') == 'PC'){
+                            window.location.href = process.env.VUE_APP_OUT_URL_PC;
+                        }
                     }).catch(() => {});
                 }
             }else{
@@ -178,7 +191,7 @@ export function download(url, params, filename) {
         headers: {
             'Content-Type': 'application/x-www-form-urlencoded',
             "Access-Control-Allow-Origin": "*",
-            token:localStorage.getItem("instituteToken"),
+            token:getToken(),
 
         },
         responseType: 'blob'

+ 2 - 0
src/views/login.vue

@@ -51,6 +51,7 @@
     import Cookies from "js-cookie";
     import { login,authInfo,getCodeImg,getConfigByType,configInfo,getInfo } from "@/api/login";
     import {Decrypt} from "@/utils/secret";
+    import { setToken } from '@/utils/auth'
 
     export default {
         name: "Login",
@@ -229,6 +230,7 @@
                         }else{
                             localStorage.setItem('userId',res.data.userId);
                             localStorage.setItem('instituteToken',res.data.token);
+                            setToken(res.data.token)
                             //身份字段规则转义 原定11老师 22学生  新版本后0系统1老师2学生,这里身份字段转义为旧版本规则
                             localStorage.setItem('userType',res.data.userType)
                             //等待配置与字段获取到后跳转

+ 151 - 0
src/views/ssoLogin.vue

@@ -0,0 +1,151 @@
+<!-- 认证平台登录 -->
+<template>
+  <div class="sso-login-page">
+  </div>
+</template>
+
+<script>
+  //                      V3
+  import { encrypt, decrypt } from '@/utils/jsencrypt'
+  import { Encrypt,Decrypt} from '@/utils/secret'
+  import store from '@/store'
+  import { login,authInfo,getCodeImg,getConfigByType,configInfo,getInfo } from "@/api/login";
+  import { setToken } from '@/utils/auth'
+
+  export default {
+    name: 'Login',
+    data() {
+      return {
+        redirect: undefined,
+        rectangleLogo: localStorage.getItem('rectangleLogo')
+      }
+    },
+    watch: {
+      $route: {
+        handler: function(route) {
+          this.redirect = route.query && route.query.redirect
+        },
+        immediate: true
+      }
+    },
+    created() {
+      localStorage.setItem('entranceJumpType','SCHOOL');
+      let url = window.location.href
+      if (url.indexOf('token') != -1) {
+        // console.log('找到了====>token')
+        setToken(url.split('=')[1])
+        this.getInfoAll();
+      } else if (url.indexOf('code') != -1) {
+        // console.log('找到了====>code')
+        //异常状态处理
+        if(url.split('=')[1] == '10100'){
+          //10100 用户信息不存在
+          this.$alert('当前用户不存在,请联系管理员!', '提示', {
+            confirmButtonText: '确定',
+            callback: action => {
+              store.dispatch('LogOut').then(() => {
+                window.location.href = process.env.VUE_APP_OUT_URL;
+              })
+            }
+          });
+        }else if(url.split('=')[1] == '500'){
+          //用户服务异常
+          this.$alert('服务异常,请稍候再试!', '提示', {
+            confirmButtonText: '确定',
+            callback: action => {
+              store.dispatch('LogOut').then(() => {
+                window.location.href = process.env.VUE_APP_OUT_URL;
+              })
+            }
+          });
+        }
+      } else {
+        window.location.href = process.env.VUE_APP_OUT_URL;
+      }
+      localStorage.setItem('windowHref', window.location.href)
+    },
+    mounted() {
+
+    },
+    methods: {
+      getInfoAll() {
+        //等待配置与字段获取到后跳转
+        Promise.all([
+          this.configInfo(),
+          this.getExploitConfig(),
+          this.fullScreen()
+        ]).then((result)=>{
+          this.$router.push({ path: this.redirect || "/" }).catch(()=>{});
+        }).catch((error) => {})
+      },
+      //获取公共配置数据
+      configInfo(){
+          getInfo().then(res => {
+              localStorage.setItem('deptName',res.data.userInfo.deptName)
+              localStorage.setItem('deptId',res.data.userInfo.deptId)
+          });
+      },
+      //获取开发配置
+      getExploitConfig(){
+          getConfigByType({ category: 2, configType: 5 }).then(response => {
+              let obj = JSON.parse(response.data.configValue);
+              //判定http或者https
+              let urlText = window.location.href.split('://')[0]+'://';
+              let outerNet = window.location.href.indexOf(obj.ipIdentify) == -1//true外网 false 内网
+              if(outerNet){//外网
+                  //MQTT地址
+                  localStorage.setItem('mqttUrl','wss://'+Decrypt(obj.mqttExtranetUrl))
+                  //MQTT账号
+                  localStorage.setItem('mqttUser',Decrypt(obj.mqttExtranetUser))
+                  //MQTT密码
+                  localStorage.setItem('mqttPassword',Decrypt(obj.mqttExtranetPassword))
+                  //PC端回跳地址
+                  localStorage.setItem('pcUrl',urlText+obj.pcExtranetUrl)
+                  localStorage.setItem('fileBrowseEnvironment',urlText+Decrypt(obj.fileBrowseEnvironmentExtranet))
+                  localStorage.setItem('fileBrowseEnvironmentExtranet',urlText+Decrypt(obj.fileBrowseEnvironmentExtranet))
+              }else{
+                  //MQTT地址
+                  localStorage.setItem('mqttUrl','ws://'+Decrypt(obj.mqttIntranetUrl))
+                  //MQTT账号
+                  localStorage.setItem('mqttUser',Decrypt(obj.mqttIntranetUser))
+                  //MQTT密码
+                  localStorage.setItem('mqttPassword',Decrypt(obj.mqttIntranetPassword))
+                  //PC端回跳地址
+                  localStorage.setItem('pcUrl',urlText+obj.pcIntranetUrl)
+                  localStorage.setItem('fileBrowseEnvironment',urlText+Decrypt(obj.fileBrowseEnvironment))
+                  localStorage.setItem('fileBrowseEnvironmentExtranet',urlText+Decrypt(obj.fileBrowseEnvironmentExtranet))
+              }
+          });
+      },
+      //全屏
+      fullScreen() {
+        var element = document.documentElement;
+        if (element.requestFullscreen) {
+          element.requestFullscreen();
+        } else if (element.msRequestFullscreen) {
+          element.msRequestFullscreen();
+        } else if (element.mozRequestFullScreen) {
+          element.mozRequestFullScreen();
+        } else if (element.webkitRequestFullscreen) {
+          element.webkitRequestFullscreen();
+        }
+      },
+    }
+  }
+</script>
+
+<style rel="stylesheet/scss" lang="scss">
+  .sso-login-page {
+    height: 100%;
+    width: 100%;
+    background-image: url("../assets/ZDimages/basicsModules/icon_dl_bbg.png");
+    background-repeat: no-repeat;
+    background-size: cover;
+    -webkit-background-size: cover;
+    -o-background-size: cover;
+    position: relative;
+    * {
+      margin: 0;
+    }
+  }
+</style>