From d2512ccb6b939aa73a049e4f510534420a41de7a Mon Sep 17 00:00:00 2001 From: yml2213 Date: Thu, 20 Aug 2026 16:19:44 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E6=95=B4=E6=8E=A5=E5=8D=95=E5=AF=86?= =?UTF-8?q?=E7=A0=81=E5=BC=BA=E5=BA=A6=E8=A7=84=E5=88=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/services/worker-platform/mappers.ts | 10 ++-------- .../worker-platform-service.test.ts | 16 ++++++++-------- .../src/pages/admin/panels/WorkersPanel.tsx | 12 ++++-------- apps/frontend/src/utils/worker-password.ts | 11 ++++------- apps/frontend/tests/worker-password.test.ts | 12 ++++++++++++ 5 files changed, 30 insertions(+), 31 deletions(-) create mode 100644 apps/frontend/tests/worker-password.test.ts diff --git a/apps/backend/src/services/worker-platform/mappers.ts b/apps/backend/src/services/worker-platform/mappers.ts index 257fb1bb..f2efc799 100644 --- a/apps/backend/src/services/worker-platform/mappers.ts +++ b/apps/backend/src/services/worker-platform/mappers.ts @@ -1483,7 +1483,7 @@ export function validateWorkerUsername(username: string) { export function validateWorkerPassword(password: string) { if (!isWorkerPasswordStrong(password)) { - throw createHttpError('接单密码至少 6 位,且必须包含大写字母、小写字母、数字和标点符号', { + throw createHttpError('接单密码至少 8 位,且必须包含英文字母和数字', { statusCode: 400, errorCode: 'worker_password_invalid', }) @@ -1491,13 +1491,7 @@ export function validateWorkerPassword(password: string) { } export function isWorkerPasswordStrong(password: string): boolean { - return ( - password.length >= 6 && - /[A-Z]/.test(password) && - /[a-z]/.test(password) && - /\d/.test(password) && - /[\p{P}\p{S}]/u.test(password) - ) + return password.length >= 8 && /[a-zA-Z]/.test(password) && /\d/.test(password) } export function normalizeSessionVersion(value: unknown): number { diff --git a/apps/backend/src/services/worker-platform/worker-platform-service.test.ts b/apps/backend/src/services/worker-platform/worker-platform-service.test.ts index fa2adbd3..4a3ae0c7 100644 --- a/apps/backend/src/services/worker-platform/worker-platform-service.test.ts +++ b/apps/backend/src/services/worker-platform/worker-platform-service.test.ts @@ -154,14 +154,14 @@ test('assertWorkerLoginAllowed allows active workers', () => { assert.doesNotThrow(() => assertWorkerLoginAllowed(buildWorkerUserRow())) }) -test('接单密码必须包含大小写字母、数字和标点符号', () => { - assert.equal(isWorkerPasswordStrong('Aa1234!'), true) - assert.equal(isWorkerPasswordStrong('aa1234!'), false) - assert.equal(isWorkerPasswordStrong('AA1234!'), false) - assert.equal(isWorkerPasswordStrong('Aaabcd!'), false) - assert.equal(isWorkerPasswordStrong('Aa123456'), false) - assert.equal(isWorkerPasswordStrong('Aa1!'), false) - assert.throws(() => validateWorkerPassword('Aa123456'), { errorCode: 'worker_password_invalid' }) +test('接单密码至少八位且必须包含英文字母和数字', () => { + assert.equal(isWorkerPasswordStrong('abc12345'), true) + assert.equal(isWorkerPasswordStrong('ABC12345'), true) + assert.equal(isWorkerPasswordStrong('12345678'), false) + assert.equal(isWorkerPasswordStrong('abcdefgh'), false) + assert.equal(isWorkerPasswordStrong('abc1234'), false) + assert.doesNotThrow(() => validateWorkerPassword('abc12345')) + assert.throws(() => validateWorkerPassword('12345678'), { errorCode: 'worker_password_invalid' }) }) test('排行榜打手名称仅展示首字符', () => { diff --git a/apps/frontend/src/pages/admin/panels/WorkersPanel.tsx b/apps/frontend/src/pages/admin/panels/WorkersPanel.tsx index 8f14302c..c3c083c5 100644 --- a/apps/frontend/src/pages/admin/panels/WorkersPanel.tsx +++ b/apps/frontend/src/pages/admin/panels/WorkersPanel.tsx @@ -427,20 +427,16 @@ export default function WorkersPanel() { name="password" rules={[ { required: true, message: '请输入新密码' }, - { min: 6, message: '密码至少 6 位' }, + { min: 8, message: '密码至少 8 位' }, { validator: (_, value) => - !value || - (/[A-Z]/.test(value) && - /[a-z]/.test(value) && - /\d/.test(value) && - /[\p{P}\p{S}]/u.test(value)) + !value || (/[a-zA-Z]/.test(value) && /\d/.test(value)) ? Promise.resolve() - : Promise.reject(new Error('密码需包含大写字母、小写字母、数字和标点符号')), + : Promise.reject(new Error('密码需包含英文字母和数字')), }, ]} > - + diff --git a/apps/frontend/src/utils/worker-password.ts b/apps/frontend/src/utils/worker-password.ts index 977adbff..f6415f20 100644 --- a/apps/frontend/src/utils/worker-password.ts +++ b/apps/frontend/src/utils/worker-password.ts @@ -1,15 +1,12 @@ -export const WORKER_PASSWORD_MIN_LENGTH = 6 +export const WORKER_PASSWORD_MIN_LENGTH = 8 -export const WORKER_PASSWORD_RULE_MESSAGE = - '密码至少 6 位,且必须包含大写字母、小写字母、数字和标点符号' +export const WORKER_PASSWORD_RULE_MESSAGE = '密码至少 8 位,且必须包含英文字母和数字' export function isWorkerPasswordStrong(value: unknown): boolean { const password = String(value || '') return ( password.length >= WORKER_PASSWORD_MIN_LENGTH && - /[A-Z]/.test(password) && - /[a-z]/.test(password) && - /\d/.test(password) && - /[\p{P}\p{S}]/u.test(password) + /[a-zA-Z]/.test(password) && + /\d/.test(password) ) } diff --git a/apps/frontend/tests/worker-password.test.ts b/apps/frontend/tests/worker-password.test.ts new file mode 100644 index 00000000..078b8d17 --- /dev/null +++ b/apps/frontend/tests/worker-password.test.ts @@ -0,0 +1,12 @@ +import assert from 'node:assert/strict' +import test from 'node:test' + +import { isWorkerPasswordStrong } from '../src/utils/worker-password.ts' + +test('接单密码至少八位且必须包含英文字母和数字', () => { + assert.equal(isWorkerPasswordStrong('abc12345'), true) + assert.equal(isWorkerPasswordStrong('ABC12345'), true) + assert.equal(isWorkerPasswordStrong('12345678'), false) + assert.equal(isWorkerPasswordStrong('abcdefgh'), false) + assert.equal(isWorkerPasswordStrong('abc1234'), false) +})