fix: 重置密码最少六字节并统一账号校验 (#2)

This commit was merged in pull request #17.
This commit is contained in:
ila
2026-09-10 20:13:38 +08:00
parent b7768c10de
commit 1e77f1026b
7 changed files with 60 additions and 22 deletions
+4 -4
View File
@@ -1,7 +1,7 @@
export function normalizeUsername(value) { return value.trim().toLowerCase() }
export function validPassword(value, minimum = 10) {
export function validPassword(value) {
const bytes = new TextEncoder().encode(value).length
return bytes >= minimum && bytes <= 72
return bytes >= 6 && bytes <= 72
}
export function validUsername(value) { return /^[a-z][a-z0-9_.-]{2,31}$/.test(normalizeUsername(value)) }
export function createSession({ fetch, storage, changed = () => {} }) {
@@ -94,12 +94,12 @@ export function createSession({ fetch, storage, changed = () => {} }) {
async createAccount(username, password) {
authorized()
if (!validUsername(username)) throw new Error('账号须为 3–32 位,以字母开头,仅含字母、数字、点、下划线或短横线')
if (!validPassword(password, 6)) throw new Error('密码须为 6–72 字节')
if (!validPassword(password)) throw new Error('密码须为 6–72 字节')
return request('/accounts', 'POST', { username: normalizeUsername(username), password })
},
async updateAccount(id, patch) {
authorized()
if (patch.password !== undefined && !validPassword(patch.password)) throw new Error('密码须为 10–72 字节')
if (patch.password !== undefined && !validPassword(patch.password)) throw new Error('密码须为 6–72 字节')
if (id === state.user.id && patch.disabled) throw new Error('不能停用当前管理员')
const account = state.accounts.find(item => item.id === id)
if (id === state.user.id || (account && account.role !== 'learner')) throw new Error('管理员账号不支持此操作')
+1 -1
View File
@@ -17,7 +17,7 @@
<el-alert v-if="formError" :title="formError" type="error" :closable="false" />
<el-form :model="form" label-position="top" @submit.prevent="save">
<el-form-item v-if="!target" label="账号"><el-input v-model="form.username" autocomplete="off" maxlength="32" /><div class="hint">3–32 位,以字母开头;可含数字、点、下划线、短横线</div></el-form-item>
<el-form-item label="新密码"><el-input v-model="form.password" type="password" show-password autocomplete="new-password" /><div class="hint">{{ target ? 10 : 6 }}–72 字节;中文等字符会占多个字节</div></el-form-item>
<el-form-item label="新密码"><el-input v-model="form.password" type="password" show-password autocomplete="new-password" /><div class="hint">6–72 字节;中文等字符会占多个字节</div></el-form-item>
<div class="dialog-footer"><el-button :disabled="busy" @click="open = false">取消</el-button><el-button type="primary" native-type="submit" :loading="busy">保存</el-button></div>
</el-form>
</el-dialog>