chore: 前置快照-assetUrl前缀与学校切换收敛会话遗留(执行方案B1~B5前既有未提交变更)

This commit is contained in:
chenxing
2026-09-08 15:14:07 +08:00
parent 67a7164897
commit c77be8b5d8
6 changed files with 232 additions and 137 deletions
+43 -4
View File
@@ -1,9 +1,9 @@
<script setup lang="ts">
import { computed, onMounted, reactive, ref, watch } from "vue";
import { useRoute } from "vue-router";
import { useRoute, useRouter } from "vue-router";
import { Message } from "view-ui-plus";
import Utils from "@/utils/index";
import { siteApi, themeApi, themePreviewUrl } from "@/api/module/cms";
import { assetUrl, siteApi, themeApi, themePreviewUrl } from "@/api/module/cms";
import { useCmsStore } from "@/store";
import config from "@/assets/config/host.config";
import { SiteVo, ThemeVo } from "@/types/cms";
@@ -18,6 +18,8 @@ import SiteWizard from "@/views/cms/SiteWizard.vue";
* 站点管理(方案 §9.1 + §6.2 主题选择增强)。
* 学校化管理(docs/09 §3.3):默认只显示当前学校站点(主站+院系子站);
* 超管可经工作台「全部站点总览」(?scope=all)查看全局列表。
* 行「进入管理」= 院系子站切换入口(壳面包屑条切换器已按 UX 收敛移除):
* 切 store.currentSite 落文章列表,跨校行先重建学校上下文;当前站点行带「当前」标记。
* 新建 → 三步向导(选模板→微调预览→确认);已建站点 → 编辑弹窗内
* 主题卡片单选 + 参数微调表单,保存带 themeParams(服务端合并进 config_json,方案 §5.3)。
* config_json 结构化编辑见 SiteConfigForm(docs/09 §3.1):
@@ -25,6 +27,7 @@ import SiteWizard from "@/views/cms/SiteWizard.vue";
*/
const store = useCmsStore();
const route = useRoute();
const router = useRouter();
/** 超管全局视图(工作台入口带入 scope=all) */
const scopeAll = computed(() => route.query.scope === "all" && store.isSuperAdmin);
@@ -43,7 +46,18 @@ const themeMeta = computed(() => {
const columns = [
{ title: "站点编码", key: "code", width: 140 },
{ title: "站点名称", key: "name", minWidth: 200, tooltip: true },
{
title: "站点名称",
key: "name",
minWidth: 200,
tooltip: true,
render: (h: any, p: any) =>
h("span", { style: "display:inline-flex;align-items:center;gap:6px" }, [
h("span", p.row.name),
// 当前操作站点标记:壳面包屑校名后缀同源(store.currentSite)
p.row.id === store.siteId ? h(Tag, { color: "success" }, () => "当前") : null,
]),
},
{ title: "学校", key: "schName", width: 150, tooltip: true },
{
title: "所属主站",
@@ -60,7 +74,7 @@ const columns = [
const t = themeMeta.value[p.row.theme || "default"];
return h("span", { style: "display:inline-flex;align-items:center;gap:6px" }, [
t
? h("img", { src: t.screenshotUrl, style: "width:44px;height:28px;object-fit:cover;border-radius:3px;border:1px solid #eee", alt: "" })
? h("img", { src: assetUrl(t.screenshotUrl), style: "width:44px;height:28px;object-fit:cover;border-radius:3px;border:1px solid #eee", alt: "" })
: h("span", { style: "display:inline-block;width:44px;height:28px;background:#f0f2f5;border-radius:3px" }),
h("span", t ? `${t.title}(${p.row.theme})` : p.row.theme || "default"),
]);
@@ -84,6 +98,7 @@ const columns = [
fixed: "right",
align: "center",
render: (h: any, p: any) => [
Utils.operatingHandle(h, "进入管理", "icon-apps", () => enterManage(p.row), p.row.id === store.siteId),
Utils.operatingHandle(h, "编辑", "icon-edit", () => openEdit(p.row)),
Utils.operatingHandle(h, "门户", "icon-browse", () => openPortal(p.row)),
],
@@ -219,6 +234,30 @@ function openPortal(row: SiteVo) {
window.open(`${config.serviceHost}/portal/${row.code}/`, "_blank");
}
/** 行级「进入管理」(docs/09 §3.3 子站管理入口):切当前操作站点后落文章列表;
* 全局视图跨校行先重建学校上下文(面包屑/左侧菜单跟随),子站行向上找主站行定学校壳 */
function enterManage(row: SiteVo) {
const main = row.parentSiteId ? rows.value.find(s => s.id === row.parentSiteId) : row;
if (!main) {
Message.warning("未找到所属主站,无法进入管理");
return;
}
if (main.code !== store.schoolCode) {
store.enterSchool(
{
schId: row.schId,
schName: row.schName,
mainSiteId: main.id,
mainSiteCode: main.code,
mainSiteName: main.name,
},
rows.value.filter(s => s.id === main.id || s.parentSiteId === main.id)
);
}
store.setCurrentSite({ id: row.id, code: row.code, name: row.name });
router.push(`/sch/${main.code}/article`);
}
function openEditPreview() {
previewVisible.value = true;
}