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;样式全在本文件