Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
FLIPPED-AURORA
gin-vue-admin
提交
e951225f
G
gin-vue-admin
项目概览
FLIPPED-AURORA
/
gin-vue-admin
大约 1 年 前同步成功
通知
334
Star
18155
Fork
5506
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
G
gin-vue-admin
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
e951225f
编写于
2月 08, 2022
作者:
Mr.奇淼(
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
修改用户管理编辑模式,增加手机号邮箱操作
上级
d025ae89
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
98 addition
and
91 deletion
+98
-91
server/model/system/sys_user.go
server/model/system/sys_user.go
+2
-0
server/source/system/user.go
server/source/system/user.go
+2
-2
web/src/view/superAdmin/user/user.vue
web/src/view/superAdmin/user/user.vue
+94
-89
未找到文件。
server/model/system/sys_user.go
浏览文件 @
e951225f
...
...
@@ -18,4 +18,6 @@ type SysUser struct {
AuthorityId
string
`json:"authorityId" gorm:"default:888;comment:用户角色ID"`
// 用户角色ID
Authority
SysAuthority
`json:"authority" gorm:"foreignKey:AuthorityId;references:AuthorityId;comment:用户角色"`
Authorities
[]
SysAuthority
`json:"authorities" gorm:"many2many:sys_user_authority;"`
Phone
string
`json:"phone" gorm:"comment:用户手机号"`
// 用户角色ID
Email
string
`json:"email" gorm:"comment:用户邮箱"`
// 用户邮箱
}
server/source/system/user.go
浏览文件 @
e951225f
...
...
@@ -18,8 +18,8 @@ func (u *user) TableName() string {
func
(
u
*
user
)
Initialize
()
error
{
entities
:=
[]
system
.
SysUser
{
{
UUID
:
uuid
.
NewV4
(),
Username
:
"admin"
,
Password
:
"e10adc3949ba59abbe56e057f20f883e"
,
NickName
:
"超级管理员"
,
HeaderImg
:
"https://qmplusimg.henrongyi.top/gva_header.jpg"
,
AuthorityId
:
"888"
},
{
UUID
:
uuid
.
NewV4
(),
Username
:
"a303176530"
,
Password
:
"3ec063004a6f31642261936a379fde3d"
,
NickName
:
"QMPlusUser"
,
HeaderImg
:
"https:///qmplusimg.henrongyi.top/1572075907logo.png"
,
AuthorityId
:
"9528"
},
{
UUID
:
uuid
.
NewV4
(),
Username
:
"admin"
,
Password
:
"e10adc3949ba59abbe56e057f20f883e"
,
NickName
:
"超级管理员"
,
HeaderImg
:
"https://qmplusimg.henrongyi.top/gva_header.jpg"
,
AuthorityId
:
"888"
,
Phone
:
"17611111111"
,
Email
:
"333333333@qq.com"
},
{
UUID
:
uuid
.
NewV4
(),
Username
:
"a303176530"
,
Password
:
"3ec063004a6f31642261936a379fde3d"
,
NickName
:
"QMPlusUser"
,
HeaderImg
:
"https:///qmplusimg.henrongyi.top/1572075907logo.png"
,
AuthorityId
:
"9528"
,
Phone
:
"17611111111"
,
Email
:
"333333333@qq.com"
},
}
if
err
:=
global
.
GVA_DB
.
Create
(
&
entities
)
.
Error
;
err
!=
nil
{
return
errors
.
Wrap
(
err
,
u
.
TableName
()
+
"表数据初始化失败!"
)
...
...
web/src/view/superAdmin/user/user.vue
浏览文件 @
e951225f
...
...
@@ -5,33 +5,21 @@
<div
class=
"gva-btn-list"
>
<el-button
size=
"small"
type=
"primary"
icon=
"plus"
@
click=
"addUser"
>
新增用户
</el-button>
</div>
<el-table
:data=
"tableData"
>
<el-table-column
align=
"left"
label=
"头像"
min-width=
"50"
>
<el-table
:data=
"tableData"
row-key=
"ID"
>
<el-table-column
align=
"left"
label=
"头像"
min-width=
"75"
>
<template
#default
="
scope
"
>
<CustomPic
style=
"margin-top:8px"
:pic-src=
"scope.row.headerImg"
/>
</
template
>
</el-table-column>
<el-table-column
align=
"left"
label=
"
UUID"
min-width=
"250"
prop=
"uuid
"
/>
<el-table-column
align=
"left"
label=
"
ID"
min-width=
"50"
prop=
"ID
"
/>
<el-table-column
align=
"left"
label=
"用户名"
min-width=
"150"
prop=
"userName"
/>
<el-table-column
align=
"left"
label=
"昵称"
min-width=
"100"
prop=
"nickName"
>
<
template
#default=
"scope"
>
<p
v-if=
"!scope.row.editFlag"
class=
"nickName"
>
{{
scope
.
row
.
nickName
}}
<el-icon
class=
"pointer"
color=
"#66b1ff"
@
click=
"openEidt(scope.row)"
>
<edit
/>
</el-icon>
</p>
<p
v-if=
"scope.row.editFlag"
class=
"nickName"
>
<el-input
v-model=
"scope.row.nickName"
/>
<el-icon
class=
"pointer"
color=
"#67c23a"
@
click=
"enterEdit(scope.row)"
>
<check
/>
</el-icon>
<el-icon
class=
"pointer"
color=
"#f23c3c"
@
click=
"closeEdit(scope.row)"
>
<close
/>
</el-icon>
</p>
</
template
>
</el-table-column>
<el-table-column
align=
"left"
label=
"用户角色"
min-width=
"150"
>
<el-table-column
align=
"left"
label=
"昵称"
min-width=
"150"
prop=
"nickName"
/>
<el-table-column
align=
"left"
label=
"手机号"
min-width=
"180"
prop=
"phone"
/>
<el-table-column
align=
"left"
label=
"邮箱"
min-width=
"180"
prop=
"email"
/>
<el-table-column
align=
"left"
label=
"用户角色"
min-width=
"200"
>
<
template
#default=
"scope"
>
<el-cascader
v-model=
"scope.row.authorityIds"
...
...
@@ -45,21 +33,24 @@
/>
</
template
>
</el-table-column>
<el-table-column
align=
"left"
label=
"操作"
min-width=
"150"
>
<el-table-column
label=
"操作"
min-width=
"250"
fixed=
"right"
>
<
template
#default=
"scope"
>
<el-popover
v-model:visible=
"scope.row.visible"
placement=
"top"
width=
"160"
trigger=
"click"
>
<el-popover
v-model:visible=
"scope.row.visible"
placement=
"top"
width=
"160"
>
<p>
确定要删除此用户吗
</p>
<div
style=
"text-align: right; margin-top: 8px;"
>
<el-button
size=
"small"
type=
"text"
@
click=
"scope.row.visible = false"
>
取消
</el-button>
<el-button
type=
"primary"
size=
"small"
@
click=
"deleteUserFunc(scope.row)"
>
确定
</el-button>
</div>
<template
#reference
>
<el-button
type=
"text"
icon=
"delete"
size=
"small"
@
click=
"scope.row.visible = true"
>
删除
</el-button>
<el-button
type=
"text"
icon=
"delete"
size=
"small"
>
删除
</el-button>
</
template
>
</el-popover>
<el-button
type=
"text"
icon=
"edit"
size=
"small"
@
click=
"openEdit(scope.row)"
>
编辑
</el-button>
<el-button
type=
"text"
icon=
"magic-stick"
size=
"small"
@
click=
"resetPasswordFunc(scope.row)"
>
重置密码
</el-button>
</template>
</el-table-column>
</el-table>
<div
class=
"gva-pagination"
>
<el-pagination
...
...
@@ -73,35 +64,52 @@
/>
</div>
</div>
<el-dialog
v-model=
"addUserDialog"
custom-class=
"user-dialog"
title=
"新增用户"
>
<el-form
ref=
"userForm"
:rules=
"rules"
:model=
"userInfo"
label-width=
"80px"
>
<el-form-item
label=
"用户名"
prop=
"username"
>
<el-input
v-model=
"userInfo.username"
/>
</el-form-item>
<el-form-item
label=
"密码"
prop=
"password"
>
<el-input
v-model=
"userInfo.password"
/>
</el-form-item>
<el-form-item
label=
"别名"
prop=
"nickName"
>
<el-input
v-model=
"userInfo.nickName"
/>
</el-form-item>
<el-form-item
label=
"用户角色"
prop=
"authorityId"
>
<el-cascader
v-model=
"userInfo.authorityIds"
style=
"width:100%"
:options=
"authOptions"
:show-all-levels=
"false"
:props=
"{ multiple:true,checkStrictly: true,label:'authorityName',value:'authorityId',disabled:'disabled',emitPath:false}"
:clearable=
"false"
/>
</el-form-item>
<el-form-item
label=
"头像"
label-width=
"80px"
>
<div
style=
"display:inline-block"
@
click=
"openHeaderChange"
>
<img
v-if=
"userInfo.headerImg"
class=
"header-img-box"
:src=
"(userInfo.headerImg && userInfo.headerImg.slice(0, 4) !== 'http')?path+userInfo.headerImg:userInfo.headerImg"
>
<div
v-else
class=
"header-img-box"
>
从媒体库选择
</div>
</div>
</el-form-item>
<el-dialog
v-model=
"addUserDialog"
custom-class=
"user-dialog"
title=
"用户"
:show-close=
"false"
:close-on-press-escape=
"false"
:close-on-click-modal=
"false"
>
<div
style=
"height:60vh;overflow:auto;padding:0 12px;"
>
<el-form
ref=
"userForm"
:rules=
"rules"
:model=
"userInfo"
label-width=
"80px"
>
<el-form-item
v-if=
"dialogFlag === 'add'"
label=
"用户名"
prop=
"userName"
>
<el-input
v-model=
"userInfo.userName"
/>
</el-form-item>
<el-form-item
v-if=
"dialogFlag === 'add'"
label=
"密码"
prop=
"password"
>
<el-input
v-model=
"userInfo.password"
/>
</el-form-item>
<el-form-item
label=
"昵称"
prop=
"nickName"
>
<el-input
v-model=
"userInfo.nickName"
/>
</el-form-item>
<el-form-item
label=
"手机号"
prop=
"phone"
>
<el-input
v-model=
"userInfo.phone"
/>
</el-form-item>
<el-form-item
label=
"邮箱"
prop=
"email"
>
<el-input
v-model=
"userInfo.email"
/>
</el-form-item>
<el-form-item
label=
"用户角色"
prop=
"authorityId"
>
<el-cascader
v-model=
"userInfo.authorityIds"
style=
"width:100%"
:options=
"authOptions"
:show-all-levels=
"false"
:props=
"{ multiple:true,checkStrictly: true,label:'authorityName',value:'authorityId',disabled:'disabled',emitPath:false}"
:clearable=
"false"
/>
</el-form-item>
<el-form-item
label=
"头像"
label-width=
"80px"
>
<div
style=
"display:inline-block"
@
click=
"openHeaderChange"
>
<img
v-if=
"userInfo.headerImg"
class=
"header-img-box"
:src=
"(userInfo.headerImg && userInfo.headerImg.slice(0, 4) !== 'http')?path+userInfo.headerImg:userInfo.headerImg"
>
<div
v-else
class=
"header-img-box"
>
从媒体库选择
</div>
</div>
</el-form-item>
</el-form>
</div>
</el-form>
<
template
#footer
>
<div
class=
"dialog-footer"
>
<el-button
size=
"small"
@
click=
"closeAddUserDialog"
>
取 消
</el-button>
...
...
@@ -120,6 +128,7 @@ export default {
</
script
>
<
script
setup
>
import
{
getUserList
,
setUserAuthorities
,
...
...
@@ -242,40 +251,12 @@ const setOptions = (authData) => {
setAuthorityOptions
(
authData
,
authOptions
.
value
)
}
const
backNickName
=
ref
(
''
)
const
openEidt
=
(
row
)
=>
{
if
(
tableData
.
value
.
some
(
item
=>
item
.
editFlag
))
{
ElMessage
(
'
当前存在正在编辑的用户
'
)
return
}
backNickName
.
value
=
row
.
nickName
row
.
editFlag
=
true
}
const
enterEdit
=
async
(
row
)
=>
{
const
res
=
await
setUserInfo
({
nickName
:
row
.
nickName
,
ID
:
row
.
ID
})
if
(
res
.
code
===
0
)
{
ElMessage
({
type
:
'
success
'
,
message
:
'
设置成功
'
})
}
backNickName
.
value
=
ref
(
''
)
row
.
editFlag
=
false
}
const
closeEdit
=
(
row
)
=>
{
row
.
nickName
=
backNickName
.
value
backNickName
.
value
=
''
row
.
editFlag
=
false
}
const
deleteUserFunc
=
async
(
row
)
=>
{
const
res
=
await
deleteUser
({
id
:
row
.
ID
})
if
(
res
.
code
===
0
)
{
ElMessage
.
success
(
'
删除成功
'
)
await
getTableData
()
row
.
visible
=
false
await
getTableData
()
}
}
...
...
@@ -286,11 +267,11 @@ const userInfo = ref({
nickName
:
''
,
headerImg
:
''
,
authorityId
:
''
,
authorityIds
:
[]
authorityIds
:
[]
,
})
const
rules
=
ref
({
user
n
ame
:
[
user
N
ame
:
[
{
required
:
true
,
message
:
'
请输入用户名
'
,
trigger
:
'
blur
'
},
{
min
:
5
,
message
:
'
最低5位字符
'
,
trigger
:
'
blur
'
}
],
...
...
@@ -310,12 +291,25 @@ const enterAddUserDialog = async() => {
userInfo
.
value
.
authorityId
=
userInfo
.
value
.
authorityIds
[
0
]
userForm
.
value
.
validate
(
async
valid
=>
{
if
(
valid
)
{
const
res
=
await
register
(
userInfo
.
value
)
if
(
res
.
code
===
0
)
{
ElMessage
({
type
:
'
success
'
,
message
:
'
创建成功
'
})
const
req
=
{
...
userInfo
.
value
}
if
(
dialogFlag
.
value
===
'
add
'
)
{
const
res
=
await
register
(
req
)
if
(
res
.
code
===
0
)
{
ElMessage
({
type
:
'
success
'
,
message
:
'
创建成功
'
})
await
getTableData
()
closeAddUserDialog
()
}
}
if
(
dialogFlag
.
value
===
'
edit
'
)
{
const
res
=
await
setUserInfo
(
req
)
if
(
res
.
code
===
0
)
{
ElMessage
({
type
:
'
success
'
,
message
:
'
编辑成功
'
})
await
getTableData
()
closeAddUserDialog
()
}
}
await
getTableData
()
closeAddUserDialog
()
}
})
}
...
...
@@ -327,7 +321,11 @@ const closeAddUserDialog = () => {
userInfo
.
value
.
authorityIds
=
[]
addUserDialog
.
value
=
false
}
const
dialogFlag
=
ref
(
'
add
'
)
const
addUser
=
()
=>
{
dialogFlag
.
value
=
'
add
'
addUserDialog
.
value
=
true
}
const
changeAuthority
=
async
(
row
,
flag
)
=>
{
...
...
@@ -344,6 +342,13 @@ const changeAuthority = async(row, flag) => {
ElMessage
({
type
:
'
success
'
,
message
:
'
角色设置成功
'
})
}
}
const
openEdit
=
(
row
)
=>
{
dialogFlag
.
value
=
'
edit
'
userInfo
.
value
=
JSON
.
parse
(
JSON
.
stringify
(
row
))
addUserDialog
.
value
=
true
}
</
script
>
<
style
lang=
"scss"
>
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录