Skip to content
Toggle navigation
P
Projects
G
Groups
S
Snippets
Help
phsl
/
client
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
Commit
990b4b29
authored
Aug 22, 2025
by
孙美琪
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
相关提交
parent
67cb9a8c
Hide whitespace changes
Inline
Side-by-side
Showing
11 changed files
with
232 additions
and
149 deletions
+232
-149
src/api/console.js
+6
-6
src/api/system/user.js
+1
-1
src/store/modules/user.js
+1
-1
src/views/computingResource/resourceList.vue
+0
-1
src/views/console/overview.vue
+7
-12
src/views/index.vue
+2
-19
src/views/system/user/profile/changeBind.vue
+127
-0
src/views/system/user/profile/index.vue
+68
-64
src/views/system/user/profile/resetPwd.vue
+1
-1
src/views/system/user/profile/userAvatar.vue
+3
-2
src/views/system/user/profile/userInfo.vue
+16
-42
No files found.
src/api/console.js
View file @
990b4b29
...
...
@@ -11,10 +11,10 @@ export function enterpriseAudit (query) {
}
// 根据用户查询企业认证信息和用户信息
export
function
auditInfo
(
query
)
{
return
request
({
url
:
'/api/v1/enterpriseAudit
'
,
method
:
'get'
,
data
:
query
})
export
function
auditInfo
(
query
)
{
return
request
({
url
:
'/member/user/getUserAndEnterpriseInfo
'
,
method
:
'get'
,
data
:
query
})
}
src/api/system/user.js
View file @
990b4b29
...
...
@@ -91,7 +91,7 @@ export function getUserProfile() {
// 修改用户个人信息
export
function
updateUserProfile
(
data
)
{
return
request
({
url
:
'/
system/user/profil
e'
,
url
:
'/
member/user/updat
e'
,
method
:
'put'
,
data
:
data
})
...
...
src/store/modules/user.js
View file @
990b4b29
...
...
@@ -57,7 +57,7 @@ const useUserStore = defineStore(
this.roles = ['ROLE_DEFAULT']
}*/
this
.
id
=
user
.
id
this
.
name
=
user
.
mobil
e
this
.
name
=
user
.
nicknam
e
this
.
avatar
=
avatar
resolve
(
res
)
}).
catch
(
error
=>
{
...
...
src/views/computingResource/resourceList.vue
View file @
990b4b29
...
...
@@ -58,7 +58,6 @@
<div
v-if=
"showVersion === 1"
class=
"version-1"
>
<el-table
:data=
"tableData"
:max-height=
"490"
style=
"width: 100%"
>
<el-table-column
prop=
"name"
label=
"型号"
width=
"190px"
sortable
/>
<!--
<el-table-column
v-for=
"item in productType"
prop=
"cpu"
label=
"CPU"
sortable
/>
-->
<el-table-column
v-for=
"(item, index) in tableData[0]?.properties.length!==0?tableData[0]?.properties.slice(0,6):tableData[0]?.properties"
:key=
"index"
...
...
src/views/console/overview.vue
View file @
990b4b29
...
...
@@ -28,9 +28,7 @@
<el-form
label-width=
"110px"
label-position=
"left"
>
<el-form-item
label=
"账号昵称:"
>
<div>
{{ infoData.nickName }}
</div>
<el-icon
@
click=
"$router.push('/user/profile')"
>
<Edit/>
</el-icon>
<el-button
type=
"primary"
link
@
click=
"$router.push('/user/profile?tab=0')"
class=
"ml20"
>
修改
</el-button>
</el-form-item>
<el-form-item
label=
"注册时间:"
>
<div>
{{ infoData.createUserTime }}
</div>
...
...
@@ -53,15 +51,11 @@
<el-form
label-width=
"96px"
label-position=
"left"
>
<el-form-item
label=
"我的手机号:"
>
<div>
{{ infoData.mobile }}
</div>
<el-icon
@
click=
"$router.push('/user/profile')"
>
<Edit/>
</el-icon>
<el-button
type=
"primary"
link
@
click=
"$router.push('/user/profile?tab=1')"
class=
"ml20"
>
换绑
</el-button>
</el-form-item>
<el-form-item
label=
"我的密码:"
>
<div>
********
</div>
<el-icon
@
click=
"$router.push('/user/profile')"
>
<Edit/>
</el-icon>
<el-button
type=
"primary"
link
@
click=
"$router.push('/user/profile?tab=2')"
class=
"ml20"
>
修改密码
</el-button>
</el-form-item>
</el-form>
</div>
...
...
@@ -81,7 +75,7 @@
<el-tag
v-else
class=
"mr5"
type=
"warning"
>
未认证
</el-tag>
<el-button
v-if=
"!infoData.status || infoData.status === '驳回'"
@
click=
"$router.push('/console/authentication')"
type=
"primary"
link
>
去申请
@
click=
"$router.push('/console/authentication')"
type=
"primary"
link
class=
"ml20"
>
去申请
</el-button>
</el-form-item>
<el-form-item
label=
"最后提交时间:"
>
...
...
@@ -119,7 +113,7 @@
</el-card>
</el-col>
</el-row>
<el-dialog></el-dialog>
</div>
</template>
...
...
@@ -131,10 +125,11 @@ import {ElMessageBox} from 'element-plus'
const
baseUrl
=
import
.
meta
.
env
.
VITE_APP_BASE_API
const
infoData
=
ref
({})
const
handleOpenDialog
=
ref
(
false
)
function
getAuditInfo
()
{
auditInfo
().
then
(
res
=>
{
console
.
log
(
res
)
console
.
log
(
res
,
'auditInfo'
)
infoData
.
value
=
res
.
data
})
}
...
...
src/views/index.vue
View file @
990b4b29
...
...
@@ -89,8 +89,7 @@
<el-col
:span=
"8"
v-for=
"(i,index) in infoList"
:key=
"index"
@
click=
"handleInfoDetails(i.id)"
>
<div
class=
"info-top-item"
>
<img
:src=
"i.images[0]"
alt=
""
>
:src=
"i.image"
alt=
""
>
<div
class=
"content"
>
<div
class=
"title"
>
{{
i
.
title
}}
</div>
...
...
@@ -240,23 +239,7 @@ onBeforeUnmount(() => {
function
getBanner
()
{
banner
().
then
(
res
=>
{
// 筛选条件:showStatus为1的数据
const
validData
=
res
.
data
.
filter
(
item
=>
item
.
showStatus
===
0
);
// 处理图片字段,只取第一张图片
validData
.
forEach
(
item
=>
{
// 注意后台字段名为images(复数),需要取第一张图片
if
(
Array
.
isArray
(
item
.
images
)
&&
item
.
images
.
length
>
0
)
{
item
.
image
=
item
.
images
[
0
];
}
else
{
item
.
image
=
''
;
// 如果没有图片,设置为空字符串
}
}
);
// 对筛选后的数据进行排序
bannerImgList
.
value
=
validData
.
sort
(
function
(
a
,
b
)
{
return
a
.
orderNum
-
b
.
orderNum
}
)
bannerImgList
.
value
=
res
.
data
.
filter
(
item
=>
item
.
image
);
}
)
}
...
...
src/views/system/user/profile/changeBind.vue
0 → 100644
View file @
990b4b29
<
template
>
<el-form
ref=
"pwdRef"
:model=
"user"
:rules=
"rules"
label-width=
"100px"
style=
"width: 400px;height: 260px;"
>
<el-form-item
label=
"原手机号码"
prop=
"oldPassword"
>
<el-input
v-model=
"user.oldPassword"
placeholder=
"请输入原手机号码"
type=
"password"
show-password
/>
</el-form-item>
<el-form-item
label=
"验证码"
prop=
"newPassword"
>
<el-input
v-model=
"user.code"
type=
"text"
size=
"large"
auto-complete=
"off"
placeholder=
"验证码"
>
<template
#
append
>
<el-button
@
click=
"startCountdown"
:disabled=
"isCounting"
>
{{
isCounting
?
`重新发送(${countdown
}
)`
:
'发送验证码'
}}
<
/el-button
>
<
/template
>
<
/el-input
>
<
/el-form-item
>
<
el
-
form
-
item
label
=
"新手机号码"
prop
=
"confirmPassword"
>
<
el
-
input
v
-
model
=
"user.confirmPassword"
placeholder
=
"请确认新密码"
type
=
"password"
show
-
password
/>
<
/el-form-item
>
<
el
-
form
-
item
label
=
"验证码"
prop
=
"code"
>
<
el
-
input
v
-
model
=
"user.code"
type
=
"text"
size
=
"large"
auto
-
complete
=
"off"
placeholder
=
"验证码"
>
<
template
#
append
>
<
el
-
button
@
click
=
"startCountdown"
:
disabled
=
"isCounting"
>
{{
isCounting
?
`重新发送(${countdown
}
)`
:
'发送验证码'
}}
<
/el-button
>
<
/template
>
<
/el-input
>
<
/el-form-item
>
<
el
-
form
-
item
>
<
el
-
button
type
=
"primary"
@
click
=
"submit"
>
保存
<
/el-button
>
<!--
<
el
-
button
type
=
"danger"
@
click
=
"close"
>
关闭
<
/el-button>--
>
<
/el-form-item
>
<
/el-form
>
<
/template
>
<
script
setup
>
import
{
updateUserPwd
}
from
"@/api/system/user"
;
import
{
sendCode
}
from
"@/api/login.js"
;
import
{
ElMessage
}
from
"element-plus"
;
const
{
proxy
}
=
getCurrentInstance
();
const
user
=
reactive
({
oldPassword
:
undefined
,
newPassword
:
undefined
,
confirmPassword
:
undefined
}
);
const
countdown
=
ref
(
60
);
// 倒计时时间,初始为60秒
const
isCounting
=
ref
(
false
);
// 是否正在倒计时的标志
const
pwdRef
=
ref
(
null
);
// 是否正在倒计时的标志
const
equalToPassword
=
(
rule
,
value
,
callback
)
=>
{
if
(
user
.
newPassword
!==
value
)
{
callback
(
new
Error
(
"两次输入的密码不一致"
));
}
else
{
callback
();
}
}
;
const
rules
=
ref
({
oldPassword
:
[{
required
:
true
,
message
:
"旧密码不能为空"
,
trigger
:
"blur"
}
],
newPassword
:
[{
required
:
true
,
message
:
"新密码不能为空"
,
trigger
:
"blur"
}
,
{
min
:
6
,
max
:
20
,
message
:
"长度在 6 到 20 个字符"
,
trigger
:
"blur"
}
,
{
pattern
:
/^
[^
<>"'|
\\]
+$/
,
message
:
"不能包含非法字符:< > \" ' \\\ |"
,
trigger
:
"blur"
}
],
confirmPassword
:
[{
required
:
true
,
message
:
"确认密码不能为空"
,
trigger
:
"blur"
}
,
{
required
:
true
,
validator
:
equalToPassword
,
trigger
:
"blur"
}
]
}
);
function
getCode
()
{
sendCode
({
mobile
:
user
.
phoneNumber
,
scene
:
2
}
).
then
(
res
=>
{
if
(
res
.
data
===
true
)
{
ElMessage
({
message
:
'短信已发送请注意查收'
,
type
:
'success'
}
)
}
}
)
}
// 开始倒计时的方法
const
startCountdown
=
()
=>
{
getCode
()
pwdRef
.
value
.
validateField
(
'phoneNumber'
,
valid
=>
{
if
(
valid
)
{
if
(
isCounting
.
value
)
return
;
// 如果已经在倒计时,则不重复开始
isCounting
.
value
=
true
;
// 设置正在倒计时的标志为true
const
timer
=
setInterval
(()
=>
{
if
(
countdown
.
value
>
0
)
{
countdown
.
value
--
;
// 倒计时减1
}
else
{
clearInterval
(
timer
);
// 倒计时结束,清除定时器
isCounting
.
value
=
false
;
// 设置正在倒计时的标志为false
countdown
.
value
=
60
;
// 重置倒计时时间
}
}
,
1000
);
// 每1000毫秒(1秒)执行一次
}
}
)
}
;
/** 提交按钮 */
function
submit
()
{
proxy
.
$refs
.
pwdRef
.
validate
(
valid
=>
{
if
(
valid
)
{
updateUserPwd
(
user
.
oldPassword
,
user
.
newPassword
).
then
(
response
=>
{
proxy
.
$modal
.
msgSuccess
(
"修改成功"
);
}
);
}
}
);
}
;
/** 关闭按钮 */
function
close
()
{
proxy
.
$tab
.
closePage
();
}
;
console
.
log
(
user
,
'user'
)
<
/script
>
src/views/system/user/profile/index.vue
View file @
990b4b29
<
template
>
<div
class=
"app-container"
>
<el-row
:gutter=
"20"
>
<el-col
:span=
"6"
:xs=
"24"
>
<el-card
class=
"box-card"
>
<template
v-slot:header
>
<div
class=
"clearfix"
>
<span>
个人信息
</span>
</div>
</
template
>
<div>
<div
class=
"text-center"
>
<userAvatar
/>
</div>
<ul
class=
"list-group list-group-striped"
>
<li
class=
"list-group-item"
>
<svg-icon
icon-class=
"user"
/>
用户名称
<div
class=
"pull-right"
>
{{ state.user.userName }}
</div>
</li>
<li
class=
"list-group-item"
>
<svg-icon
icon-class=
"phone"
/>
手机号码
<div
class=
"pull-right"
>
{{ state.user.phonenumber }}
</div>
</li>
<li
class=
"list-group-item"
>
<svg-icon
icon-class=
"email"
/>
用户邮箱
<div
class=
"pull-right"
>
{{ state.user.email }}
</div>
</li>
<!-- <li class="list-group-item">-->
<!-- <svg-icon icon-class="tree" />所属部门-->
<!-- <div class="pull-right" v-if="state.user.dept">{{ state.user.dept.deptName }} / {{ state.postGroup }}</div>-->
<!-- </li>-->
<!-- <li class="list-group-item">-->
<!-- <svg-icon icon-class="peoples" />所属角色-->
<!-- <div class="pull-right">{{ state.roleGroup }}</div>-->
<!-- </li>-->
<!-- <li class="list-group-item">-->
<!-- <svg-icon icon-class="date" />创建日期-->
<!-- <div class="pull-right">{{ state.user.createTime }}</div>-->
<!-- </li>-->
</ul>
</div>
</el-card>
</el-col>
<el-col
:span=
"18"
:xs=
"24"
>
<el-card>
<
template
v-slot:header
>
<div
class=
"clearfix"
>
<span>
基本资料
</span>
</div>
</
template
>
<el-tabs
v-model=
"activeTab"
>
<el-tab-pane
label=
"基本资料"
name=
"userinfo"
>
<userInfo
:user=
"state.user"
/>
</el-tab-pane>
<el-tab-pane
label=
"修改密码"
name=
"resetPwd"
>
<resetPwd
/>
</el-tab-pane>
</el-tabs>
</el-card>
</el-col>
</el-row>
</div>
<div
class=
"app-container"
>
<el-row
:gutter=
"20"
>
<el-col
:span=
"6"
:xs=
"24"
>
<el-card
class=
"box-card"
>
<template
v-slot:header
>
<div
class=
"clearfix"
>
<span>
个人信息
</span>
</div>
</
template
>
<div>
<div
class=
"text-center mb20"
>
<userAvatar/>
</div>
<ul
class=
"list-group list-group-striped"
>
<li
class=
"list-group-item"
>
<svg-icon
icon-class=
"user"
/>
用户名称
<div
class=
"pull-right"
>
{{ state.user.userName }}
</div>
</li>
<li
class=
"list-group-item"
>
<svg-icon
icon-class=
"phone"
/>
手机号码
<div
class=
"pull-right"
>
{{ state.user.phonenumber }}
</div>
</li>
</ul>
</div>
</el-card>
</el-col>
<el-col
:span=
"18"
:xs=
"24"
>
<el-card>
<
template
v-slot:header
>
<div
class=
"clearfix"
>
<span>
基本资料
</span>
</div>
</
template
>
<el-tabs
v-model=
"activeTab"
>
<el-tab-pane
label=
"修改昵称"
name=
"0"
>
<userInfo
:user=
"state.user"
/>
</el-tab-pane>
<el-tab-pane
label=
"换绑"
name=
"1"
>
<changeBind
:user=
"state.user"
/>
</el-tab-pane>
<el-tab-pane
label=
"修改密码"
name=
"2"
>
<resetPwd
:user=
"state.user"
/>
</el-tab-pane>
</el-tabs>
</el-card>
</el-col>
</el-row>
</div>
</template>
<
script
setup
name=
"Profile"
>
import
userAvatar
from
"./userAvatar"
;
import
userInfo
from
"./userInfo"
;
import
resetPwd
from
"./resetPwd"
;
import
{
getUserProfile
}
from
"@/api/system/user"
;
import
changeBind
from
"./changeBind"
;
import
{
getUserProfile
}
from
"@/api/system/user"
;
import
{
useRoute
}
from
'vue-router'
import
{
onMounted
}
from
"vue"
;
const
activeTab
=
ref
(
"userinfo"
);
const
route
=
useRoute
()
const
activeTab
=
ref
(
'0'
);
const
state
=
reactive
({
user
:
{},
roleGroup
:
{},
...
...
@@ -83,5 +77,15 @@ function getUser() {
});
};
getUser
();
// getUser();
onMounted
(()
=>
{
const
tabNum
=
route
.
query
.
tab
activeTab
.
value
=
tabNum
})
</
script
>
<
style
scoped
lang=
"scss"
>
.box-card
{
height
:
395px
;
}
</
style
>
src/views/system/user/profile/resetPwd.vue
View file @
990b4b29
<
template
>
<el-form
ref=
"pwdRef"
:model=
"user"
:rules=
"rules"
label-width=
"80px"
>
<el-form
ref=
"pwdRef"
:model=
"user"
:rules=
"rules"
label-width=
"80px"
style=
"width: 400px;height: 260px;"
>
<el-form-item
label=
"旧密码"
prop=
"oldPassword"
>
<el-input
v-model=
"user.oldPassword"
placeholder=
"请输入旧密码"
type=
"password"
show-password
/>
</el-form-item>
...
...
src/views/system/user/profile/userAvatar.vue
View file @
990b4b29
...
...
@@ -167,5 +167,7 @@ function closeDialog() {
cursor
:
pointer
;
line-height
:
110px
;
border-radius
:
50%
;
width
:
120px
;
height
:
120px
;
}
</
style
>
\ No newline at end of file
</
style
>
src/views/system/user/profile/userInfo.vue
View file @
990b4b29
<
template
>
<el-form
ref=
"userRef"
:model=
"form"
:rules=
"rules"
label-width=
"80px"
>
<el-form-item
label=
"用户昵称"
prop=
"nickName"
>
<el-input
v-model=
"form.nickName"
maxlength=
"30"
/>
</el-form-item>
<el-form-item
label=
"手机号码"
prop=
"phonenumber"
>
<el-input
v-model=
"form.phonenumber"
maxlength=
"11"
/>
</el-form-item>
<el-form-item
label=
"邮箱"
prop=
"email"
>
<el-input
v-model=
"form.email"
maxlength=
"50"
/>
</el-form-item>
<el-form-item
label=
"性别"
>
<el-radio-group
v-model=
"form.sex"
>
<el-radio
label=
"0"
>
男
</el-radio>
<el-radio
label=
"1"
>
女
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item>
<el-form
ref=
"pwdRef"
:model=
"user"
:rules=
"rules"
label-width=
"80px"
style=
"width: 400px;height: 260px;"
>
<el-form-item
label=
"账号昵称"
prop=
"nickname"
>
<el-input
v-model=
"user.nickname"
placeholder=
"请输入账号昵称"
type=
"text"
/>
</el-form-item>
<el-form-item>
<el-button
type=
"primary"
@
click=
"submit"
>
保存
</el-button>
<!--
<el-button
type=
"danger"
@
click=
"close"
>
关闭
</el-button>
-->
</el-form-item>
</el-form>
<!--
<el-button
type=
"danger"
@
click=
"close"
>
关闭
</el-button>
-->
</el-form-item>
</el-form>
</
template
>
<
script
setup
>
import
{
updateUserProfile
}
from
"@/api/system/user"
;
import
{
updateUserProfile
}
from
"@/api/system/user"
;
const
props
=
defineProps
({
user
:
{
type
:
Object
}
});
const
{
proxy
}
=
getCurrentInstance
();
const
{
proxy
}
=
getCurrentInstance
();
const
user
=
reactive
({
nickname
:
undefined
,
});
const
form
=
ref
({});
const
rules
=
ref
({
nickName
:
[{
required
:
true
,
message
:
"用户昵称不能为空"
,
trigger
:
"blur"
}],
email
:
[{
required
:
true
,
message
:
"邮箱地址不能为空"
,
trigger
:
"blur"
},
{
type
:
"email"
,
message
:
"请输入正确的邮箱地址"
,
trigger
:
[
"blur"
,
"change"
]
}],
phonenumber
:
[{
required
:
true
,
message
:
"手机号码不能为空"
,
trigger
:
"blur"
},
{
pattern
:
/^1
[
3|4|5|6|7|8|9
][
0-9
]\d{8}
$/
,
message
:
"请输入正确的手机号码"
,
trigger
:
"blur"
}],
nickname
:
[{
required
:
true
,
message
:
"账号昵称不能为空"
,
trigger
:
"blur"
}],
});
/** 提交按钮 */
function
submit
()
{
proxy
.
$refs
.
user
Ref
.
validate
(
valid
=>
{
proxy
.
$refs
.
pwd
Ref
.
validate
(
valid
=>
{
if
(
valid
)
{
updateUserProfile
(
form
.
value
).
then
(
response
=>
{
updateUserProfile
(
{
nickname
:
user
.
nickname
}
).
then
(
response
=>
{
proxy
.
$modal
.
msgSuccess
(
"修改成功"
);
props
.
user
.
phonenumber
=
form
.
value
.
phonenumber
;
props
.
user
.
email
=
form
.
value
.
email
;
});
}
});
...
...
@@ -57,11 +38,4 @@ function submit() {
function
close
()
{
proxy
.
$tab
.
closePage
();
};
// 回显当前登录用户信息
watch
(()
=>
props
.
user
,
user
=>
{
if
(
user
)
{
form
.
value
=
{
nickName
:
user
.
nickName
,
phonenumber
:
user
.
phonenumber
,
email
:
user
.
email
,
sex
:
user
.
sex
};
}
},{
immediate
:
true
});
</
script
>
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