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;