diff --git a/src/api/BaseApi.ts b/src/api/BaseApi.ts index 04ade2a..664343e 100644 --- a/src/api/BaseApi.ts +++ b/src/api/BaseApi.ts @@ -240,6 +240,20 @@ class Base extends Abstract { return this.postRequest({ url, params: { logoText } }); } + // ===== 默认壁纸(平台/学校两级,壁纸三级默认轮 2026-10-09;后端契约见 SchSettingsController#schWallpaper)===== + + /** 读默认壁纸(已登录可读):{wallpaperUrl: string|null, schId=实际命中层}——本校空 → 平台层 → null */ + getSchWallpaper() { + const url = path + "/schWallpaper"; + return this.getRequest<{ wallpaperUrl: string | null; schId: number }>({ url }); + } + + /** 保存默认壁纸(仅学校管理员/超管):URL 取管理池返回的绝对地址原样存,≤255;空串=清空本级 */ + saveSchWallpaper(wallpaperUrl: string) { + const url = path + "/saveSchWallpaper"; + return this.postRequest({ url, params: { wallpaperUrl } }); + } + // ===== 学校默认头像样式(默认头像轮 2026-09-30;后端契约见 SchSettingsController#schAvatarStyle)===== /** diff --git a/src/assets/styles/header.scss b/src/assets/styles/header.scss index 7c2663c..6c3f644 100644 --- a/src/assets/styles/header.scss +++ b/src/assets/styles/header.scss @@ -24,16 +24,23 @@ box-shadow: 0px 4px 10px 0px rgba(0, 0, 0, 0.08); } + & .logo-wrap { + display: flex; + align-items: center; + flex-shrink: 0; + } + & .logo-box { height: 36px; } & .logo-text { margin-left: 10px; - font-size: 16px; - font-weight: 600; + font-size: 22px; + font-weight: 700; color: #252b35; white-space: nowrap; + letter-spacing: 0.5px; } & .operate-container { diff --git a/src/components/Header.vue b/src/components/Header.vue index 2f81a56..763158f 100644 --- a/src/components/Header.vue +++ b/src/components/Header.vue @@ -1,7 +1,9 @@ - - {{ logoText }} + + + {{ logoText }} + diff --git a/src/views/Settings.vue b/src/views/Settings.vue index fe11789..39c2f68 100644 --- a/src/views/Settings.vue +++ b/src/views/Settings.vue @@ -351,20 +351,22 @@ 壁纸{{ curLayer === 'platform' ? '系统壁纸池' : '校区壁纸池' }} - 维护{{ curLayer === 'platform' ? '平台内置(schId=0)系统壁纸' : '本校可选壁纸' }}池:上传、删除,供师生在「壁纸」中选用。 - 壁纸是每个用户的自选项,本层只提供可选项,不代替用户指定。 + 维护{{ curLayer === 'platform' ? '平台内置(schId=0)系统壁纸' : '本校可选壁纸' }}池:上传、删除,供师生在「壁纸」中选用; + 并可从池中选定本级默认壁纸——成员未自选壁纸时按「本校默认 → 平台默认」回落生效。 - {{ curLayer === 'platform' ? '平台系统壁纸' : '本校校区壁纸' }} 本级可维护 + {{ curLayer === 'platform' ? '平台系统壁纸' : '本校校区壁纸' }} 本级可维护 · 点选为默认 暂无壁纸,请先上传 × + ✓ @@ -378,18 +380,26 @@ - + - 平台系统壁纸 只读参考 + 平台系统壁纸 只读参考 · 可选用为本级默认 + @click="wallSelUrl = w.url" + > + ✓ + + + 设为本级默认 + 清空本级默认 + {{ wallDefaultHitLabel }} + @@ -1076,6 +1086,60 @@ async function onClearLogoText() { } } +/* ===== 默认壁纸(平台/学校两级,壁纸三级默认轮 2026-10-09):管理员从本级池点选, + * 成员未自选壁纸时后端按「本校默认 → 平台默认 → 池内最新」兜底(getUserSettings 生效链)===== */ +const wallSelUrl = ref(""); +const layerWallHitSchId = ref(null); +const wallDefaultHasValue = ref(false); +const wallDefaultSaving = ref(false); +/** 本级是否真配置过(对齐主题/LOGO 文字层口径:平台层一律按本级,校级看命中层) */ +const layerWallConfigured = computed(() => wallDefaultHasValue.value && (curLayer.value === "platform" || layerWallHitSchId.value !== 0)); +const wallDefaultHitLabel = computed(() => { + if (curLayer.value === "platform") { + return wallDefaultHasValue.value ? "平台默认已配置" : "平台默认未配置(成员未自选时回落壁纸池最新一张)"; + } + return layerWallConfigured.value ? "本校已配置" : "未配置本级,当前生效:平台默认"; +}); + +async function loadWallDefault() { + try { + const res = await BaseApi.getSchWallpaper(); + layerWallHitSchId.value = res?.schId ?? null; + wallDefaultHasValue.value = !!res?.wallpaperUrl; + wallSelUrl.value = res?.wallpaperUrl || ""; + } catch (e) { + /* 读取失败不打扰 */ + } +} + +/** 保存/清空走同一端点(saveSchWallpaper):空串=清空本级(后端存 null);成功后回读一次刷新命中态 */ +async function onSaveWallDefault() { + if (wallDefaultSaving.value) return; + wallDefaultSaving.value = true; + try { + await BaseApi.saveSchWallpaper(wallSelUrl.value.trim()); + Message.success("默认壁纸已保存,成员未自选壁纸时生效"); + await loadWallDefault(); + } catch (error) { + Message.error("保存失败:" + error); + } finally { + wallDefaultSaving.value = false; + } +} +async function onClearWallDefault() { + if (wallDefaultSaving.value) return; + wallDefaultSaving.value = true; + try { + await BaseApi.saveSchWallpaper(""); + Message.success("已清空本级默认壁纸"); + await loadWallDefault(); + } catch (error) { + Message.error("操作失败:" + error); + } finally { + wallDefaultSaving.value = false; + } +} + /* ===== wallpaper pane · my 层(个人壁纸,2026-10-02 任务A;S4 三层化后仅 curLayer==='my' 渲染)===== * 能力复制自 Header「设置壁纸」模态框(模态框保留不动):列表 getUserWallpaperList(type 0=系统/1=校区/2=个人)、 * 点选即保存 checkWallpaper(与模态框 onClickWallpaper 同语义)、上传走 /api/wallpaperUpload(普通用户落 type=2 个人壁纸)、 @@ -1138,6 +1202,7 @@ watch(curPane, pane => { if (pane === "wallpaper") { if (isAdmin.value) { if (wallpaperManageList.value.length === 0) loadManageLists(); + loadWallDefault(); } else { loadMyWallpaperList(); }
维护{{ curLayer === 'platform' ? '平台内置(schId=0)系统壁纸' : '本校可选壁纸' }}池:上传、删除,供师生在「壁纸」中选用。 - 壁纸是每个用户的自选项,本层只提供可选项,不代替用户指定。
维护{{ curLayer === 'platform' ? '平台内置(schId=0)系统壁纸' : '本校可选壁纸' }}池:上传、删除,供师生在「壁纸」中选用; + 并可从池中选定本级默认壁纸——成员未自选壁纸时按「本校默认 → 平台默认」回落生效。