Skip to content
Toggle navigation
P
Projects
G
Groups
S
Snippets
Help
phsl
/
admin
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Issues
0
Merge Requests
0
Pipelines
Wiki
Snippets
Members
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Unverified
Commit
d28179d1
authored
Mar 30, 2023
by
芋道源码
Committed by
Gitee
Mar 30, 2023
Browse files
Options
Browse Files
Download
Plain Diff
!76 用户管理代码二次重构
Merge pull request !76 from fessor/dev
parents
84ab75b4
3c6d96d9
Show whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
205 additions
and
279 deletions
+205
-279
src/views/system/user/components/UserAssignRoleForm.vue
+43
-24
src/views/system/user/components/UserDeptTree.vue
+51
-0
src/views/system/user/components/UserForm.vue
+54
-40
src/views/system/user/components/UserImportForm.vue
+16
-15
src/views/system/user/index.vue
+41
-156
src/views/system/user/utils.ts
+0
-44
No files found.
src/views/system/user/RoleForm.vue
→
src/views/system/user/
components/UserAssign
RoleForm.vue
View file @
d28179d1
<
template
>
<
template
>
<el-dialog
title=
"分配角色"
:modelValue=
"show"
width=
"500px"
append-to-body
@
close=
"closeDialog"
>
<Dialog
title=
"分配角色"
:modelValue=
"showDialog"
width=
"500px"
append-to-body
@
close=
"closeDialog"
>
<el-form
:model=
"formData"
label-width=
"80px"
ref=
"formRef"
>
<el-form
:model=
"formData"
label-width=
"80px"
ref=
"formRef"
>
<el-form-item
label=
"用户名称"
>
<el-form-item
label=
"用户名称"
>
<el-input
v-model=
"formData.username"
:disabled=
"true"
/>
<el-input
v-model=
"formData.username"
:disabled=
"true"
/>
...
@@ -24,25 +30,19 @@
...
@@ -24,25 +30,19 @@
<el-button
@
click=
"cancel"
>
取 消
</el-button>
<el-button
@
click=
"cancel"
>
取 消
</el-button>
</div>
</div>
</
template
>
</
template
>
</
el-dialog>
</
Dialog>
</template>
</template>
<
script
setup
lang=
"ts"
>
<
script
setup
lang=
"ts"
>
// TODO el-dialog 用 Dialog 组件
import
{
import
{
assignUserRoleApi
,
PermissionAssignUserRoleReqVO
}
from
'@/api/system/permission'
assignUserRoleApi
,
listUserRolesApi
,
PermissionAssignUserRoleReqVO
}
from
'@/api/system/permission'
import
{
UserVO
}
from
'@/api/system/user'
import
*
as
RoleApi
from
'@/api/system/role'
interface
Props
{
const
emits
=
defineEmits
([
'success'
])
show
:
boolean
roleOptions
:
any
[]
formInitValue
?:
Recordable
&
Partial
<
typeof
initParams
>
}
const
props
=
withDefaults
(
defineProps
<
Props
>
(),
{
show
:
false
,
roleOptions
:
()
=>
[],
formInitValue
:
()
=>
({})
})
const
emits
=
defineEmits
([
'update:show'
,
'success'
])
const
{
t
}
=
useI18n
()
// 国际化
const
{
t
}
=
useI18n
()
// 国际化
const
message
=
useMessage
()
// 消息弹窗
const
message
=
useMessage
()
// 消息弹窗
...
@@ -55,13 +55,7 @@ const initParams = {
...
@@ -55,13 +55,7 @@ const initParams = {
roleIds
:
[]
as
number
[]
roleIds
:
[]
as
number
[]
}
}
const
formData
=
ref
<
Recordable
>
({
...
initParams
})
const
formData
=
ref
<
Recordable
>
({
...
initParams
})
watch
(
()
=>
props
.
formInitValue
,
(
val
)
=>
{
formData
.
value
=
{
...
val
}
},
{
deep
:
true
}
)
/* 弹框按钮操作 */
/* 弹框按钮操作 */
// 点击取消
// 点击取消
const
cancel
=
()
=>
{
const
cancel
=
()
=>
{
...
@@ -69,7 +63,7 @@ const cancel = () => {
...
@@ -69,7 +63,7 @@ const cancel = () => {
}
}
// 关闭弹窗
// 关闭弹窗
const
closeDialog
=
()
=>
{
const
closeDialog
=
()
=>
{
emits
(
'update:show'
,
false
)
showDialog
.
value
=
false
}
}
// 提交
// 提交
const
submit
=
async
()
=>
{
const
submit
=
async
()
=>
{
...
@@ -86,4 +80,29 @@ const submit = async () => {
...
@@ -86,4 +80,29 @@ const submit = async () => {
console
.
error
(
error
)
console
.
error
(
error
)
}
}
}
}
const
roleOptions
=
ref
()
const
userRole
=
reactive
(
initParams
)
const
showDialog
=
ref
(
false
)
const
formRef
=
ref
()
const
openForm
=
async
(
row
:
UserVO
)
=>
{
formRef
.
value
?.
resetFields
()
userRole
.
id
=
row
.
id
userRole
.
username
=
row
.
username
userRole
.
nickname
=
row
.
nickname
// 获得角色列表
const
roleOpt
=
await
RoleApi
.
getSimpleRoleList
()
roleOptions
.
value
=
[...
roleOpt
]
// 获得角色拥有的菜单集合
const
roles
=
await
listUserRolesApi
(
row
.
id
)
userRole
.
roleIds
=
roles
formData
.
value
=
{
...
userRole
}
showDialog
.
value
=
true
}
defineExpose
({
openForm
})
</
script
>
</
script
>
src/views/system/user/components/UserDeptTree.vue
0 → 100644
View file @
d28179d1
<
template
>
<div
class=
"head-container"
>
<el-input
v-model=
"deptName"
placeholder=
"请输入部门名称"
clearable
style=
"margin-bottom: 20px"
>
<template
#
prefix
>
<Icon
icon=
"ep:search"
/>
</
template
>
</el-input>
</div>
<div
class=
"head-container"
>
<el-tree
:data=
"deptOptions"
:props=
"defaultProps"
:expand-on-click-node=
"false"
:filter-node-method=
"filterNode"
ref=
"treeRef"
node-key=
"id"
default-expand-all
highlight-current
@
node-click=
"handleDeptNodeClick"
/>
</div>
</template>
<
script
setup
lang=
"ts"
name=
"UserDeptTree"
>
import
{
ElTree
}
from
'element-plus'
import
*
as
DeptApi
from
'@/api/system/dept'
import
{
defaultProps
,
handleTree
}
from
'@/utils/tree'
const
emits
=
defineEmits
([
'node-click'
])
const
deptName
=
ref
(
''
)
const
deptOptions
=
ref
<
Tree
[]
>
([])
// 树形结构
const
treeRef
=
ref
<
InstanceType
<
typeof
ElTree
>>
()
const
getTree
=
async
()
=>
{
const
res
=
await
DeptApi
.
getSimpleDeptList
()
deptOptions
.
value
=
[]
deptOptions
.
value
.
push
(...
handleTree
(
res
))
}
const
filterNode
=
(
value
:
string
,
data
:
Tree
)
=>
{
if
(
!
value
)
return
true
return
data
.
name
.
includes
(
value
)
}
const
handleDeptNodeClick
=
async
(
row
:
{
[
key
:
string
]:
any
})
=>
{
emits
(
'node-click'
,
row
)
}
onMounted
(
async
()
=>
{
await
getTree
()
})
</
script
>
src/views/system/user/
Add
Form.vue
→
src/views/system/user/
components/User
Form.vue
View file @
d28179d1
<
template
>
<
template
>
<!-- 添加或修改参数配置对话框 -->
<!-- 添加或修改参数配置对话框 -->
<el-dialog
<Dialog
:title=
"title"
:modelValue=
"showDialog"
width=
"600px"
append-to-body
@
close=
"closeDialog"
>
:title=
"title"
:modelValue=
"modelValue"
width=
"600px"
append-to-body
@
close=
"closeDialog"
>
<el-form
ref=
"formRef"
:model=
"formData"
:rules=
"rules"
label-width=
"80px"
>
<el-form
ref=
"formRef"
:model=
"formData"
:rules=
"rules"
label-width=
"80px"
>
<el-row>
<el-row>
<el-col
:span=
"12"
>
<el-col
:span=
"12"
>
...
@@ -61,10 +55,10 @@
...
@@ -61,10 +55,10 @@
<el-form-item
label=
"用户性别"
>
<el-form-item
label=
"用户性别"
>
<el-select
v-model=
"formData.sex"
placeholder=
"请选择"
>
<el-select
v-model=
"formData.sex"
placeholder=
"请选择"
>
<el-option
<el-option
v-for=
"dict in
sexDictDatas"
v-for=
"dict in
getIntDictOptions(DICT_TYPE.SYSTEM_USER_SEX)"
:key=
"
parseInt(dict.value)"
:key=
"
dict.value as number"
:label=
"dict.label"
:label=
"dict.label"
:value=
"
parseInt(dict.value)"
:value=
"
dict.value"
/>
/>
</el-select>
</el-select>
</el-form-item>
</el-form-item>
...
@@ -76,7 +70,7 @@
...
@@ -76,7 +70,7 @@
v-for=
"item in postOptions"
v-for=
"item in postOptions"
:key=
"item.id"
:key=
"item.id"
:label=
"item.name"
:label=
"item.name"
:value=
"item.id
"
:value=
"item.id
as number"
/>
/>
</el-select>
</el-select>
</el-form-item>
</el-form-item>
...
@@ -96,41 +90,45 @@
...
@@ -96,41 +90,45 @@
<el-button
@
click=
"cancel"
>
取 消
</el-button>
<el-button
@
click=
"cancel"
>
取 消
</el-button>
</div>
</div>
</
template
>
</
template
>
</
el-dialog>
</
Dialog>
</template>
</template>
<
script
lang=
"ts"
setup
>
<
script
lang=
"ts"
setup
>
import
{
PostVO
}
from
'@/api/system/post'
import
{
PostVO
}
from
'@/api/system/post'
import
{
createUserApi
,
updateUserApi
}
from
'@/api/system/user'
import
*
as
PostApi
from
'@/api/system/post'
import
{
DICT_TYPE
,
getDictOptions
}
from
'@/utils/dict'
import
{
createUserApi
,
getUserApi
,
updateUserApi
}
from
'@/api/system/user'
import
{
defaultProps
}
from
'@/utils/tree'
import
*
as
DeptApi
from
'@/api/system/dept'
import
{
DICT_TYPE
,
getIntDictOptions
}
from
'@/utils/dict'
import
{
defaultProps
,
handleTree
}
from
'@/utils/tree'
import
{
ElForm
,
FormItemRule
}
from
'element-plus'
import
{
ElForm
,
FormItemRule
}
from
'element-plus'
import
{
Arrayable
}
from
'element-plus/es/utils'
import
{
Arrayable
}
from
'element-plus/es/utils'
import
{
UserVO
}
from
'@/api/login/types'
type
Form
=
InstanceType
<
typeof
ElForm
>
type
Form
=
InstanceType
<
typeof
ElForm
>
interface
Props
{
deptOptions
?:
Tree
[]
postOptions
?:
PostVO
[]
//岗位列表
modelValue
:
boolean
formInitValue
?:
Recordable
&
Partial
<
typeof
initParams
>
}
const
props
=
withDefaults
(
defineProps
<
Props
>
(),
{
const
emits
=
defineEmits
([
'success'
])
deptOptions
:
()
=>
[],
postOptions
:
()
=>
[],
modelValue
:
false
,
formInitValue
:
()
=>
({})
})
const
emits
=
defineEmits
([
'update:modelValue'
,
'success'
])
const
{
t
}
=
useI18n
()
// 国际化
const
{
t
}
=
useI18n
()
// 国际化
const
message
=
useMessage
()
// 消息弹窗
const
message
=
useMessage
()
// 消息弹窗
const
showDialog
=
ref
(
false
)
// 弹出层标题
// 弹出层标题
const
title
=
computed
(()
=>
{
const
title
=
computed
(()
=>
{
return
formData
.
value
?.
id
?
'修改用户'
:
'添加用户'
return
formData
.
value
?.
id
?
'修改用户'
:
'添加用户'
})
})
// 性别字典
const
deptOptions
=
ref
<
Tree
[]
>
([])
// 树形结构
const
sexDictDatas
=
getDictOptions
(
DICT_TYPE
.
SYSTEM_USER_SEX
)
const
getTree
=
async
()
=>
{
const
res
=
await
DeptApi
.
getSimpleDeptList
()
deptOptions
.
value
=
[]
deptOptions
.
value
.
push
(...
handleTree
(
res
))
}
// 获取岗位列表
const
postOptions
=
ref
<
PostVO
[]
>
([])
//岗位列表
const
getPostOptions
=
async
()
=>
{
const
res
=
(
await
PostApi
.
getSimplePostList
())
as
PostVO
[]
postOptions
.
value
.
push
(...
res
)
}
// 表单初始化参数
// 表单初始化参数
const
initParams
=
{
const
initParams
=
{
...
@@ -156,7 +154,7 @@ const rules = {
...
@@ -156,7 +154,7 @@ const rules = {
email
:
[
email
:
[
{
{
type
:
'email'
,
type
:
'email'
,
message
:
"'请输入正确的邮箱地址"
,
message
:
'请输入正确的邮箱地址'
,
trigger
:
[
'blur'
,
'change'
]
trigger
:
[
'blur'
,
'change'
]
}
}
],
],
...
@@ -170,13 +168,6 @@ const rules = {
...
@@ -170,13 +168,6 @@ const rules = {
}
as
Partial
<
Record
<
string
,
Arrayable
<
FormItemRule
>>>
}
as
Partial
<
Record
<
string
,
Arrayable
<
FormItemRule
>>>
const
formRef
=
ref
<
Form
|
null
>
()
const
formRef
=
ref
<
Form
|
null
>
()
const
formData
=
ref
<
Recordable
>
({
...
initParams
})
const
formData
=
ref
<
Recordable
>
({
...
initParams
})
watch
(
()
=>
props
.
formInitValue
,
(
val
)
=>
{
formData
.
value
=
{
...
val
}
},
{
deep
:
true
}
)
const
resetForm
=
()
=>
{
const
resetForm
=
()
=>
{
let
form
=
formRef
?.
value
let
form
=
formRef
?.
value
...
@@ -185,7 +176,7 @@ const resetForm = () => {
...
@@ -185,7 +176,7 @@ const resetForm = () => {
form
&&
(
form
as
Form
).
resetFields
()
form
&&
(
form
as
Form
).
resetFields
()
}
}
const
closeDialog
=
()
=>
{
const
closeDialog
=
()
=>
{
emits
(
'update:modelValue'
,
false
)
showDialog
.
value
=
false
}
}
// 操作成功
// 操作成功
const
operateOk
=
()
=>
{
const
operateOk
=
()
=>
{
...
@@ -213,11 +204,34 @@ const submitForm = () => {
...
@@ -213,11 +204,34 @@ const submitForm = () => {
}
}
})
})
}
}
/* 取消 */
const
cancel
=
()
=>
{
const
cancel
=
()
=>
{
closeDialog
()
closeDialog
()
}
}
/* 打开弹框 */
const
openForm
=
(
row
:
undefined
|
UserVO
)
=>
{
resetForm
()
getTree
()
// 部门树
if
(
row
&&
row
.
id
)
{
const
id
=
row
.
id
getUserApi
(
id
).
then
((
response
)
=>
{
formData
.
value
=
response
})
}
else
{
formData
.
value
=
{
...
initParams
}
}
showDialog
.
value
=
true
}
// ========== 初始化 ==========
onMounted
(
async
()
=>
{
await
getPostOptions
()
})
defineExpose
({
defineExpose
({
resetForm
resetForm
,
openForm
})
})
</
script
>
</
script
>
src/views/system/user/ImportForm.vue
→
src/views/system/user/
components/User
ImportForm.vue
View file @
d28179d1
<
template
>
<
template
>
<
el-dialog
<
Dialog
:title=
"upload.title"
:title=
"upload.title"
:modelValue=
"
modelValue"
:modelValue=
"
showDialog"
width=
"400px"
width=
"400px"
append-to-body
append-to-body
@
close=
"closeDialog"
@
close=
"closeDialog"
...
@@ -45,7 +45,7 @@
...
@@ -45,7 +45,7 @@
<el-button
@
click=
"cancel"
>
取 消
</el-button>
<el-button
@
click=
"cancel"
>
取 消
</el-button>
</div>
</div>
</
template
>
</
template
>
</
el-dialog>
</
Dialog>
</template>
</template>
<
script
lang=
"ts"
setup
>
<
script
lang=
"ts"
setup
>
...
@@ -53,19 +53,11 @@ import { importUserTemplateApi } from '@/api/system/user'
...
@@ -53,19 +53,11 @@ import { importUserTemplateApi } from '@/api/system/user'
import
{
getAccessToken
,
getTenantId
}
from
'@/utils/auth'
import
{
getAccessToken
,
getTenantId
}
from
'@/utils/auth'
import
download
from
'@/utils/download'
import
download
from
'@/utils/download'
interface
Props
{
const
emits
=
defineEmits
([
'success'
])
modelValue
:
boolean
}
// const props =
withDefaults
(
defineProps
<
Props
>
(),
{
modelValue
:
false
})
const
emits
=
defineEmits
([
'update:modelValue'
,
'success'
])
const
message
=
useMessage
()
// 消息弹窗
const
message
=
useMessage
()
// 消息弹窗
const
showDialog
=
ref
(
false
)
const
uploadRef
=
ref
()
const
uploadRef
=
ref
()
// 用户导入参数
// 用户导入参数
...
@@ -123,7 +115,8 @@ const handleExceed = (): void => {
...
@@ -123,7 +115,8 @@ const handleExceed = (): void => {
message.error('
最多只能上传一个文件!
')
message.error('
最多只能上传一个文件!
')
}
}
// 上传错误提示
// 上传错误提示
const excelUploadError = (): void => {
const excelUploadError = (e): void => {
console.log(e)
message.error('
导入数据失败,请您重新上传!
')
message.error('
导入数据失败,请您重新上传!
')
}
}
...
@@ -144,10 +137,18 @@ const cancel = () => {
...
@@ -144,10 +137,18 @@ const cancel = () => {
}
}
// 关闭弹窗
// 关闭弹窗
const
closeDialog
=
()
=>
{
const
closeDialog
=
()
=>
{
emits('
update
:
modelValue
'
,
false
)
showDialog
.
value
=
false
}
}
// 提交上传文件
// 提交上传文件
const
submitFileForm
=
()
=>
{
const
submitFileForm
=
()
=>
{
uploadRef
.
value
?.
submit
()
uploadRef
.
value
?.
submit
()
}
}
const
openForm
=
()
=>
{
uploadRef
.
value
?.
clearFiles
()
showDialog
.
value
=
true
}
defineExpose
({
openForm
})
</
script
>
</
script
>
src/views/system/user/index.vue
View file @
d28179d1
...
@@ -5,31 +5,7 @@
...
@@ -5,31 +5,7 @@
<el-row
:gutter=
"20"
>
<el-row
:gutter=
"20"
>
<!--部门数据-->
<!--部门数据-->
<el-col
:span=
"4"
:xs=
"24"
>
<el-col
:span=
"4"
:xs=
"24"
>
<div
class=
"head-container"
>
<UserDeptTree
@
node-click=
"handleDeptNodeClick"
/>
<el-input
v-model=
"deptName"
placeholder=
"请输入部门名称"
clearable
style=
"margin-bottom: 20px"
>
<template
#
prefix
>
<Icon
icon=
"ep:search"
/>
</
template
>
</el-input>
</div>
<div
class=
"head-container"
>
<el-tree
:data=
"deptOptions"
:props=
"defaultProps"
:expand-on-click-node=
"false"
:filter-node-method=
"filterNode"
ref=
"treeRef"
node-key=
"id"
default-expand-all
highlight-current
@
node-click=
"handleDeptNodeClick"
/>
</div>
</el-col>
</el-col>
<!--用户数据-->
<!--用户数据-->
<el-col
:span=
"20"
:xs=
"24"
>
<el-col
:span=
"20"
:xs=
"24"
>
...
@@ -66,10 +42,10 @@
...
@@ -66,10 +42,10 @@
style=
"width: 240px"
style=
"width: 240px"
>
>
<el-option
<el-option
v-for=
"dict in
statusDictDatas
"
v-for=
"dict in
getIntDictOptions(DICT_TYPE.COMMON_STATUS)
"
:key=
"
parseInt(dict.value)
"
:key=
"
dict.value as number
"
:label=
"dict.label"
:label=
"dict.label"
:value=
"
parseInt(dict.value)
"
:value=
"
dict.value as number
"
/>
/>
</el-select>
</el-select>
</el-form-item>
</el-form-item>
...
@@ -244,51 +220,34 @@
...
@@ -244,51 +220,34 @@
</el-row>
</el-row>
</content-wrap>
</content-wrap>
<!-- 添加或修改用户对话框 -->
<!-- 添加或修改用户对话框 -->
<AddForm
<UserForm
ref=
"userFormRef"
@
success=
"getList"
/>
ref=
"addEditFormRef"
v-model=
"showAddDialog"
:dept-options=
"deptOptions"
:post-options=
"postOptions"
:form-init-value=
"addFormInitValue"
@
success=
"getList"
/>
<!-- 用户导入对话框 -->
<!-- 用户导入对话框 -->
<
ImportForm
v-model=
"importDialogVisible
"
@
success=
"getList"
/>
<
UserImportForm
ref=
"userImportFormRef
"
@
success=
"getList"
/>
<!-- 分配角色 -->
<!-- 分配角色 -->
<RoleForm
<UserAssignRoleForm
ref=
"userAssignRoleFormRef"
@
success=
"getList"
/>
ref=
"roleFormRef"
v-model:show=
"roleDialogVisible"
:role-options=
"roleOptions"
:form-init-value=
"userRole"
@
success=
"getList"
/>
</div>
</div>
</template>
</template>
<
script
setup
lang=
"ts"
name=
"User"
>
<
script
setup
lang=
"ts"
name=
"User"
>
import
type
{
ElTree
}
from
'element-plus'
import
download
from
'@/utils/download'
import
{
handleTree
,
defaultProps
}
from
'@/utils/tree'
import
{
parseTime
}
from
'@/utils/formatTime'
// 原vue3版本api方法都是Api结尾觉得见名知义,个人觉得这个可以形成规范
import
{
DICT_TYPE
,
getIntDictOptions
}
from
'@/utils/dict'
// TODO 使用 DeptApi 这种形式哈
import
{
CommonStatusEnum
}
from
'@/utils/constants'
import
{
getSimpleDeptList
as
getSimpleDeptListApi
}
from
'@/api/system/dept'
import
{
getSimplePostList
as
getSimplePostListApi
,
PostVO
}
from
'@/api/system/post'
import
{
DICT_TYPE
,
getDictOptions
}
from
'@/utils/dict'
import
{
import
{
deleteUserApi
,
deleteUserApi
,
exportUserApi
,
exportUserApi
,
resetUserPwdApi
,
resetUserPwdApi
,
updateUserStatusApi
,
updateUserStatusApi
,
getUserPageApi
,
UserVO
UserVO
}
from
'@/api/system/user'
}
from
'@/api/system/user'
import
{
parseTime
}
from
'./utils'
// TODO 可以使用 formatTime 里的方法
import
AddForm
from
'./AddForm.vue'
// TODO 改成 UserForm
import
UserForm
from
'./components/UserForm.vue'
import
ImportForm
from
'./ImportForm.vue'
// TODO 改成 UserImportForm
import
UserImportForm
from
'./components/UserImportForm.vue'
import
RoleForm
from
'./RoleForm.vue'
// TODO 改成 UserAssignRoleForm
import
UserAssignRoleForm
from
'./components/UserAssignRoleForm.vue'
import
{
getUserApi
,
getUserPageApi
}
from
'@/api/system/user'
import
UserDeptTree
from
'./components/UserDeptTree.vue'
import
{
getSimpleRoleList
as
getSimpleRoleListApi
}
from
'@/api/system/role'
import
{
listUserRolesApi
}
from
'@/api/system/permission'
import
{
CommonStatusEnum
}
from
'@/utils/constants'
import
download
from
'@/utils/download'
const
message
=
useMessage
()
// 消息弹窗
const
message
=
useMessage
()
// 消息弹窗
const
{
t
}
=
useI18n
()
// 国际化
const
{
t
}
=
useI18n
()
// 国际化
...
@@ -302,42 +261,12 @@ const queryParams = reactive({
...
@@ -302,42 +261,12 @@ const queryParams = reactive({
createTime
:
[]
createTime
:
[]
})
})
const
showSearch
=
ref
(
true
)
const
showSearch
=
ref
(
true
)
const
showAddDialog
=
ref
(
false
)
// 数据字典- // TODO 可以直接 vue 那 getIntDictOptions,这样一方面少个变量,也可以 getIntDictOptions
const
statusDictDatas
=
getDictOptions
(
DICT_TYPE
.
COMMON_STATUS
)
// ========== 创建部门树结构 ==========
// TODO 要不把部门树拆成一个左侧的组件,然后点击后触发 handleDeptNodeClick
const
deptName
=
ref
(
''
)
watch
(
()
=>
deptName
.
value
,
(
val
)
=>
{
treeRef
.
value
?.
filter
(
val
)
}
)
const
deptOptions
=
ref
<
Tree
[]
>
([])
// 树形结构
const
treeRef
=
ref
<
InstanceType
<
typeof
ElTree
>>
()
const
getTree
=
async
()
=>
{
const
res
=
await
getSimpleDeptListApi
()
deptOptions
.
value
=
[]
deptOptions
.
value
.
push
(...
handleTree
(
res
))
}
const
filterNode
=
(
value
:
string
,
data
:
Tree
)
=>
{
if
(
!
value
)
return
true
return
data
.
name
.
includes
(
value
)
}
const
handleDeptNodeClick
=
async
(
row
:
{
[
key
:
string
]:
any
})
=>
{
const
handleDeptNodeClick
=
async
(
row
:
{
[
key
:
string
]:
any
})
=>
{
queryParams
.
deptId
=
row
.
id
queryParams
.
deptId
=
row
.
id
getList
()
getList
()
}
}
// 获取岗位列表
const
postOptions
=
ref
<
PostVO
[]
>
([])
//岗位列表
const
getPostOptions
=
async
()
=>
{
const
res
=
await
getSimplePostListApi
()
postOptions
.
value
.
push
(...
res
)
}
// 用户列表
// 用户列表
const
userList
=
ref
<
UserVO
[]
>
([])
const
userList
=
ref
<
UserVO
[]
>
([])
const
loading
=
ref
(
false
)
const
loading
=
ref
(
false
)
...
@@ -374,37 +303,30 @@ const resetQuery = () => {
...
@@ -374,37 +303,30 @@ const resetQuery = () => {
}
}
// 添加或编辑
// 添加或编辑
const
addEdit
FormRef
=
ref
()
const
user
FormRef
=
ref
()
// 添加用户
// 添加用户
// TODO 可以参考别的模块哈,openForm;然后 tree 和 position 可以里面在加载下,让组件自己维护自己哈。
const
handleAdd
=
()
=>
{
const
handleAdd
=
()
=>
{
addEditFormRef
?.
value
.
resetForm
()
userFormRef
.
value
?.
openForm
()
// 获得下拉数据
getTree
()
// 打开表单,并设置初始化
showAddDialog
.
value
=
true
}
}
// 用户导入
// 用户导入
const
userImportFormRef
=
ref
()
const
handleImport
=
()
=>
{
const
handleImport
=
()
=>
{
importDialogVisible
.
value
=
true
userImportFormRef
.
value
?.
openForm
()
}
}
// 用户导出
// 用户导出
// TODO 改成 await 的风格;
const
exportLoading
=
ref
(
false
)
const
exportLoading
=
ref
(
false
)
const
handleExport
=
()
=>
{
const
handleExport
=
()
=>
{
message
message
.
confirm
(
'是否确认导出所有用户数据项?'
)
.
confirm
(
'是否确认导出所有用户数据项?'
)
.
then
(()
=>
{
.
then
(
async
()
=>
{
// 处理查询参数
// 处理查询参数
let
params
=
{
...
queryParams
}
let
params
=
{
...
queryParams
}
params
.
pageNo
=
1
params
.
pageNo
=
1
params
.
pageSize
=
99999
params
.
pageSize
=
99999
exportLoading
.
value
=
true
exportLoading
.
value
=
true
return
exportUserApi
(
params
)
const
response
=
await
exportUserApi
(
params
)
})
.
then
((
response
)
=>
{
download
.
excel
(
response
,
'用户数据.xls'
)
download
.
excel
(
response
,
'用户数据.xls'
)
})
})
.
catch
(()
=>
{})
.
catch
(()
=>
{})
...
@@ -435,17 +357,14 @@ const handleCommand = (command: string, index: number, row: UserVO) => {
...
@@ -435,17 +357,14 @@ const handleCommand = (command: string, index: number, row: UserVO) => {
}
}
// 用户状态修改
// 用户状态修改
// TODO 改成 await 的风格;
const
handleStatusChange
=
(
row
:
UserVO
)
=>
{
const
handleStatusChange
=
(
row
:
UserVO
)
=>
{
let
text
=
row
.
status
===
CommonStatusEnum
.
ENABLE
?
'启用'
:
'停用'
let
text
=
row
.
status
===
CommonStatusEnum
.
ENABLE
?
'启用'
:
'停用'
message
message
.
confirm
(
'确认要"'
+
text
+
'""'
+
row
.
username
+
'"用户吗?'
,
t
(
'common.reminder'
))
.
confirm
(
'确认要"'
+
text
+
'""'
+
row
.
username
+
'"用户吗?'
,
t
(
'common.reminder'
))
.
then
(
function
()
{
.
then
(
async
()
=>
{
row
.
status
=
row
.
status
=
row
.
status
===
CommonStatusEnum
.
ENABLE
?
CommonStatusEnum
.
ENABLE
:
CommonStatusEnum
.
DISABLE
row
.
status
===
CommonStatusEnum
.
ENABLE
?
CommonStatusEnum
.
ENABLE
:
CommonStatusEnum
.
DISABLE
return
updateUserStatusApi
(
row
.
id
,
row
.
status
)
await
updateUserStatusApi
(
row
.
id
,
row
.
status
)
})
.
then
(()
=>
{
message
.
success
(
text
+
'成功'
)
message
.
success
(
text
+
'成功'
)
// 刷新列表
// 刷新列表
getList
()
getList
()
...
@@ -457,81 +376,47 @@ const handleStatusChange = (row: UserVO) => {
...
@@ -457,81 +376,47 @@ const handleStatusChange = (row: UserVO) => {
}
}
// 具体数据单行操作
// 具体数据单行操作
const
addFormInitValue
=
ref
<
Recordable
>
({})
/** 修改按钮操作 */
/** 修改按钮操作 */
const
handleUpdate
=
(
row
:
UserVO
)
=>
{
const
handleUpdate
=
(
row
:
UserVO
)
=>
{
addEditFormRef
.
value
?.
resetForm
()
userFormRef
.
value
?.
openForm
(
row
)
getTree
()
const
id
=
row
.
id
getUserApi
(
id
).
then
((
response
)
=>
{
addFormInitValue
.
value
=
response
showAddDialog
.
value
=
true
})
}
}
// 删除用户
// 删除用户
// TODO 改成 await 的风格;
const
handleDelete
=
(
row
:
UserVO
)
=>
{
const
handleDelete
=
(
row
:
UserVO
)
=>
{
const
ids
=
row
.
id
const
ids
=
row
.
id
message
message
.
confirm
(
'是否确认删除用户编号为"'
+
ids
+
'"的数据项?'
)
.
confirm
(
'是否确认删除用户编号为"'
+
ids
+
'"的数据项?'
)
.
then
(()
=>
{
.
then
(
async
()
=>
{
return
deleteUserApi
(
ids
)
await
deleteUserApi
(
ids
)
})
.
then
(()
=>
{
getList
()
message
.
success
(
'删除成功'
)
message
.
success
(
'删除成功'
)
getList
()
})
.
catch
((
e
)
=>
{
console
.
error
(
e
)
})
})
.
catch
(()
=>
{})
}
}
// 重置密码
// 重置密码
// TODO 改成 await 的风格;
const
handleResetPwd
=
(
row
:
UserVO
)
=>
{
const
handleResetPwd
=
(
row
:
UserVO
)
=>
{
message
.
prompt
(
'请输入"'
+
row
.
username
+
'"的新密码'
,
t
(
'common.reminder'
)).
then
(({
value
})
=>
{
message
resetUserPwdApi
(
row
.
id
,
value
)
.
prompt
(
'请输入"'
+
row
.
username
+
'"的新密码'
,
t
(
'common.reminder'
))
.
then
(()
=>
{
.
then
(
async
({
value
})
=>
{
await
resetUserPwdApi
(
row
.
id
,
value
)
message
.
success
(
'修改成功,新密码是:'
+
value
)
message
.
success
(
'修改成功,新密码是:'
+
value
)
})
})
.
catch
((
e
)
=>
{
.
catch
((
e
)
=>
{
console
.
error
(
e
)
console
.
error
(
e
)
})
})
})
}
}
// 分配角色
// 分配角色
const
roleDialogVisible
=
ref
(
false
)
const
userAssignRoleFormRef
=
ref
()
const
roleOptions
=
ref
()
const
handleRole
=
(
row
:
UserVO
)
=>
{
const
userRole
=
reactive
({
userAssignRoleFormRef
.
value
?.
openForm
(
row
)
id
:
0
,
username
:
''
,
nickname
:
''
,
roleIds
:
[]
})
const
handleRole
=
async
(
row
:
UserVO
)
=>
{
addEditFormRef
.
value
?.
resetForm
()
userRole
.
id
=
row
.
id
userRole
.
username
=
row
.
username
userRole
.
nickname
=
row
.
nickname
// 获得角色列表
const
roleOpt
=
await
getSimpleRoleListApi
()
roleOptions
.
value
=
[...
roleOpt
]
// 获得角色拥有的菜单集合
const
roles
=
await
listUserRolesApi
(
row
.
id
)
userRole
.
roleIds
=
roles
roleDialogVisible
.
value
=
true
}
}
/* 用户导入 */
const
importDialogVisible
=
ref
(
false
)
// ========== 初始化 ==========
// ========== 初始化 ==========
onMounted
(
async
()
=>
{
onMounted
(
async
()
=>
{
getList
()
getList
()
await
getPostOptions
()
await
getTree
()
})
})
</
script
>
</
script
>
src/views/system/user/utils.ts
deleted
100644 → 0
View file @
84ab75b4
export
const
parseTime
=
(
time
)
=>
{
if
(
!
time
)
{
return
null
}
const
format
=
'{y}-{m}-{d} {h}:{i}:{s}'
let
date
if
(
typeof
time
===
'object'
)
{
date
=
time
}
else
{
if
(
typeof
time
===
'string'
&&
/^
[
0-9
]
+$/
.
test
(
time
))
{
time
=
parseInt
(
time
)
}
else
if
(
typeof
time
===
'string'
)
{
time
=
time
.
replace
(
new
RegExp
(
/-/gm
),
'/'
)
.
replace
(
'T'
,
' '
)
.
replace
(
new
RegExp
(
/
\.[\d]{3}
/gm
),
''
)
}
if
(
typeof
time
===
'number'
&&
time
.
toString
().
length
===
10
)
{
time
=
time
*
1000
}
date
=
new
Date
(
time
)
}
const
formatObj
=
{
y
:
date
.
getFullYear
(),
m
:
date
.
getMonth
()
+
1
,
d
:
date
.
getDate
(),
h
:
date
.
getHours
(),
i
:
date
.
getMinutes
(),
s
:
date
.
getSeconds
(),
a
:
date
.
getDay
()
}
const
time_str
=
format
.
replace
(
/{
(
y|m|d|h|i|s|a
)
+}/g
,
(
result
,
key
)
=>
{
let
value
=
formatObj
[
key
]
// Note: getDay() returns 0 on Sunday
if
(
key
===
'a'
)
{
return
[
'日'
,
'一'
,
'二'
,
'三'
,
'四'
,
'五'
,
'六'
][
value
]
}
if
(
result
.
length
>
0
&&
value
<
10
)
{
value
=
'0'
+
value
}
return
value
||
0
})
return
time_str
}
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