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;