5770ee1d by renchao@pashanhoo.com

style:cas

1 parent 2159a36b
1 <!-- 1 <!--
2 * @Description: 2 * @Description:
3 * @Autor: renchao 3 * @Autor: renchao
4 * @LastEditTime: 2023-05-16 09:50:40 4 * @LastEditTime: 2023-05-26 16:57:47
5 --> 5 -->
6 <!DOCTYPE html> 6 <!DOCTYPE html>
7 <html> 7 <html>
...@@ -18,8 +18,19 @@ ...@@ -18,8 +18,19 @@
18 </title> 18 </title>
19 </head> 19 </head>
20 <script> 20 <script>
21 window.baseUrl = location.origin || location.protocol + '//' + location.host 21 window._config = {
22 const authorization = "bearer AT-4-MxSrO29Coe7VTazx8uuixtqqgO-hvCB6" 22 // 是否微服务模式,业务系统根据需要读取
23 cloudEnable: false,
24 // 是否启用单点登录
25 casEnable: true,
26 // cas 基地址
27 casBaseURL: 'http://192.168.2.38/cas',
28 services: {
29 // 配置到 contextPath 前一级
30 management: 'http://192.168.2.38',
31 business: 'http://localhost:7001'
32 }
33 }
23 fetch('<%= BASE_URL %>config.json') 34 fetch('<%= BASE_URL %>config.json')
24 .then(response => response.json()) 35 .then(response => response.json())
25 .then(config => { 36 .then(config => {
......
1 /* 1 /*
2 * @Description: 项目权限 2 * @Description: 项目权限
3 * @Autor: renchao 3 * @Autor: renchao
4 * @LastEditTime: 2023-05-16 14:10:26 4 * @LastEditTime: 2023-05-26 17:17:34
5 */ 5 */
6 import Vue from 'vue' 6 import Vue from 'vue'
7 import router from './router' 7 import router from './router'
8 import store from './store' 8 import store from './store'
9 import axios from 'axios'
9 import { getMenuInfo } from '@/api/user' 10 import { getMenuInfo } from '@/api/user'
11 import { getUrlParam } from '@/utils/operation'
10 import NProgress from 'nprogress' // progress bar 12 import NProgress from 'nprogress' // progress bar
11 import 'nprogress/nprogress.css' // progress bar style 13 import 'nprogress/nprogress.css' // progress bar style
12 import getPageTitle from '@/utils/get-page-title' 14 import getPageTitle from '@/utils/get-page-title'
...@@ -14,31 +16,82 @@ import Cookies from 'js-cookie' ...@@ -14,31 +16,82 @@ import Cookies from 'js-cookie'
14 NProgress.configure({ showSpinner: false }) // NProgress Configuration 16 NProgress.configure({ showSpinner: false }) // NProgress Configuration
15 17
16 router.beforeEach(async (to, from, next) => { 18 router.beforeEach(async (to, from, next) => {
17 Vue.prototype.$currentRoute = to 19 const token = localStorage.getItem("token")
18 NProgress.start() 20 debugger
19 document.title = getPageTitle(to.meta.title) 21 if (to.path === '/login') {
20 let hasAddDict = store.state.dict.addDict 22 if (token) {
21 let hasAddRoute = store.state.permission.addRoutes 23 next('/')
22 if (!hasAddDict) { 24 } else {
23 store.dispatch('dict/generateDic') 25 next()
26 }
27 return
24 } 28 }
25 if (hasAddRoute) { 29 if (window._config.casEnable === true) {
26 next() 30 let locationUrl = window.location.protocol + '//' + window.location.host + window.location.pathname;
27 // next({ ...to, replace: true }) 31 if (!token) {
28 } else { 32 let ticket = getUrlParam('ticket');
29 const { result: getMenuData } = await getMenuInfo() 33 if (ticket) {
30 const accessRoutes = await store.dispatch('permission/generateRoutes', getMenuData) 34 axios.get("http://192.168.2.38/management/cas/validate", {
31 // 获取用户信息 35 params: {
32 await store.dispatch('user/getUserInfo') 36 'ticket': ticket,
33 router.addRoutes([...accessRoutes, { path: '*', redirect: '/404', hidden: true }]) 37 'service': locationUrl
34 const routeTo = Cookies.get('routerTo') 38 }
35 if (routeTo && routeTo !== '/') { 39 }).then((res) => {
36 next({ ...to, replace: true }) 40 localStorage.setItem('token', res.data.content.id)
41 window.location.href = localStorage.getItem('location')
42 }).catch(e => {
43 console.log(e)
44 })
45 } else {
46 localStorage.setItem("location", window.location.href)
47 window.location.href = window._config.casBaseURL + '/login?service=' + encodeURIComponent(locationUrl);
48 }
37 } else { 49 } else {
38 next('/home') 50 next()
39 } 51 }
52 } else {
53 if (!token) {
54 const redirectData = {
55 path: '/login',
56 replace: true,
57 }
58 if (to.path) {
59 redirectData.query = {
60 ...redirectData.query,
61 redirect: to.path,
62 };
63 }
64 next(redirectData)
65 return
66 }
67 next()
40 } 68 }
41 NProgress.done() 69
70 // Vue.prototype.$currentRoute = to
71 // NProgress.start()
72 // document.title = getPageTitle(to.meta.title)
73 // let hasAddDict = store.state.dict.addDict
74 // let hasAddRoute = store.state.permission.addRoutes
75 // if (!hasAddDict) {
76 // store.dispatch('dict/generateDic')
77 // }
78 // if (hasAddRoute) {
79 // next()
80 // // next({ ...to, replace: true })
81 // } else {
82 // const { result: getMenuData } = await getMenuInfo()
83 // const accessRoutes = await store.dispatch('permission/generateRoutes', getMenuData)
84 // // 获取用户信息
85 // await store.dispatch('user/getUserInfo')
86 // router.addRoutes([...accessRoutes, { path: '*', redirect: '/404', hidden: true }])
87 // const routeTo = Cookies.get('routerTo')
88 // if (routeTo && routeTo !== '/') {
89 // next({ ...to, replace: true })
90 // } else {
91 // next('/home')
92 // }
93 // }
94 // NProgress.done()
42 }) 95 })
43 router.afterEach(to => { 96 router.afterEach(to => {
44 // 解决刷新页面报404问题 97 // 解决刷新页面报404问题
......
1 /* 1 /*
2 * @Description: 全局路由 2 * @Description: 全局路由
3 * @Autor: renchao 3 * @Autor: renchao
4 * @LastEditTime: 2023-05-16 14:09:37 4 * @LastEditTime: 2023-05-26 17:11:19
5 */ 5 */
6 import Vue from 'vue' 6 import Vue from 'vue'
7 import Router from 'vue-router' 7 import Router from 'vue-router'
......
...@@ -110,3 +110,25 @@ export function down (index, data) { ...@@ -110,3 +110,25 @@ export function down (index, data) {
110 data.splice(index, 0, downData); 110 data.splice(index, 0, downData);
111 } 111 }
112 } 112 }
113
114
115 export function getUrlParam (paraName) {
116 let url = document.location.toString();
117 let arrObj = url.split('?');
118
119 if (arrObj.length > 1) {
120 let arrPara = arrObj[1].split('&');
121 let arr;
122
123 for (let i = 0; i < arrPara.length; i++) {
124 arr = arrPara[i].split('=');
125
126 if (arr != null && arr[0] === paraName) {
127 return arr[1];
128 }
129 }
130 return '';
131 } else {
132 return '';
133 }
134 }
......
1 /* 1 /*
2 * @Description: 此文件主要创建 axios 实例,然后添加请求拦截器和响应拦截器 2 * @Description: 此文件主要创建 axios 实例,然后添加请求拦截器和响应拦截器
3 * @Autor: renchao 3 * @Autor: renchao
4 * @LastEditTime: 2023-05-16 14:07:58 4 * @LastEditTime: 2023-05-26 16:52:25
5 */ 5 */
6 import axios from 'axios' 6 import axios from 'axios'
7 import { Message } from 'element-ui' 7 import { Message } from 'element-ui'
...@@ -9,10 +9,6 @@ import { endLoadingSubCount } from './requestLoading' ...@@ -9,10 +9,6 @@ import { endLoadingSubCount } from './requestLoading'
9 9
10 // create an axios instance 10 // create an axios instance
11 const service = axios.create({ 11 const service = axios.create({
12 baseURL:
13 process.env.NODE_ENV == "development"
14 ? process.env.VUE_APP_BASE_API
15 : window.baseUrl + "/",
16 withCredentials: true, //是否允许跨域 12 withCredentials: true, //是否允许跨域
17 headers: { 13 headers: {
18 'Content-Type': 'application/json; charset=utf-8' 14 'Content-Type': 'application/json; charset=utf-8'
...@@ -23,13 +19,14 @@ const service = axios.create({ ...@@ -23,13 +19,14 @@ const service = axios.create({
23 // request interceptor 19 // request interceptor
24 service.interceptors.request.use( 20 service.interceptors.request.use(
25 config => { 21 config => {
26 // do something before request is sent 22 const token = localStorage.getItem('token')
27 if (process.env.NODE_ENV === "production") { 23 // 添加请求头
28 return config; 24 if (token) {
25 config.headers['Authorization'] = "Bearer " + token
29 } else { 26 } else {
30 config.headers.Authorization = authorization; 27 config.headers.delete('Authorization')
31 return config;
32 } 28 }
29 return config;
33 }, 30 },
34 error => { 31 error => {
35 // do something with request error 32 // do something with request error
...@@ -55,13 +52,35 @@ service.interceptors.response.use( ...@@ -55,13 +52,35 @@ service.interceptors.response.use(
55 }, 52 },
56 error => { 53 error => {
57 endLoadingSubCount() 54 endLoadingSubCount()
58 // 对响应错误做点什么 55 if (error.response.status === 401) {
59 Message({ 56 //todo: 需要解决 一个页面多个请求,刷新后此处会触发多次
60 message: '服务器异常,请联系管理员', 57 if (window.__isNeedLogin) {
61 type: 'error', 58 window.__isNeedLogin = false
62 duration: 5 * 1000, 59 this.$message.error('token失效,请重新登录');
63 customClass: 'messageIndex' 60 let locationUrl = window.location.protocol + '//' + window.location.host + window.location.pathname;
64 }) 61 localStorage.removeItem('token')
62 if (window._config.casEnable) {
63 window.location.href = window._config.casBaseURL + '/logout?service=' + encodeURIComponent(locationUrl);
64 } else {
65 router.replace({
66 path: '/login',
67 query: {
68 redirect: router.currentRoute.value.fullPath
69 }
70 })
71 return false
72 }
73 }
74
75 } else {
76 // 对响应错误做点什么
77 Message({
78 message: '服务器异常,请联系管理员',
79 type: 'error',
80 duration: 5 * 1000,
81 customClass: 'messageIndex'
82 })
83 }
65 return Promise.reject(error); 84 return Promise.reject(error);
66 } 85 }
67 ) 86 )
......