feat: 增加用户密码修改时的确认验证

在编辑用户时,如果填写了新密码,需要进行密码确认,确保两次输入一致。
同时更新后端请求模型以支持密码字段。
This commit is contained in:
fawney19
2025-12-28 20:00:25 +08:00
parent e21acd73eb
commit 7d6d262ed3
2 changed files with 35 additions and 1 deletions

View File

@@ -86,6 +86,34 @@
</p> </p>
</div> </div>
<div
v-if="isEditMode && form.password.length > 0"
class="space-y-2"
>
<Label class="text-sm font-medium">
确认新密码 <span class="text-muted-foreground">*</span>
</Label>
<Input
:id="`pwd-confirm-${formNonce}`"
v-model="form.confirmPassword"
type="password"
autocomplete="new-password"
data-form-type="other"
data-lpignore="true"
:name="`confirm-${formNonce}`"
required
minlength="6"
placeholder="再次输入新密码"
class="h-10"
/>
<p
v-if="form.confirmPassword.length > 0 && form.password !== form.confirmPassword"
class="text-xs text-destructive"
>
两次输入的密码不一致
</p>
</div>
<div class="space-y-2"> <div class="space-y-2">
<Label <Label
for="form-email" for="form-email"
@@ -423,6 +451,7 @@ const apiFormats = ref<Array<{ value: string; label: string }>>([])
const form = ref({ const form = ref({
username: '', username: '',
password: '', password: '',
confirmPassword: '',
email: '', email: '',
quota: 10, quota: 10,
role: 'user' as 'admin' | 'user', role: 'user' as 'admin' | 'user',
@@ -443,6 +472,7 @@ function resetForm() {
form.value = { form.value = {
username: '', username: '',
password: '', password: '',
confirmPassword: '',
email: '', email: '',
quota: 10, quota: 10,
role: 'user', role: 'user',
@@ -461,6 +491,7 @@ function loadUserData() {
form.value = { form.value = {
username: props.user.username, username: props.user.username,
password: '', password: '',
confirmPassword: '',
email: props.user.email || '', email: props.user.email || '',
quota: props.user.quota_usd == null ? 10 : props.user.quota_usd, quota: props.user.quota_usd == null ? 10 : props.user.quota_usd,
role: props.user.role, role: props.user.role,
@@ -486,7 +517,9 @@ const isFormValid = computed(() => {
const hasUsername = form.value.username.trim().length > 0 const hasUsername = form.value.username.trim().length > 0
const hasEmail = form.value.email.trim().length > 0 const hasEmail = form.value.email.trim().length > 0
const hasPassword = isEditMode.value || form.value.password.length >= 6 const hasPassword = isEditMode.value || form.value.password.length >= 6
return hasUsername && hasEmail && hasPassword // 编辑模式下如果填写了密码,必须确认密码一致
const passwordConfirmed = !isEditMode.value || form.value.password.length === 0 || form.value.password === form.value.confirmPassword
return hasUsername && hasEmail && hasPassword && passwordConfirmed
}) })
// 加载访问控制选项 // 加载访问控制选项

View File

@@ -317,6 +317,7 @@ class UpdateUserRequest(BaseModel):
username: Optional[str] = Field(None, min_length=1, max_length=50) username: Optional[str] = Field(None, min_length=1, max_length=50)
email: Optional[str] = Field(None, max_length=100) email: Optional[str] = Field(None, max_length=100)
password: Optional[str] = Field(None, min_length=6, max_length=128, description="新密码(留空保持不变)")
quota_usd: Optional[float] = Field(None, ge=0) quota_usd: Optional[float] = Field(None, ge=0)
is_active: Optional[bool] = None is_active: Optional[bool] = None
role: Optional[str] = None role: Optional[str] = None