From e2c937f424fd3f2d11a12d50a607418b63807583 Mon Sep 17 00:00:00 2001 From: chenxing Date: Tue, 6 Oct 2026 20:20:44 +0800 Subject: [PATCH] =?UTF-8?q?feat(avatar):=20=E9=BB=98=E8=AE=A4=E5=A4=B4?= =?UTF-8?q?=E5=83=8F=E8=BD=AE=E5=89=8D=E7=AB=AF=E9=9B=86=E6=88=90=E2=80=94?= =?UTF-8?q?=E2=80=94=E8=AE=BE=E7=BD=AE=E9=A1=B5=E4=B8=A4=E7=BA=A7=E6=A0=B7?= =?UTF-8?q?=E5=BC=8F=20+=20=E7=99=BB=E5=BD=95=E5=86=99=E5=AD=A6=E6=A0=A1?= =?UTF-8?q?=E9=BB=98=E8=AE=A4=E9=94=AE=20+=20=E9=A1=B6=E6=A0=8F=E4=B8=89?= =?UTF-8?q?=E6=80=81=E5=A4=B4=E5=83=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - BaseApi:schAvatarStyle/saveSchAvatarStyle/clearSchAvatarStyle 三端点(后端 SchSettingsController 配套,本仓 service 仓随轮提交) - App.vue:登录后 loadSchAvatarDefault()(与 loadSchThemeDefault 同构:失败/404/空→不写键不报错不阻塞),写 localStorage[yh-avatar-sch-default] - Settings.vue:新增 avatar pane(我的头像样式人人可见 + 本校默认管理员可配,watch 进 pane 拉取) - AppHeader/UserInfoModal:头像展示位换 UserAvatar 三态组件 - ThemePreview:预览页头像形态联动 运行时联调与部署验证待人工(后端端点须随 service 发版) --- src/App.vue | 16 ++ src/api/BaseApi.ts | 23 +++ src/components/AppHeader.vue | 3 +- src/components/UserInfoModal.vue | 4 +- src/views/Settings.vue | 309 ++++++++++++++++++++++++++++++- src/views/ThemePreview.vue | 72 ++++--- 6 files changed, 390 insertions(+), 37 deletions(-) diff --git a/src/App.vue b/src/App.vue index c1e4a9d..7f4dc32 100644 --- a/src/App.vue +++ b/src/App.vue @@ -62,6 +62,7 @@ mittBus.on("openBschIframePage", async (params: IframePageParmas) => { const [r1, r2] = await Promise.all([p1, p2]); store.$state.userInfo = userinfo; loadSchThemeDefault(); + loadSchAvatarDefault(); if (r1.length == 0) { store.$state.userRoleList = [ { @@ -103,6 +104,21 @@ function loadSchThemeDefault() { .catch(() => undefined); } +/** 拉学校默认头像样式写键(默认头像轮 2026-09-30;与 loadSchThemeDefault 同构:失败/404/空 → 不写、不报错、不阻塞登录流程) */ +function loadSchAvatarDefault() { + BaseApi.getSchAvatarStyle() + .then((res: any) => { + if (res && res.avatarStyle) { + try { + localStorage.setItem("yh-avatar-sch-default", res.avatarStyle); + } catch (e) { + /* 隐私模式写失败静默 */ + } + } + }) + .catch(() => undefined); +} + /**切换角色 */ async function switchRole() { await loadUserMenuBarList(); diff --git a/src/api/BaseApi.ts b/src/api/BaseApi.ts index c8bf3ba..dd382f9 100644 --- a/src/api/BaseApi.ts +++ b/src/api/BaseApi.ts @@ -213,6 +213,29 @@ class Base extends Abstract { return this.postRequest({ url }); } + // ===== 学校默认头像样式(默认头像轮 2026-09-30;后端契约见 SchSettingsController#schAvatarStyle)===== + + /** + * 读本校默认头像样式(已登录可读):{avatarStyle: "text"|"silhouette"|null}—— + * null 表示未配置(前端"不写键、不报错"),登录后调一次写 localStorage["yh-avatar-sch-default"] + */ + getSchAvatarStyle() { + const url = path + "/schAvatarStyle"; + return this.getRequest<{ avatarStyle: string | null; schId: number }>({ url }); + } + + /** 保存本校默认头像样式(仅学校管理员):avatarStyle = "text" | "silhouette" */ + saveSchAvatarStyle(avatarStyle: string) { + const url = path + "/saveSchAvatarStyle"; + return this.postRequest({ url, params: { avatarStyle } }); + } + + /** 清空本校默认头像样式(仅学校管理员;置空后读侧返回 null) */ + clearSchAvatarStyle() { + const url = path + "/clearSchAvatarStyle"; + return this.postRequest({ url }); + } + savUserRole(info: any) { const url = path + "/user/savUserRole"; return this.postRequest({ url, data: info as any }); diff --git a/src/components/AppHeader.vue b/src/components/AppHeader.vue index 9094304..59c5c94 100644 --- a/src/components/AppHeader.vue +++ b/src/components/AppHeader.vue @@ -8,7 +8,7 @@

{{ appName }}

- + Hi {{ userInfo.name }} @@ -27,6 +27,7 @@ import { useDefaultStore } from "@/store"; import { computed } from "vue"; import SvgIcon from "@/components/SvgIcon.vue"; +import UserAvatar from "@/components/UserAvatar.vue"; import mittBus from "@/utils/mitt"; import { StateEnum } from "@/types"; import { useRouter } from "vue-router"; diff --git a/src/components/UserInfoModal.vue b/src/components/UserInfoModal.vue index 7613116..2ce0226 100644 --- a/src/components/UserInfoModal.vue +++ b/src/components/UserInfoModal.vue @@ -15,7 +15,7 @@ :headers="uploadHeaders" >
- +
更换头像
@@ -67,8 +67,8 @@