43033b73 by xiaomiao
2 parents 5744c545 40f23ca0
...@@ -5,4 +5,4 @@ NODE_ENV=development ...@@ -5,4 +5,4 @@ NODE_ENV=development
5 VUE_APP_BASE_API = '/api' 5 VUE_APP_BASE_API = '/api'
6 6
7 # 开发环境 7 # 开发环境
8 VUE_APP_API_BASE_URL = 'http://192.168.2.38:8008' 8 VUE_APP_API_BASE_URL = 'http://192.168.2.38:8027'
......
1 import request from "@/utils/request";
2 import SERVER from "./config";
3
4 export function loginIn(username, password) {
5 return request({
6 url: `${SERVER.MANAGEMENTAPI}/login?username=${username}&password=${password}`,
7 method: "post",
8 });
9 }
10 export function loginOut() {
11 return request({
12 url: `${SERVER.MANAGEMENTAPI}/logout`,
13 method: "post",
14 });
15 }
...\ No newline at end of file ...\ No newline at end of file
1 <template> 1 <template>
2 <div class="navbar-con"> 2 <div class="navbar-con">
3 <div class="navbar"> 3 <div class="navbar">
4 <div class="title">{{ dicData['sysCode'] && dicData['sysCode'][0].DNAME }}</div> 4 <div class="title">
5 <div class="user">欢迎进入系统 {{ name }} <svg-icon icon-class='close' class="closeStyle" @click="onCancel" />退出系统</div> 5 {{ dicData["sysCode"] && dicData["sysCode"][0].DNAME }}
6 </div>
7 <div class="user">
8 欢迎进入系统 {{ name }}
9 <span @click="onCancel">
10 <svg-icon icon-class="close" class="closeStyle" />退出系统</span
11 >
12 </div>
6 <div class="sidebarLeft"> 13 <div class="sidebarLeft">
7 <sidebarLeft /> 14 <sidebarLeft />
8 </div> 15 </div>
...@@ -13,22 +20,31 @@ ...@@ -13,22 +20,31 @@
13 </div> 20 </div>
14 </template> 21 </template>
15 <script> 22 <script>
16 import sidebarLeft from './Sidebar/sidebarLeft' 23 import sidebarLeft from "./Sidebar/sidebarLeft";
17 import sidebarRight from './Sidebar/sidebarRight' 24 import sidebarRight from "./Sidebar/sidebarRight";
18 import { mapGetters } from 'vuex' 25 import { loginOut } from "@/api/login.js";
26 import { mapGetters } from "vuex";
19 export default { 27 export default {
20 components: { 28 components: {
21 sidebarLeft, 29 sidebarLeft,
22 sidebarRight 30 sidebarRight,
23 }, 31 },
24 computed: { 32 computed: {
25 ...mapGetters(['sidebar', 'dicData', 'name']) 33 ...mapGetters(["sidebar", "dicData", "name"]),
26 }, 34 },
27 methods: { 35 methods: {
28 onCancel () { 36 onCancel() {
29 } 37 loginOut()
30 } 38 .then((res) => {
31 } 39 sessionStorage.removeItem("token");
40 this.$router.push("/login");
41 })
42 .catch((error) => {
43 // console.dir(error);
44 });
45 },
46 },
47 };
32 </script> 48 </script>
33 <style lang="scss" scoped> 49 <style lang="scss" scoped>
34 /deep/.el-menu--horizontal { 50 /deep/.el-menu--horizontal {
...@@ -40,9 +56,9 @@ export default { ...@@ -40,9 +56,9 @@ export default {
40 height: 34px; 56 height: 34px;
41 width: 130px; 57 width: 130px;
42 text-align: center; 58 text-align: center;
43 color: #FFFFFF; 59 color: #ffffff;
44 margin-right: 20px; 60 margin-right: 20px;
45 background: url('~@/image/navbar.png') no-repeat; 61 background: url("~@/image/navbar.png") no-repeat;
46 background-size: 100% 100%; 62 background-size: 100% 100%;
47 } 63 }
48 64
...@@ -56,7 +72,7 @@ export default { ...@@ -56,7 +72,7 @@ export default {
56 72
57 /deep/.el-submenu__title { 73 /deep/.el-submenu__title {
58 height: 34px; 74 height: 34px;
59 color: #FFFFFF; 75 color: #ffffff;
60 } 76 }
61 77
62 /deep/.el-submenu__title span { 78 /deep/.el-submenu__title span {
...@@ -88,9 +104,9 @@ export default { ...@@ -88,9 +104,9 @@ export default {
88 104
89 // 导航选中背景色 105 // 导航选中背景色
90 .xuanzhong { 106 .xuanzhong {
91 background: url('~@/image/selNavbar.png') no-repeat; 107 background: url("~@/image/selNavbar.png") no-repeat;
92 background-size: 100% 100%; 108 background-size: 100% 100%;
93 color: #FFFFFF !important; 109 color: #ffffff !important;
94 font-weight: 700; 110 font-weight: 700;
95 } 111 }
96 112
...@@ -110,7 +126,6 @@ export default { ...@@ -110,7 +126,6 @@ export default {
110 @extend .xuanzhong; 126 @extend .xuanzhong;
111 } 127 }
112 128
113
114 .navbar { 129 .navbar {
115 height: $headerHeight; 130 height: $headerHeight;
116 overflow: hidden; 131 overflow: hidden;
...@@ -119,12 +134,12 @@ export default { ...@@ -119,12 +134,12 @@ export default {
119 align-items: center; 134 align-items: center;
120 padding: 0 20px; 135 padding: 0 20px;
121 justify-content: space-between; 136 justify-content: space-between;
122 background: url('~@/image/header.png') no-repeat; 137 background: url("~@/image/header.png") no-repeat;
123 background-size: 100% 100%; 138 background-size: 100% 100%;
124 139
125 .user { 140 .user {
126 font-size: 12px; 141 font-size: 12px;
127 color: #FFFFFF; 142 color: #ffffff;
128 position: absolute; 143 position: absolute;
129 right: 20px; 144 right: 20px;
130 top: 0; 145 top: 0;
...@@ -143,10 +158,9 @@ export default { ...@@ -143,10 +158,9 @@ export default {
143 right: 0; 158 right: 0;
144 margin: 0 auto; 159 margin: 0 auto;
145 font-size: 32px; 160 font-size: 32px;
146 color: #FFFFFF; 161 color: #ffffff;
147 font-weight: 700; 162 font-weight: 700;
148 text-align: center; 163 text-align: center;
149
150 } 164 }
151 165
152 .right-menu { 166 .right-menu {
......
1 <template> 1 <template>
2 <el-menu router :default-active="activeMenu" mode="horizontal"> 2 <el-menu router :default-active="activeMenu" mode="horizontal">
3 <!-- 权限菜单 --> 3 <!-- 权限菜单 -->
4 <sidebar-item v-for="route in permission_routes.slice(1, 4)" :key="route.path" :item="route" 4 <sidebar-item v-for="route in permission_routes.slice(2, 5)" :key="route.path" :item="route"
5 :base-path="route.path" /> 5 :base-path="route.path" />
6 <!-- 菜单全部展示 --> 6 <!-- 菜单全部展示 -->
7 <!-- <sidebar-item v-for="route in asyncRoutes" :key="route.path" :item="route" :base-path="route.path" /> --> 7 <!-- <sidebar-item v-for="route in asyncRoutes" :key="route.path" :item="route" :base-path="route.path" /> -->
......
1 <template> 1 <template>
2 <el-menu router :default-active="activeMenu" mode="horizontal"> 2 <el-menu router :default-active="activeMenu" mode="horizontal">
3 <!-- 权限菜单 --> 3 <!-- 权限菜单 -->
4 <sidebar-item v-for="route in permission_routes.slice(4, 7)" :key="route.path" :item="route" 4 <sidebar-item v-for="route in permission_routes.slice(5, 8)" :key="route.path" :item="route"
5 :base-path="route.path" /> 5 :base-path="route.path" />
6 <!-- 菜单全部展示 --> 6 <!-- 菜单全部展示 -->
7 <!-- <sidebar-item v-for="route in asyncRoutes" :key="route.path" :item="route" :base-path="route.path" /> --> 7 <!-- <sidebar-item v-for="route in asyncRoutes" :key="route.path" :item="route" :base-path="route.path" /> -->
......
1 import router from './router' 1 import router from "./router";
2 import store from './store' 2 import store from "./store";
3 import { getMenuInfo } from '@/api/user' 3 import { getMenuInfo } from "@/api/user";
4 import NProgress from 'nprogress' // progress bar 4 import NProgress from "nprogress"; // progress bar
5 import 'nprogress/nprogress.css' // progress bar style 5 import "nprogress/nprogress.css"; // progress bar style
6 import getPageTitle from '@/utils/get-page-title' 6 import getPageTitle from "@/utils/get-page-title";
7 import Cookies from 'js-cookie' 7 import Cookies from "js-cookie";
8 NProgress.configure({ showSpinner: false }) // NProgress Configuration 8 NProgress.configure({ showSpinner: false }); // NProgress Configuration
9 9
10 router.beforeEach(async (to, from, next) => { 10 router.beforeEach(async (to, from, next) => {
11 NProgress.start() 11 NProgress.start();
12 document.title = getPageTitle(to.meta.title) 12 document.title = getPageTitle(to.meta.title);
13 let hasAddDict = store.state.dict.addDict 13 let hasAddDict = store.state.dict.addDict;
14 let hasAddRoute = store.state.permission.addRoutes 14 let hasAddRoute = store.state.permission.addRoutes;
15 if (!hasAddDict) { 15 if (to.path == "/login") {
16 store.dispatch('dict/generateDic') 16 sessionStorage.removeItem("token");
17 } 17 next();
18 if (hasAddRoute) { 18 } else {
19 next() 19 //判断token是否存在
20 } else { 20 const hasToken = sessionStorage.getItem("token");
21 const { result: getMenuData } = await getMenuInfo() 21 if (hasToken) {
22 const accessRoutes = await store.dispatch('permission/generateRoutes', getMenuData) 22 //加载字典
23 if (!hasAddDict) {
24 store.dispatch("dict/generateDic");
25 }
26 if (hasAddRoute) {
27 next();
28 } else {
29 //请求菜单
30 const { result: getMenuData } = await getMenuInfo() || [];
31 const accessRoutes = await store.dispatch(
32 "permission/generateRoutes",
33 getMenuData
34 );
23 // 获取用户信息 35 // 获取用户信息
24 await store.dispatch('user/getUserInfo') 36 await store.dispatch("user/getUserInfo");
25 router.addRoutes([...accessRoutes, { path: '*', redirect: '/404', hidden: true }]) 37 router.addRoutes([
26 const routeTo = Cookies.get('routerTo') 38 ...accessRoutes,
27 if (routeTo && routeTo !== '/') { 39 { path: "*", redirect: "/404", hidden: true },
28 next({ ...to, replace: true }) 40 ]);
41 const routeTo = Cookies.get("routerTo");
42 if (routeTo && routeTo !== "/") {
43 next({ ...to, replace: true });
29 } else { 44 } else {
30 next('/home') 45 next("/home");
31 } 46 }
47 }
48 } else {
49 next("/login");
32 } 50 }
33 NProgress.done() 51 }
34 }) 52 NProgress.done();
35 router.afterEach(to => { 53 });
36 // 解决刷新页面报404问题 54 router.afterEach((to) => {
37 Cookies.set("routerTo", to.fullPath) 55 // 解决刷新页面报404问题
38 NProgress.done() 56 Cookies.set("routerTo", to.fullPath);
39 }) 57 NProgress.done();
58 });
......
...@@ -20,6 +20,12 @@ export const constantRoutes = [ ...@@ -20,6 +20,12 @@ export const constantRoutes = [
20 } 20 }
21 ] 21 ]
22 }, 22 },
23 //登录
24 {
25 path: "/login",
26 name: "login",
27 component: () => import("@/views/login/index.vue"),
28 },
23 // 监管首页 29 // 监管首页
24 { 30 {
25 path: '/', 31 path: '/',
...@@ -240,7 +246,7 @@ export const asyncRoutes = [ ...@@ -240,7 +246,7 @@ export const asyncRoutes = [
240 meta: { title: '角色管理' } 246 meta: { title: '角色管理' }
241 } 247 }
242 ] 248 ]
243 } 249 },
244 ] 250 ]
245 251
246 const createRouter = () => 252 const createRouter = () =>
......
...@@ -10,8 +10,7 @@ const service = axios.create({ ...@@ -10,8 +10,7 @@ const service = axios.create({
10 baseURL: process.env.VUE_APP_BASE_API, 10 baseURL: process.env.VUE_APP_BASE_API,
11 withCredentials: true, //是否允许跨域 11 withCredentials: true, //是否允许跨域
12 headers: { 12 headers: {
13 'Content-Type': 'application/json; charset=utf-8', 13 'Content-Type': 'application/json; charset=utf-8'
14 'Authorization': 'bearer AT-4-MxSrO29Coe7VTazx8uuixtqqgO-hvCB6'
15 }, 14 },
16 timeout: 15000 15 timeout: 15000
17 }) 16 })
...@@ -19,8 +18,8 @@ const service = axios.create({ ...@@ -19,8 +18,8 @@ const service = axios.create({
19 // request interceptor 18 // request interceptor
20 service.interceptors.request.use( 19 service.interceptors.request.use(
21 config => { 20 config => {
22 config.headers.Authorization = 21 //调用登录接口时无token,也不需要传token,其他接口都传入token
23 'bearer AT-4-MxSrO29Coe7VTazx8uuixtqqgO-hvCB6' 22 config.headers.Authorization = sessionStorage.getItem("token") || "";
24 config.headers.Accept = 'application/json' 23 config.headers.Accept = 'application/json'
25 return config 24 return config
26 }, 25 },
...@@ -70,7 +69,8 @@ function handleErrorData (errMes) { ...@@ -70,7 +69,8 @@ function handleErrorData (errMes) {
70 } else { 69 } else {
71 switch (errMes.code) { 70 switch (errMes.code) {
72 case 401: 71 case 401:
73 Message.error("未授权,请重新登录!"); 72 Message.error("由于长时间未操作,请重新登录!");
73 window.location.href = `http://${window.location.host}`
74 break; 74 break;
75 case 403: 75 case 403:
76 Message.error("拒绝访问"); 76 Message.error("拒绝访问");
......
1 <template>
2 <div class="bg">
3 <div class="login-inner-bg login">
4 <div class="user_style">
5 <el-form
6 :model="user"
7 :rules="rules"
8 ref="user"
9 id="loginform"
10 class="demo-ruleForm"
11 >
12 <el-form-item prop="account">
13 <el-input v-model="user.account" placeholder="用户名"></el-input>
14 </el-form-item>
15 <el-form-item prop="password">
16 <el-input
17 type="password"
18 v-model="user.password"
19 placeholder="登录密码"
20 ></el-input>
21 </el-form-item>
22 <el-form-item>
23 <el-checkbox
24 label="记住用户名"
25 @change="checkUserName"
26 ></el-checkbox>
27 </el-form-item>
28 <el-form-item id="login">
29 <el-button type="primary" style="width: 100%" @click="login('user')"
30 >登录</el-button
31 >
32 </el-form-item>
33 </el-form>
34 </div>
35 </div>
36 </div>
37 </template>
38
39 <script>
40 import { loginIn } from "@/api/login.js";
41 export default {
42 name: "Login",
43 data: function () {
44 return {
45 user: {
46 account: "",
47 password: "",
48 checkStatus: false,
49 },
50 rules: {
51 account: [{ required: true, message: "请填写帐号", trigger: "blur" }],
52 password: [{ required: true, message: "请填写密码", trigger: "blur" }],
53 },
54 };
55 },
56 mounted: function () {
57 // this.checkUserName();
58 },
59 methods: {
60 //记住用户名
61 checkUserName: function (flag) {
62 this.user.checkStatus = flag;
63 if (this.user.checkStatus) {
64 localStorage.setItem("accountId", this.user.account);
65 let name = localStorage.getItem("accountId");
66 if (name === "") {
67 return;
68 } else {
69 this.user.account = name;
70 }
71 } else {
72 this.user.account = localStorage.getItem("accountId");
73 }
74 },
75 login(user) {
76 var self = this;
77 this.$refs[user].validate((valid) => {
78 if (valid) {
79 loginIn(self.user.account, self.user.password)
80 .then((res) => {
81 if (res.status === 1) {
82 sessionStorage.setItem("token", `Bearer ${res.content}`);
83 this.$router.push('/');
84 } else {
85 alert(res.message);
86 }
87 })
88 .catch((error) => {
89 // console.dir(error);
90 });
91 }
92 });
93 },
94 },
95 components: {},
96 };
97 </script>
98 <style scoped>
99 .bg {
100 width: 100%;
101 height: 100%;
102 background: url(../../image/bg.png) no-repeat;
103 background-size: 100% 100%;
104 overflow: hidden;
105 }
106
107 .login-inner-bg {
108 background: url(../../image/loginInnerBg.png) no-repeat;
109 width: 393px;
110 height: 348px;
111 margin: 35vh auto 0;
112 overflow: hidden;
113 }
114
115 .login .user_style {
116 margin: 90px 20px 0;
117 }
118
119 .login .btn {
120 width: 100%;
121 height: 6vh;
122 background-color: #00c2de;
123 border-radius: 5px;
124 font-size: 1.4vw;
125 color: #ffffff;
126 }
127
128 .login .btn:hover {
129 cursor: pointer;
130 background-color: #2d8cf0;
131 }
132
133 #loginform .el-button {
134 background: #409eff !important;
135 color: #ffffff !important;
136 }
137
138 #loginform .el-button:hover {
139 cursor: pointer !important;
140 background-color: #2d8cf0 !important;
141 }
142 </style>
143 <style>
144 .inputUser .ivu-input {
145 padding: 6px 24px !important;
146 border: 1px solid #9f9f9f !important;
147 }
148
149 #loginform .el-input__inner {
150 width: 100% !important;
151 caret-color: #000 !important;
152 color: #606266 !important;
153 border-radius: 4px !important;
154 border: 1px solid #67c23a !important;
155 background: #fff !important;
156 opacity: 1 !important;
157 }
158
159 #loginform .el-input__inner::-webkit-input-placeholder {
160 /* WebKit browsers */
161 color: #80807f !important;
162 }
163 .el-checkbox__label {
164 color: #fff;
165 }
166 </style>
...@@ -286,6 +286,7 @@ export default { ...@@ -286,6 +286,7 @@ export default {
286 handleMinus (index, row) { 286 handleMinus (index, row) {
287 removeTreeListItem(this.tableData, row.dictid, 'dictid'); 287 removeTreeListItem(this.tableData, row.dictid, 'dictid');
288 this.tableData = judgeSort(this.tableData) 288 this.tableData = judgeSort(this.tableData)
289 this.key++;
289 }, 290 },
290 handleSubmit () { 291 handleSubmit () {
291 editDictNode({ 292 editDictNode({
......
...@@ -96,7 +96,7 @@ export default { ...@@ -96,7 +96,7 @@ export default {
96 ], 96 ],
97 telephone: [ 97 telephone: [
98 { 98 {
99 pattern: /^((d{3,4})|d{3,4}-|s)?d{7,14}$/, 99 pattern: /\d{3}-\d{8}|\d{4}-\d{7}/,
100 message: "办公电话格式有误", 100 message: "办公电话格式有误",
101 trigger: "blur", 101 trigger: "blur",
102 }, 102 },
......