Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
W
wangxiaolu-sfa-ui
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
sfa
wangxiaolu-sfa-ui
Commits
a8a46e49
提交
a8a46e49
authored
1月 08, 2025
作者:
lidongxu
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
refactor(user.js): 重构-用户管理页面
同上
上级
c63df3f7
隐藏空白字符变更
内嵌
并排
正在显示
4 个修改的文件
包含
690 行增加
和
441 行删除
+690
-441
index.vue
src/components/CategoryTree/index.vue
+12
-5
index.vue
src/components/ToolTip/index.vue
+31
-0
main.js
src/main.js
+3
-0
index.vue
src/views/system/user/index.vue
+644
-436
没有找到文件。
src/components/CategoryTree/index.vue
浏览文件 @
a8a46e49
...
...
@@ -54,7 +54,7 @@
@
pagination=
"getPageList"
/>
<!-- 折叠分类侧边栏 -->
<div
class=
"arrow"
@
click=
"h
ideSideBar = true
"
>
@
click=
"h
andleClick
"
>
<svg-icon
icon-class=
"left-arrow"
/>
</div>
</div>
...
...
@@ -62,7 +62,7 @@
<!-- 展开分类侧边栏 -->
<div
class=
"arrow"
v-show=
"hideSideBar"
@
click=
"h
ideSideBar = !hideSideBar
"
>
@
click=
"h
andleClick
"
>
<svg-icon
icon-class=
"right-arrow"
/>
</div>
</el-col>
...
...
@@ -150,7 +150,7 @@ watch(searchValue, (val) => {
}
else
{
// 有分页,走外面接口搜索
queryParams
.
searchKey
=
val
emits
(
'search'
,
queryParams
)
//
emits('search', queryParams)
}
})
...
...
@@ -167,11 +167,12 @@ watch(() => props.modelValue, (val) => {
// 点击空白位置-取消选中效果
const
cancelSel
=
()
=>
{
// 刚才有过点击的某行
console
.
log
(
666
,
lastRow
.
value
)
if
(
lastRow
.
value
)
{
treeRef
.
value
.
setCurrentKey
(
null
)
lastRow
.
value
=
null
emits
(
'update:modelValue'
,
''
)
emits
(
'search'
)
emits
(
'search'
,
null
)
}
}
...
...
@@ -181,11 +182,13 @@ const handleNodeClick = (row) => {
if
(
lastRowId
.
value
===
row
[
props
.
nodeKey
])
{
treeRef
.
value
.
setCurrentKey
(
null
)
lastRowId
.
value
=
null
lastRow
.
value
=
null
}
else
{
lastRowId
.
value
=
row
[
props
.
nodeKey
]
lastRow
.
value
=
row
}
emits
(
'update:modelValue'
,
lastRowId
.
value
?
row
[
props
.
nodeKey
]
:
''
)
emits
(
'search'
)
emits
(
'search'
,
row
)
}
// tree 筛选节点
...
...
@@ -198,6 +201,10 @@ const filterNode = (value, data) => {
const
getPageList
=
()
=>
{
emits
(
'pageChange'
,
queryParams
)
}
const
handleClick
=
()
=>
{
hideSideBar
.
value
=!
hideSideBar
.
value
}
</
script
>
<
style
scoped
...
...
src/components/ToolTip/index.vue
0 → 100644
浏览文件 @
a8a46e49
<
template
>
<div
class=
"wrap"
>
<el-tooltip
v-if=
"show"
v-bind=
"$attrs"
>
<slot></slot>
</el-tooltip>
<div
@
mouseenter=
"show = true"
@
mouseleave=
"show = false"
v-else
>
<slot></slot>
</div>
</div>
</
template
>
<
script
>
export
default
{
name
:
'MouseToolTip'
,
data
()
{
return
{
show
:
false
}
}
}
</
script
>
<
style
scoped
lang=
"scss"
>
.wrap
{
display
:
inline-block
;
}
</
style
>
\ No newline at end of file
src/main.js
浏览文件 @
a8a46e49
...
...
@@ -48,6 +48,8 @@ import NoData from '@/components/NoData'
import
CategoryTree
from
'@/components/CategoryTree'
// 返回头部
import
BackToUp
from
'@/components/BackToUp'
// 自定义 toolTip
import
CustomToolTip
from
'@/components/ToolTip'
const
app
=
createApp
(
App
)
...
...
@@ -76,6 +78,7 @@ app.component('GroupLegend', GroupLegend)
app
.
component
(
'NoData'
,
NoData
)
app
.
component
(
'CategoryTree'
,
CategoryTree
)
app
.
component
(
'BackToUp'
,
BackToUp
)
app
.
component
(
'CustomToolTip'
,
CustomToolTip
)
// 全局插件
app
.
use
(
plugins
)
...
...
src/views/system/user/index.vue
浏览文件 @
a8a46e49
<
template
>
<div
class=
"app-container"
>
<el-row
:gutter=
"20"
>
<splitpanes
:horizontal=
"appStore.device === 'mobile'"
class=
"default-theme"
>
<!--部门数据-->
<pane
size=
"16"
>
<el-col>
<div
class=
"head-container"
>
<el-input
v-model=
"deptName"
placeholder=
"请输入部门名称"
clearable
prefix-icon=
"Search"
style=
"margin-bottom: 20px"
/>
</div>
<div
class=
"head-container"
>
<el-tree
:data=
"deptOptions"
:props=
"
{ label: 'label', children: 'children' }" :expand-on-click-node="false" :filter-node-method="filterNode" ref="deptTreeRef" node-key="id" highlight-current default-expand-all @node-click="handleNodeClick" />
</div>
<el-row
:gutter=
"20"
class=
"client-fix-height"
>
<!--部门数据-->
<category-tree
:options=
"deptOptions"
:defaultProps=
"
{ label: 'label', children: 'children' }"
node-key="id"
placeholder="搜索部门名称"
:defaultExpandList="defaultExpandedKeys"
:colSpan="4"
@search="handleNodeClick">
</category-tree>
<!--用户数据-->
<el-col
:span=
"20"
:xs=
"24"
class=
"right_col"
>
<el-form
:model=
"queryParams"
ref=
"queryRef"
:inline=
"true"
v-show=
"showSearch"
label-width=
"68px"
>
<el-form-item
label=
"用户名称"
prop=
"userName"
>
<el-input
v-model=
"queryParams.userName"
placeholder=
"请输入用户名称"
clearable
style=
"width: 240px"
@
keyup
.
enter=
"handleQuery"
/>
</el-form-item>
<el-form-item
label=
"手机号码"
prop=
"phonenumber"
>
<el-input
v-model=
"queryParams.phonenumber"
placeholder=
"请输入手机号码"
clearable
style=
"width: 240px"
@
keyup
.
enter=
"handleQuery"
/>
</el-form-item>
<el-form-item
label=
"状态"
prop=
"status"
>
<el-select
v-model=
"queryParams.status"
placeholder=
"用户状态"
clearable
style=
"width: 240px"
>
<el-option
v-for=
"dict in sys_normal_disable"
:key=
"dict.value"
:label=
"dict.label"
:value=
"dict.value"
/>
</el-select>
</el-form-item>
<el-form-item
label=
"创建时间"
style=
"width: 308px"
>
<el-date-picker
v-model=
"dateRange"
value-format=
"YYYY-MM-DD"
type=
"daterange"
range-separator=
"-"
start-placeholder=
"开始日期"
end-placeholder=
"结束日期"
></el-date-picker>
</el-form-item>
<el-form-item>
<el-button
type=
"primary"
icon=
"Search"
@
click=
"handleQuery"
>
搜索
</el-button>
<el-button
icon=
"Refresh"
@
click=
"resetQuery"
>
重置
</el-button>
</el-form-item>
</el-form>
<el-row
:gutter=
"10"
class=
"mb8"
>
<el-col
:span=
"1.5"
>
<el-button
type=
"primary"
plain
icon=
"Plus"
@
click=
"handleAdd"
v-hasPermi=
"['system:user:add']"
>
新增
</el-button>
</el-col>
<el-col
:span=
"1.5"
>
<el-button
type=
"success"
plain
icon=
"Edit"
:disabled=
"single"
@
click=
"handleUpdate"
v-hasPermi=
"['system:user:edit']"
>
修改
</el-button>
</el-col>
</pane>
<!--用户数据-->
<pane
size=
"84"
>
<el-col>
<el-form
:model=
"queryParams"
ref=
"queryRef"
:inline=
"true"
v-show=
"showSearch"
label-width=
"68px"
>
<el-form-item
label=
"用户名称"
prop=
"userName"
>
<el-input
v-model=
"queryParams.userName"
placeholder=
"请输入用户名称"
clearable
style=
"width: 240px"
@
keyup
.
enter=
"handleQuery"
/>
</el-form-item>
<el-form-item
label=
"手机号码"
prop=
"phonenumber"
>
<el-input
v-model=
"queryParams.phonenumber"
placeholder=
"请输入手机号码"
clearable
style=
"width: 240px"
@
keyup
.
enter=
"handleQuery"
/>
</el-form-item>
<el-form-item
label=
"状态"
prop=
"status"
>
<el-select
v-model=
"queryParams.status"
placeholder=
"用户状态"
clearable
style=
"width: 240px"
>
<el-option
v-for=
"dict in sys_normal_disable"
:key=
"dict.value"
:label=
"dict.label"
:value=
"dict.value"
/>
</el-select>
</el-form-item>
<el-form-item
label=
"创建时间"
style=
"width: 308px"
>
<el-date-picker
v-model=
"dateRange"
value-format=
"YYYY-MM-DD"
type=
"daterange"
range-separator=
"-"
start-placeholder=
"开始日期"
end-placeholder=
"结束日期"
></el-date-picker>
</el-form-item>
<el-form-item>
<el-button
type=
"primary"
icon=
"Search"
@
click=
"handleQuery"
>
搜索
</el-button>
<el-button
icon=
"Refresh"
@
click=
"resetQuery"
>
重置
</el-button>
</el-form-item>
</el-form>
<el-row
:gutter=
"10"
class=
"mb8"
>
<el-col
:span=
"1.5"
>
<el-button
type=
"primary"
plain
icon=
"Plus"
@
click=
"handleAdd"
v-hasPermi=
"['system:user:add']"
>
新增
</el-button>
</el-col>
<el-col
:span=
"1.5"
>
<el-button
type=
"success"
plain
icon=
"Edit"
:disabled=
"single"
@
click=
"handleUpdate"
v-hasPermi=
"['system:user:edit']"
>
修改
</el-button>
</el-col>
<el-col
:span=
"1.5"
>
<el-button
type=
"danger"
plain
icon=
"Delete"
:disabled=
"multiple"
@
click=
"handleDelete"
v-hasPermi=
"['system:user:remove']"
>
删除
</el-button>
</el-col>
<el-col
:span=
"1.5"
>
<el-button
type=
"info"
plain
icon=
"Upload"
@
click=
"handleImport"
v-hasPermi=
"['system:user:import']"
>
导入
</el-button>
</el-col>
<el-col
:span=
"1.5"
>
<el-button
type=
"warning"
plain
icon=
"Download"
@
click=
"handleExport"
v-hasPermi=
"['system:user:export']"
>
导出
</el-button>
</el-col>
<right-toolbar
v-model:showSearch=
"showSearch"
@
queryTable=
"getList"
:columns=
"columns"
></right-toolbar>
</el-row>
<el-table
v-loading=
"loading"
:data=
"userList"
@
selection-change=
"handleSelectionChange"
>
<el-table-column
type=
"selection"
width=
"50"
align=
"center"
/>
<el-table-column
label=
"用户编号"
align=
"center"
key=
"userId"
prop=
"userId"
v-if=
"columns[0].visible"
/>
<el-table-column
label=
"用户名称"
align=
"center"
key=
"userName"
prop=
"userName"
v-if=
"columns[1].visible"
:show-overflow-tooltip=
"true"
/>
<el-table-column
label=
"用户昵称"
align=
"center"
key=
"nickName"
prop=
"nickName"
v-if=
"columns[2].visible"
:show-overflow-tooltip=
"true"
/>
<el-table-column
label=
"部门"
align=
"center"
key=
"deptName"
prop=
"dept.deptName"
v-if=
"columns[3].visible"
:show-overflow-tooltip=
"true"
/>
<el-table-column
label=
"手机号码"
align=
"center"
key=
"phonenumber"
prop=
"phonenumber"
v-if=
"columns[4].visible"
width=
"120"
/>
<el-table-column
label=
"状态"
align=
"center"
key=
"status"
v-if=
"columns[5].visible"
>
<template
#
default=
"scope"
>
<el-switch
v-model=
"scope.row.status"
active-value=
"0"
inactive-value=
"1"
@
change=
"handleStatusChange(scope.row)"
></el-switch>
</
template
>
</el-table-column>
<el-table-column
label=
"创建时间"
align=
"center"
prop=
"createTime"
v-if=
"columns[6].visible"
width=
"160"
>
<
template
#
default=
"scope"
>
<span>
{{
parseTime
(
scope
.
row
.
createTime
)
}}
</span>
</
template
>
</el-table-column>
<el-table-column
label=
"操作"
align=
"center"
width=
"150"
class-name=
"small-padding fixed-width"
>
<
template
#
default=
"scope"
>
<el-tooltip
content=
"修改"
placement=
"top"
v-if=
"scope.row.userId !== 1"
>
<el-button
link
type=
"primary"
icon=
"Edit"
@
click=
"handleUpdate(scope.row)"
v-hasPermi=
"['system:user:edit']"
></el-button>
</el-tooltip>
<el-tooltip
content=
"删除"
placement=
"top"
v-if=
"scope.row.userId !== 1"
>
<el-button
link
type=
"primary"
icon=
"Delete"
@
click=
"handleDelete(scope.row)"
v-hasPermi=
"['system:user:remove']"
></el-button>
</el-tooltip>
<el-tooltip
content=
"重置密码"
placement=
"top"
v-if=
"scope.row.userId !== 1"
>
<el-button
link
type=
"primary"
icon=
"Key"
@
click=
"handleResetPwd(scope.row)"
v-hasPermi=
"['system:user:resetPwd']"
></el-button>
</el-tooltip>
<el-tooltip
content=
"分配角色"
placement=
"top"
v-if=
"scope.row.userId !== 1"
>
<el-button
link
type=
"primary"
icon=
"CircleCheck"
@
click=
"handleAuthRole(scope.row)"
v-hasPermi=
"['system:user:edit']"
></el-button>
</el-tooltip>
</
template
>
</el-table-column>
</el-table>
<pagination
v-show=
"total > 0"
:total=
"total"
v-model:page=
"queryParams.pageNum"
v-model:limit=
"queryParams.pageSize"
@
pagination=
"getList"
/>
<el-col
:span=
"1.5"
>
<el-button
type=
"danger"
plain
icon=
"Delete"
:disabled=
"multiple"
@
click=
"handleDelete"
v-hasPermi=
"['system:user:remove']"
>
删除
</el-button>
</el-col>
</pane>
</splitpanes>
<el-col
:span=
"1.5"
>
<el-button
type=
"info"
plain
icon=
"Upload"
@
click=
"handleImport"
v-hasPermi=
"['system:user:import']"
>
导入
</el-button>
</el-col>
<el-col
:span=
"1.5"
>
<el-button
type=
"warning"
plain
icon=
"Download"
@
click=
"handleExport"
v-hasPermi=
"['system:user:export']"
>
导出
</el-button>
</el-col>
<right-toolbar
v-model:showSearch=
"showSearch"
@
queryTable=
"getList"
:columns=
"columns"
></right-toolbar>
</el-row>
<el-table
v-loading=
"loading"
:data=
"userList"
>
<el-table-column
type=
"selection"
width=
"50"
/>
<el-table-column
label=
"用户编号"
key=
"userId"
prop=
"userId"
v-if=
"columns[0].visible"
align=
"left"
/>
<el-table-column
label=
"用户名称"
key=
"userName"
prop=
"userName"
v-if=
"columns[1].visible"
align=
"left"
/>
<el-table-column
label=
"用户昵称"
key=
"nickName"
prop=
"nickName"
v-if=
"columns[2].visible"
align=
"left"
/>
<el-table-column
label=
"部门"
key=
"deptName"
prop=
"dept.deptName"
v-if=
"columns[3].visible"
align=
"left"
/>
<el-table-column
label=
"手机号码"
key=
"phonenumber"
prop=
"phonenumber"
v-if=
"columns[4].visible"
align=
"left"
/>
<el-table-column
label=
"状态"
key=
"status"
v-if=
"columns[5].visible"
align=
"left"
>
<template
#
default=
"scope"
>
<el-switch
v-model=
"scope.row.status"
active-value=
"0"
inactive-value=
"1"
@
change=
"handleStatusChange(scope.row)"
></el-switch>
</
template
>
</el-table-column>
<el-table-column
label=
"创建时间"
prop=
"createTime"
v-if=
"columns[6].visible"
align=
"left"
>
<
template
#
default=
"scope"
>
<span>
{{
parseTime
(
scope
.
row
.
createTime
)
}}
</span>
</
template
>
</el-table-column>
<el-table-column
label=
"操作"
class-name=
"small-padding fixed-width"
align=
"left"
>
<
template
#
default=
"scope"
>
<custom-tool-tip
content=
"修改"
placement=
"top"
v-if=
"scope.row.userId !== 1"
>
<el-button
link
type=
"primary"
icon=
"Edit"
@
click=
"handleUpdate(scope.row)"
v-hasPermi=
"['system:user:edit']"
></el-button>
</custom-tool-tip>
<custom-tool-tip
content=
"删除"
placement=
"top"
v-if=
"scope.row.userId !== 1"
>
<el-button
link
type=
"primary"
icon=
"Delete"
@
click=
"handleDelete(scope.row)"
v-hasPermi=
"['system:user:remove']"
></el-button>
</custom-tool-tip>
<custom-tool-tip
content=
"重置密码"
placement=
"top"
v-if=
"scope.row.userId !== 1"
>
<el-button
link
type=
"primary"
icon=
"Key"
@
click=
"handleResetPwd(scope.row)"
v-hasPermi=
"['system:user:resetPwd']"
></el-button>
</custom-tool-tip>
<custom-tool-tip
content=
"分配角色"
placement=
"top"
v-if=
"scope.row.userId !== 1"
>
<el-button
link
type=
"primary"
icon=
"CircleCheck"
@
click=
"handleAuthRole(scope.row)"
v-hasPermi=
"['system:user:edit']"
></el-button>
</custom-tool-tip>
</
template
>
</el-table-column>
</el-table>
<pagination
v-show=
"total > 0"
:total=
"total"
v-model:page=
"queryParams.pageNum"
v-model:limit=
"queryParams.pageSize"
@
pagination=
"getList"
/>
</el-col>
</el-row>
<!-- 添加或修改用户配置对话框 -->
<el-dialog
:title=
"title"
v-model=
"open"
width=
"600px"
append-to-body
>
<el-form
:model=
"form"
:rules=
"rules"
ref=
"userRef"
label-width=
"80px"
>
<el-dialog
:title=
"title"
v-model=
"open"
width=
"600px"
append-to-body
>
<el-form
:model=
"form"
:rules=
"rules"
ref=
"userRef"
label-width=
"80px"
>
<el-row>
<el-col
:span=
"12"
>
<el-form-item
label=
"用户昵称"
prop=
"nickName"
>
<el-input
v-model=
"form.nickName"
placeholder=
"请输入用户昵称"
maxlength=
"30"
/>
<el-form-item
label=
"用户昵称"
prop=
"nickName"
>
<el-input
v-model=
"form.nickName"
placeholder=
"请输入用户昵称"
maxlength=
"30"
/>
</el-form-item>
</el-col>
<el-col
:span=
"12"
>
<el-form-item
label=
"归属部门"
prop=
"deptId"
>
<el-tree-select
v-model=
"form.deptId"
:data=
"enabledDeptOptions"
:props=
"{ value: 'id', label: 'label', children: 'children' }"
value-key=
"id"
placeholder=
"请选择归属部门"
check-strictly
/>
<el-form-item
label=
"归属部门"
prop=
"deptId"
>
<el-tree-select
v-model=
"form.deptId"
:data=
"enabledDeptOptions"
:props=
"{ value: 'id', label: 'label', children: 'children' }"
value-key=
"id"
placeholder=
"请选择归属部门"
check-strictly
/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col
:span=
"12"
>
<el-form-item
label=
"手机号码"
prop=
"phonenumber"
>
<el-input
v-model=
"form.phonenumber"
placeholder=
"请输入手机号码"
maxlength=
"11"
/>
<el-form-item
label=
"手机号码"
prop=
"phonenumber"
>
<el-input
v-model=
"form.phonenumber"
placeholder=
"请输入手机号码"
maxlength=
"11"
/>
</el-form-item>
</el-col>
<el-col
:span=
"12"
>
<el-form-item
label=
"邮箱"
prop=
"email"
>
<el-input
v-model=
"form.email"
placeholder=
"请输入邮箱"
maxlength=
"50"
/>
<el-form-item
label=
"邮箱"
prop=
"email"
>
<el-input
v-model=
"form.email"
placeholder=
"请输入邮箱"
maxlength=
"50"
/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col
:span=
"12"
>
<el-form-item
v-if=
"form.userId == undefined"
label=
"用户名称"
prop=
"userName"
>
<el-input
v-model=
"form.userName"
placeholder=
"请输入用户名称"
maxlength=
"30"
/>
<el-form-item
v-if=
"form.userId == undefined"
label=
"用户名称"
prop=
"userName"
>
<el-input
v-model=
"form.userName"
placeholder=
"请输入用户名称"
maxlength=
"30"
/>
</el-form-item>
</el-col>
<el-col
:span=
"12"
>
<el-form-item
v-if=
"form.userId == undefined"
label=
"用户密码"
prop=
"password"
>
<el-input
v-model=
"form.password"
placeholder=
"请输入用户密码"
type=
"password"
maxlength=
"20"
show-password
/>
<el-form-item
v-if=
"form.userId == undefined"
label=
"用户密码"
prop=
"password"
>
<el-input
v-model=
"form.password"
placeholder=
"请输入用户密码"
type=
"password"
maxlength=
"20"
show-password
/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col
:span=
"12"
>
<el-form-item
label=
"用户性别"
>
<el-select
v-model=
"form.sex"
placeholder=
"请选择"
>
<el-option
v-for=
"dict in sys_user_sex"
:key=
"dict.value"
:label=
"dict.label"
:value=
"dict.value"
></el-option>
<el-select
v-model=
"form.sex"
placeholder=
"请选择"
>
<el-option
v-for=
"dict in sys_user_sex"
:key=
"dict.value"
:label=
"dict.label"
:value=
"dict.value"
></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col
:span=
"12"
>
<el-form-item
label=
"状态"
>
<el-radio-group
v-model=
"form.status"
>
<el-radio
v-for=
"dict in sys_normal_disable"
:key=
"dict.value"
:value=
"dict.value"
>
{{ dict.label }}
</el-radio>
<el-radio
v-for=
"dict in sys_normal_disable"
:key=
"dict.value"
:value=
"dict.value"
>
{{ dict.label }}
</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
...
...
@@ -159,15 +303,27 @@
<el-row>
<el-col
:span=
"12"
>
<el-form-item
label=
"岗位"
>
<el-select
v-model=
"form.postIds"
multiple
placeholder=
"请选择"
>
<el-option
v-for=
"item in postOptions"
:key=
"item.postId"
:label=
"item.postName"
:value=
"item.postId"
:disabled=
"item.status == 1"
></el-option>
<el-select
v-model=
"form.postIds"
multiple
placeholder=
"请选择"
>
<el-option
v-for=
"item in postOptions"
:key=
"item.postId"
:label=
"item.postName"
:value=
"item.postId"
:disabled=
"item.status == 1"
></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col
:span=
"12"
>
<el-form-item
label=
"角色"
>
<el-select
v-model=
"form.roleIds"
multiple
placeholder=
"请选择"
>
<el-option
v-for=
"item in roleOptions"
:key=
"item.roleId"
:label=
"item.roleName"
:value=
"item.roleId"
:disabled=
"item.status == 1"
></el-option>
<el-select
v-model=
"form.roleIds"
multiple
placeholder=
"请选择"
>
<el-option
v-for=
"item in roleOptions"
:key=
"item.roleId"
:label=
"item.roleName"
:value=
"item.roleId"
:disabled=
"item.status == 1"
></el-option>
</el-select>
</el-form-item>
</el-col>
...
...
@@ -175,22 +331,37 @@
<el-row>
<el-col
:span=
"24"
>
<el-form-item
label=
"备注"
>
<el-input
v-model=
"form.remark"
type=
"textarea"
placeholder=
"请输入内容"
></el-input>
<el-input
v-model=
"form.remark"
type=
"textarea"
placeholder=
"请输入内容"
></el-input>
</el-form-item>
</el-col>
</el-row>
</el-form>
<
template
#
footer
>
<div
class=
"dialog-footer"
>
<el-button
type=
"primary"
@
click=
"submitForm"
>
确 定
</el-button>
<el-button
type=
"primary"
@
click=
"submitForm"
>
确 定
</el-button>
<el-button
@
click=
"cancel"
>
取 消
</el-button>
</div>
</
template
>
</el-dialog>
<!-- 用户导入对话框 -->
<el-dialog
:title=
"upload.title"
v-model=
"upload.open"
width=
"400px"
append-to-body
>
<el-upload
ref=
"uploadRef"
:limit=
"1"
accept=
".xlsx, .xls"
:headers=
"upload.headers"
:action=
"upload.url + '?updateSupport=' + upload.updateSupport"
:disabled=
"upload.isUploading"
:on-progress=
"handleFileUploadProgress"
:on-success=
"handleFileSuccess"
:auto-upload=
"false"
drag
>
<el-dialog
:title=
"upload.title"
v-model=
"upload.open"
width=
"400px"
append-to-body
>
<el-upload
ref=
"uploadRef"
:limit=
"1"
accept=
".xlsx, .xls"
:headers=
"upload.headers"
:action=
"upload.url + '?updateSupport=' + upload.updateSupport"
:disabled=
"upload.isUploading"
:on-progress=
"handleFileUploadProgress"
:on-success=
"handleFileSuccess"
:auto-upload=
"false"
drag
>
<el-icon
class=
"el-icon--upload"
><upload-filled
/></el-icon>
<div
class=
"el-upload__text"
>
将文件拖到此处,或
<em>
点击上传
</em></div>
<
template
#
tip
>
...
...
@@ -199,13 +370,17 @@
<el-checkbox
v-model=
"upload.updateSupport"
/>
是否更新已经存在的用户数据
</div>
<span>
仅允许导入xls、xlsx格式文件。
</span>
<el-link
type=
"primary"
:underline=
"false"
style=
"font-size: 12px; vertical-align: baseline"
@
click=
"importTemplate"
>
下载模板
</el-link>
<el-link
type=
"primary"
:underline=
"false"
style=
"font-size: 12px; vertical-align: baseline"
@
click=
"importTemplate"
>
下载模板
</el-link>
</div>
</
template
>
</el-upload>
<
template
#
footer
>
<div
class=
"dialog-footer"
>
<el-button
type=
"primary"
@
click=
"submitFileForm"
>
确 定
</el-button>
<el-button
type=
"primary"
@
click=
"submitFileForm"
>
确 定
</el-button>
<el-button
@
click=
"upload.open = false"
>
取 消
</el-button>
</div>
</
template
>
...
...
@@ -213,328 +388,361 @@
</div>
</template>
<
script
setup
name=
"User"
>
import
{
getToken
}
from
"@/utils/auth"
;
import
useAppStore
from
'@/store/modules/app'
import
{
changeUserStatus
,
listUser
,
resetUserPwd
,
delUser
,
getUser
,
updateUser
,
addUser
,
deptTreeSelectList
}
from
"@/api"
;
import
{
Splitpanes
,
Pane
}
from
"splitpanes"
import
"splitpanes/dist/splitpanes.css"
const
router
=
useRouter
();
const
appStore
=
useAppStore
()
const
{
proxy
}
=
getCurrentInstance
();
const
{
sys_normal_disable
,
sys_user_sex
}
=
proxy
.
useDict
(
"sys_normal_disable"
,
"sys_user_sex"
);
const
userList
=
ref
([]);
const
open
=
ref
(
false
);
const
loading
=
ref
(
true
);
const
showSearch
=
ref
(
true
);
const
ids
=
ref
([]);
const
single
=
ref
(
true
);
const
multiple
=
ref
(
true
);
const
total
=
ref
(
0
);
const
title
=
ref
(
""
);
const
dateRange
=
ref
([]);
const
deptName
=
ref
(
""
);
const
deptOptions
=
ref
(
undefined
);
const
enabledDeptOptions
=
ref
(
undefined
);
const
initPassword
=
ref
(
undefined
);
const
postOptions
=
ref
([]);
const
roleOptions
=
ref
([]);
/*** 用户导入参数 */
const
upload
=
reactive
({
// 是否显示弹出层(用户导入)
open
:
false
,
// 弹出层标题(用户导入)
title
:
""
,
// 是否禁用上传
isUploading
:
false
,
// 是否更新已经存在的用户数据
updateSupport
:
0
,
// 设置上传的请求头部
headers
:
{
Authorization
:
"Bearer "
+
getToken
()
},
// 上传的地址
url
:
import
.
meta
.
env
.
VITE_APP_BASE_API
+
"/system/user/importData"
});
// 列显隐信息
const
columns
=
ref
([
{
key
:
0
,
label
:
`用户编号`
,
visible
:
true
},
{
key
:
1
,
label
:
`用户名称`
,
visible
:
true
},
{
key
:
2
,
label
:
`用户昵称`
,
visible
:
true
},
{
key
:
3
,
label
:
`部门`
,
visible
:
true
},
{
key
:
4
,
label
:
`手机号码`
,
visible
:
true
},
{
key
:
5
,
label
:
`状态`
,
visible
:
true
},
{
key
:
6
,
label
:
`创建时间`
,
visible
:
true
}
]);
const
data
=
reactive
({
form
:
{},
queryParams
:
{
pageNum
:
1
,
pageSize
:
10
,
userName
:
undefined
,
phonenumber
:
undefined
,
status
:
undefined
,
deptId
:
undefined
},
rules
:
{
userName
:
[{
required
:
true
,
message
:
"用户名称不能为空"
,
trigger
:
"blur"
},
{
min
:
2
,
max
:
20
,
message
:
"用户名称长度必须介于 2 和 20 之间"
,
trigger
:
"blur"
}],
nickName
:
[{
required
:
true
,
message
:
"用户昵称不能为空"
,
trigger
:
"blur"
}],
password
:
[{
required
:
true
,
message
:
"用户密码不能为空"
,
trigger
:
"blur"
},
{
min
:
5
,
max
:
20
,
message
:
"用户密码长度必须介于 5 和 20 之间"
,
trigger
:
"blur"
},
{
pattern
:
/^
[^
<>"'|
\\]
+$/
,
message
:
"不能包含非法字符:< >
\"
'
\\\
|"
,
trigger
:
"blur"
}],
email
:
[{
type
:
"email"
,
message
:
"请输入正确的邮箱地址"
,
trigger
:
[
"blur"
,
"change"
]
}],
phonenumber
:
[{
pattern
:
/^1
[
3|4|5|6|7|8|9
][
0-9
]\d{8}
$/
,
message
:
"请输入正确的手机号码"
,
trigger
:
"blur"
}]
}
});
const
{
queryParams
,
form
,
rules
}
=
toRefs
(
data
);
/** 通过条件过滤节点 */
const
filterNode
=
(
value
,
data
)
=>
{
if
(
!
value
)
return
true
;
return
data
.
label
.
indexOf
(
value
)
!==
-
1
;
};
/** 根据名称筛选部门树 */
watch
(
deptName
,
val
=>
{
proxy
.
$refs
[
"deptTreeRef"
].
filter
(
val
);
});
/** 查询用户列表 */
function
getList
()
{
loading
.
value
=
true
;
listUser
(
proxy
.
addDateRange
(
queryParams
.
value
,
dateRange
.
value
)).
then
(
res
=>
{
loading
.
value
=
false
;
userList
.
value
=
res
.
data
.
rows
;
total
.
value
=
res
.
data
.
total
;
<
script
setup
name=
"User"
>
import
{
getToken
}
from
"@/utils/auth"
;
import
useAppStore
from
'@/store/modules/app'
import
{
changeUserStatus
,
listUser
,
resetUserPwd
,
delUser
,
getUser
,
updateUser
,
addUser
,
deptTreeSelectList
}
from
"@/api"
;
// import { Splitpanes, Pane } from "splitpanes"
// import "splitpanes/dist/splitpanes.css"
const
router
=
useRouter
();
const
appStore
=
useAppStore
()
const
{
proxy
}
=
getCurrentInstance
();
const
{
sys_normal_disable
,
sys_user_sex
}
=
proxy
.
useDict
(
"sys_normal_disable"
,
"sys_user_sex"
);
const
userList
=
ref
([]);
const
open
=
ref
(
false
);
const
loading
=
ref
(
true
);
const
showSearch
=
ref
(
true
);
const
ids
=
ref
([]);
const
single
=
ref
(
true
);
const
multiple
=
ref
(
true
);
const
total
=
ref
(
0
);
const
title
=
ref
(
""
);
const
dateRange
=
ref
([]);
const
deptName
=
ref
(
""
);
const
deptOptions
=
ref
(
undefined
);
const
enabledDeptOptions
=
ref
(
undefined
);
const
initPassword
=
ref
(
undefined
);
const
postOptions
=
ref
([]);
const
roleOptions
=
ref
([]);
const
defaultExpandedKeys
=
ref
([])
/*** 用户导入参数 */
const
upload
=
reactive
({
// 是否显示弹出层(用户导入)
open
:
false
,
// 弹出层标题(用户导入)
title
:
""
,
// 是否禁用上传
isUploading
:
false
,
// 是否更新已经存在的用户数据
updateSupport
:
0
,
// 设置上传的请求头部
headers
:
{
Authorization
:
"Bearer "
+
getToken
()
},
// 上传的地址
url
:
import
.
meta
.
env
.
VITE_APP_BASE_API
+
"/system/user/importData"
});
// 列显隐信息
const
columns
=
ref
([
{
key
:
0
,
label
:
`用户编号`
,
visible
:
true
},
{
key
:
1
,
label
:
`用户名称`
,
visible
:
true
},
{
key
:
2
,
label
:
`用户昵称`
,
visible
:
true
},
{
key
:
3
,
label
:
`部门`
,
visible
:
true
},
{
key
:
4
,
label
:
`手机号码`
,
visible
:
true
},
{
key
:
5
,
label
:
`状态`
,
visible
:
true
},
{
key
:
6
,
label
:
`创建时间`
,
visible
:
true
}
]);
const
data
=
reactive
({
form
:
{},
queryParams
:
{
pageNum
:
1
,
pageSize
:
10
,
userName
:
undefined
,
phonenumber
:
undefined
,
status
:
undefined
,
deptId
:
undefined
},
rules
:
{
userName
:
[{
required
:
true
,
message
:
"用户名称不能为空"
,
trigger
:
"blur"
},
{
min
:
2
,
max
:
20
,
message
:
"用户名称长度必须介于 2 和 20 之间"
,
trigger
:
"blur"
}],
nickName
:
[{
required
:
true
,
message
:
"用户昵称不能为空"
,
trigger
:
"blur"
}],
password
:
[{
required
:
true
,
message
:
"用户密码不能为空"
,
trigger
:
"blur"
},
{
min
:
5
,
max
:
20
,
message
:
"用户密码长度必须介于 5 和 20 之间"
,
trigger
:
"blur"
},
{
pattern
:
/^
[^
<>"'|
\\]
+$/
,
message
:
"不能包含非法字符:< >
\"
'
\\\
|"
,
trigger
:
"blur"
}],
email
:
[{
type
:
"email"
,
message
:
"请输入正确的邮箱地址"
,
trigger
:
[
"blur"
,
"change"
]
}],
phonenumber
:
[{
pattern
:
/^1
[
3|4|5|6|7|8|9
][
0-9
]\d{8}
$/
,
message
:
"请输入正确的手机号码"
,
trigger
:
"blur"
}]
}
});
};
/** 查询部门下拉树结构 */
function
getDeptTree
()
{
deptTreeSelectList
().
then
(
response
=>
{
deptOptions
.
value
=
response
.
data
;
enabledDeptOptions
.
value
=
filterDisabledDept
(
JSON
.
parse
(
JSON
.
stringify
(
response
.
data
)));
const
{
queryParams
,
form
,
rules
}
=
toRefs
(
data
);
/** 通过条件过滤节点 */
const
filterNode
=
(
value
,
data
)
=>
{
if
(
!
value
)
return
true
;
return
data
.
label
.
indexOf
(
value
)
!==
-
1
;
};
/** 根据名称筛选部门树 */
watch
(
deptName
,
val
=>
{
proxy
.
$refs
[
"deptTreeRef"
].
filter
(
val
);
});
};
/** 过滤禁用的部门 */
function
filterDisabledDept
(
deptList
)
{
return
deptList
.
filter
(
dept
=>
{
if
(
dept
.
disabled
)
{
return
false
;
}
if
(
dept
.
children
&&
dept
.
children
.
length
)
{
dept
.
children
=
filterDisabledDept
(
dept
.
children
);
/** 查询用户列表 */
function
getList
()
{
loading
.
value
=
true
;
listUser
(
proxy
.
addDateRange
(
queryParams
.
value
,
dateRange
.
value
)).
then
(
res
=>
{
loading
.
value
=
false
;
userList
.
value
=
res
.
data
.
rows
;
total
.
value
=
res
.
data
.
total
;
});
};
/** 查询部门下拉树结构 */
function
getDeptTree
()
{
deptTreeSelectList
().
then
(
response
=>
{
deptOptions
.
value
=
response
.
data
;
enabledDeptOptions
.
value
=
filterDisabledDept
(
JSON
.
parse
(
JSON
.
stringify
(
response
.
data
)));
defaultExpandedKeys
.
value
=
[
response
.
data
[
0
].
id
];
queryParams
.
value
.
deptId
=
response
.
data
[
0
].
id
;
});
};
/** 过滤禁用的部门 */
function
filterDisabledDept
(
deptList
)
{
return
deptList
.
filter
(
dept
=>
{
if
(
dept
.
disabled
)
{
return
false
;
}
if
(
dept
.
children
&&
dept
.
children
.
length
)
{
dept
.
children
=
filterDisabledDept
(
dept
.
children
);
}
return
true
;
});
};
/** 节点单击事件 */
function
handleNodeClick
(
data
)
{
queryParams
.
value
.
deptId
=
data
?
data
.
id
:
''
;
handleQuery
();
};
/** 搜索按钮操作 */
function
handleQuery
()
{
queryParams
.
value
.
pageNum
=
1
;
getList
();
};
/** 重置按钮操作 */
function
resetQuery
()
{
dateRange
.
value
=
[];
proxy
.
resetForm
(
"queryRef"
);
queryParams
.
value
.
deptId
=
undefined
;
proxy
.
$refs
.
deptTreeRef
.
setCurrentKey
(
null
);
handleQuery
();
};
/** 删除按钮操作 */
function
handleDelete
(
row
)
{
const
userIds
=
row
.
userId
||
ids
.
value
;
proxy
.
$modal
.
confirm
(
'是否确认删除用户编号为"'
+
userIds
+
'"的数据项?'
).
then
(
function
()
{
return
delUser
(
userIds
);
}).
then
(()
=>
{
getList
();
proxy
.
$modal
.
msgSuccess
(
"删除成功"
);
}).
catch
(()
=>
{
});
};
/** 导出按钮操作 */
function
handleExport
()
{
proxy
.
download
(
"system/user/export"
,
{
...
queryParams
.
value
,
},
`user_
${
new
Date
().
getTime
()}
.xlsx`
);
};
/** 用户状态修改 */
function
handleStatusChange
(
row
)
{
let
text
=
row
.
status
===
"0"
?
"启用"
:
"停用"
;
proxy
.
$modal
.
confirm
(
'确认要"'
+
text
+
'""'
+
row
.
userName
+
'"用户吗?'
).
then
(
function
()
{
return
changeUserStatus
(
row
.
userId
,
row
.
status
);
}).
then
(()
=>
{
proxy
.
$modal
.
msgSuccess
(
text
+
"成功"
);
}).
catch
(
function
()
{
row
.
status
=
row
.
status
===
"0"
?
"1"
:
"0"
;
});
};
/** 更多操作 */
function
handleCommand
(
command
,
row
)
{
switch
(
command
)
{
case
"handleResetPwd"
:
handleResetPwd
(
row
);
break
;
case
"handleAuthRole"
:
handleAuthRole
(
row
);
break
;
default
:
break
;
}
return
true
;
});
};
};
/** 节点单击事件
*/
function
handleNodeClick
(
data
)
{
queryParams
.
value
.
deptId
=
data
.
i
d
;
handleQuery
(
);
};
/** 跳转角色分配
*/
function
handleAuthRole
(
row
)
{
const
userId
=
row
.
userI
d
;
router
.
push
(
"/system/user-auth/role/"
+
userId
);
};
/** 搜索按钮操作 */
function
handleQuery
()
{
queryParams
.
value
.
pageNum
=
1
;
getList
();
};
/** 重置按钮操作 */
function
resetQuery
()
{
dateRange
.
value
=
[];
proxy
.
resetForm
(
"queryRef"
);
queryParams
.
value
.
deptId
=
undefined
;
proxy
.
$refs
.
deptTreeRef
.
setCurrentKey
(
null
);
handleQuery
();
};
/** 删除按钮操作 */
function
handleDelete
(
row
)
{
const
userIds
=
row
.
userId
||
ids
.
value
;
proxy
.
$modal
.
confirm
(
'是否确认删除用户编号为"'
+
userIds
+
'"的数据项?'
).
then
(
function
()
{
return
delUser
(
userIds
);
}).
then
(()
=>
{
/** 重置密码按钮操作 */
function
handleResetPwd
(
row
)
{
proxy
.
$prompt
(
'请输入"'
+
row
.
userName
+
'"的新密码'
,
"提示"
,
{
confirmButtonText
:
"确定"
,
cancelButtonText
:
"取消"
,
closeOnClickModal
:
false
,
inputPattern
:
/^.
{5,20}
$/
,
inputErrorMessage
:
"用户密码长度必须介于 5 和 20 之间"
,
inputValidator
:
(
value
)
=>
{
if
(
/<|>|"|'|
\|
|
\\
/
.
test
(
value
))
{
return
"不能包含非法字符:< >
\"
'
\\\
|"
}
},
}).
then
(({
value
})
=>
{
resetUserPwd
(
row
.
userId
,
value
).
then
(
response
=>
{
proxy
.
$modal
.
msgSuccess
(
"修改成功,新密码是:"
+
value
);
});
}).
catch
(()
=>
{
});
};
/** 选择条数 */
function
handleSelectionChange
(
selection
)
{
ids
.
value
=
selection
.
map
(
item
=>
item
.
userId
);
single
.
value
=
selection
.
length
!=
1
;
multiple
.
value
=
!
selection
.
length
;
};
/** 导入按钮操作 */
function
handleImport
()
{
upload
.
title
=
"用户导入"
;
upload
.
open
=
true
;
};
/** 下载模板操作 */
function
importTemplate
()
{
proxy
.
download
(
"system/user/importTemplate"
,
{
},
`user_template_
${
new
Date
().
getTime
()}
.xlsx`
);
};
/**文件上传中处理 */
const
handleFileUploadProgress
=
(
event
,
file
,
fileList
)
=>
{
upload
.
isUploading
=
true
;
};
/** 文件上传成功处理 */
const
handleFileSuccess
=
(
response
,
file
,
fileList
)
=>
{
upload
.
open
=
false
;
upload
.
isUploading
=
false
;
proxy
.
$refs
[
"uploadRef"
].
handleRemove
(
file
);
proxy
.
$alert
(
"<div style='overflow: auto;overflow-x: hidden;max-height: 70vh;padding: 10px 20px 0;'>"
+
response
.
msg
+
"</div>"
,
"导入结果"
,
{
dangerouslyUseHTMLString
:
true
});
getList
();
proxy
.
$modal
.
msgSuccess
(
"删除成功"
);
}).
catch
(()
=>
{});
};
/** 导出按钮操作 */
function
handleExport
()
{
proxy
.
download
(
"system/user/export"
,
{
...
queryParams
.
value
,
},
`user_
${
new
Date
().
getTime
()}
.xlsx`
);
};
/** 用户状态修改 */
function
handleStatusChange
(
row
)
{
let
text
=
row
.
status
===
"0"
?
"启用"
:
"停用"
;
proxy
.
$modal
.
confirm
(
'确认要"'
+
text
+
'""'
+
row
.
userName
+
'"用户吗?'
).
then
(
function
()
{
return
changeUserStatus
(
row
.
userId
,
row
.
status
);
}).
then
(()
=>
{
proxy
.
$modal
.
msgSuccess
(
text
+
"成功"
);
}).
catch
(
function
()
{
row
.
status
=
row
.
status
===
"0"
?
"1"
:
"0"
;
});
};
/** 更多操作 */
function
handleCommand
(
command
,
row
)
{
switch
(
command
)
{
case
"handleResetPwd"
:
handleResetPwd
(
row
);
break
;
case
"handleAuthRole"
:
handleAuthRole
(
row
);
break
;
default
:
break
;
}
};
/** 跳转角色分配 */
function
handleAuthRole
(
row
)
{
const
userId
=
row
.
userId
;
router
.
push
(
"/system/user-auth/role/"
+
userId
);
};
/** 重置密码按钮操作 */
function
handleResetPwd
(
row
)
{
proxy
.
$prompt
(
'请输入"'
+
row
.
userName
+
'"的新密码'
,
"提示"
,
{
confirmButtonText
:
"确定"
,
cancelButtonText
:
"取消"
,
closeOnClickModal
:
false
,
inputPattern
:
/^.
{5,20}
$/
,
inputErrorMessage
:
"用户密码长度必须介于 5 和 20 之间"
,
inputValidator
:
(
value
)
=>
{
if
(
/<|>|"|'|
\|
|
\\
/
.
test
(
value
))
{
return
"不能包含非法字符:< >
\"
'
\\\
|"
}
},
}).
then
(({
value
})
=>
{
resetUserPwd
(
row
.
userId
,
value
).
then
(
response
=>
{
proxy
.
$modal
.
msgSuccess
(
"修改成功,新密码是:"
+
value
);
};
/** 提交上传文件 */
function
submitFileForm
()
{
proxy
.
$refs
[
"uploadRef"
].
submit
();
};
/** 重置操作表单 */
function
reset
()
{
form
.
value
=
{
userId
:
undefined
,
deptId
:
undefined
,
userName
:
undefined
,
nickName
:
undefined
,
password
:
undefined
,
phonenumber
:
undefined
,
email
:
undefined
,
sex
:
undefined
,
status
:
"0"
,
remark
:
undefined
,
postIds
:
[],
roleIds
:
[]
};
proxy
.
resetForm
(
"userRef"
);
};
/** 取消按钮 */
function
cancel
()
{
open
.
value
=
false
;
reset
();
};
/** 新增按钮操作 */
function
handleAdd
()
{
reset
();
getUser
().
then
(
response
=>
{
postOptions
.
value
=
response
.
posts
;
roleOptions
.
value
=
response
.
roles
;
open
.
value
=
true
;
title
.
value
=
"添加用户"
;
form
.
value
.
password
=
initPassword
.
value
;
});
}).
catch
(()
=>
{});
};
/** 选择条数 */
function
handleSelectionChange
(
selection
)
{
ids
.
value
=
selection
.
map
(
item
=>
item
.
userId
);
single
.
value
=
selection
.
length
!=
1
;
multiple
.
value
=
!
selection
.
length
;
};
/** 导入按钮操作 */
function
handleImport
()
{
upload
.
title
=
"用户导入"
;
upload
.
open
=
true
;
};
/** 下载模板操作 */
function
importTemplate
()
{
proxy
.
download
(
"system/user/importTemplate"
,
{
},
`user_template_
${
new
Date
().
getTime
()}
.xlsx`
);
};
/**文件上传中处理 */
const
handleFileUploadProgress
=
(
event
,
file
,
fileList
)
=>
{
upload
.
isUploading
=
true
;
};
/** 文件上传成功处理 */
const
handleFileSuccess
=
(
response
,
file
,
fileList
)
=>
{
upload
.
open
=
false
;
upload
.
isUploading
=
false
;
proxy
.
$refs
[
"uploadRef"
].
handleRemove
(
file
);
proxy
.
$alert
(
"<div style='overflow: auto;overflow-x: hidden;max-height: 70vh;padding: 10px 20px 0;'>"
+
response
.
msg
+
"</div>"
,
"导入结果"
,
{
dangerouslyUseHTMLString
:
true
});
getList
();
};
/** 提交上传文件 */
function
submitFileForm
()
{
proxy
.
$refs
[
"uploadRef"
].
submit
();
};
/** 重置操作表单 */
function
reset
()
{
form
.
value
=
{
userId
:
undefined
,
deptId
:
undefined
,
userName
:
undefined
,
nickName
:
undefined
,
password
:
undefined
,
phonenumber
:
undefined
,
email
:
undefined
,
sex
:
undefined
,
status
:
"0"
,
remark
:
undefined
,
postIds
:
[],
roleIds
:
[]
};
proxy
.
resetForm
(
"userRef"
);
};
/** 取消按钮 */
function
cancel
()
{
open
.
value
=
false
;
reset
();
};
/** 新增按钮操作 */
function
handleAdd
()
{
reset
();
getUser
().
then
(
response
=>
{
postOptions
.
value
=
response
.
posts
;
roleOptions
.
value
=
response
.
roles
;
open
.
value
=
true
;
title
.
value
=
"添加用户"
;
form
.
value
.
password
=
initPassword
.
value
;
});
};
/** 修改按钮操作 */
function
handleUpdate
(
row
)
{
reset
();
const
userId
=
row
.
userId
||
ids
.
value
;
getUser
(
userId
).
then
(
response
=>
{
form
.
value
=
response
.
data
;
postOptions
.
value
=
response
.
posts
;
roleOptions
.
value
=
response
.
roles
;
form
.
value
.
postIds
=
response
.
postIds
;
form
.
value
.
roleIds
=
response
.
roleIds
;
open
.
value
=
true
;
title
.
value
=
"修改用户"
;
form
.
password
=
""
;
});
};
/** 提交按钮 */
function
submitForm
()
{
const
obj
=
roleOptions
.
value
.
find
(
o
=>
o
.
roleId
==
form
.
value
.
roleIds
[
0
])
form
.
value
.
roleName
=
obj
.
roleName
proxy
.
$refs
[
"userRef"
].
validate
(
valid
=>
{
if
(
valid
)
{
if
(
form
.
value
.
userId
!=
undefined
)
{
updateUser
(
form
.
value
).
then
(
response
=>
{
proxy
.
$modal
.
msgSuccess
(
"修改成功"
);
open
.
value
=
false
;
getList
();
});
}
else
{
addUser
(
form
.
value
).
then
(
response
=>
{
proxy
.
$modal
.
msgSuccess
(
"新增成功"
);
open
.
value
=
false
;
getList
();
});
/** 修改按钮操作 */
function
handleUpdate
(
row
)
{
reset
();
const
userId
=
row
.
userId
||
ids
.
value
;
getUser
(
userId
).
then
(
response
=>
{
form
.
value
=
response
.
data
;
postOptions
.
value
=
response
.
posts
;
roleOptions
.
value
=
response
.
roles
;
form
.
value
.
postIds
=
response
.
postIds
;
form
.
value
.
roleIds
=
response
.
roleIds
;
open
.
value
=
true
;
title
.
value
=
"修改用户"
;
form
.
password
=
""
;
});
};
/** 提交按钮 */
function
submitForm
()
{
const
obj
=
roleOptions
.
value
.
find
(
o
=>
o
.
roleId
==
form
.
value
.
roleIds
[
0
])
form
.
value
.
roleName
=
obj
.
roleName
proxy
.
$refs
[
"userRef"
].
validate
(
valid
=>
{
if
(
valid
)
{
if
(
form
.
value
.
userId
!=
undefined
)
{
updateUser
(
form
.
value
).
then
(
response
=>
{
proxy
.
$modal
.
msgSuccess
(
"修改成功"
);
open
.
value
=
false
;
getList
();
});
}
else
{
addUser
(
form
.
value
).
then
(
response
=>
{
proxy
.
$modal
.
msgSuccess
(
"新增成功"
);
open
.
value
=
false
;
getList
();
});
}
}
}
});
};
});
};
getDeptTree
();
getList
();
getDeptTree
();
getList
();
</
script
>
<
style
scoped
lang=
"scss"
>
.app-container
{
>
.el-row
{
display
:
flex
;
.right_col
{
flex
:
1
!
important
;
transition
:
all
.5s
;
display
:
flex
;
flex-direction
:
column
;
height
:
100%
;
overflow-y
:
scroll
;
padding-left
:
20px
!
important
;
.pagination
{
/* 没办法设置某个子元素单独在主轴排列方式,使用此方式可以 */
margin-top
:
auto
;
}
&
.el-col-20
{
width
:
83
.33333333%
;
max-width
:
none
;
}
}
}
}
</
style
>
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论