Skip to content

Commit 14651ea

Browse files
perf: Upgrade pwd
1 parent 2fcb740 commit 14651ea

File tree

6 files changed

+179
-10
lines changed

6 files changed

+179
-10
lines changed

backend/apps/system/api/user.py

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
from fastapi import APIRouter
22
from apps.system.crud.user import get_db_user, get_user_info
33
from apps.system.models.user import UserModel
4-
from apps.system.schemas.system_schema import UserCreator, UserEditor, UserGrid, UserLanguage
4+
from apps.system.schemas.system_schema import PwdEditor, UserCreator, UserEditor, UserGrid, UserLanguage
55
from common.core.deps import CurrentUser, SessionDep
66
from common.core.pagination import Paginator
77
from common.core.schemas import PaginatedResponse, PaginationParams
8+
from common.core.security import md5pwd, verify_md5pwd
89
from common.utils.time import get_timestamp
910

1011
router = APIRouter(tags=["user"], prefix="/user")
@@ -66,10 +67,17 @@ async def langChange(session: SessionDep, current_user: CurrentUser, language: U
6667
lang = language.language
6768
if lang not in ["zh-CN", "en"]:
6869
return {"message": "Language not supported"}
69-
db_user = session.get(UserModel, current_user.id)
70-
if not db_user:
71-
return {"message": "User not found"}
70+
db_user: UserModel = get_db_user(session=session, user_id=current_user.id)
7271
db_user.language = lang
7372
session.add(db_user)
7473
session.commit()
75-
return {"message": "Language changed successfully", "language": lang}
74+
return {"message": "Language changed successfully", "language": lang}
75+
76+
@router.put("/pwd")
77+
async def pwdUpdate(session: SessionDep, current_user: CurrentUser, editor: PwdEditor):
78+
db_user: UserModel = get_db_user(session=session, user_id=current_user.id)
79+
if not verify_md5pwd(editor.pwd, db_user.password):
80+
raise RuntimeError("pwd error")
81+
db_user.password = md5pwd(editor.new_pwd)
82+
session.add(db_user)
83+
session.commit()

backend/apps/system/schemas/system_schema.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,4 +36,8 @@ class UserEditor(UserCreator, BaseCreatorDTO):
3636

3737
class UserGrid(UserEditor):
3838
create_time: int
39-
language: str = "zh-CN"
39+
language: str = "zh-CN"
40+
41+
class PwdEditor(BaseModel):
42+
pwd: str
43+
new_pwd: str

frontend/src/api/auth.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,5 @@ export const userApi = {
88
delete: (id: number) => request.delete(`/settings/terminology/${id}`),
99
query: (id: number) => request.get(`/settings/terminology/${id}`),
1010
language: (data: any) => request.put('/user/language', data),
11+
pwd: (data: any) => request.put('/user/pwd', data),
1112
}

frontend/src/components/layout/Person.vue

Lines changed: 35 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,22 @@ import icon_translate_outlined from '@/assets/svg/icon_translate_outlined.svg'
88
import icon_logout_outlined from '@/assets/svg/icon_logout_outlined.svg'
99
import icon_right_outlined from '@/assets/svg/icon_right_outlined.svg'
1010
import icon_done_outlined from '@/assets/svg/icon_done_outlined.svg'
11-
11+
import { useI18n } from 'vue-i18n'
12+
import PwdForm from './PwdForm.vue'
13+
import { useRouter } from 'vue-router'
14+
import { useUserStore } from '@/stores/user'
15+
const router = useRouter()
16+
const userStore = useUserStore()
17+
const pwdFormRef = ref()
18+
const { t } = useI18n()
1219
defineProps({
1320
collapse: { type: [Boolean], required: true },
1421
})
1522
1623
const name = ref('飞小致')
1724
const currentLanguage = ref('zh-CN')
1825
const emit = defineEmits(['selectPerson'])
26+
const dialogVisible = ref(false)
1927
const languageList = [
2028
{
2129
name: 'English',
@@ -37,6 +45,20 @@ const handlePersonChange = () => {
3745
const handleDefaultLanguageChange = (item: any) => {
3846
currentLanguage.value = item.value
3947
}
48+
49+
const openPwd = () => {
50+
dialogVisible.value = true
51+
}
52+
const closePwd = () => {
53+
dialogVisible.value = false
54+
}
55+
const savePwdHandler = () => {
56+
pwdFormRef.value?.submit()
57+
}
58+
const logout = () => {
59+
userStore.logout()
60+
router.push('/login')
61+
}
4062
</script>
4163

4264
<template>
@@ -64,7 +86,7 @@ const handleDefaultLanguageChange = (item: any) => {
6486
</el-icon>
6587
<div class="datasource-name">系统管理</div>
6688
</div>
67-
<div class="popover-item">
89+
<div class="popover-item" @click="openPwd">
6890
<el-icon size="16">
6991
<icon_key_outlined></icon_key_outlined>
7092
</el-icon>
@@ -104,7 +126,7 @@ const handleDefaultLanguageChange = (item: any) => {
104126
</el-icon>
105127
<div class="datasource-name">帮助</div>
106128
</div>
107-
<div class="popover-item mr4">
129+
<div class="popover-item mr4" @click="logout">
108130
<el-icon size="16">
109131
<icon_logout_outlined></icon_logout_outlined>
110132
</el-icon>
@@ -113,6 +135,16 @@ const handleDefaultLanguageChange = (item: any) => {
113135
</div>
114136
</div>
115137
</el-popover>
138+
139+
<el-dialog v-model="dialogVisible" :title="t('user.upgrade_pwd.title')" width="600">
140+
<pwd-form v-if="dialogVisible" ref="pwdFormRef" @pwd-saved="closePwd" />
141+
<template #footer>
142+
<div class="dialog-footer">
143+
<el-button @click="closePwd">{{ t('common.cancel') }}</el-button>
144+
<el-button type="primary" @click="savePwdHandler">{{ t('common.save') }}</el-button>
145+
</div>
146+
</template>
147+
</el-dialog>
116148
</template>
117149

118150
<style lang="less" scoped>
Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
<script lang="ts" setup>
2+
import { ref, reactive } from 'vue'
3+
import { useI18n } from 'vue-i18n'
4+
import { userApi } from '@/api/auth'
5+
const { t } = useI18n()
6+
const pwdRef = ref()
7+
const pwdForm = reactive({
8+
pwd: '',
9+
new_pwd: '',
10+
confirm_pwd: '',
11+
})
12+
13+
const rules = {
14+
pwd: [
15+
{
16+
required: true,
17+
message: t('common.please_input', { msg: t('user.upgrade_pwd.old_pwd') }),
18+
trigger: 'blur',
19+
},
20+
],
21+
new_pwd: [
22+
{
23+
required: true,
24+
message: t('common.please_input', { msg: t('user.upgrade_pwd.new_pwd') }),
25+
trigger: 'blur',
26+
},
27+
],
28+
confirm_pwd: [
29+
{
30+
required: true,
31+
message: t('common.please_input', { msg: t('user.upgrade_pwd.confirm_pwd') }),
32+
trigger: 'blur',
33+
},
34+
],
35+
}
36+
37+
const initForm = (item: any) => {
38+
if (item) {
39+
Object.assign(pwdForm, { ...item })
40+
}
41+
pwdRef.value.clearValidate()
42+
}
43+
44+
const emits = defineEmits(['pwdSaved'])
45+
46+
const submit = () => {
47+
pwdRef.value.validate((res: any) => {
48+
if (res) {
49+
const param = {
50+
pwd: pwdForm.pwd,
51+
new_pwd: pwdForm.new_pwd,
52+
}
53+
userApi.pwd(param).then(() => {
54+
ElMessage({
55+
type: 'success',
56+
message: t('common.save_success'),
57+
})
58+
emits('pwdSaved')
59+
})
60+
}
61+
})
62+
}
63+
defineExpose({
64+
initForm,
65+
submit,
66+
})
67+
</script>
68+
69+
<template>
70+
<div class="params-form">
71+
<el-form ref="pwdRef" :rules="rules" label-position="top" :model="pwdForm" style="width: 100%">
72+
<el-form-item prop="pwd" :label="t('user.upgrade_pwd.old_pwd')">
73+
<el-input
74+
v-model="pwdForm.pwd"
75+
:placeholder="t('common.please_input', { msg: t('user.upgrade_pwd.old_pwd') })"
76+
type="password"
77+
show-password
78+
/>
79+
</el-form-item>
80+
<el-form-item prop="new_pwd" :label="t('user.upgrade_pwd.new_pwd')">
81+
<el-input
82+
v-model="pwdForm.new_pwd"
83+
:placeholder="t('common.please_input', { msg: t('user.upgrade_pwd.new_pwd') })"
84+
type="password"
85+
show-password
86+
/>
87+
</el-form-item>
88+
<el-form-item prop="confirm_pwd" :label="t('user.upgrade_pwd.confirm_pwd')">
89+
<el-input
90+
v-model="pwdForm.confirm_pwd"
91+
:placeholder="t('common.please_input', { msg: t('user.upgrade_pwd.confirm_pwd') })"
92+
type="password"
93+
show-password
94+
/>
95+
</el-form-item>
96+
</el-form>
97+
</div>
98+
</template>
99+
100+
<style lang="less" scoped>
101+
.params-form {
102+
.ed-form-item--default {
103+
margin-bottom: 16px;
104+
105+
&.is-error {
106+
margin-bottom: 40px;
107+
}
108+
}
109+
110+
.ed-input-number {
111+
width: 100%;
112+
}
113+
}
114+
</style>

frontend/src/i18n/zh-CN.json

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,8 @@
1717
"save_success": "保存成功",
1818
"next": "下一步",
1919
"save": "保存",
20-
"logout": "退出登录"
20+
"logout": "退出登录",
21+
"please_input": "请输入{msg}"
2122
},
2223
"dashboard": {
2324
"select_dashboard": "请选择仪表板",
@@ -246,5 +247,14 @@
246247
"remark": "备注",
247248
"back_community": "还原至社区版",
248249
"confirm_tips": "确定还原至社区版?"
250+
},
251+
"user": {
252+
"title": "用户管理",
253+
"upgrade_pwd": {
254+
"title": "修改密码",
255+
"old_pwd": "旧密码",
256+
"new_pwd": "新密码",
257+
"confirm_pwd": "确认密码"
258+
}
249259
}
250260
}

0 commit comments

Comments
 (0)