feat(theme): 皮肤包管理收敛平台级+命名表单-新顶层路由/theme-manage(meta.superOnly守卫+页面watch双兜底),ThemeManage升级全屏页复用新抽WorkbenchHeader(工作台同款深色顶栏backTo=/workbench),工作台超管工具行加皮肤包管理按钮,删SiteManage兜底按钮,旧/theme重定向新页;上传/添加皮肤包改表单弹窗(zip+显示名/描述;添加=源包+标识名+命名一步),内置包可改显示名/描述(无参数区+恢复默认名称);openEdit未注册主题保留原值并告警(themeEdit util,不再静默归一default);mock删modId=7菜单节点;SiteWizard预览内容源v-model对齐path语义(W4遗留);vitest 62/62+build通过
build / build (push) Successful in 2m17s

This commit is contained in:
chenxing
2026-09-08 20:25:57 +08:00
parent 604d77049b
commit 9ba4cb135a
12 changed files with 553 additions and 218 deletions
+103
View File
@@ -0,0 +1,103 @@
<script setup lang="ts">
import { computed } from "vue";
import { useRouter } from "vue-router";
import { useCmsStore } from "@/store";
import config from "@/assets/config/host.config";
/**
* 工作台同款深色顶栏(超管平台级页面共用):
* 标题 + 可选「返回」图标 + 头像/姓名(用户中心)+ 退出登录。
* 使用方:SchoolWorkbench(无返回)、ThemeManage(backTo=/workbench)。
*/
const props = defineProps<{
title: string;
/** 传入则渲染返回图标按钮(如返回工作台) */
backTo?: string;
}>();
const router = useRouter();
const store = useCmsStore();
const userInfo = computed(() => ({
name: store.session.baseUserName || "管理员",
avatar: store.session.baseUserAvatar,
}));
function goBack() {
if (props.backTo) {
router.push(props.backTo);
}
}
const linkUserInfo = () => {
window.location.href = config.baseHost + "/v/userinfo";
};
const logout = () => {
const url = "/cas/logout?service=" + window.location.href;
window.location.href = config.ssoHost + url;
};
</script>
<template>
<header class="wb-header">
<h4>{{ title }}</h4>
<div class="wb-header-aside">
<a v-if="backTo" href="javascript:void(0);" class="back" title="返回工作台" @click="goBack">
<Icon type="ios-arrow-back" :size="20" />
</a>
<img :src="userInfo.avatar" v-if="userInfo.avatar" class="wb-avatar" @click="linkUserInfo" />
<a class="name" href="javascript:void(0);" @click="linkUserInfo">{{ userInfo.name }}</a>
<span class="delimiter"></span>
<a href="javascript:;" class="logout" @click="logout" title="退出登陆">
<i class="iconfont icon-logout"></i>
</a>
</div>
</header>
</template>
<style scoped lang="scss">
.wb-header {
height: 56px;
flex-shrink: 0;
background: #1f2a3a;
color: #fff;
display: flex;
align-items: center;
padding: 0 24px;
h4 {
color: #fff;
font-size: 16px;
margin: 0;
}
.wb-header-aside {
margin-left: auto;
display: flex;
align-items: center;
gap: 10px;
.name {
color: #fff;
}
.back {
color: #fff;
display: inline-flex;
align-items: center;
}
.delimiter {
width: 1px;
height: 16px;
background: rgba(255, 255, 255, 0.3);
display: inline-block;
}
.wb-avatar {
width: 28px;
height: 28px;
border-radius: 50%;
cursor: pointer;
}
.logout {
color: #fff;
display: inline-flex;
align-items: center;
}
}
}
</style>