From 05c5723419c1a8d55d31c7f617f7738ca5f4fb32 Mon Sep 17 00:00:00 2001 From: xy Date: Sat, 3 Oct 2026 11:23:50 +0800 Subject: [PATCH 1/2] =?UTF-8?q?feat(account):=20=E6=8C=89=E5=8E=9F?= =?UTF-8?q?=E5=9E=8B=E5=AE=8C=E5=96=84=E5=B7=A6=E4=B8=8B=E8=A7=92=E8=B4=A6?= =?UTF-8?q?=E6=88=B7=E8=8F=9C=E5=8D=95=E4=B8=8E=E4=B8=AA=E4=BA=BA=E4=BF=A1?= =?UTF-8?q?=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- clinical-web/README.md | 4 + clinical-web/src/api/auth.ts | 10 + .../src/components/layout/AccountPanel.vue | 177 ++++++++++++++++++ clinical-web/src/components/layout/Menu.vue | 137 ++++++++++++-- .../src/composables/useAccountPanel.ts | 121 ++++++++++++ clinical-web/src/types/auth.ts | 10 + .../src/views/management/audit/index.vue | 1 + 7 files changed, 442 insertions(+), 18 deletions(-) create mode 100644 clinical-web/src/components/layout/AccountPanel.vue create mode 100644 clinical-web/src/composables/useAccountPanel.ts diff --git a/clinical-web/README.md b/clinical-web/README.md index 9b87d1c..6b4b076 100644 --- a/clinical-web/README.md +++ b/clinical-web/README.md @@ -285,3 +285,7 @@ API 请求和响应类型按业务域放在 `api/workbench/types.ts`、`api/mana 真实 PAD 任务的勾选表格、结构化单选/多选、文本与日期项,使用后端 `/v1/sign-tasks/{taskId}/form` 返回的字段定义和规范化正文。每次修改串行保存完整患者答案,使用 `expectedRevision` 防止覆盖其他端的修改;保存失败会阻止签署。系统快照及医护已填项只读。上传签名时带 `signer.answerRevision`,后端完成最终必填校验并固化答案。已签任务和记录详情读取签署快照,下载 PDF 使用同一份答案。 旧文书的勾选表格由后端按行生成独立编号;裸方框按独立勾选处理。需要互斥单选时应在模板中定义 `choice` 及选项。创建任务时单选/勾选项留给患者填写,文本项仍可由医护预填。页面显示“填写内容已保存”后可刷新回显。 + +### 左下角账户菜单 + +点击头像区域可查看个人信息、修改密码或退出登录。个人资料使用 `GET /v1/auth/me`,联系方式通过 `PATCH /v1/auth/me` 保存,仅更新当前登录用户。手机号和邮箱保持脱敏值时不提交,填写完整值表示替换,空字符串表示清空;`expectedVersion` 防止并发覆盖。基本信息只读,ID 优先展示 `employeeId`,无编号时显示用户 UUID。改密遵循后端 12–128 位强密码策略,成功后清理登录态并重新登录。 diff --git a/clinical-web/src/api/auth.ts b/clinical-web/src/api/auth.ts index dd40b20..71bf8e5 100644 --- a/clinical-web/src/api/auth.ts +++ b/clinical-web/src/api/auth.ts @@ -14,6 +14,7 @@ import type { LoginRequest, LoginResponse, PasswordChangeRequest, + ProfileUpdateRequest, } from '@/types/auth' import type { ApiResponse } from '@/types/common' @@ -115,3 +116,12 @@ export function getAuthErrorMessage(error: unknown) { return '登录失败,请稍后重试' } + +export async function updateProfile(payload: ProfileUpdateRequest): Promise { + const response = await request.request>({ + url: '/v1/auth/me', + method: 'PATCH', + data: payload, + }) + return unwrapApiResponse(response) +} diff --git a/clinical-web/src/components/layout/AccountPanel.vue b/clinical-web/src/components/layout/AccountPanel.vue new file mode 100644 index 0000000..3e608cd --- /dev/null +++ b/clinical-web/src/components/layout/AccountPanel.vue @@ -0,0 +1,177 @@ + + + + + diff --git a/clinical-web/src/components/layout/Menu.vue b/clinical-web/src/components/layout/Menu.vue index bf165e6..87283be 100644 --- a/clinical-web/src/components/layout/Menu.vue +++ b/clinical-web/src/components/layout/Menu.vue @@ -1,11 +1,27 @@