@@ -480,7 +549,7 @@ const isAdmin = computed(() => !!store.getIsAdmin);
/** 普通用户不可用的管理 pane(导航隐藏;URL 直达渲染 noperm 黄条,不白屏不报错) */
const ADMIN_PANES = ["logo", "wallpaper", "sidebar", "sys", "statset", "backend", "schooltheme"];
-const ALL_PANES = ["profile", "password", "avatar", "mytheme", "schooltheme", "logo", "wallpaper", "sidebar", "sys", "statset", "backend", "noperm"];
+const ALL_PANES = ["profile", "password", "avatar", "mytheme", "mywallpaper", "schooltheme", "logo", "wallpaper", "sidebar", "sys", "statset", "backend", "noperm"];
const curPane = ref
("profile");
@@ -522,6 +591,8 @@ const NAV_ACCOUNT: NavItem[] = [
];
const NAV_THEME: NavItem[] = [
{ key: "mytheme", name: "我的主题", icon: svgWrap('') },
+ // 我的壁纸(2026-10-02 任务A):普通用户壁纸自选 pane,能力复制自 Header 设置壁纸模态框(模态框保留不动)
+ { key: "mywallpaper", name: "我的壁纸", icon: svgWrap('') },
{ key: "schooltheme", name: "本校默认", icon: svgWrap(''), adminOnly: true },
];
const NAV_APPEARANCE: NavItem[] = [
@@ -744,6 +815,67 @@ async function onApplyWallpaper() {
}
}
+/* ===== mywallpaper:个人壁纸 pane(2026-10-02 任务A)=====
+ * 能力复制自 Header「设置壁纸」模态框(模态框保留不动):列表 getUserWallpaperList(type 0=系统/1=校区/2=个人)、
+ * 点选即保存 checkWallpaper(与模态框 onClickWallpaper 同语义)、上传走 /api/wallpaperUpload(普通用户落 type=2 个人壁纸)、
+ * 自己上传的可删(deleteWallById,isEdit 标记与模态框一致);选中态回显 store 用户设置 wallpaperUrl。 */
+const myWallpaperList = ref([]);
+const myWallGroups = computed(() => {
+ const list = myWallpaperList.value || [];
+ return {
+ sys: list.filter(x => x.type === 0),
+ sch: list.filter(x => x.type === 1),
+ mine: list.filter(x => x.type === 2),
+ };
+});
+/** 当前生效壁纸(回显选中态,Header 模态框 getIsWallpaper 同源) */
+const myWallSelected = computed(() => store.getCurWallPaperUrl || "");
+
+async function loadMyWallpaperList() {
+ try {
+ const list = (await UserSettingApi.getUserWallpaperList(store.getCurSchId)) || [];
+ // 与 Header 模态框同序:type 升序(系统→校区→个人),同 type 按 id 升序
+ list.sort((a: any, b: any) => (a.type === b.type ? a.id - b.id : a.type - b.type));
+ myWallpaperList.value = list;
+ } catch (e) {
+ myWallpaperList.value = [];
+ }
+}
+
+/** 点选即保存(无保存按钮,与 Header 模态框行为一致);成功后同步 store 即时生效 */
+async function onPickMyWallpaper(w: any) {
+ if (myWallSelected.value === w.url) return;
+ await UserSettingApi.checkWallpaper(store.getCurSchId, w.url);
+ const userSetting = store.curUserSettingInfo;
+ if (!!userSetting) {
+ userSetting.wallpaperUrl = w.url;
+ store.setCurUserSettingsInfo(userSetting);
+ }
+ Message.success("壁纸已应用");
+}
+
+async function onDeleteMyWallpaper(w: any) {
+ await MyConfirm({
+ title: "删除",
+ msg: "确定删除该壁纸吗?",
+ info: "删除后无法恢复!",
+ async onOk() {
+ await UserSettingApi.deleteWallById(w.id);
+ await loadMyWallpaperList();
+ },
+ });
+}
+
+function onMyWallpaperUploaded() {
+ Message.success("上传成功");
+ loadMyWallpaperList();
+}
+
+// 打开我的壁纸 pane 时拉一次可选列表(所有人)
+watch(curPane, pane => {
+ if (pane === "mywallpaper") loadMyWallpaperList();
+});
+
// 首次切到 logo / wallpaper pane 时懒加载管理列表
watch(curPane, pane => {
if ((pane === "logo" || pane === "wallpaper") && isAdmin.value && logoManageList.value.length === 0 && wallpaperManageList.value.length === 0) {