Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
9
91isoft_vue_manage
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
杨硕
91isoft_vue_manage
Commits
caebd246
Commit
caebd246
authored
Jul 18, 2023
by
杨硕
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
完善模版项目
parent
39e63d54
Changes
12
Show whitespace changes
Inline
Side-by-side
Showing
12 changed files
with
1157 additions
and
520 deletions
+1157
-520
errorLog.js
src/api/monitor/errorLog.js
+10
-4
loginInfo.js
src/api/monitor/loginInfo.js
+10
-4
operLog.js
src/api/monitor/operLog.js
+10
-4
role.js
src/api/system/role.js
+6
-0
user.js
src/api/system/user.js
+2
-2
index.vue
src/views/monitor/errorLog/index.vue
+36
-30
index.vue
src/views/monitor/loginInfo/index.vue
+66
-48
index.vue
src/views/monitor/operLog/index.vue
+37
-30
data.vue
src/views/system/dict/data.vue
+866
-322
index.vue
src/views/system/role/index.vue
+27
-27
index.vue
src/views/system/user/index.vue
+83
-46
vue.config.js
vue.config.js
+4
-3
No files found.
src/api/monitor/errorLog.js
View file @
caebd246
import
request
from
'@/utils/request'
import
Qs
from
'qs'
// 查询异常日志列表
export
function
list
(
query
)
{
return
request
({
url
:
'/monitor/errorLog/
list
'
,
url
:
'/monitor/errorLog/
queryErrorLogListByPagination
'
,
method
:
'get'
,
params
:
query
})
}
// 删除异常日志
export
function
delErrLog
(
operId
)
{
export
function
delErrLog
(
data
)
{
// data = Qs.stringify(data)
return
request
({
url
:
'/monitor/errorLog/'
+
operId
,
method
:
'delete'
url
:
'/monitor/errorLog/delete'
,
method
:
'post'
,
data
,
headers
:
{
'Content-Type'
:
'application/json;charset=UTF-8'
}
})
}
...
...
src/api/monitor/loginInfo.js
View file @
caebd246
import
request
from
'@/utils/request'
import
Qs
from
'qs'
// 查询登录日志列表
export
function
list
(
query
)
{
return
request
({
url
:
'/monitor/loginInfo/
list
'
,
url
:
'/monitor/loginInfo/
querySysLoginListByPagination
'
,
method
:
'get'
,
params
:
query
})
}
// 删除登录日志
export
function
delLogininfo
(
infoId
)
{
export
function
delLogininfo
(
data
)
{
// data = Qs.stringify(data)
return
request
({
url
:
'/monitor/loginInfo/'
+
infoId
,
method
:
'delete'
url
:
'/monitor/loginInfo/delete'
,
method
:
'post'
,
data
,
headers
:
{
'Content-Type'
:
'application/json;charset=UTF-8'
}
})
}
...
...
src/api/monitor/operLog.js
View file @
caebd246
import
request
from
'@/utils/request'
import
Qs
from
'qs'
// 查询操作日志列表
export
function
list
(
query
)
{
return
request
({
url
:
'/monitor/operLog/
list
'
,
url
:
'/monitor/operLog/
queryOperLogListByPagination
'
,
method
:
'get'
,
params
:
query
})
}
// 删除操作日志
export
function
delOperLog
(
operId
)
{
export
function
delOperLog
(
data
)
{
// data = Qs.stringify(data)
return
request
({
url
:
'/monitor/operLog/'
+
operId
,
method
:
'delete'
url
:
'/monitor/operLog/delete'
,
method
:
'post'
,
data
,
headers
:
{
'Content-Type'
:
'application/json;charset=UTF-8'
}
})
}
...
...
src/api/system/role.js
View file @
caebd246
...
...
@@ -8,6 +8,12 @@ export function listRole(query) {
params
:
query
})
}
export
function
getlistRole
()
{
return
request
({
url
:
'system/role/listAll'
,
method
:
'get'
})
}
// 查询角色详细
export
function
getRole
(
businessId
)
{
...
...
src/api/system/user.js
View file @
caebd246
...
...
@@ -40,10 +40,10 @@ export function addUser(data) {
// 修改用户
export
function
updateUser
(
data
)
{
const
businessId
=
data
.
businessId
//
const businessId = data.businessId
data
=
Qs
.
stringify
(
data
)
return
request
({
url
:
'/system/user/update
/'
+
businessId
,
url
:
'/system/user/update
'
,
method
:
'put'
,
data
:
data
,
headers
:
{
...
...
src/views/monitor/errorLog/index.vue
View file @
caebd246
...
...
@@ -98,7 +98,7 @@
<el-table-column
type=
"selection"
width=
"55"
align=
"center"
/>
<el-table-column
:show-overflow-tooltip=
"true"
label=
"日志编号"
width=
"100"
align=
"center"
prop=
"businessId"
>
<template
slot-scope=
"scope"
>
{{
scope
.
row
.
oper
Id
||
'-'
}}
{{
scope
.
row
.
business
Id
||
'-'
}}
</
template
>
</el-table-column>
<el-table-column
:show-overflow-tooltip=
"true"
label=
"系统模块"
align=
"center"
prop=
"systemMode"
>
...
...
@@ -200,9 +200,9 @@
</el-col>
</el-row>
</el-form>
<!-- <div slot="footer" class="dialog-footer">-->
<!-- <el-button @click="open = false">关 闭</el-button>-->
<!-- </div>-->
<!-- <div slot="footer" class="dialog-footer">-->
<!-- <el-button @click="open = false">关 闭</el-button>-->
<!-- </div>-->
</el-dialog>
</div>
</template>
...
...
@@ -315,7 +315,7 @@ export default {
},
// 多选框选中数据
handleSelectionChange
(
selection
)
{
this
.
ids
=
selection
.
map
(
item
=>
item
.
oper
Id
)
this
.
ids
=
selection
.
map
(
item
=>
item
.
business
Id
)
},
/** 详细按钮操作 */
handleView
(
row
)
{
...
...
@@ -329,7 +329,13 @@ export default {
cancelButtonText
:
'取消'
,
type
:
'warning'
}).
then
(()
=>
{
return
delErrLog
(
this
.
ids
)
const
id
=
this
.
ids
.
join
(
','
)
// TODO: clear this log
console
.
log
(
`this.ids`
,
id
)
const
query
=
{
deleteIds
:
id
}
return
delErrLog
(
query
)
}).
then
(()
=>
{
this
.
getList
()
this
.
$message
.
success
(
'删除成功'
)
...
...
@@ -384,7 +390,7 @@ export default {
}
</
script
>
<
style
lang=
"scss"
scoped
>
.app-container-errlog
{
.app-container-errlog
{
padding
:
0
;
font-size
:
18px
;
.placeholder
{
...
...
@@ -392,6 +398,6 @@ export default {
background-color
:
#F4F4F4
;
margin-bottom
:
10px
}
}
}
</
style
>
src/views/monitor/loginInfo/index.vue
View file @
caebd246
...
...
@@ -80,50 +80,60 @@
<div
style=
"padding:10px"
>
<div
class=
"mb12 font-small-bold"
>
登录日志列表
</div>
<el-table
v-loading=
"loading"
border
:data=
"list"
@
selection-change=
"handleSelectionChange"
>
<!--
<el-table-column
type=
"selection"
width=
"55"
align=
"center"
/>
-->
<!-- <!–
<el-table-column
type=
"index"
label=
"序号"
width=
"50"
/>
–>
-->
<!--
<el-table-column
label=
"访问编号"
width=
"100"
align=
"center"
prop=
"infoId"
show-overflow-tooltip
>
-->
<!--
<template
slot-scope=
"scope"
>
-->
<!--
{{
scope
.
row
.
infoId
||
'-'
}}
-->
<!--
</
template
>
-->
<!-- </el-table-column>-->
<!-- <el-table-column label="用户名称" align="center" prop="userName" show-overflow-tooltip>-->
<!-- <template slot-scope="scope">-->
<!-- {{ scope.row.userName || '-' }}-->
<!-- </template>-->
<!-- </el-table-column>-->
<!-- <el-table-column label="登录地址" align="center" prop="ipaddr" show-overflow-tooltip>-->
<!-- <template slot-scope="scope">-->
<!-- {{ scope.row.ipaddr || '-' }}-->
<!-- </template>-->
<!-- </el-table-column>-->
<!-- <el-table-column label="操作信息" align="center" prop="msg" show-overflow-tooltip>-->
<!-- <template slot-scope="scope">-->
<!-- {{ scope.row.msg || '-' }}-->
<!-- </template>-->
<!-- </el-table-column>-->
<!-- <!– <el-table-column label="登录地址" align="center" prop="ipaddr" width="130" :show-overflow-tooltip="true" />–>-->
<!-- <el-table-column label="登录地点" align="center" prop="loginLocation" :show-overflow-tooltip="true" />-->
<!-- <!– <el-table-column label="浏览器" align="center" prop="browser" show-overflow-tooltip>–>-->
<!-- <!– <template slot-scope="scope">–>-->
<!-- <!– {{ scope.row.browser || '-' }}–>-->
<!-- <!– </template>–>-->
<!-- <!– </el-table-column>–>-->
<!-- <!– <el-table-column label="操作系统" align="center" prop="os" show-overflow-tooltip>–>-->
<!-- <!– <template slot-scope="scope">–>-->
<!-- <!– {{ scope.row.os || '-' }}–>-->
<!-- <!– </template>–>-->
<!-- <!– </el-table-column>–>-->
<!-- <el-table-column label="登录状态" align="center" prop="status" :formatter="statusFormat" />-->
<!--
<el-table-column
type=
"selection"
width=
"55"
align=
"center"
/>
-->
<!-- <!–
<el-table-column
type=
"index"
label=
"序号"
width=
"50"
/>
–>
-->
<!--
<el-table-column
label=
"访问编号"
width=
"100"
align=
"center"
prop=
"infoId"
show-overflow-tooltip
>
-->
<!--
<template
slot-scope=
"scope"
>
-->
<!--
{{
scope
.
row
.
infoId
||
'-'
}}
-->
<!--
</
template
>
-->
<!-- </el-table-column>-->
<!-- <el-table-column label="用户名称" align="center" prop="userName" show-overflow-tooltip>-->
<!-- <template slot-scope="scope">-->
<!-- {{ scope.row.userName || '-' }}-->
<!-- </template>-->
<!-- </el-table-column>-->
<!-- <el-table-column label="登录地址" align="center" prop="ipaddr" show-overflow-tooltip>-->
<!-- <template slot-scope="scope">-->
<!-- {{ scope.row.ipaddr || '-' }}-->
<!-- </template>-->
<!-- </el-table-column>-->
<!-- <el-table-column label="操作信息" align="center" prop="msg" show-overflow-tooltip>-->
<!-- <template slot-scope="scope">-->
<!-- {{ scope.row.msg || '-' }}-->
<!-- </template>-->
<!-- </el-table-column>-->
<!-- <!– <el-table-column label="登录地址" align="center" prop="ipaddr" width="130" :show-overflow-tooltip="true" />–>-->
<!-- <el-table-column label="登录地点" align="center" prop="loginLocation" :show-overflow-tooltip="true" />-->
<!-- <!– <el-table-column label="浏览器" align="center" prop="browser" show-overflow-tooltip>–>-->
<!-- <!– <template slot-scope="scope">–>-->
<!-- <!– {{ scope.row.browser || '-' }}–>-->
<!-- <!– </template>–>-->
<!-- <!– </el-table-column>–>-->
<!-- <!– <el-table-column label="操作系统" align="center" prop="os" show-overflow-tooltip>–>-->
<!-- <!– <template slot-scope="scope">–>-->
<!-- <!– {{ scope.row.os || '-' }}–>-->
<!-- <!– </template>–>-->
<!-- <!– </el-table-column>–>-->
<!-- <el-table-column label="登录状态" align="center" prop="status" :formatter="statusFormat" />-->
<el-table-column
type=
"selection"
width=
"55"
align=
"center"
/>
<el-table-column
label=
"访问编号"
align=
"center"
prop=
"
info
Id"
/>
<el-table-column
label=
"访问编号"
align=
"center"
prop=
"
business
Id"
/>
<el-table-column
label=
"用户名称"
align=
"center"
prop=
"username"
/>
<el-table-column
label=
"登录地址"
align=
"center"
prop=
"ipaddr"
width=
"130"
:show-overflow-tooltip=
"true"
/>
<el-table-column
label=
"登录地点"
align=
"center"
prop=
"loginLocation"
:show-overflow-tooltip=
"true"
/>
<!-- <el-table-column label="浏览器" align="center" prop="browser" />
<el-table-column label="操作系统" align="center" prop="os" />-->
<el-table-column
label=
"登录状态"
align=
"center"
prop=
"status"
:formatter=
"statusFormat"
/>
<el-table-column
label=
"提示信息"
align=
"center"
prop=
"msg"
/>
<!-- <el-table-column label="登录状态" align="center" prop="status" :formatter="statusFormat" />-->
<el-table-column
label=
"登录状态"
align=
"center"
prop=
"status"
>
<
template
slot-scope=
"scope"
>
<span
v-if=
"scope.row.status === '0'"
>
失败
</span>
<span
v-if=
"scope.row.status === '1'"
>
成功
</span>
</
template
>
</el-table-column>
<el-table-column
label=
"提示信息"
align=
"center"
>
<
template
slot-scope=
"scope"
>
{{
scope
.
row
.
msg
||
'-'
}}
</
template
>
</el-table-column>
<el-table-column
label=
"登录时间"
align=
"center"
prop=
"loginTime"
width=
"180"
show-overflow-tooltip
>
<
template
slot-scope=
"scope"
>
<span>
{{
parseTime
(
scope
.
row
.
loginTime
)
|
transformDateByFormat
(
'YYYY-MM-DD HH:mm:ss'
)
}}
</span>
...
...
@@ -144,8 +154,10 @@
<
script
>
import
{
list
,
delLogininfo
,
cleanLogininfo
,
exportLogininfo
}
from
'@/api/monitor/loginInfo'
import
dictCons
from
'@/utils/dictCons'
import
Template
from
'@/views/instance/Template'
export
default
{
name
:
'LoginInfo'
,
components
:
{
Template
},
data
()
{
return
{
// 遮罩层
...
...
@@ -226,7 +238,7 @@ export default {
},
// 多选框选中数据
handleSelectionChange
(
selection
)
{
this
.
ids
=
selection
.
map
(
item
=>
item
.
info
Id
)
this
.
ids
=
selection
.
map
(
item
=>
item
.
business
Id
)
this
.
multiple
=
!
selection
.
length
},
/** 删除按钮操作 */
...
...
@@ -236,7 +248,13 @@ export default {
cancelButtonText
:
'取消'
,
type
:
'warning'
}).
then
(()
=>
{
return
delLogininfo
(
this
.
ids
)
const
id
=
this
.
ids
.
join
(
','
)
// TODO: clear this log
console
.
log
(
`this.ids`
,
id
)
const
query
=
{
deleteIds
:
id
}
return
delLogininfo
(
query
)
}).
then
(()
=>
{
this
.
getList
()
this
.
$message
.
success
(
'删除成功'
)
...
...
@@ -291,7 +309,7 @@ export default {
}
</
script
>
<
style
lang=
"scss"
scoped
>
.app-container
{
.app-container
{
padding
:
0
;
font-size
:
18px
;
.placeholder
{
...
...
@@ -299,6 +317,6 @@ export default {
background-color
:
#F4F4F4
;
margin-bottom
:
10px
}
}
}
</
style
>
src/views/monitor/operLog/index.vue
View file @
caebd246
...
...
@@ -98,7 +98,7 @@
<el-table-column
type=
"selection"
width=
"55"
align=
"center"
/>
<el-table-column
:show-overflow-tooltip=
"true"
label=
"日志编号"
width=
"100"
align=
"center"
prop=
"operId"
>
<template
slot-scope=
"scope"
>
{{
scope
.
row
.
oper
Id
||
'-'
}}
{{
scope
.
row
.
business
Id
||
'-'
}}
</
template
>
</el-table-column>
<el-table-column
:show-overflow-tooltip=
"true"
label=
"系统模块"
align=
"center"
prop=
"systemMode"
>
...
...
@@ -200,9 +200,9 @@
<!-- </el-col>-->
</el-row>
</el-form>
<!-- <div slot="footer" class="dialog-footer">-->
<!-- <el-button @click="open = false">关 闭</el-button>-->
<!-- </div>-->
<!-- <div slot="footer" class="dialog-footer">-->
<!-- <el-button @click="open = false">关 闭</el-button>-->
<!-- </div>-->
</el-dialog>
</div>
</template>
...
...
@@ -316,7 +316,7 @@ export default {
},
// 多选框选中数据
handleSelectionChange
(
selection
)
{
this
.
ids
=
selection
.
map
(
item
=>
item
.
oper
Id
)
this
.
ids
=
selection
.
map
(
item
=>
item
.
business
Id
)
},
/** 详细按钮操作 */
handleView
(
row
)
{
...
...
@@ -330,7 +330,14 @@ export default {
cancelButtonText
:
'取消'
,
type
:
'warning'
}).
then
(()
=>
{
return
delOperLog
(
this
.
ids
)
const
id
=
this
.
ids
.
join
(
','
)
// TODO: clear this log
console
.
log
(
`this.ids`
,
id
)
const
query
=
{
deleteIds
:
id
}
// const deleteIds = JSON.stringify(query)
return
delOperLog
(
query
)
}).
then
(()
=>
{
this
.
getList
()
this
.
$message
.
success
(
'删除成功'
)
...
...
@@ -385,7 +392,7 @@ export default {
}
</
script
>
<
style
lang=
"scss"
scoped
>
.app-container-operlog
{
.app-container-operlog
{
padding
:
0
;
font-size
:
18px
;
.placeholder
{
...
...
@@ -393,6 +400,6 @@ export default {
background-color
:
#F4F4F4
;
margin-bottom
:
10px
}
}
}
</
style
>
src/views/system/dict/data.vue
View file @
caebd246
<
template
>
<div
class=
"app-container"
>
<el-form
v-show=
"showSearch"
ref=
"queryForm"
style=
"width: 100%"
:model=
"queryParams"
:inline=
"true"
>
<el-form-item
label=
"字典名称"
prop=
"dictType"
>
<el-select
v-model=
"queryParams.dictType"
placeholder=
"请选择字典名称"
clearable
size=
"small"
>
<el-option
v-for=
"item in typeOptions"
:key=
"item.businessId"
:label=
"item.dictName"
:value=
"item.dictType"
/>
</el-select>
</el-form-item>
<el-form-item
label=
"字典标签"
prop=
"dictLabel"
>
<div
class=
"user-manage"
>
<div
class=
"search"
style=
"border-bottom: 14px solid #f4f4f4"
>
<el-form
v-show=
"showSearch"
ref=
"queryForm"
style=
"padding: 0 0 0 10px"
class=
"formClass"
:model=
"queryParams"
:inline=
"true"
label-width=
"auto"
>
<!--
<el-form-item
label=
"用户类型"
prop=
"name"
class=
"noMargin"
>
-->
<!--
<el-input-->
<!-- v-model="queryParams.name"-->
<!-- placeholder="请输入用户类型"-->
<!-- clearable-->
<!-- :maxlength="30"-->
<!-- size="small"-->
<!-- style="width: 150px"-->
<!-- />-->
<!--
</el-form-item>
-->
<el-form-item
label=
"登录名"
prop=
"username"
>
<el-input
v-model=
"queryParams.dictLabel
"
placeholder=
"请输入字典标签
"
v-model=
"queryParams.username
"
placeholder=
"请输入登录名
"
clearable
:maxlength=
"30"
size=
"small"
@
keyup
.
enter
.
native=
"handleQuery
"
style=
"width: 150px
"
/>
</el-form-item>
<el-form-item
label=
"状态"
prop=
"flag"
>
<el-select
v-model=
"queryParams.flag"
placeholder=
"数据状态"
clearable
size=
"small"
>
<el-select
v-model=
"queryParams.flag"
placeholder=
"请选择用户状态"
clearable
size=
"small"
style=
"width: 150px"
>
<el-option
v-for=
"dict in statusOptions"
:key=
"dict.dictValue"
...
...
@@ -32,131 +39,153 @@
</el-select>
</el-form-item>
<el-form-item>
<el-button
type=
"primary"
size=
"small"
@
click=
"handleQuery"
>
搜索
</el-button>
<el-button
size=
"small"
@
click=
"resetQuery"
>
重置
</el-button>
<el-button
type=
"primary"
style=
"padding: 8px 7px;"
icon=
"el-icon-search"
size=
"small"
@
click=
"handleQuery"
>
查询
</el-button>
<el-button
type=
"primary"
style=
"padding: 8px 7px;"
icon=
"el-icon-refresh"
size=
"small"
@
click=
"resetQuery"
>
重置
</el-button>
</el-form-item>
</el-form>
<el-row
:gutter=
"10"
class=
"mb8"
>
<el-col
:span=
"1.5"
>
<el-form-item
style=
"float: right"
>
<!--
<el-button-->
<!-- v-hasPermi="['sys:user:add']"-->
<!-- style="padding: 8px 7px;"-->
<!-- type="primary"-->
<!-- size="small"-->
<!-- icon="el-icon-plus"-->
<!-- @click="handleFormAdd"-->
<!-- >表单页新增模板
</el-button>
-->
<el-button
v-hasPermi=
"['sys:dict:add']"
v-hasPermi=
"['sys:user:add']"
style=
"padding: 8px 7px;"
type=
"primary"
size=
"small"
icon=
"el-icon-plus"
size=
"mini"
@
click=
"handleAdd"
>
新增
</el-button>
</el-col>
<el-col
:span=
"1.5"
>
<el-button
v-hasPermi=
"['sys:dict:update']"
type=
"success"
icon=
"el-icon-edit"
size=
"mini"
:disabled=
"single"
@
click=
"handleUpdate"
>
修改
</el-button>
</el-col>
<el-col
:span=
"1.5"
>
>
新增
</el-button>
<el-button
v-hasPermi=
"['sys:dict:delete']"
type=
"danger"
icon=
"el-icon-delete"
size=
"mini"
:disabled=
"multiple"
@
click=
"handleDelete"
>
删除
</el-button>
</el-col>
<el-col
:span=
"1.5"
>
<el-button
v-has-permi=
"['sys:dict:export']"
style=
"padding: 8px 7px;"
type=
"warning"
icon=
"el-icon-upload"
size=
"small"
@
click=
"handleImport"
>
导入
</el-button>
<el-button
v-hasPermi=
"['sys:user:export']"
style=
"padding: 8px 7px;"
type=
"success"
size=
"small"
icon=
"el-icon-download"
size=
"mini"
@
click=
"handleExport"
>
导出
</el-button>
>
导出
</el-button>
</el-form-item>
</el-form>
</div>
<el-row
:gutter=
"20"
>
<!--部门数据-->
<el-col
:span=
"4"
:xs=
"24"
style=
"background: #f4f4f4;height: 100%"
>
<div
class=
"head-container"
style=
"padding: 10px 6px;background: #FFFFFF"
>
<el-input
v-model=
"deptName"
placeholder=
"请输入部门名称"
clearable
:maxlength=
"30"
size=
"mini"
/>
</div>
<div
class=
"head-container"
style=
"overflow-y:auto;min-height: 70.6vh;height: calc(100% - 48px);background: #ffffff;padding-right: 5px"
>
<el-tree
ref=
"tree"
:key=
"currentNodeKey"
:data=
"deptOptionsTree"
:props=
"defaultProps"
:expand-on-click-node=
"false"
:filter-node-method=
"filterNode"
default-expand-all
highlight-current
:current-node-key=
"currentNode"
@
node-click=
"handleNodeClick"
>
<div
slot-scope=
"
{ node }" style="white-space: nowrap;text-overflow: ellipsis;overflow: hidden" class="custom-tree-node">
<span
style=
"font-size: 14px"
:title=
"node.label"
>
{{
node
.
label
}}
</span>
</div>
</el-tree>
</div>
</el-col>
<right-toolbar
:show-search
.
sync=
"showSearch"
@
queryTable=
"getList"
/>
</el-row>
<div
class=
"placeholder"
/>
<div
style=
"padding:10px"
>
<div
class=
"mb12 font-small-bold"
>
字典参数列表
</div>
<el-table
v-loading=
"loading"
:data=
"dataList"
border
@
selection-change=
"handleSelectionChange"
>
<el-table-column
type=
"selection"
width=
"55"
align=
"center"
/>
<!--
<el-table-column
:show-overflow-tooltip=
"true"
label=
"参数编码"
prop=
"dictCode"
>
-->
<!--
<template
slot-scope=
"scope"
>
-->
<!--
{{
scope
.
row
.
dictCode
||
'-'
}}
-->
<!--
</
template
>
-->
<!-- </el-table-column>-->
<el-table-column
label=
"字典编码"
align=
"center"
prop=
"businessId"
/>
<el-table-column
:show-overflow-tooltip=
"true"
label=
"字典标签"
prop=
"dictLabel"
>
<!--用户数据-->
<el-col
:span=
"20"
:xs=
"24"
>
<div
class=
"mb12 font-small-bold"
style=
"margin-top: 20px"
>
用户管理列表
</div>
<el-table
v-loading=
"loading"
style=
"padding-right: 10px"
:data=
"userList"
>
<el-table-column
type=
"index"
label=
"序号"
width=
"50"
/>
<el-table-column
label=
"用户编号"
>
<template
v-slot:default=
"scope"
>
{{
scope
.
row
.
businessId
||
'-'
}}
</
template
>
</el-table-column>
<el-table-column
label=
"登录名"
prop=
"username"
:show-overflow-tooltip=
"true"
>
<
template
slot-scope=
"scope"
>
{{
scope
.
row
.
dictLabel
||
'-'
}}
{{
scope
.
row
.
username
||
'-'
}}
</
template
>
</el-table-column>
<el-table-column
:show-overflow-tooltip=
"true"
label=
"字典键值"
prop=
"dictVal
ue"
>
<el-table-column
label=
"用户名称"
prop=
"userType"
:show-overflow-tooltip=
"tr
ue"
>
<
template
slot-scope=
"scope"
>
{{
scope
.
row
.
dictValu
e
||
'-'
}}
{{
scope
.
row
.
nam
e
||
'-'
}}
</
template
>
</el-table-column>
<el-table-column
:show-overflow-tooltip=
"true"
label=
"字典排序"
prop=
"dictSort
"
>
<el-table-column
label=
"手机号"
prop=
"phone"
:show-overflow-tooltip=
"true
"
>
<
template
slot-scope=
"scope"
>
{{
isNaN
(
scope
.
row
.
dictSort
)
?
'-'
:
scope
.
row
.
dictSort
}}
{{
scope
.
row
.
phone
||
'-'
}}
</
template
>
</el-table-column>
<el-table-column
label=
"状态"
align=
"center"
prop=
"flag"
:formatter=
"statusFormat"
>
<el-table-column
width=
"120"
label=
"状态"
prop=
"flag"
>
<
template
slot-scope=
"scope"
>
<el-switch
v-model=
"scope.row.flag"
class=
"switchDisabledStyle"
inactive-value=
"0"
active-value=
"1"
@
click
.
native=
"changeStatus(scope.row)"
>
</el-switch>
</
template
>
</el-table-column>
<el-table-column
:show-overflow-tooltip=
"true"
label=
"备注"
prop=
"remarks"
>
<
template
slot-scope=
"scope"
>
{{
scope
.
row
.
remarks
||
'-'
}}
@
click
.
native=
"handleStatusChange(scope.row)"
/>
</
template
>
</el-table-column>
<el-table-column
:show-overflow-tooltip=
"true"
label=
"创建时间"
prop=
"createDate
"
>
<el-table-column
:show-overflow-tooltip=
"true"
label=
"创建时间"
prop=
"createDate"
width=
"160
"
>
<
template
slot-scope=
"scope"
>
<span>
{{
scope
.
row
.
createDate
|
transformDateByFormat
(
'YYYY-MM-DD HH:mm'
)
}}
</span>
</
template
>
</el-table-column>
<el-table-column
label=
"操作"
class-name=
"small-padding fixed-width"
>
<el-table-column
label=
"操作"
width=
"180"
class-name=
"small-padding fixed-width"
>
<
template
slot-scope=
"scope"
>
<el-button
v-hasPermi=
"['sys:dictConfig:edit
']"
v-hasPermi=
"['sys:user:update
']"
size=
"mini"
type=
"text"
style=
"color: #49cec9"
@
click=
"handleUpdate(scope.row)"
>
修改
</el-button>
<el-button
v-hasPermi=
"['sys:dictConfig:remove']"
v-hasPermi=
"['sys:user:resetPwd']"
size=
"mini"
type=
"text"
:loading=
"addLoading"
@
click=
"handleResetPwd(scope.row)"
>
重置
</el-button>
<el-button
v-if=
"scope.row.businessId !== 1"
v-hasPermi=
"['sys:user:delete']"
size=
"mini"
type=
"text"
icon=
"el-icon-delete"
@
click=
"handleDelete(scope.row)"
>
删除
</el-button>
<el-switch
v-model=
"scope.row.status"
v-hasPermi=
"['sys:dictConfig:toggle']"
disabled
class=
"switchDisabledStyle"
active-value=
"0"
inactive-value=
"1"
@
click
.
native=
"changeStatus(scope.row)"
/>
</
template
>
</el-table-column>
</el-table>
</div>
<pagination
v-show=
"total>0"
:total=
"total"
...
...
@@ -164,147 +193,523 @@
:limit
.
sync=
"queryParams.pageSize"
@
pagination=
"getList"
/>
</el-col>
</el-row>
<!-- 添加或修改参数配置对话框 -->
<el-dialog
:title=
"title"
:visible
.
sync=
"open"
width=
"
5
00px"
append-to-body
>
<el-dialog
:title=
"title"
:visible
.
sync=
"open"
width=
"
6
00px"
append-to-body
>
<el-form
ref=
"form"
:model=
"form"
:rules=
"rules"
label-width=
"80px"
>
<el-form-item
label=
"字典类型"
>
<el-input
v-model
.
trim=
"form.dictType"
:disabled=
"true"
show-word-limit
maxlength=
"30"
placeholder=
"请输入字典类型"
/>
<el-row>
<el-col
:span=
"12"
>
<el-form-item
label=
"用户昵称"
prop=
"nickName"
>
<el-input
v-model=
"form.nickName"
placeholder=
"请输入用户昵称"
/>
</el-form-item>
<el-form-item
label=
"参数标签"
prop=
"dictLabel"
>
<el-input
v-model
.
trim=
"form.dictLabel"
show-word-limit
maxlength=
"30"
placeholder=
"请输入参数标签"
/>
</el-col>
<el-col
:span=
"12"
>
<el-form-item
label=
"用户性别"
>
<el-select
v-model=
"form.sex"
placeholder=
"请选择"
>
<el-option
v-for=
"dict in sexOptions"
:key=
"dict.dictValue"
:label=
"dict.label"
:value=
"dict.value"
/>
</el-select>
</el-form-item>
<el-form-item
label=
"参数键值"
prop=
"dictValue"
>
<el-input
v-model
.
trim=
"form.dictValue"
show-word-limit
maxlength=
"300"
placeholder=
"请输入参数键值"
/>
</el-col>
</el-row>
<el-row>
<el-col
:span=
"12"
>
<el-form-item
label=
"手机号码"
prop=
"phone"
>
<el-input
v-model
.
trim=
"form.phone"
value=
"phone"
placeholder=
"请输入手机号码"
maxlength=
"11"
/>
</el-form-item>
</el-col>
<el-col
:span=
"12"
>
<el-form-item
label=
"邮箱"
prop=
"email"
>
<el-input
v-model
.
trim=
"form.email"
placeholder=
"请输入邮箱"
maxlength=
"25"
/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col
:span=
"12"
>
<el-form-item
v-if=
"form.businessId == undefined"
label=
"登录名"
prop=
"username"
>
<el-input
v-model=
"form.username"
placeholder=
"请输入登录名"
/>
</el-form-item>
<el-form-item
label=
"参数排序"
prop=
"dictSort"
>
<el-input-number
v-model=
"form.dictSort"
style=
"width: 100%"
controls-position=
"right"
:min=
"0"
/>
</el-col>
<el-col
:span=
"12"
>
<el-form-item
v-if=
"form.businessId == undefined"
label=
"用户密码"
prop=
"password"
>
<el-input
v-model=
"form.password"
placeholder=
"请输入用户密码"
type=
"password"
/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col
:span=
"12"
>
<el-form-item
label=
"用户名称"
prop=
"name"
>
<el-input
v-model
.
trim=
"form.name"
placeholder=
"请输入用户名称"
/>
</el-form-item>
<el-form-item
label=
"参数状态"
prop=
"status"
>
<el-radio-group
v-model=
"form.status"
>
</el-col>
<el-col
:span=
"12"
>
<el-form-item
label=
"身份证号"
prop=
"idNumber"
>
<el-input
v-model
.
trim=
"form.idNumber"
placeholder=
"请输入身份证号"
maxlength=
"18"
/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col
:span=
"12"
>
<el-form-item
v-if=
"form.businessId == undefined"
label=
"状态"
>
<el-radio-group
v-model=
"form.flag"
>
<el-radio
v-for=
"dict in statusOptions.filter(item => { return item.dictValue })
"
v-for=
"dict in statusOptions
"
:key=
"dict.dictValue"
:label=
"dict.dictValue"
>
{{ dict.dictLabel }}
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item
label=
"备注"
prop=
"remarks"
>
<el-input
v-model
.
trim=
"form.remarks"
type=
"textarea"
show-word-limit
maxlength=
"200"
placeholder=
"请输入内容"
/>
</el-col>
</el-row>
<el-row>
<el-col
:span=
"24"
>
<el-form-item
label=
"部门"
prop=
"postId"
>
<treeSelect
v-model=
"form.deptId"
:disable-branch-nodes=
"true"
:options=
"deptChildren"
:show-count=
"true"
placeholder=
"请选择归属部门"
@
input=
"changeValue"
/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col
:span=
"24"
>
<el-form-item
label=
"角色"
prop=
"postId"
>
<el-select
v-model=
"form.roleList"
multiple
placeholder=
"请选择"
style=
"width: 100%"
@
change=
"roleChange"
>
<el-option
v-for=
"item in options"
:key=
"item.businessId"
:label=
"item.roleName"
:value=
"item.businessId"
/>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col
:span=
"24"
>
<el-form-item
label=
"备注"
>
<el-input
v-model=
"form.remarks"
type=
"textarea"
placeholder=
"请输入内容"
/>
</el-form-item>
</el-col>
</el-row>
</el-form>
<div
slot=
"footer"
class=
"dialog-footer"
>
<el-button
type=
"primary"
@
click=
"submitForm"
>
确 定
</el-button>
<el-button
@
click=
"cancel"
>
取 消
</el-button>
<el-button
type=
"primary"
@
click=
"submitForm"
>
确 定
</el-button>
</div>
</el-dialog>
<!-- 用户导入对话框 -->
<el-dialog
:title=
"upload.title"
:visible
.
sync=
"upload.open"
width=
"400px"
append-to-body
>
<el-upload
accept=
".xlsx, .xls"
:headers=
"upload.headers"
:action=
"upload.url + '?updateSupport=' + upload.updateSupport"
:disabled=
"upload.isUploading"
:on-progress=
"handleFileUploadProgress"
:on-success=
"handleFileSuccess"
:auto-upload=
"false"
:on-change=
"employeeUpload"
:on-remove=
"handleRemove"
:before-remove=
"beforeRemove"
:on-preview=
"handlePreview"
:file-list=
"fileList"
drag
>
<i
class=
"el-icon-upload"
/>
<div
class=
"el-upload__text"
>
将文件拖到此处,或
<em>
点击上传
</em>
</div>
<div
slot=
"tip"
class=
"el-upload__tip"
>
<el-checkbox
v-model=
"upload.updateSupport"
/>
是否更新已经存在的用户数据
<el-link
type=
"info"
style=
"font-size:12px"
@
click=
"importTemplate"
>
下载模板
</el-link>
</div>
<div
slot=
"tip"
class=
"el-upload__tip"
style=
"color:red"
>
提示:仅允许导入“xls”或“xlsx”格式文件!
</div>
</el-upload>
<div
slot=
"footer"
class=
"dialog-footer"
>
<el-button
@
click=
"upload.open = false"
>
取 消
</el-button>
<el-button
:loading=
"importLoading"
type=
"primary"
@
click=
"submitFileForm"
>
确 定
</el-button>
</div>
</el-dialog>
<el-dialog
:close-on-click-modal=
"false"
title=
"修改密码"
width=
"30%"
custom-class=
"paddingFixed"
:visible
.
sync=
"resetPwdDiaLog"
@
close=
"$refs.ruleForm.resetFields(),pwdType = 'password'"
>
<el-form
ref=
"ruleForm"
:model=
"ruleForm"
:rules=
"rules"
label-width=
"auto"
class=
"demo-ruleForm"
>
<el-form-item
label=
"新密码"
prop=
"newPassword"
>
<el-input
id=
"restPwd"
v-model
.
trim=
"ruleForm.newPassword"
:show-password=
"false"
autocomplete=
"off"
auto-complete=
"off"
:type=
"pwdType"
placeholder=
"请输入8~16位,由字母和数字混合所组成的新密码"
:maxlength=
"16"
>
<svg-icon
slot=
"suffix"
:style=
"{ width: '18px', height: '18px', verticalAlign: pwdTypeMap[pwdType] ? 'middle' : '-6px', marginRight: '5px', cursor: 'pointer' }"
:icon-class=
"pwdType === 'password' ? 'eye' : 'eye-open'"
@
click
.
stop=
"pwdTypeMap[pwdType] ? pwdType = 'password' : pwdType = 'text'"
/>
</el-input>
</el-form-item>
</el-form>
<span
slot=
"footer"
class=
"dialog-footer"
>
<el-button
@
click=
"resetPwdDiaLog = false"
>
取 消
</el-button>
<el-button
:disabled=
"userRestLoading"
:loading=
"userRestLoading"
type=
"primary"
@
click=
"handleResetPwdSure"
>
确 定
</el-button>
</span>
</el-dialog>
</div>
</template>
<
script
>
import
{
listData
,
getData
,
delData
,
addData
,
updateData
,
exportData
,
checkDictLabelUnique
}
from
'@/api/system/dict/data'
import
{
listType
,
getType
,
updateType
}
from
'@/api/system/dict/type'
import
dictCons
from
'@/utils/dictCons'
import
{
listUser
,
getUser
,
delUser
,
addUser
,
updateUser
,
exportUser
,
resetUserPwd
,
changeUserStatus
,
importExcel
,
uploadFalseFile
,
importTemplate
// userLoginManage
}
from
'@/api/system/user'
import
{
getToken
}
from
'@/utils/auth'
import
{
getChildrenDept
,
treeselect
}
from
'@/api/system/dept'
import
TreeSelect
from
'@riophae/vue-treeselect'
import
'@riophae/vue-treeselect/dist/vue-treeselect.css'
import
{
getlistRole
,
listRole
}
from
'@/api/system/role'
export
default
{
name
:
'Data'
,
name
:
'User'
,
components
:
{
TreeSelect
},
data
()
{
const
verifyIDProp
=
(
rule
,
value
,
callback
)
=>
{
if
(
value
===
''
||
value
===
undefined
||
value
===
null
)
{
var
trueGroupName
=
(
rule
,
value
,
callback
)
=>
{
if
(
value
&&
!
value
.
trim
())
{
return
callback
(
new
Error
(
'请输入正确的用户昵称'
))
}
callback
()
}
else
if
(
!
this
.
form
.
dictLabelOne
||
this
.
form
.
dictLabelOne
!==
this
.
form
.
dictLabel
)
{
// 验证编码是否重复
checkDictLabelUnique
(
this
.
form
.
dictLabel
).
then
(
(
res
)
=>
{
if
(
res
.
code
===
200
)
{
if
(
res
.
msg
===
'0'
)
{
}
var
passwordCheck
=
(
rule
,
value
,
callback
)
=>
{
const
pattern
=
/^
(?![
0-9
]
+$
)(?![
a-zA-Z
]
+$
)[
0-9A-Za-z
]{8,16}
$/
if
(
!
pattern
.
test
(
value
))
{
callback
(
new
Error
(
'新密码必须为数字与字母的组合'
))
}
callback
()
}
else
if
(
res
.
msg
===
'1'
)
{
callback
(
new
Error
(
'字典标签已存在'
))
}
var
phone
=
(
rule
,
value
,
callback
)
=>
{
if
(
!
value
)
{
return
callback
(
new
Error
(
'请输入手机号'
))
}
else
{
callback
()
}
}
var
idNumber
=
(
rule
,
value
,
callback
)
=>
{
if
(
!
value
)
{
return
callback
(
new
Error
(
'请输入身份证号'
))
}
else
{
callback
()
}
}
).
catch
(
err
=>
{
callback
()
}
)
var
name
=
(
rule
,
value
,
callback
)
=>
{
if
(
!
value
)
{
return
callback
(
new
Error
(
'请输入用户类型'
)
)
}
else
{
callback
()
}
}
return
{
pwdTypeMap
:
{
text
:
true
,
password
:
false
},
pwdType
:
'password'
,
// 遮罩层
loading
:
true
,
// 导入列表
fileList
:
[],
// 选中数组
ids
:
[],
// 非单个禁用
single
:
true
,
// 非多个禁用
multiple
:
true
,
// 显示搜索条件
showSearch
:
true
,
// 总条数
total
:
0
,
//
字典
表格数据
dataList
:
[]
,
//
默认字典类型
defaultDictType
:
''
,
//
用户
表格数据
userList
:
null
,
//
显示查询条件
showSearch
:
true
,
// 弹出层标题
title
:
''
,
resetPwdDiaLog
:
false
,
// 部门树选项
deptOptions
:
undefined
,
deptOptionsTree
:
undefined
,
currentNode
:
undefined
,
currentNodeKey
:
false
,
options
:
[],
// 是否显示弹出层
open
:
false
,
// 部门名称
deptName
:
undefined
,
// 默认密码
initPassword
:
undefined
,
importLoading
:
false
,
// // 时间范围
// dateRange: ['', ''],
// 状态数据字典
statusOptions
:
[],
// 类型数据字典
typeOptions
:
[],
statusOptions
:
[
{
dictLabel
:
'启用'
,
dictValue
:
'1'
},
{
dictLabel
:
'停用'
,
dictValue
:
'0'
}
],
// 性别状态字典
sexOptions
:
[
{
label
:
'男'
,
value
:
'0'
},
{
label
:
'女'
,
value
:
'1'
}
],
// 岗位选项
postOptions
:
[],
// 角色选项
roleOptions
:
[],
// 子部门信息
deptChildren
:
[],
// 表单参数
form
:
{
username
:
''
,
phone
:
''
,
email
:
''
,
idNumber
:
''
,
name
:
''
},
defaultProps
:
{
children
:
'children'
,
label
:
'label'
},
ruleForm
:
{
newPassword
:
''
,
row
:
undefined
},
// 用户导入参数
upload
:
{
// 是否显示弹出层(用户导入)
open
:
false
,
// 弹出层标题(用户导入)
title
:
''
,
// 是否禁用上传
isUploading
:
false
,
// 是否更新已经存在的用户数据
updateSupport
:
0
,
// 设置上传的请求头部
headers
:
{
Authorization
:
'Bearer '
+
getToken
()
},
// 上传的地址
url
:
process
.
env
.
VUE_APP_BASE_API
+
'/system/user/importExcel'
},
// 查询参数
queryParams
:
{
pageNum
:
1
,
pageSize
:
10
,
dictName
:
undefined
,
dictType
:
undefined
,
status
:
''
,
flag
:
undefined
username
:
undefined
,
email
:
undefined
,
phone
:
undefined
,
nickName
:
undefined
,
idNumber
:
undefined
,
userType
:
undefined
,
allowLogin
:
undefined
,
flag
:
undefined
,
deptId
:
undefined
,
name
:
undefined
},
// 表单参数
form
:
{},
// 表单校验
rules
:
{
dictLabel
:
[
{
required
:
true
,
message
:
'请输入参数标签'
,
trigger
:
'blur'
}
// { validator: verifyIDProp, trigger: 'blur' }
username
:
[
{
required
:
true
,
message
:
'请输入登录名'
,
trigger
:
'blur'
}
],
dictValue
:
[
{
required
:
true
,
message
:
'请输入参数键值'
,
trigger
:
'blur'
}
nickName
:
[
{
required
:
false
,
message
:
'请输入用户昵称'
,
trigger
:
'blur'
},
{
validator
:
trueGroupName
,
message
:
'请输入正确的用户昵称'
}
],
dictSort
:
[
{
required
:
true
,
message
:
'请输入参数顺序'
,
trigger
:
'blur'
}
deptId
:
[
{
required
:
false
,
message
:
'请输入归属部门'
,
trigger
:
'blur'
}
],
password
:
[
{
required
:
true
,
message
:
'请输入用户密码'
,
trigger
:
'blur'
},
{
min
:
8
,
max
:
16
,
message
:
'长度在 8 到 16 个字符'
,
trigger
:
'blur'
},
{
validator
:
passwordCheck
,
trigger
:
'blur'
}
],
name
:
[
{
require
:
true
,
message
:
'用户姓名不能为空'
,
trigger
:
'blur'
},
{
validator
:
name
,
trigger
:
'blur'
}
],
email
:
[
{
required
:
false
,
message
:
'请输入邮箱地址'
,
trigger
:
'blur'
},
{
type
:
'email'
,
message
:
'请输入正确的邮箱地址'
,
trigger
:
[
'blur'
,
'change'
]
}
],
newPassword
:
[
{
required
:
true
,
message
:
'请输入密码'
,
trigger
:
'blur'
},
{
min
:
8
,
max
:
16
,
message
:
'长度在 8 到 16 个字符'
,
trigger
:
'blur'
},
{
validator
:
passwordCheck
,
trigger
:
'blur'
}
],
phone
:
[
{
required
:
false
,
message
:
'请输入手机号码'
,
trigger
:
'blur'
},
{
pattern
:
/^1
[
3|4|5|6|7|8|9
][
0-9
]\d{8}
$/
,
message
:
'请输入正确的手机号码'
,
trigger
:
'blur'
},
{
validator
:
phone
,
trigger
:
'blur'
}
],
idNumber
:
[
{
require
:
true
,
message
:
'请输入身份证号'
,
trigger
:
'blur'
},
{
min
:
18
,
max
:
18
,
message
:
'长度18字符'
,
trigger
:
'blur'
},
{
validator
:
idNumber
,
trigger
:
'blur'
}
]
},
manageLoading
:
false
userInfoLoading
:
false
,
userImportLoading
:
false
,
userRestLoading
:
false
,
addLoading
:
false
}
},
created
()
{
const
dictId
=
this
.
$route
.
params
&&
this
.
$route
.
params
.
dictId
this
.
getType
(
dictId
)
this
.
getTypeList
()
this
.
getDicts
(
dictCons
[
'NORMAL_DISABLE'
]).
then
(
response
=>
{
this
.
statusOptions
=
response
.
data
/** 路由离开前存储筛选条件*/
beforeRouteLeave
(
to
,
from
,
next
)
{
this
.
$store
.
dispatch
(
'searchSave/searchParamsSet'
,
{
path
:
this
.
$route
.
path
,
param
:
{
...
this
.
queryParams
}
})
next
()
},
watch
:
{
// 根据名称筛选部门树
deptName
(
val
)
{
this
.
$refs
.
tree
.
filter
(
val
)
}
},
created
()
{
if
(
this
.
$store
.
getters
.
searchParams
[
this
.
$route
.
path
])
{
const
{
searchParams
}
=
this
.
$store
.
getters
;
const
{
path
}
=
this
.
$route
const
param
=
JSON
.
parse
(
searchParams
[
path
])
// 保留着的查询条件
this
.
queryParams
=
{
...
param
}
}
this
.
getList
()
this
.
getTreeSelect
()
this
.
getRole
()
// this.getConfigKey('sys.user.initPassword').then(response => {
// this.initPassword = response.msg
// })
},
methods
:
{
// 状态
changeStatus
(
row
)
{
changeValue
()
{
this
.
$refs
.
form
.
validateField
(
'id'
)
},
/** 查询用户列表 */
getList
()
{
this
.
loading
=
true
listUser
(
this
.
queryParams
).
then
(
response
=>
{
this
.
userList
=
response
.
rows
this
.
total
=
response
.
total
this
.
loading
=
false
}
)
},
roleChange
(
e
)
{
// TODO: clear this log
console
.
log
(
`e`
,
e
)
this
.
$forceUpdate
()
},
/** 查询部门下拉树结构 */
getTreeSelect
()
{
treeselect
().
then
(
response
=>
{
this
.
deptOptionsTree
=
response
.
data
.
concat
({
id
:
-
1
,
label
:
'无部门人员'
,
children
:
undefined
})
if
(
response
.
data
&&
response
.
data
.
length
>
0
)
{
this
.
deptOptions
=
response
.
data
[
0
].
children
}
})
},
/** 查询子部门 */
getChildrenDept
(
userId
)
{
treeselect
().
then
(
response
=>
{
this
.
deptChildren
=
response
.
data
// this.form.postId = response.data.checkedKeys
})
},
getRole
()
{
getlistRole
().
then
(
response
=>
{
this
.
options
=
response
.
data
}
)
},
// 筛选节点
filterNode
(
value
,
data
)
{
if
(
!
value
)
return
true
return
data
.
label
.
indexOf
(
value
)
!==
-
1
},
// 节点单击事件
handleNodeClick
(
data
)
{
if
(
this
.
currentNode
===
data
.
id
)
{
this
.
currentNode
=
undefined
this
.
queryParams
.
deptId
=
''
this
.
currentNodeKey
=
!
this
.
currentNodeKey
}
else
{
this
.
currentNode
=
data
.
id
this
.
queryParams
.
deptId
=
data
.
id
}
this
.
getList
()
},
handleClick
(
data
)
{
// this.form.deptId = data.id
},
// 用户状态修改
handleStatusChange
(
row
)
{
const
text
=
row
.
flag
===
'1'
?
'启用'
:
'停用'
this
.
$confirm
(
'确认要"'
+
text
+
'""'
+
row
.
dictLabel
+
'"吗?'
,
'提示
'
,
{
this
.
$confirm
(
'确认要"'
+
text
+
'""'
+
row
.
username
+
'"用户吗?'
,
'警告
'
,
{
confirmButtonText
:
'确定'
,
cancelButtonText
:
'取消'
,
type
:
'warning'
}).
then
(
function
()
{
return
updateData
(
row
)
return
changeUserStatus
(
row
.
businessId
,
row
.
flag
)
}).
then
(()
=>
{
this
.
$message
({
message
:
text
+
'成功'
,
...
...
@@ -314,33 +719,6 @@ export default {
row
.
flag
=
row
.
flag
===
'0'
?
'1'
:
'0'
})
},
/** 查询字典类型详细 */
getType
(
dictId
)
{
getType
(
dictId
).
then
(
response
=>
{
this
.
queryParams
.
dictType
=
response
.
data
.
dictType
this
.
defaultDictType
=
response
.
data
.
dictType
this
.
getList
()
})
},
/** 查询字典类型列表 */
getTypeList
()
{
listType
().
then
(
response
=>
{
this
.
typeOptions
=
response
.
rows
})
},
/** 查询字典数据列表 */
getList
()
{
this
.
loading
=
true
listData
(
this
.
queryParams
).
then
(
response
=>
{
this
.
dataList
=
response
.
rows
this
.
total
=
response
.
total
this
.
loading
=
false
})
},
// 数据状态字典翻译
statusFormat
(
row
,
column
)
{
return
this
.
selectDictLabel
(
this
.
statusOptions
,
row
.
flag
)
},
// 取消按钮
cancel
()
{
this
.
open
=
false
...
...
@@ -349,65 +727,127 @@ export default {
// 表单重置
reset
()
{
this
.
form
=
{
bussinessId
:
undefined
,
dictCode
:
undefined
,
dictLabel
:
undefined
,
dictValue
:
undefined
,
dictSort
:
0
,
flag
:
'1'
,
status
:
'0'
,
remarks
:
undefined
userId
:
undefined
,
deptId
:
undefined
,
phone
:
undefined
,
username
:
undefined
,
userType
:
undefined
,
nickName
:
undefined
,
password
:
undefined
,
idNumber
:
undefined
,
email
:
undefined
,
sex
:
undefined
,
flag
:
undefined
,
remark
:
undefined
,
postIds
:
[],
roleIds
:
[]
}
this
.
resetForm
(
'form'
)
},
/**
搜索
按钮操作 */
/**
查询
按钮操作 */
handleQuery
()
{
this
.
queryParams
.
page
Num
=
1
this
.
queryParams
.
page
=
1
this
.
getList
()
},
/** 重置按钮操作 */
resetQuery
()
{
this
.
resetForm
(
'queryForm'
)
this
.
queryParams
.
dictType
=
this
.
defaultDictType
this
.
handleQuery
()
},
/** 新增按钮操作 */
handleAdd
()
{
this
.
reset
()
this
.
open
=
true
this
.
title
=
'添加字典数据'
this
.
form
.
dictType
=
this
.
queryParams
.
dictType
},
// 多选框选中数据
handleSelectionChange
(
selection
)
{
this
.
ids
=
selection
.
map
(
item
=>
item
.
business
Id
)
this
.
ids
=
selection
.
map
(
item
=>
item
.
user
Id
)
this
.
single
=
selection
.
length
!==
1
this
.
multiple
=
!
selection
.
length
},
/** 没有实际作用,用来展示切换tab后表单字段保留功能*/
handleFormAdd
()
{
this
.
$router
.
push
(
{
path
:
'/system/user/addFormList'
}
)
},
/** 新增按钮操作 */
handleAdd
()
{
this
.
reset
()
this
.
getChildrenDept
(
0
)
this
.
open
=
true
this
.
title
=
'添加用户'
},
/** 修改按钮操作 */
handleUpdate
(
row
)
{
this
.
reset
()
const
dictCode
=
row
.
businessId
||
this
.
ids
getData
(
dictCode
).
then
(
response
=>
{
this
.
form
=
response
.
data
this
.
form
.
dictLabelOne
=
response
.
data
.
dictLabel
const
userId
=
row
.
businessId
||
this
.
ids
getUser
(
userId
).
then
(
response
=>
{
this
.
open
=
true
this
.
title
=
'修改字典数据'
this
.
form
=
response
.
data
const
data
=
response
.
data
.
roleIds
.
split
(
','
)
// TODO: clear this log
console
.
log
(
`data`
,
data
)
this
.
form
.
roleList
=
[]
data
.
forEach
(
item
=>
{
const
id
=
Number
(
item
)
this
.
form
.
roleList
.
push
(
id
)
})
// this.form.postId = response.data.deptId
this
.
title
=
'修改'
})
this
.
getChildrenDept
(
userId
)
},
/** 重置密码按钮操作 */
handleResetPwd
(
row
)
{
this
.
ruleForm
.
newPassword
=
''
this
.
ruleForm
.
row
=
row
.
businessId
this
.
resetPwdDiaLog
=
!
this
.
resetPwdDiaLog
},
handleResetPwdSure
()
{
this
.
$refs
.
ruleForm
.
validate
(
pass
=>
{
if
(
pass
)
{
this
.
userRestLoading
=
true
resetUserPwd
(
this
.
ruleForm
.
row
,
this
.
ruleForm
.
newPassword
).
then
(
response
=>
{
if
(
response
.
code
===
200
)
{
this
.
$message
({
message
:
'修改成功'
,
type
:
'success'
})
this
.
resetPwdDiaLog
=
false
}
this
.
userRestLoading
=
false
}).
catch
(
e
=>
{
this
.
userRestLoading
=
false
})
}
else
{
return
false
}
})
},
// 数组值是否相同
isAllEqual
(
array
)
{
if
(
array
.
length
>
0
)
{
return
!
array
.
some
(
function
(
value
,
index
)
{
return
value
!==
array
[
0
]
})
}
else
{
return
true
}
},
/** 提交按钮 */
submitForm
:
function
()
{
submitForm
()
{
this
.
$refs
[
'form'
].
validate
(
valid
=>
{
if
(
valid
)
{
if
(
this
.
form
.
businessId
!==
undefined
)
{
updateData
(
this
.
form
).
then
(
response
=>
{
this
.
msgSuccess
(
'修改成功'
)
updateUser
(
this
.
form
).
then
(
response
=>
{
this
.
$message
({
message
:
'修改成功'
,
type
:
'success'
})
this
.
open
=
false
this
.
getList
()
})
}
else
{
addData
(
this
.
form
).
then
(
response
=>
{
this
.
msgSuccess
(
'新增成功'
)
addUser
(
this
.
form
).
then
(
response
=>
{
this
.
$message
({
message
:
'新增成功'
,
type
:
'success'
})
this
.
open
=
false
this
.
getList
()
})
...
...
@@ -417,17 +857,17 @@ export default {
},
/** 删除按钮操作 */
handleDelete
(
row
)
{
const
dictCodes
=
row
.
businessId
||
this
.
ids
const
userId
=
row
.
businessId
||
this
.
ids
this
.
$confirm
(
'所选择数据被删除后不可再恢复,是否继续?'
,
'提示'
,
{
confirmButtonText
:
'确定'
,
cancelButtonText
:
'取消'
,
type
:
'warning'
}).
then
(
function
()
{
return
del
Data
(
dictCodes
)
return
del
User
(
userId
)
}).
then
(()
=>
{
this
.
getList
()
this
.
$message
({
message
:
'
删
除成功'
,
message
:
'
刪
除成功'
,
type
:
'success'
})
}).
catch
(
function
()
{})
...
...
@@ -435,43 +875,147 @@ export default {
/** 导出按钮操作 */
handleExport
()
{
const
queryParams
=
this
.
queryParams
this
.
$confirm
(
'是否确认导出所有
数据项
?'
,
'警告'
,
{
this
.
$confirm
(
'是否确认导出所有
用户信息
?'
,
'警告'
,
{
confirmButtonText
:
'确定'
,
cancelButtonText
:
'取消'
,
type
:
'warning'
}).
then
(
function
()
{
return
exportData
(
queryParams
).
then
(
response
=>
{
return
exportUser
(
queryParams
).
then
(
response
=>
{
const
blob
=
new
Blob
([
response
])
const
downloadElement
=
document
.
createElement
(
'a'
)
const
href
=
window
.
URL
.
createObjectURL
(
blob
)
// 创建下载的链接
downloadElement
.
href
=
href
downloadElement
.
download
=
'用户信息'
+
'.xls'
// 下载后文件名
document
.
body
.
appendChild
(
downloadElement
)
downloadElement
.
click
()
// 点击下载
document
.
body
.
removeChild
(
downloadElement
)
// 下载完成移除元素
window
.
URL
.
revokeObjectURL
(
href
)
// 释放掉blob对象
// this.download(response.msg);
})
})
},
/** 导入按钮操作 */
handleImport
()
{
this
.
upload
.
title
=
'用户导入'
this
.
upload
.
open
=
true
},
/** 下载模板操作 */
importTemplate
()
{
importTemplate
().
then
(
response
=>
{
const
blob
=
new
Blob
([
response
])
const
downloadElement
=
document
.
createElement
(
'a'
)
const
href
=
window
.
URL
.
createObjectURL
(
blob
)
// 创建下载的链接
downloadElement
.
href
=
href
downloadElement
.
download
=
'字典数据信息
'
+
'.xls'
// 下载后文件名
downloadElement
.
download
=
'用户导入模板
'
+
'.xls'
// 下载后文件名
document
.
body
.
appendChild
(
downloadElement
)
downloadElement
.
click
()
// 点击下载
document
.
body
.
removeChild
(
downloadElement
)
// 下载完成移除元素
window
.
URL
.
revokeObjectURL
(
href
)
// 释放掉blob对象
// this.download(response.msg);
})
},
// 文件上传中处理
handleFileUploadProgress
(
event
,
file
,
fileList
)
{
this
.
upload
.
isUploading
=
true
},
// 文件上传成功处理
handleFileSuccess
(
response
,
file
,
fileList
)
{
this
.
upload
.
open
=
false
this
.
upload
.
isUploading
=
false
this
.
$refs
.
upload
.
clearFiles
()
this
.
$alert
(
response
.
msg
,
'导入结果'
,
{
dangerouslyUseHTMLString
:
true
})
this
.
getList
()
},
// 提交上传文件
submitFileForm
()
{
// this.$refs.upload.submit()
this
.
importLoading
=
true
if
(
this
.
fileList
.
length
===
0
)
{
this
.
$message
.
warning
(
'请上传文件'
)
// 导入成功后关闭弹出框
this
.
importLoading
=
false
this
.
upload
.
open
=
true
}
else
{
// 根据后台需求数据格式
var
formData
=
new
FormData
()
// 当前为空
formData
.
append
(
'file'
,
this
.
fileList
)
importExcel
(
formData
).
then
(
res
=>
{
if
(
res
.
code
===
200
)
{
if
(
res
.
data
.
filename
===
null
)
{
this
.
$message
.
success
(
'导入成功'
)
this
.
fileList
=
[]
// 导入成功后关闭弹出框
this
.
importLoading
=
false
this
.
upload
.
open
=
false
// 导入成功后刷新页面
this
.
getList
()
}
else
{
uploadFalseFile
({
fileName
:
res
.
data
.
filename
}).
then
(
res
=>
{
const
blob
=
new
Blob
([
res
])
const
downloadElement
=
document
.
createElement
(
'a'
)
const
href
=
window
.
URL
.
createObjectURL
(
blob
)
// 创建下载的链接
downloadElement
.
href
=
href
downloadElement
.
download
=
'模板错误提示'
+
'.txt'
// 下载后文件名
document
.
body
.
appendChild
(
downloadElement
)
downloadElement
.
click
()
// 点击下载
document
.
body
.
removeChild
(
downloadElement
)
// 下载完成移除元素
window
.
URL
.
revokeObjectURL
(
href
)
// 释放掉blob对象
})
}
this
.
importLoading
=
false
}
else
if
(
res
.
code
===
41020
)
{
this
.
$message
.
info
(
'上传超时,请重新上传'
)
this
.
importLoading
=
false
}
}).
catch
(
err
=>
{
this
.
$message
.
success
(
err
.
message
)
this
.
importLoading
=
false
})
}
},
employeeUpload
(
file
,
fileList
)
{
if
(
fileList
.
length
>
1
)
{
fileList
.
splice
(
0
,
1
)
}
this
.
fileList
=
fileList
[
0
].
raw
},
handleRemove
(
file
,
fileList
)
{
this
.
fileList
=
[]
},
beforeRemove
(
file
,
fileList
)
{
this
.
fileList
=
[]
},
/* 上传文件所需求 */
handlePreview
(
file
)
{
}
}
}
</
script
>
<
style
lang=
"scss"
scoped
>
.app-container
{
.user-manage
{
font-size
:
18px
;
padding
:
0
;
.placeholder
{
height
:
1
.3vh
;
background-color
:
#F4F4F4
;
margin-bottom
:
10px
height
:
14px
;
background-color
:
#F4F4F4
}
}
.table-drop
{
margin-left
:
15px
;
font-size
:
16px
;
font-weight
:
bold
;
color
:
#46BCF3
;
}
</
style
>
<
style
lang=
"scss"
>
.user-manage
{
.formClass
{
}
.optionsContent
{
box-sizing
:
border-box
;
width
:
100%
;
padding
:
0
0
0
10px
;
display
:
flex
;
flex-direction
:
row
;
.paddingFixed
{
.el-dialog__body
{
padding-bottom
:
17px
;
}
}
.el-form-item__label-wrap
{
margin-left
:
0
!
important
;
}
}
</
style
>
src/views/system/role/index.vue
View file @
caebd246
...
...
@@ -109,13 +109,13 @@
style=
"color: #49cec9"
@
click=
"handleUpdate(scope.row)"
>
修改
</el-button>
<
el-button
v-hasPermi=
"['sys:role:update']"
size=
"mini"
type=
"text"
icon=
"el-icon-circle-check"
@
click=
"handleMenu(scope.row)"
>
数据权限
</el-button
>
<
!--
<el-button-->
<!-- v-hasPermi="['sys:role:update']"-->
<!-- size="mini"-->
<!-- type="text"-->
<!-- icon="el-icon-circle-check"-->
<!-- @click="handleMenu(scope.row)"-->
<!-- >数据权限
</el-button>
--
>
<el-button
size=
"mini"
type=
"text"
...
...
@@ -674,7 +674,7 @@ export default {
}
</
script
>
<
style
lang=
"scss"
scoped
>
.app-container
{
.app-container
{
font-size
:
18px
;
padding
:
0
;
...
...
@@ -693,9 +693,9 @@ export default {
.el-switch
{
margin-left
:
15px
;
}
}
.el-divider--vertical
{
}
.el-divider--vertical
{
height
:
12em
;
width
:
4px
;
}
}
</
style
>
src/views/system/user/index.vue
View file @
caebd246
...
...
@@ -43,14 +43,14 @@
<el-button
type=
"primary"
style=
"padding: 8px 7px;"
icon=
"el-icon-refresh"
size=
"small"
@
click=
"resetQuery"
>
重置
</el-button>
</el-form-item>
<el-form-item
style=
"float: right"
>
<!--
<el-button-->
<!-- v-hasPermi="['sys:user:add']"-->
<!-- style="padding: 8px 7px;"-->
<!-- type="primary"-->
<!-- size="small"-->
<!-- icon="el-icon-plus"-->
<!-- @click="handleFormAdd"-->
<!-- >表单页新增模板
</el-button>
-->
<!--
<el-button-->
<!-- v-hasPermi="['sys:user:add']"-->
<!-- style="padding: 8px 7px;"-->
<!-- type="primary"-->
<!-- size="small"-->
<!-- icon="el-icon-plus"-->
<!-- @click="handleFormAdd"-->
<!-- >表单页新增模板
</el-button>
-->
<el-button
v-hasPermi=
"['sys:user:add']"
style=
"padding: 8px 7px;"
...
...
@@ -129,7 +129,7 @@
{{
scope
.
row
.
username
||
'-'
}}
</
template
>
</el-table-column>
<el-table-column
label=
"用户
类型
"
prop=
"userType"
:show-overflow-tooltip=
"true"
>
<el-table-column
label=
"用户
名称
"
prop=
"userType"
:show-overflow-tooltip=
"true"
>
<
template
slot-scope=
"scope"
>
{{
scope
.
row
.
name
||
'-'
}}
</
template
>
...
...
@@ -248,8 +248,8 @@
</el-row>
<el-row>
<el-col
:span=
"12"
>
<el-form-item
label=
"用户
类型
"
prop=
"name"
>
<el-input
v-model
.
trim=
"form.name"
placeholder=
"请输入用户
类型
"
/>
<el-form-item
label=
"用户
名称
"
prop=
"name"
>
<el-input
v-model
.
trim=
"form.name"
placeholder=
"请输入用户
名称
"
/>
</el-form-item>
</el-col>
<el-col
:span=
"12"
>
...
...
@@ -273,11 +273,10 @@
</el-row>
<el-row>
<el-col
:span=
"24"
>
<el-form-item
label=
"
岗位
"
prop=
"postId"
>
<el-form-item
label=
"
部门
"
prop=
"postId"
>
<treeSelect
v-model=
"form.
pos
tId"
v-model=
"form.
dep
tId"
:disable-branch-nodes=
"true"
multiple
:options=
"deptChildren"
:show-count=
"true"
placeholder=
"请选择归属部门"
...
...
@@ -286,6 +285,20 @@
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col
:span=
"24"
>
<el-form-item
label=
"角色"
prop=
"postId"
>
<el-select
v-model=
"form.roleList"
multiple
placeholder=
"请选择"
style=
"width: 100%"
@
change=
"roleChange"
>
<el-option
v-for=
"item in options"
:key=
"item.businessId"
:label=
"item.roleName"
:value=
"item.businessId"
/>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col
:span=
"24"
>
<el-form-item
label=
"备注"
>
...
...
@@ -387,6 +400,7 @@ import { getToken } from '@/utils/auth'
import
{
getChildrenDept
,
treeselect
}
from
'@/api/system/dept'
import
TreeSelect
from
'@riophae/vue-treeselect'
import
'@riophae/vue-treeselect/dist/vue-treeselect.css'
import
{
getlistRole
,
listRole
}
from
'@/api/system/role'
export
default
{
name
:
'User'
,
...
...
@@ -456,6 +470,7 @@ export default {
deptOptionsTree
:
undefined
,
currentNode
:
undefined
,
currentNodeKey
:
false
,
options
:
[],
// 是否显示弹出层
open
:
false
,
// 部门名称
...
...
@@ -615,9 +630,10 @@ export default {
}
this
.
getList
()
this
.
getTreeSelect
()
this
.
getConfigKey
(
'sys.user.initPassword'
).
then
(
response
=>
{
this
.
initPassword
=
response
.
msg
})
this
.
getRole
()
// this.getConfigKey('sys.user.initPassword').then(response => {
// this.initPassword = response.msg
// })
},
methods
:
{
changeValue
()
{
...
...
@@ -633,6 +649,11 @@ export default {
}
)
},
roleChange
(
e
)
{
// TODO: clear this log
console
.
log
(
`e`
,
e
)
this
.
$forceUpdate
()
},
/** 查询部门下拉树结构 */
getTreeSelect
()
{
treeselect
().
then
(
response
=>
{
...
...
@@ -648,11 +669,18 @@ export default {
},
/** 查询子部门 */
getChildrenDept
(
userId
)
{
getChildrenDept
(
userId
).
then
(
response
=>
{
this
.
deptChildren
=
response
.
data
.
postChildren
this
.
form
.
postId
=
response
.
data
.
checkedKeys
treeselect
(
).
then
(
response
=>
{
this
.
deptChildren
=
response
.
data
//
this.form.postId = response.data.checkedKeys
})
},
getRole
()
{
getlistRole
().
then
(
response
=>
{
this
.
options
=
response
.
data
}
)
},
// 筛选节点
filterNode
(
value
,
data
)
{
if
(
!
value
)
return
true
...
...
@@ -754,6 +782,15 @@ export default {
getUser
(
userId
).
then
(
response
=>
{
this
.
open
=
true
this
.
form
=
response
.
data
const
data
=
response
.
data
.
roleIds
.
split
(
','
)
// TODO: clear this log
console
.
log
(
`data`
,
data
)
this
.
form
.
roleList
=
[]
data
.
forEach
(
item
=>
{
const
id
=
Number
(
item
)
this
.
form
.
roleList
.
push
(
id
)
})
// this.form.postId = response.data.deptId
this
.
title
=
'修改'
})
this
.
getChildrenDept
(
userId
)
...
...
@@ -954,22 +991,22 @@ export default {
}
</
script
>
<
style
lang=
"scss"
scoped
>
.user-manage
{
.user-manage
{
font-size
:
18px
;
.placeholder
{
height
:
14px
;
background-color
:
#F4F4F4
}
}
.table-drop
{
}
.table-drop
{
margin-left
:
15px
;
font-size
:
16px
;
font-weight
:
bold
;
color
:
#46BCF3
;
}
}
</
style
>
<
style
lang=
"scss"
>
.user-manage
{
.user-manage
{
.formClass
{
}
.paddingFixed
{
...
...
@@ -980,5 +1017,5 @@ export default {
.el-form-item__label-wrap
{
margin-left
:
0
!
important
;
}
}
}
</
style
>
vue.config.js
View file @
caebd246
...
...
@@ -79,9 +79,10 @@ module.exports = {
// }
// },
[
process
.
env
.
VUE_APP_BASE_API
]:
{
// target: `http://192.168.1.
17:10010/internal
`,
// target: `http://192.168.1.
29:8088/
`,
// target: `http://10.5.87.231:10010/internal`,
target
:
`http://117.122.212.91:32012/`
,
// target: `http://117.122.212.91:32012/`,
target
:
`http://192.144.239.97:20070/`
,
changeOrigin
:
true
,
pathRewrite
:
{
[
'^'
+
process
.
env
.
VUE_APP_BASE_API
]:
''
...
...
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