Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
M
mineTools
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
zhanglw
mineTools
Commits
1ea73e42
Commit
1ea73e42
authored
Sep 26, 2023
by
zhanglw
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
路由控制
parent
14a7192f
Changes
9
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
315 additions
and
642 deletions
+315
-642
common.js
src/api/common.js
+4
-621
index.js
src/components/Dict/index.js
+3
-0
index.js
src/router/index.js
+26
-6
routers.js
src/router/routers.js
+14
-1
add.vue
src/views/backstage/appletMgt/applet/add.vue
+5
-0
index.vue
src/views/backstage/appletMgt/applet/index.vue
+3
-3
index.vue
src/views/homepage/index.vue
+36
-0
login.vue
src/views/homepage/login.vue
+214
-0
login.vue
src/views/login.vue
+10
-11
No files found.
src/api/common.js
View file @
1ea73e42
This diff is collapsed.
Click to expand it.
src/components/Dict/index.js
View file @
1ea73e42
...
...
@@ -19,6 +19,9 @@ const install = function(Vue) {
new
Dict
(
this
.
dict
).
init
(
this
.
$options
.
dicts
,
()
=>
{
this
.
$nextTick
(()
=>
{
this
.
$emit
(
'
dictReady
'
)
if
(
this
.
$options
.
methods
&&
this
.
$options
.
methods
.
onDictReady
instanceof
Function
)
{
this
.
$options
.
methods
.
onDictReady
.
call
(
this
,
this
.
dict
)
}
})
})
}
...
...
src/router/index.js
View file @
1ea73e42
...
...
@@ -9,7 +9,8 @@ import { filterAsyncRouter } from '@/store/modules/permission'
NProgress
.
configure
({
showSpinner
:
false
})
// NProgress Configuration
const
whiteList
=
[
'
/login
'
]
// no redirect whitelist
const
whiteList
=
[
'
/login
'
,
'
/backlogin
'
,
'
/home
'
]
// 免登录路由白名单
const
backUrlList
=
[
'
/dashboard
'
,
'
/system
'
,
'
/monitor
'
,
'
/sys-tools
'
,
'
/backstage
'
]
// 后台路由
router
.
beforeEach
((
to
,
from
,
next
)
=>
{
if
(
to
.
meta
.
title
)
{
...
...
@@ -17,9 +18,14 @@ router.beforeEach((to, from, next) => {
}
NProgress
.
start
()
if
(
getToken
())
{
// 已登录且要跳转的页面是登录页
if
(
to
.
path
===
'
/login
'
)
{
next
({
path
:
'
/
'
})
if
(
to
.
path
===
'
/
'
)
{
// 根路由重定向到前台home页
next
(
'
/home
'
)
NProgress
.
done
()
}
else
if
(
to
.
path
===
'
/login
'
)
{
// 已登录且要跳转的页面是登录页
next
({
path
:
'
/home
'
})
NProgress
.
done
()
}
else
if
(
to
.
path
===
'
/backlogin
'
)
{
// 已登录且要跳转的页面是后台登录页
next
({
path
:
'
/backstage/dashboard
'
})
NProgress
.
done
()
}
else
{
if
(
store
.
getters
.
roles
.
length
===
0
)
{
// 判断当前用户是否已拉取完user_info信息
...
...
@@ -31,7 +37,7 @@ router.beforeEach((to, from, next) => {
location
.
reload
()
// 为了重新实例化vue-router对象 避免bug
})
})
// 登录时未拉取 菜单,在此处拉取
// 登录时未拉取 菜单,在此处拉取
}
else
if
(
store
.
getters
.
loadMenus
)
{
// 修改成false,防止死循环
store
.
dispatch
(
'
updateLoadMenus
'
)
...
...
@@ -41,9 +47,23 @@ router.beforeEach((to, from, next) => {
}
}
}
else
{
const
findUrl
=
(
urlList
,
path
)
=>
{
let
flag
=
false
urlList
.
forEach
(
url
=>
{
if
(
path
.
indexOf
(
url
)
!==
-
1
)
{
flag
=
true
}
})
return
flag
}
/* has no token*/
if
(
whiteList
.
indexOf
(
to
.
path
)
!==
-
1
)
{
// 在免登录白名单,直接进入
if
(
to
.
path
===
'
/
'
)
{
// 根路由重定向到前台home页
next
(
'
/home
'
)
}
else
if
(
findUrl
(
whiteList
,
to
.
path
))
{
// 在免登录白名单,直接进入
next
()
}
else
if
(
findUrl
(
backUrlList
,
to
.
path
))
{
// 后台路由重定向到后台登录
next
(
`/backlogin?redirect=
${
to
.
fullPath
}
`
)
NProgress
.
done
()
}
else
{
next
(
`/login?redirect=
${
to
.
fullPath
}
`
)
// 否则全部重定向到登录页
NProgress
.
done
()
...
...
src/router/routers.js
View file @
1ea73e42
...
...
@@ -7,6 +7,11 @@ Vue.use(Router)
export
const
constantRouterMap
=
[
{
path
:
'
/login
'
,
meta
:
{
title
:
'
登录
'
,
noCache
:
true
},
component
:
(
resolve
)
=>
require
([
'
@/views/homepage/login
'
],
resolve
),
hidden
:
true
},
{
path
:
'
/backlogin
'
,
meta
:
{
title
:
'
后台登录
'
,
noCache
:
true
},
component
:
(
resolve
)
=>
require
([
'
@/views/login
'
],
resolve
),
hidden
:
true
},
...
...
@@ -32,7 +37,15 @@ export const constantRouterMap = [
]
},
{
path
:
'
/
'
,
path
:
'
/home
'
,
meta
:
{
title
:
'
首页
'
,
noCache
:
true
},
component
:
(
resolve
)
=>
{
return
require
([
'
@/views/homepage/index
'
],
resolve
)
},
hidden
:
true
},
{
path
:
'
/backstage
'
,
component
:
Layout
,
redirect
:
'
/dashboard
'
,
children
:
[
...
...
src/views/backstage/appletMgt/applet/add.vue
View file @
1ea73e42
...
...
@@ -45,6 +45,11 @@
<el-input
v-model=
"formData.contentAbstract"
type=
"textarea"
placeholder=
"请输入文本"
maxlength=
"300"
:autosize=
"
{ minRows: 4, maxRows: 4}" show-word-limit resize="none" class="cell-input" />
</div>
</el-form-item>
<el-form-item
label=
"web页面地址:"
class=
"form-cell"
prop=
"title"
>
<div
class=
"cell-box"
>
<el-input
v-model=
"formData.title"
placeholder=
"单行输入"
class=
"cell-input"
/>
</div>
</el-form-item>
<el-form-item
label=
"上传软件工具:"
class=
"form-cell"
>
<div
class=
"cell-box"
>
<el-upload
...
...
src/views/backstage/appletMgt/applet/index.vue
View file @
1ea73e42
...
...
@@ -91,13 +91,13 @@ export default {
Object
.
keys
(
this
.
query
).
length
!==
0
&&
Object
.
keys
(
this
.
query
).
forEach
(
item
=>
{
if
(
this
.
query
[
item
]
===
null
||
this
.
query
[
item
]
===
''
)
this
.
query
[
item
]
=
undefined
})
HttpReq
.
backstageApi
.
queryProduct
({
HttpReq
.
backstageApi
.
getApp
({
page
:
this
.
page
-
1
,
pageSize
:
this
.
pageSize
,
...
this
.
query
}).
then
((
res
)
=>
{
this
.
tableData
=
res
.
data
.
data
this
.
total
=
res
.
data
.
total
//
this.tableData = res.data.data
//
this.total = res.data.total
})
},
batchOperate
(
type
,
row
)
{
...
...
src/views/homepage/index.vue
0 → 100644
View file @
1ea73e42
<
template
>
<div
class=
"page-body"
>
前台-首页-占位
</div>
</
template
>
<
script
>
export
default
{
components
:
{
},
dicts
:
[],
data
()
{
return
{
imgSrcStart
:
process
.
env
.
VUE_APP_BASE_API
,
query
:
{},
throttle
:
null
,
// 节流器
throttleTime
:
300
}
},
mounted
()
{
this
.
$nextTick
(()
=>
{
})
},
methods
:
{
onDictReady
(
dict
)
{
}
}
}
</
script
>
<
style
rel=
"stylesheet/scss"
lang=
"scss"
scoped
>
.touch
{
cursor
:pointer
;
}
.clear
{
clear
:
both
}
</
style
>
src/views/homepage/login.vue
0 → 100644
View file @
1ea73e42
<
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
v-if=
"$store.state.settings.caseNumber"
>
⋅
</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
{
getCodeImg
}
from
'
@/api/login
'
import
Cookies
from
'
js-cookie
'
import
qs
from
'
qs
'
import
Background
from
'
@/assets/images/background.webp
'
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
)
{
const
data
=
route
.
query
if
(
data
&&
data
.
redirect
)
{
this
.
redirect
=
data
.
redirect
delete
data
.
redirect
if
(
JSON
.
stringify
(
data
)
!==
'
{}
'
)
{
this
.
redirect
=
this
.
redirect
+
'
&
'
+
qs
.
stringify
(
data
,
{
indices
:
false
})
}
}
},
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
})
},
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
}
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
(
'
error submit!!
'
)
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
>
src/views/login.vue
View file @
1ea73e42
...
...
@@ -14,14 +14,14 @@
<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-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>
...
...
@@ -56,7 +56,7 @@ export default {
codeUrl
:
''
,
cookiePass
:
''
,
loginForm
:
{
username
:
'
admin
'
,
username
:
'
18888888888
'
,
password
:
'
123456
'
,
rememberMe
:
false
,
code
:
''
,
...
...
@@ -64,8 +64,7 @@ export default {
},
loginRules
:
{
username
:
[{
required
:
true
,
trigger
:
'
blur
'
,
message
:
'
用户名不能为空
'
}],
password
:
[{
required
:
true
,
trigger
:
'
blur
'
,
message
:
'
密码不能为空
'
}],
code
:
[{
required
:
true
,
trigger
:
'
change
'
,
message
:
'
验证码不能为空
'
}]
password
:
[{
required
:
true
,
trigger
:
'
blur
'
,
message
:
'
密码不能为空
'
}]
},
loading
:
false
,
redirect
:
undefined
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment