Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
P
portalhtml
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
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
rex
portalhtml
Commits
d0c6244a
Commit
d0c6244a
authored
Oct 18, 2021
by
jiangqihao
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
权限管理菜单
parent
ee984843
Changes
11
Show whitespace changes
Inline
Side-by-side
Showing
11 changed files
with
287 additions
and
63 deletions
+287
-63
account.js
src/api/account.js
+2
-1
permission.js
src/permission.js
+12
-27
customers.js
src/router/modules/customers.js
+4
-4
models.js
src/router/modules/models.js
+5
-5
permission.js
src/store/modules/permission.js
+51
-15
constant.js
src/views/customers/customers-add/constant.js
+191
-0
index.vue
src/views/customers/customers-add/index.vue
+6
-3
area.vue
src/views/customers/customers-details/area.vue
+4
-2
index.vue
src/views/customers/customers-details/index.vue
+4
-2
province.vue
src/views/customers/customers-details/province.vue
+4
-2
index.vue
src/views/login/index.vue
+4
-2
No files found.
src/api/account.js
View file @
d0c6244a
...
...
@@ -14,5 +14,6 @@ export const role = {
searchUrl
:
'/roleToMenu/search'
,
detailUrl
:
'/roleToMenu/getOne'
,
updateUrl
:
'/roleToMenu/update'
,
deleteUrl
:
'/roleToMenu/delete'
deleteUrl
:
'/roleToMenu/delete'
,
searchOneUrl
:
'/roleToMenu/searchOne'
,
}
src/permission.js
View file @
d0c6244a
/*
* @Descripttion:
* @Author: 薛泽展
* @Date: 2021-10-12 12:29:05
* @Since: JDK1.8
*/
import
router
from
'./router'
import
store
from
'./store'
import
{
Message
}
from
'element-ui'
...
...
@@ -14,9 +8,9 @@ import getPageTitle from '@/utils/get-page-title'
NProgress
.
configure
({
showSpinner
:
false
})
// NProgress Configuration
const
whiteList
=
[
'/
prov-register'
,
'/city-register'
,
'/prov-progress'
,
'/city-progress'
,
'/
login'
,
'/auth-redirect'
]
// no redirect whitelist
const
whiteList
=
[
'/login'
,
'/auth-redirect'
]
// no redirect whitelist
router
.
beforeEach
(
async
(
to
,
from
,
next
)
=>
{
router
.
beforeEach
(
async
(
to
,
from
,
next
)
=>
{
// start progress bar
NProgress
.
start
()
// set page title
...
...
@@ -34,7 +28,6 @@ router.beforeEach(async(to, from, next) => {
// determine whether the user has obtained his permission roles through getInfo
const
hasRoles
=
store
.
getters
.
roles
&&
store
.
getters
.
roles
.
length
>
0
if
(
hasRoles
)
{
console
.
log
(
to
)
store
.
commit
(
'permission/SET_CURRENTTOPNAVPATH'
,
to
.
matched
[
0
].
path
)
const
routes
=
store
.
getters
.
permission_routes
routes
.
forEach
(
route
=>
{
...
...
@@ -47,10 +40,12 @@ router.beforeEach(async(to, from, next) => {
try
{
// get user info
// note: roles must be a object array! such as: ['admin'] or ,['developer','editor']
const
{
roles
}
=
await
store
.
dispatch
(
'user/getInfo'
)
const
{
ExtRoleCode_SDK
}
=
await
store
.
dispatch
(
'user/getInfo'
)
// generate accessible routes map based on roles
const
accessRoutes
=
await
store
.
dispatch
(
'permission/generateRoutes'
,
roles
)
// 获取按钮权限
await
store
.
dispatch
(
'permission/getPermissions'
,
ExtRoleCode_SDK
)
// 获取路由权限
const
accessRoutes
=
await
store
.
dispatch
(
'permission/generateRoutes'
)
// dynamically add accessible routes
router
.
addRoutes
(
accessRoutes
)
...
...
@@ -62,32 +57,22 @@ router.beforeEach(async(to, from, next) => {
// remove token and go to login page to re-login
await
store
.
dispatch
(
'user/resetToken'
)
Message
.
error
(
error
||
'Has Error'
)
next
(
`/login?redirect=
${
to
.
p
ath
}
`
)
next
(
`/login?redirect=
${
to
.
fullP
ath
}
`
)
NProgress
.
done
()
}
}
}
}
else
{
/* has no token*/
console
.
info
(
'=========================111'
+
to
.
path
)
if
(
whiteList
.
indexOf
(
to
.
path
)
!==
-
1
)
{
// in the free login whitelist, go directly
console
.
info
(
'=========================2222'
)
next
()
}
else
{
console
.
info
(
'=========================3333'
)
// other pages that do not have permission to access are redirected to the login page.
if
(
to
.
path
===
'/city-register'
)
{
next
({
path
:
'/city-register'
})
}
else
if
(
to
.
path
===
'/prov-register'
)
{
next
({
path
:
'/prov-register'
})
}
else
{
next
(
`/login?redirect=
${
to
.
path
}
`
)
next
(
`/login?redirect=
${
to
.
fullPath
}
`
)
NProgress
.
done
()
}
// next(`/login?redirect=${to.path}`)
// NProgress.done()
}
}
})
...
...
src/router/modules/customers.js
View file @
d0c6244a
...
...
@@ -64,19 +64,19 @@ const customersRouter = {
{
path
:
'/Provincial-agentList'
,
component
:
()
=>
import
(
'@/views/customers/provincial-agentList'
),
name
:
'
ProvincialAgentList
'
,
name
:
'
CustomersProvince
'
,
meta
:
{
title
:
'省级代理商'
}
},
{
path
:
'/Municipal-agentList'
,
component
:
()
=>
import
(
'@/views/customers/municipal-agentList'
),
name
:
'
MunicipalAgentList
'
,
name
:
'
CustomersCity
'
,
meta
:
{
title
:
'城市代理商'
}
},
{
path
:
'/potential'
,
component
:
()
=>
import
(
'@/views/customers/potential-customers'
),
name
:
'
PotentialCustomer
s'
,
name
:
'
CustomersProces
s'
,
meta
:
{
title
:
'potentialCustomers'
}
},
{
...
...
@@ -88,7 +88,7 @@ const customersRouter = {
},
{
path
:
'/Personal-customers'
,
component
:
()
=>
import
(
'@/views/customers/personal-customers'
),
name
:
'
PersonalCustomers
'
,
name
:
'
CustomersMessage
'
,
meta
:
{
title
:
'代理商信息'
}
},
// {
...
...
src/router/modules/models.js
View file @
d0c6244a
...
...
@@ -6,7 +6,7 @@ const modelsRouter = {
path
:
'/models'
,
component
:
Layout
,
redirect
:
'/models/potential'
,
name
:
'
Model
s'
,
name
:
'
Template
s'
,
meta
:
{
topTitle
:
'模板'
,
title
:
'模板管理'
,
...
...
@@ -16,25 +16,25 @@ const modelsRouter = {
{
path
:
'total'
,
component
:
()
=>
import
(
'@/views/models/total-models'
),
name
:
'T
otalModels
'
,
name
:
'T
emplatesOverview
'
,
meta
:
{
title
:
'总代模板'
}
},
{
path
:
'prov'
,
component
:
()
=>
import
(
'@/views/models/prov-models'
),
name
:
'
ProvModels
'
,
name
:
'
TemplatesProvince
'
,
meta
:
{
title
:
'省代模板'
}
},
{
path
:
'city'
,
component
:
()
=>
import
(
'@/views/models/city-models'
),
name
:
'
CityModels
'
,
name
:
'
TemplatesCity
'
,
meta
:
{
title
:
'城市模板'
}
},
{
path
:
'all'
,
component
:
()
=>
import
(
'@/views/models/all-models'
),
name
:
'
AllModels
'
,
name
:
'
TemplatesAll
'
,
meta
:
{
title
:
'模板'
}
},
{
...
...
src/store/modules/permission.js
View file @
d0c6244a
import
{
asyncRoutes
,
constantRoutes
}
from
'@/router'
import
normalRequest
from
'@/utils/normal-request'
import
{
role
}
from
'@/api/account'
/**
* Use meta.role to determine if the current user has permission
* @param roles
* @param route
*/
function
hasPermission
(
roles
,
route
)
{
if
(
route
.
meta
&&
route
.
meta
.
roles
)
{
return
roles
.
some
(
role
=>
route
.
meta
.
roles
.
includes
(
role
))
}
else
{
return
true
function
hasPermission
(
route
,
paths
)
{
if
(
route
.
name
)
{
return
paths
.
includes
(
route
.
name
)
}
}
function
treeToArray
(
menus
,
permissions
,
paths
)
{
// if (menus && Array.isArray(menus)) {
menus
.
forEach
(
item
=>
{
// if (item.isTrue) {
permissions
.
push
(
item
.
ID
)
// if (item.path) {
paths
.
push
(
item
.
Path
)
// }
// }
// treeToArray(item.subMenus, permissions, paths)
})
// }
}
/**
* Filter asynchronous routing tables by recursion
* @param routes asyncRoutes
* @param
role
s
* @param
permission
s
*/
export
function
filterAsyncRoutes
(
routes
,
role
s
)
{
export
function
filterAsyncRoutes
(
routes
,
path
s
)
{
const
res
=
[]
routes
.
forEach
(
route
=>
{
const
tmp
=
{
...
route
}
if
(
hasPermission
(
ro
les
,
tmp
))
{
if
(
hasPermission
(
ro
ute
,
paths
))
{
if
(
tmp
.
children
)
{
tmp
.
children
=
filterAsyncRoutes
(
tmp
.
children
,
role
s
)
tmp
.
children
=
filterAsyncRoutes
(
tmp
.
children
,
path
s
)
}
res
.
push
(
tmp
)
}
})
// console.log(res)
return
res
}
const
state
=
{
routes
:
[],
// 项目所有的路由
addRoutes
:
[],
paths
:
JSON
.
parse
(
localStorage
.
getItem
(
'PATHS'
))
||
[],
// 菜单路由
permissions
:
JSON
.
parse
(
localStorage
.
getItem
(
'PERMISSIONS'
))
||
[],
// 按钮权限
sideRoutes
:
[],
// 侧边栏路由,用于渲染侧边菜单栏
currentTopNavPath
:
''
// 当前一级路由地址,用于刷新时回显当前选中的顶端菜单栏
}
...
...
@@ -46,6 +61,12 @@ const mutations = {
state
.
addRoutes
=
routes
state
.
routes
=
constantRoutes
.
concat
(
routes
)
},
SET_PERMISSIONS
:
(
state
,
permissions
)
=>
{
state
.
permissions
=
permissions
},
SET_PATHS
:
(
state
,
paths
)
=>
{
state
.
paths
=
paths
},
SET_CURRENTTOPNAVPATH
:
(
state
,
path
)
=>
{
state
.
currentTopNavPath
=
path
},
...
...
@@ -55,17 +76,32 @@ const mutations = {
}
const
actions
=
{
generateRoutes
({
commit
}
,
roles
)
{
generateRoutes
({
commit
})
{
return
new
Promise
(
resolve
=>
{
const
paths
=
JSON
.
parse
(
localStorage
.
getItem
(
'PATHS'
))
let
accessedRoutes
if
(
roles
.
includes
(
'admin'
))
{
accessedRoutes
=
asyncRoutes
||
[]
const
test
=
false
// 是否测试阶段
if
(
test
)
{
accessedRoutes
=
asyncRoutes
}
else
{
accessedRoutes
=
filterAsyncRoutes
(
asyncRoutes
,
role
s
)
accessedRoutes
=
filterAsyncRoutes
(
asyncRoutes
,
path
s
)
}
commit
(
'SET_ROUTES'
,
accessedRoutes
)
resolve
(
accessedRoutes
)
})
},
getPermissions
({
commit
},
roleId
)
{
console
.
log
(
roleId
)
normalRequest
(
role
.
searchOneUrl
,
{
id
:
roleId
}).
then
(
res
=>
{
var
menus
=
res
.
results
.
data
.
results
[
0
].
RoleToMenuMenuList
var
permissions
=
[]
var
paths
=
[]
treeToArray
(
menus
,
permissions
,
paths
)
localStorage
.
setItem
(
'PERMISSIONS'
,
JSON
.
stringify
(
permissions
))
localStorage
.
setItem
(
'PATHS'
,
JSON
.
stringify
(
paths
))
commit
(
'SET_PERMISSIONS'
,
permissions
)
commit
(
'SET_PATHS'
,
paths
)
})
}
}
...
...
src/views/customers/customers-add/constant.js
0 → 100644
View file @
d0c6244a
import
{
provinceSearch
,
citySearch
,
districtSearch
}
from
'@/api/customers'
;
const
sections
=
[
{
title
:
'基本信息'
,
formDesc
:
{
Name
:
{
type
:
'lov'
,
label
:
'公司全称'
,
layout
:
16
,
code
:
'qcc'
,
displayKey
:
'Name'
,
btnTitle
:
'获取企查查信息'
,
disabled
:
true
,
returnFn
:
function
(
row
)
{
return
{
Name
:
row
.
Name
,
ExtSocialUnifiedCreditCode_SDK
:
row
.
CreditCode
,
ExtCorporateName_SDK
:
row
.
OperName
}
},
},
ExtSecondName_SDK
:
{
type
:
'input'
,
label
:
'公司全称曾用名'
,
layout
:
12
,
disabled
:
true
,
},
ExtSocialUnifiedCreditCode_SDK
:
{
type
:
'input'
,
label
:
'社会统一信用代码'
,
layout
:
12
,
disabled
:
true
},
ExtRegisteredCapital_SDK
:
{
type
:
'input'
,
label
:
'注册资本(万元)'
,
layout
:
12
,
default
:
''
,
disabled
:
true
},
ExtCorporateName_SDK
:
{
type
:
'input'
,
label
:
'法人'
,
layout
:
12
,
disabled
:
true
},
// Ext_QuoteOppotunity_KUT: {
// type: 'input',
// label: '税务登记编号',
// layout: 12
// },
}
},
{
title
:
'地址信息'
,
formDesc
:
{
ExtProvince_SDK
:
{
type
:
'select'
,
label
:
'省份'
,
layout
:
12
,
options
:
async
data
=>
{
const
res
=
await
provinceSearch
({})
var
result
=
res
.
results
.
map
(
item
=>
{
return
{
text
:
item
.
Name
,
value
:
item
.
Code
}
})
return
result
},
disabled
:
true
,
},
ExtCity_SDK
:
{
type
:
'select'
,
label
:
'地市'
,
layout
:
12
,
isOptions
:
true
,
optionsLinkageFields
:
[
'ExtProvince_SDK'
],
options
:
async
data
=>
{
if
(
!
data
.
ExtProvince_SDK
)
{
return
[]
}
const
res
=
await
citySearch
({
provinceCode
:
data
.
ExtProvince_SDK
})
var
result
=
res
.
results
.
map
(
item
=>
{
return
{
text
:
item
.
Name
,
value
:
item
.
Code
}
})
return
result
},
disabled
:
true
,
},
ExtDistrict_SDK
:
{
type
:
'select'
,
label
:
'县市'
,
layout
:
12
,
isOptions
:
true
,
optionsLinkageFields
:
[
'ExtProvince_SDK'
,
'ExtCity_SDK'
],
options
:
async
data
=>
{
if
(
!
data
.
ExtCity_SDK
)
{
return
[]
}
const
res
=
await
districtSearch
({
cityCode
:
data
.
ExtCity_SDK
})
var
result
=
res
.
results
.
map
(
item
=>
{
return
{
text
:
item
.
Name
,
value
:
item
.
Code
}
})
return
result
},
disabled
:
true
,
},
ExtAddressDetail_SDK
:
{
type
:
'input'
,
label
:
'详细经营地址'
,
layout
:
12
,
disabled
:
true
,
},
}
},
{
title
:
'联系信息'
,
formDesc
:
{
ExtLeader_SDK
:
{
type
:
'input'
,
label
:
'公司负责人姓名'
,
layout
:
12
,
disabled
:
true
,
},
ExtLeaderPhone_SDK
:
{
type
:
'input'
,
label
:
'公司负责人联系方式'
,
layout
:
12
,
disabled
:
true
,
},
ExtLeaderEmail_SDK
:
{
type
:
'input'
,
label
:
'公司负责人邮箱'
,
layout
:
12
,
disabled
:
true
,
},
ExtUnis_SDK
:
{
type
:
'input'
,
layout
:
12
,
label
:
'Unis业务负责人姓名'
,
disabled
:
true
,
break
:
true
,
},
ExtUnisPhone_SDK
:
{
type
:
'input'
,
layout
:
12
,
label
:
'Unis业务负责人联系方式'
,
disabled
:
true
,
},
ExtUnisEmail_SDK
:
{
type
:
'input'
,
label
:
'Unis业务负责人邮箱'
,
layout
:
12
,
disabled
:
true
,
},
ExtBusiness_SDK
:
{
type
:
'input'
,
layout
:
12
,
label
:
'商务负责人姓名'
,
disabled
:
true
,
break
:
true
,
},
ExtBusinessPhone_SDK
:
{
type
:
'input'
,
layout
:
12
,
label
:
'商务负责人联系方式'
,
disabled
:
true
,
},
ExtBusinessEmail_SDK
:
{
type
:
'input'
,
label
:
'商务负责人邮箱'
,
layout
:
12
,
disabled
:
true
,
},
}
}
]
export
default
sections
\ No newline at end of file
src/views/customers/customers-add/index.vue
View file @
d0c6244a
...
...
@@ -25,6 +25,7 @@ import { customerCreate, provinceSearch, citySearch, districtSearch } from '@/ap
import
customerAddAddress
from
'./components/customersAdd-adress/index'
import
customerAddAccessory
from
'./components/customersAdd-accessory/index'
import
{
qccGetOne
}
from
'@/api/qcc'
import
constant
from
'./constant'
export
default
{
components
:
{
...
...
@@ -42,6 +43,7 @@ export default {
title
:
'代理商新增'
,
loading
:
false
,
addBtnStart
:
false
,
displayBtn
:
false
,
objectId
:
''
,
formData
:
{},
sections
:
[
...
...
@@ -74,7 +76,7 @@ export default {
type
:
'input'
,
label
:
'社会统一信用代码'
,
layout
:
12
,
disabled
:
t
rue
disabled
:
t
his
.
displayBtn
},
ExtRegisteredCapital_SDK
:
{
type
:
'input'
,
...
...
@@ -195,6 +197,7 @@ export default {
layout
:
12
,
label
:
'Unis业务负责人姓名'
,
disabled
:
false
,
break
:
true
,
},
ExtUnisPhone_SDK
:
{
type
:
'input'
,
...
...
@@ -213,6 +216,7 @@ export default {
layout
:
12
,
label
:
'商务负责人姓名'
,
disabled
:
false
,
break
:
true
,
},
ExtBusinessPhone_SDK
:
{
type
:
'input'
,
...
...
@@ -262,12 +266,12 @@ export default {
handleSubmit
(
data
)
{
const
formData
=
this
.
$translateToC4CData
(
data
)
formData
.
extCustomerType_SDK
=
'121'
console
.
log
(
formData
)
this
.
loading
=
true
customerCreate
(
this
.
paramsToFormData
(
formData
)).
then
(
res
=>
{
this
.
addBtnStart
=
true
this
.
objectId
=
res
.
results
const
objectID
=
res
.
results
this
.
sections
=
constant
this
.
$router
.
push
({
path
:
'/customersAdd'
,
query
:
{
objectID
:
objectID
,
addBtnStart
:
false
}
...
...
@@ -275,7 +279,6 @@ export default {
this
.
$message
.
success
(
'创建成功'
)
this
.
loading
=
false
})
// return Promise.resolve()
},
handleSuccess
()
{
// this.$message.success('创建成功')
...
...
src/views/customers/customers-details/area.vue
View file @
d0c6244a
...
...
@@ -213,7 +213,8 @@ export default {
type
:
'input'
,
layout
:
12
,
label
:
'Unis业务负责人姓名'
,
disabled
:
true
disabled
:
true
,
break
:
true
,
},
ExtUnisPhone_SDK
:
{
type
:
'input'
,
...
...
@@ -231,7 +232,8 @@ export default {
type
:
'input'
,
layout
:
12
,
label
:
'商务负责人姓名'
,
disabled
:
true
disabled
:
true
,
break
:
true
,
},
ExtBusinessPhone_SDK
:
{
type
:
'input'
,
...
...
src/views/customers/customers-details/index.vue
View file @
d0c6244a
...
...
@@ -195,7 +195,8 @@ export default {
type
:
'input'
,
layout
:
12
,
label
:
'Unis业务负责人姓名'
,
disabled
:
true
disabled
:
true
,
break
:
true
,
},
ExtUnisPhone_SDK
:
{
type
:
'input'
,
...
...
@@ -213,7 +214,8 @@ export default {
type
:
'input'
,
layout
:
12
,
label
:
'商务负责人姓名'
,
disabled
:
true
disabled
:
true
,
break
:
true
,
},
ExtBusinessPhone_SDK
:
{
type
:
'input'
,
...
...
src/views/customers/customers-details/province.vue
View file @
d0c6244a
...
...
@@ -195,7 +195,8 @@ export default {
type
:
'input'
,
layout
:
12
,
label
:
'Unis业务负责人姓名'
,
disabled
:
true
disabled
:
true
,
break
:
true
,
},
ExtUnisPhone_SDK
:
{
type
:
'input'
,
...
...
@@ -213,7 +214,8 @@ export default {
type
:
'input'
,
layout
:
12
,
label
:
'商务负责人姓名'
,
disabled
:
true
disabled
:
true
,
break
:
true
,
},
ExtBusinessPhone_SDK
:
{
type
:
'input'
,
...
...
src/views/login/index.vue
View file @
d0c6244a
...
...
@@ -198,8 +198,9 @@ export default {
max
:
16
,
type
:
"string"
,
trigger
:
"blur"
,
message
:
"
密码由字母(区分大小写)和数字组成,长度不能小于8位
"
}
message
:
"
请按照密码规则输入!!
"
}
],
tip
:
"密码由字母(区分大小写)和数字组成,长度8-16位"
,
attrs
:
{
size
:
"mini"
,
clearable
:
false
,
...
...
@@ -217,9 +218,10 @@ export default {
max
:
16
,
type
:
"string"
,
trigger
:
"blur"
,
message
:
"
密码由字母(区分大小写)和数字组成,长度不能小于8位
"
message
:
"
请按照密码规则输入!!
"
}
],
tip
:
"密码由字母(区分大小写)和数字组成,长度8-16位"
,
attrs
:
{
size
:
"mini"
,
clearable
:
false
,
...
...
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