From 4f36ff9ceb6cd875ecbfbcf3bc4eaad067f98d51 Mon Sep 17 00:00:00 2001 From: chenxing Date: Thu, 8 Oct 2026 18:58:30 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A4=96=E8=A7=82=E5=81=8F=E5=A5=BD=E5=BC=82?= =?UTF-8?q?=E6=AD=A5=E8=A1=A5=E9=BD=90D=EF=BC=9A=E8=AE=BE=E7=BD=AE?= =?UTF-8?q?=E9=A1=B5=E9=80=89=E6=8B=A9=E7=AB=AF=E5=8F=8C=E5=86=99=E6=9C=8D?= =?UTF-8?q?=E5=8A=A1=E7=AB=AF=E7=9C=9F=E6=BA=90=EF=BC=88fire-and-forget?= =?UTF-8?q?=EF=BC=8C=E6=9C=AC=E5=9C=B0=E4=BD=93=E9=AA=8C=E4=B8=8D=E5=8F=98?= =?UTF-8?q?=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - BaseApi 加三方法:getAppearance / saveMyTheme(紧凑编码,null=跟随)/ saveMyAvatarStyle - Settings.vue 五个写键分支旁挂双写:pickMyTheme / followSchoolTheme(置 NULL) / pickMyAvatarStyle / followSchoolAvatar(置 NULL) / pickSide(写 yh-theme 的全部分支) - 双写失败 console.warn 不弹错不回滚本地(本地体验与改造前逐字节一致) - App.vue loadSchThemeDefault/loadSchAvatarDefault 保留不动(与 init 异步补齐幂等收敛) - sync 件:UserAvatar.vue 监听 yh-appearance-updated + theme.ts 版本戳 20261008-1831-d9db725 - 注:本仓工作区另有并行会话 WIP(harness/命令面板),本提交只含本案文件与 hunks --- src/api/BaseApi.ts | 29 +++++++++++++++++++++++++++++ src/components/UserAvatar.vue | 13 +++++++++++-- src/utils/theme.ts | 2 +- src/views/Settings.vue | 29 ++++++++++++++++++++++++----- 4 files changed, 65 insertions(+), 8 deletions(-) diff --git a/src/api/BaseApi.ts b/src/api/BaseApi.ts index 5d4b084..83082dd 100644 --- a/src/api/BaseApi.ts +++ b/src/api/BaseApi.ts @@ -249,6 +249,35 @@ class Base extends Abstract { return this.postRequest({ url }); } + // ===== 用户外观偏好(外观偏好服务端化 2026-10-08;后端契约见 AppearanceController)===== + + /** + * 读当前用户外观偏好聚合:{myTheme, schTheme, avatarMy, avatarSch, logoUrl}(紧凑编码/绝对 URL,查不到为 null)。 + * 各子应用 yh-theme-init 异步补齐段的同源数据源;选择端预留(本轮设置页双写用不到)。 + */ + getAppearance() { + const url = path + "/appearance"; + return this.getRequest<{ + myTheme: string | null; + schTheme: string | null; + avatarMy: string | null; + avatarSch: string | null; + logoUrl: string | null; + }>({ url }); + } + + /** 保存用户自选主题档(紧凑编码 theme|sideDeep01|gradOn01|sideFollow01);null=跟随学校默认。设置页 fire-and-forget 双写:成功不提示、失败不回滚本地 */ + saveMyTheme(themeState: string | null) { + const url = path + "/saveMyTheme"; + return this.postRequest({ url, data: { themeState } as any }); + } + + /** 保存用户自选头像样式("text"|"silhouette");null=跟随学校默认。双写语义同 saveMyTheme */ + saveMyAvatarStyle(avatarStyle: string | null) { + const url = path + "/saveMyAvatarStyle"; + return this.postRequest({ url, data: { avatarStyle } as any }); + } + savUserRole(info: any) { const url = path + "/user/savUserRole"; return this.postRequest({ url, data: info as any }); diff --git a/src/components/UserAvatar.vue b/src/components/UserAvatar.vue index aefb0b1..bd6c318 100644 --- a/src/components/UserAvatar.vue +++ b/src/components/UserAvatar.vue @@ -4,7 +4,7 @@ 取值链/取字契约见《设置页修复与默认头像落地方案》§10.1/§10.2;样式全在本文件