fix(门户+设置): LOGO 文字贴徽标左对齐并放大字号(修 space-between 居中);壁纸 pane 管理员选本级默认(LOGO文字与主题JSON化增补)
build / build (push) Successful in 44s
build / build (push) Successful in 44s
This commit is contained in:
@@ -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)=====
|
||||
|
||||
/**
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
<template>
|
||||
<header :class="headerClass">
|
||||
<img v-if="!!logoUrl" :src="baseUrl + '/image/default-logo.png'" v-real-img="logoUrl" class="logo-box" alt="" />
|
||||
<span v-if="logoText" class="logo-text">{{ logoText }}</span>
|
||||
<div class="logo-wrap">
|
||||
<img v-if="!!logoUrl" :src="baseUrl + '/image/default-logo.png'" v-real-img="logoUrl" class="logo-box" alt="" />
|
||||
<span v-if="logoText" class="logo-text">{{ logoText }}</span>
|
||||
</div>
|
||||
<ul class="operate-container fix">
|
||||
<li v-if="isWidgetIconShow" :class="{ active: isWidgetShow }">
|
||||
<div class="icon-box" v-wave @click="toggleWidgetShow">
|
||||
|
||||
+73
-8
@@ -351,20 +351,22 @@
|
||||
<template v-else>
|
||||
<div class="pane-head">
|
||||
<h3>壁纸<span class="scope">{{ curLayer === 'platform' ? '系统壁纸池' : '校区壁纸池' }}</span></h3>
|
||||
<p>维护{{ curLayer === 'platform' ? '平台内置(schId=0)系统壁纸' : '本校可选壁纸' }}池:上传、删除,供师生在「壁纸」中选用。
|
||||
壁纸是每个用户的自选项,本层只提供可选项,不代替用户指定。</p>
|
||||
<p>维护{{ curLayer === 'platform' ? '平台内置(schId=0)系统壁纸' : '本校可选壁纸' }}池:上传、删除,供师生在「壁纸」中选用;
|
||||
并可从池中选定<b>本级默认壁纸</b>——成员未自选壁纸时按「本校默认 → 平台默认」回落生效。</p>
|
||||
</div>
|
||||
<div class="sec-card">
|
||||
<h4>{{ curLayer === 'platform' ? '平台系统壁纸' : '本校校区壁纸' }} <span class="tag">本级可维护</span></h4>
|
||||
<h4>{{ curLayer === 'platform' ? '平台系统壁纸' : '本校校区壁纸' }} <span class="tag">本级可维护 · 点选为默认</span></h4>
|
||||
<div class="wall-grid">
|
||||
<div v-if="layerWallPool.length === 0" class="logo-empty">暂无壁纸,请先上传</div>
|
||||
<div
|
||||
v-for="w in layerWallPool"
|
||||
:key="w.id"
|
||||
class="wall-item"
|
||||
:class="['wall-item', { sel: wallSelUrl === w.url }]"
|
||||
:style="{ background: 'center / cover no-repeat url(' + w.url + ')' }"
|
||||
@click="wallSelUrl = w.url"
|
||||
>
|
||||
<i class="del" title="删除" @click.stop="onDeleteWallpaper(w)">×</i>
|
||||
<i class="tick">✓</i>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-row form-row--last form-row--top">
|
||||
@@ -378,18 +380,26 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- 上级只读参考池:校管视角下的平台系统壁纸(type=0,可选用不可删);超管视角为空 -->
|
||||
<!-- 上级只读参考池:校管视角下的平台系统壁纸(type=0,可选用为本级默认不可删);超管视角为空 -->
|
||||
<div v-if="upperWallPool.length > 0" class="sec-card">
|
||||
<h4>平台系统壁纸 <span class="tag">只读参考</span></h4>
|
||||
<h4>平台系统壁纸 <span class="tag">只读参考 · 可选用为本级默认</span></h4>
|
||||
<div class="wall-grid">
|
||||
<div
|
||||
v-for="w in upperWallPool"
|
||||
:key="w.id"
|
||||
class="wall-item"
|
||||
:class="['wall-item', { sel: wallSelUrl === w.url }]"
|
||||
:style="{ background: 'center / cover no-repeat url(' + w.url + ')' }"
|
||||
></div>
|
||||
@click="wallSelUrl = w.url"
|
||||
>
|
||||
<i class="tick">✓</i>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="pane-foot">
|
||||
<button class="btn primary" :disabled="wallDefaultSaving || !wallSelUrl" @click="onSaveWallDefault">设为本级默认</button>
|
||||
<button class="btn plain" :disabled="wallDefaultSaving || !layerWallConfigured" @click="onClearWallDefault">清空本级默认</button>
|
||||
<span class="hint">{{ wallDefaultHitLabel }}</span>
|
||||
</div>
|
||||
</template>
|
||||
</div>
|
||||
|
||||
@@ -1076,6 +1086,60 @@ async function onClearLogoText() {
|
||||
}
|
||||
}
|
||||
|
||||
/* ===== 默认壁纸(平台/学校两级,壁纸三级默认轮 2026-10-09):管理员从本级池点选,
|
||||
* 成员未自选壁纸时后端按「本校默认 → 平台默认 → 池内最新」兜底(getUserSettings 生效链)===== */
|
||||
const wallSelUrl = ref("");
|
||||
const layerWallHitSchId = ref<number | null>(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();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user