刘力
3 years ago
12 changed files with 2359 additions and 381 deletions
-
2280package-lock.json
-
7package.json
-
1src/App.vue
-
38src/api/login.js
-
9src/main.js
-
48src/router/index.js
-
13src/router/routers.js
-
23src/store/getters.js
-
23src/store/index.js
-
2src/utils/request.js
-
13src/view/Main.vue
-
239src/view/login.vue
2280
package-lock.json
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -1,19 +1,39 @@ |
|||||
import Vue from 'vue' |
|
||||
import Router from 'vue-router' |
|
||||
import Main from '../view/Main' |
|
||||
import Login from '../view/Login' |
|
||||
|
import router from './routers' |
||||
|
import store from '@/store' |
||||
|
import Config from '@/settings' |
||||
|
//导入进度条
|
||||
|
import NProgress from 'nprogress' |
||||
|
import 'nprogress/nprogress.css' |
||||
|
import { |
||||
|
getToken |
||||
|
} from '@/utils/auth' |
||||
|
// import {
|
||||
|
// filterAsyncRouter
|
||||
|
// } from '@/store/modules/permission'
|
||||
|
|
||||
|
|
||||
Vue.use(Router) |
|
||||
|
|
||||
export default new Router({ |
|
||||
routes: [ |
|
||||
{ |
|
||||
path: '/main', |
|
||||
component: Main |
|
||||
},{ |
|
||||
path:'/login', |
|
||||
component: Login |
|
||||
|
NProgress.configure({ |
||||
|
showSpinner: false |
||||
|
}) |
||||
|
|
||||
|
//重新定向白名单
|
||||
|
const whiteList = ['/login'] |
||||
|
|
||||
|
//路由守卫,路由跳转前执行钩子函数
|
||||
|
//to:目标路由对象
|
||||
|
//from:即将要离开的路由对象
|
||||
|
//next:执行效果依赖
|
||||
|
router.beforeEach((to, from, next) => { |
||||
|
//如果路由标题设置则显示配置标题和目标菜单标题
|
||||
|
if (to.meta.title) { |
||||
|
document.title = to.meta.title + '-' + Config.title |
||||
} |
} |
||||
] |
|
||||
|
NProgress.start() |
||||
|
next(`/login?redirect=${to.fullPath}`) |
||||
|
NProgress.done() |
||||
|
}) |
||||
|
|
||||
|
router.afterEach(()=>{ |
||||
|
NProgress.done() |
||||
}) |
}) |
@ -1,4 +1,27 @@ |
|||||
const getters = { |
const getters = { |
||||
|
|
||||
|
deployUploadApi: state => state.api.deployUploadApi, |
||||
|
databaseUploadApi: state => state.api.databaseUploadApi, |
||||
|
size: state => state.app.size, |
||||
|
sidebar: state => state.app.sidebar, |
||||
|
device: state => state.app.device, |
||||
|
token: state => state.user.token, |
||||
|
visitedViews: state => state.tagsView.visitedViews, |
||||
|
cachedViews: state => state.tagsView.cachedViews, |
||||
|
roles: state => state.user.roles, |
||||
|
user: state => state.user.user, |
||||
|
loadMenus: state => state.user.loadMenus, |
||||
|
permission_routers: state => state.permission.routers, |
||||
|
addRouters: state => state.permission.addRouters, |
||||
|
socketApi: state => state.api.socketApi, |
||||
|
imagesUploadApi: state => state.api.imagesUploadApi, |
||||
|
baseApi: state => state.api.baseApi, |
||||
|
fileUploadApi: state => state.api.fileUploadApi, |
||||
|
updateAvatarApi: state => state.api.updateAvatarApi, |
||||
|
qiNiuUploadApi: state => state.api.qiNiuUploadApi, |
||||
|
sqlApi: state => state.api.sqlApi, |
||||
|
swaggerApi: state => state.api.swaggerApi, |
||||
|
sidebarRouters: state => state.permission.sidebarRouters |
||||
|
|
||||
} |
} |
||||
export default getters |
export default getters |
@ -1,3 +1,26 @@ |
|||||
import Vue from "vue" |
import Vue from "vue" |
||||
import Vuex from 'vuex' |
import Vuex from 'vuex' |
||||
import getters from './getters' |
import getters from './getters' |
||||
|
|
||||
|
Vue.use(Vuex) |
||||
|
|
||||
|
//实现自动导入模块
|
||||
|
const modulesFiles = require.context('./modules', true, /\.js$/) |
||||
|
|
||||
|
|
||||
|
const modules = modulesFiles.keys().reduce((modules, modulePath) => { |
||||
|
|
||||
|
//获取上级目录modules的 所有后缀名为 .js的文件
|
||||
|
const moduleName = modulePath.replace(/^\.\/(.*)\.\w+$/, '$1') |
||||
|
const value = modulesFiles(modulePath) |
||||
|
modules[moduleName] = value.default |
||||
|
return modules |
||||
|
}, {}) |
||||
|
|
||||
|
|
||||
|
const store = new Vuex.Store({ |
||||
|
modules, |
||||
|
getters |
||||
|
}) |
||||
|
|
||||
|
export default store |
@ -1,13 +0,0 @@ |
|||||
<template> |
|
||||
<h1>首页</h1> |
|
||||
</template> |
|
||||
|
|
||||
<script> |
|
||||
export default { |
|
||||
name:"Main" |
|
||||
} |
|
||||
</script> |
|
||||
|
|
||||
<style> |
|
||||
|
|
||||
</style> |
|
@ -1,239 +0,0 @@ |
|||||
<template> |
|
||||
<div class="login" :style="'background-image:url('+ Background +');'"> |
|
||||
<el-form ref="loginForm" :model="loginForm" :rules="loginRules" label-position="left" label-width="0px" class="login-form"> |
|
||||
<h3 class="title"> |
|
||||
阅行客后台管理系统 |
|
||||
</h3> |
|
||||
<el-form-item prop="username"> |
|
||||
<el-input v-model="loginForm.username" type="text" auto-complete="off" placeholder="账号"> |
|
||||
<svg-icon slot="prefix" icon-class="user" class="el-input__icon input-icon" /> |
|
||||
</el-input> |
|
||||
</el-form-item> |
|
||||
<el-form-item prop="password"> |
|
||||
<el-input v-model="loginForm.password" type="password" auto-complete="off" placeholder="密码" @keyup.enter.native="handleLogin"> |
|
||||
<svg-icon slot="prefix" icon-class="password" class="el-input__icon input-icon" /> |
|
||||
</el-input> |
|
||||
</el-form-item> |
|
||||
<el-form-item prop="code"> |
|
||||
<el-input v-model="loginForm.code" auto-complete="off" placeholder="验证码" style="width: 63%" @keyup.enter.native="handleLogin"> |
|
||||
<svg-icon slot="prefix" icon-class="validCode" class="el-input__icon input-icon" /> |
|
||||
</el-input> |
|
||||
<div class="login-code"> |
|
||||
<img :src="codeUrl" @click="getCode"> |
|
||||
</div> |
|
||||
</el-form-item> |
|
||||
<el-checkbox v-model="loginForm.rememberMe" style="margin:0 0 25px 0;"> |
|
||||
记住我 |
|
||||
</el-checkbox> |
|
||||
<el-form-item style="width:100%;"> |
|
||||
<el-button :loading="loading" size="medium" type="primary" style="width:100%;" @click.native.prevent="handleLogin"> |
|
||||
<span v-if="!loading">登 录</span> |
|
||||
<span v-else>登 录 中...</span> |
|
||||
</el-button> |
|
||||
</el-form-item> |
|
||||
</el-form> |
|
||||
<!-- 底部 --> |
|
||||
<div v-if="$store.state.settings.showFooter" id="el-login-footer"> |
|
||||
<span v-html="$store.state.settings.footerTxt" /> |
|
||||
<span> ⋅ </span> |
|
||||
<a href="https://beian.miit.gov.cn/#/Integrated/index" target="_blank">{{ $store.state.settings.caseNumber }}</a> |
|
||||
</div> |
|
||||
</div> |
|
||||
</template> |
|
||||
|
|
||||
<script> |
|
||||
import { encrypt } from "@/utils/rsaEncrypt"; |
|
||||
import Config from "@/settings"; |
|
||||
import Cookies from "js-cookie"; |
|
||||
import Background from "@/assets/images/background.jpg"; |
|
||||
|
|
||||
export default { |
|
||||
//输出模块名称 |
|
||||
name: "Login", |
|
||||
data() { |
|
||||
return { |
|
||||
//背景图 |
|
||||
Background: Background, |
|
||||
//登录验证码 |
|
||||
codeUrl: "", |
|
||||
//通行证 |
|
||||
cookiePass: "", |
|
||||
//默认登录信息--测试用 |
|
||||
loginForm: { |
|
||||
username: "admin", |
|
||||
password: "123456", |
|
||||
rememberMe: false, |
|
||||
code: "", |
|
||||
uuid: "", |
|
||||
}, |
|
||||
//登录规则 |
|
||||
loginRules: { |
|
||||
username: [ |
|
||||
{ required: true, trigger: "blur", message: "用户名不能为空" }, |
|
||||
], |
|
||||
password: [ |
|
||||
{ required: true, trigger: "blur", message: "密码不能为空" }, |
|
||||
], |
|
||||
code: [ |
|
||||
{ required: true, trigger: "change", message: "验证码不能为空" }, |
|
||||
], |
|
||||
}, |
|
||||
//加载状态是否显示 |
|
||||
loading: false, |
|
||||
//跳转定向 |
|
||||
redirect: undefined, |
|
||||
}; |
|
||||
}, |
|
||||
watch: { |
|
||||
//监听路由变化 |
|
||||
$route: { |
|
||||
handler: function (route) { |
|
||||
this.redirect = route.query && route.query.redirect; |
|
||||
}, |
|
||||
//立即执行handler |
|
||||
immediate: true, |
|
||||
}, |
|
||||
}, |
|
||||
// 使用钩子初始化获取信息 |
|
||||
created() { |
|
||||
//获取验证码 |
|
||||
this.getCode(); |
|
||||
//获取用户名密码等 Cookie |
|
||||
this.getCookie(); |
|
||||
// token过期提示 |
|
||||
this.point(); |
|
||||
}, |
|
||||
methods: { |
|
||||
//获取验证码方法 |
|
||||
getCode() { |
|
||||
getCodeImg().then((res) => { |
|
||||
this.codeUrl = res.img; |
|
||||
this.loginForm.uuid = res.uuid; |
|
||||
}); |
|
||||
}, |
|
||||
//获取Cookie |
|
||||
getCookie() { |
|
||||
const username = Cookies.get("username"); |
|
||||
let password = Cookies.get("password"); |
|
||||
const rememberMe = Cookies.get("rememberMe"); |
|
||||
// 保存cookie里面的加密后的密码 |
|
||||
this.cookiePass = password === undefined ? "" : password; |
|
||||
password = password === undefined ? this.loginForm.password : password; |
|
||||
this.loginForm = { |
|
||||
username: username === undefined ? this.loginForm.username : username, |
|
||||
password: password, |
|
||||
rememberMe: rememberMe === undefined ? false : Boolean(rememberMe), |
|
||||
code: "", |
|
||||
}; |
|
||||
}, |
|
||||
handleLogin() { |
|
||||
this.$refs.loginForm.validate((valid) => { |
|
||||
// 获取登录信息 |
|
||||
const user = { |
|
||||
username: this.loginForm.username, |
|
||||
password: this.loginForm.password, |
|
||||
rememberMe: this.loginForm.rememberMe, |
|
||||
code: this.loginForm.code, |
|
||||
uuid: this.loginForm.uuid, |
|
||||
}; |
|
||||
//如果cookie通行证不匹配 |
|
||||
if (user.password !== this.cookiePass) { |
|
||||
//把密码进行加密处理 |
|
||||
user.password = encrypt(user.password); |
|
||||
} |
|
||||
if (valid) { |
|
||||
this.loading = true; |
|
||||
if (user.rememberMe) { |
|
||||
Cookies.set("username", user.username, { |
|
||||
expires: Config.passCookieExpires, |
|
||||
}); |
|
||||
Cookies.set("password", user.password, { |
|
||||
expires: Config.passCookieExpires, |
|
||||
}); |
|
||||
Cookies.set("rememberMe", user.rememberMe, { |
|
||||
expires: Config.passCookieExpires, |
|
||||
}); |
|
||||
} else { |
|
||||
Cookies.remove("username"); |
|
||||
Cookies.remove("password"); |
|
||||
Cookies.remove("rememberMe"); |
|
||||
} |
|
||||
this.$store |
|
||||
.dispatch("Login", user) |
|
||||
.then(() => { |
|
||||
this.loading = false; |
|
||||
this.$router.push({ path: this.redirect || "/" }); |
|
||||
}) |
|
||||
.catch(() => { |
|
||||
this.loading = false; |
|
||||
this.getCode(); |
|
||||
}); |
|
||||
} else { |
|
||||
console.log("提交错误!!"); |
|
||||
return false; |
|
||||
} |
|
||||
}); |
|
||||
}, |
|
||||
point() { |
|
||||
const point = Cookies.get("point") !== undefined; |
|
||||
if (point) { |
|
||||
this.$notify({ |
|
||||
title: "提示", |
|
||||
message: "当前登录状态已过期,请重新登录!", |
|
||||
type: "warning", |
|
||||
duration: 5000, |
|
||||
}); |
|
||||
Cookies.remove("point"); |
|
||||
} |
|
||||
}, |
|
||||
}, |
|
||||
}; |
|
||||
</script> |
|
||||
|
|
||||
<style rel="stylesheet/scss" lang="scss"> |
|
||||
.login { |
|
||||
display: flex; |
|
||||
justify-content: center; |
|
||||
align-items: center; |
|
||||
height: 100%; |
|
||||
background-size: cover; |
|
||||
} |
|
||||
.title { |
|
||||
margin: 0 auto 30px auto; |
|
||||
text-align: center; |
|
||||
color: #707070; |
|
||||
} |
|
||||
|
|
||||
.login-form { |
|
||||
border-radius: 6px; |
|
||||
background: #ffffff; |
|
||||
width: 385px; |
|
||||
padding: 25px 25px 5px 25px; |
|
||||
.el-input { |
|
||||
height: 38px; |
|
||||
input { |
|
||||
height: 38px; |
|
||||
} |
|
||||
} |
|
||||
.input-icon { |
|
||||
height: 39px; |
|
||||
width: 14px; |
|
||||
margin-left: 2px; |
|
||||
} |
|
||||
} |
|
||||
.login-tip { |
|
||||
font-size: 13px; |
|
||||
text-align: center; |
|
||||
color: #bfbfbf; |
|
||||
} |
|
||||
.login-code { |
|
||||
width: 33%; |
|
||||
display: inline-block; |
|
||||
height: 38px; |
|
||||
float: right; |
|
||||
img { |
|
||||
cursor: pointer; |
|
||||
vertical-align: middle; |
|
||||
} |
|
||||
} |
|
||||
</style> |
|
Write
Preview
Loading…
Cancel
Save
Reference in new issue