From 564403b5ca24ce36e1c824f1f2d61ba9f8840795 Mon Sep 17 00:00:00 2001 From: chenxing Date: Tue, 6 Oct 2026 20:21:02 +0800 Subject: [PATCH] =?UTF-8?q?feat(avatar):=20=E5=AD=A6=E6=A0=A1=E9=BB=98?= =?UTF-8?q?=E8=AE=A4=E5=A4=B4=E5=83=8F=E6=A0=B7=E5=BC=8F=E7=AB=AF=E7=82=B9?= =?UTF-8?q?=E4=B8=89=E4=BB=B6=E5=A5=97=EF=BC=88=E9=BB=98=E8=AE=A4=E5=A4=B4?= =?UTF-8?q?=E5=83=8F=E8=BD=AE=E5=90=8E=E7=AB=AF=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - SchSettingsController:GET schAvatarStyle(登录可读,null=未配置)/ POST saveSchAvatarStyle(校管理员)/ POST clearSchAvatarStyle - SchSettings 实体 + sql/sch_settings_avatar_style.sql:avatar_style 列(DDL 待人工执行) 前端配套=UserHome/front e2c937f(登录写 localStorage[yh-avatar-sch-default] + 设置页 avatar pane) --- .../controller/api/SchSettingsController.java | 62 +++++++++++++++++++ .../yunhai/userhome/entity/SchSettings.java | 4 ++ .../sql/sch_settings_avatar_style.sql | 6 ++ 3 files changed, 72 insertions(+) create mode 100644 src/main/resources/sql/sch_settings_avatar_style.sql diff --git a/src/main/java/com/yunhai/userhome/controller/api/SchSettingsController.java b/src/main/java/com/yunhai/userhome/controller/api/SchSettingsController.java index 08dcd43..02a4ee0 100644 --- a/src/main/java/com/yunhai/userhome/controller/api/SchSettingsController.java +++ b/src/main/java/com/yunhai/userhome/controller/api/SchSettingsController.java @@ -31,6 +31,9 @@ import java.util.Optional; * logo 等字段不能删行,置空后读侧返回 null,效果等同"未配置")。存储形态:theme_name 列存紧凑四段编码 * {@code theme|sideDeep01|gradOn01|sideFollow01}(如 teal|0|1|1;不拆列、零 DDL,列宽未确认故不存整份 JSON; * 旧格式值/非法值读侧一律视同未配置)。

+ *

默认头像轮(2026-09-30)同构新增学校默认头像样式三接口:schAvatarStyle 读(可空不兜底); + * saveSchAvatarStyle 写(仅学校管理员/超管,值只接受 text|silhouette);clearSchAvatarStyle 清空(置空 + * avatar_style 字段)。

*/ @RestController @RequestMapping(value = Config.API_PATH) @@ -39,6 +42,9 @@ public class SchSettingsController { /** 合法档位(与通道 THEME_NAMES 一致;防旧库脏值意外生效) */ private static final String[] THEME_KEYS = {"blue", "ocean", "ink", "violet", "teal"}; + /** 合法头像样式(与前端 avatar.ts 的 AvatarStyle 一致;写入侧从严,对齐 encodeThemeState 做法) */ + private static final String[] AVATAR_STYLES = {"text", "silhouette"}; + @Autowired private ISchSettingsService schSettingsService; @@ -117,6 +123,62 @@ public class SchSettingsController { return false; } + private static boolean isAvatarStyle(String style) { + if (style == null) return false; + for (String k : AVATAR_STYLES) { + if (k.equals(style)) return true; + } + return false; + } + + /** + * 学校默认头像样式(默认头像轮 2026-09-30,已登录可读):{avatarStyle: "text"|"silhouette"|null, schId}。 + * 未配置/脏值 → avatarStyle=null(读侧可空不兜底,对齐 schTheme 语义;前端"不写键、不报错")。 + */ + @GetMapping("schAvatarStyle") + public Map schAvatarStyle(BoaUser authUserWithDept) { + Integer schId = resolveThemeSchId(authUserWithDept, null); + String avatarStyle = schSettingsService.findBySchIdRaw(schId) + .map(SchSettings::getAvatarStyle) + .filter(SchSettingsController::isAvatarStyle) + .orElse(null); + Map out = new HashMap<>(); + out.put("avatarStyle", avatarStyle); + out.put("schId", schId); + return out; + } + + /** 保存学校默认头像样式(仅学校管理员/超管):值只接受 "text"/"silhouette",非法抛 DException。 */ + @PostMapping("saveSchAvatarStyle") + public void saveSchAvatarStyle(BoaUser authUserWithDept, + @RequestParam("avatarStyle") String avatarStyle, + @RequestParam(name = "schId", required = false) Integer schId) { + requireThemeAdmin(authUserWithDept); + if (!isAvatarStyle(avatarStyle)) { + throw new DException("头像样式不合法: " + avatarStyle); + } + Integer targetSchId = resolveThemeSchId(authUserWithDept, schId); + SchSettings schSettings = schSettingsService.findBySchIdRaw(targetSchId).orElseGet(SchSettings::new); + schSettings.setCDate(new Date()); + schSettings.setSchId(targetSchId); + schSettings.setCId(authUserWithDept.getId()); + schSettings.setAvatarStyle(avatarStyle); + schSettingsService.save(schSettings); + } + + /** 清空学校默认头像样式(仅管理员):置空 avatar_style 字段(行还承载 logo/theme 等配置不能删行,置空后读侧返回 null)。 */ + @PostMapping("clearSchAvatarStyle") + public void clearSchAvatarStyle(BoaUser authUserWithDept, + @RequestParam(name = "schId", required = false) Integer schId) { + requireThemeAdmin(authUserWithDept); + Integer targetSchId = resolveThemeSchId(authUserWithDept, schId); + Optional existing = schSettingsService.findBySchIdRaw(targetSchId); + if (!existing.isPresent()) return; + SchSettings schSettings = existing.get(); + schSettings.setAvatarStyle(null); + schSettingsService.save(schSettings); + } + /** * 学校默认主题档(已登录可读):{themeState: "" | null, schId}。 * 未配置/旧格式值/脏数据 → themeState=null(前端"不写键、不报错")。 diff --git a/src/main/java/com/yunhai/userhome/entity/SchSettings.java b/src/main/java/com/yunhai/userhome/entity/SchSettings.java index 8be3da1..a91bebe 100644 --- a/src/main/java/com/yunhai/userhome/entity/SchSettings.java +++ b/src/main/java/com/yunhai/userhome/entity/SchSettings.java @@ -30,6 +30,10 @@ public class SchSettings { @Column(name = "theme_name") private String themeName; + /** 学校默认头像样式(默认头像轮 2026-09-30):text|silhouette;null=未配置(读侧可空不兜底) */ + @Column(name = "avatar_style") + private String avatarStyle; + @Column(name = "logo_url") private String logoUrl; diff --git a/src/main/resources/sql/sch_settings_avatar_style.sql b/src/main/resources/sql/sch_settings_avatar_style.sql new file mode 100644 index 0000000..f4dc846 --- /dev/null +++ b/src/main/resources/sql/sch_settings_avatar_style.sql @@ -0,0 +1,6 @@ +-- 学校默认头像样式(默认头像轮 2026-09-30):sch_settings 新增 avatar_style 列。 +-- dev 环境由 JPA ddl-auto=update 自动加列;测试/生产等 ddl-auto 关闭的环境手工执行本文件。 +ALTER TABLE sch_settings ADD COLUMN avatar_style VARCHAR(16) NULL COMMENT '学校默认头像样式 text|silhouette'; + +-- 回滚: +-- ALTER TABLE sch_settings DROP COLUMN avatar_style;