feat(B1): 校级建站入口-新建院系子站(向导锁定本校主站)+学校信息服务端继承

- SiteManage: 新建按钮校级显示"新建院系子站";编辑弹窗校级隐藏schId/schName(payload留空服务端继承)
- SiteWizard: lockParentId 锁定上级为本校主站禁改
- SchoolWorkbench: 副文案改自助创建口径
- vitest 24/24 绿 + build 成功
This commit is contained in:
chenxing
2026-09-08 15:14:07 +08:00
parent c77be8b5d8
commit 3990811ed5
3 changed files with 33 additions and 19 deletions
+15 -10
View File
@@ -32,6 +32,10 @@ const router = useRouter();
/** 超管全局视图(工作台入口带入 scope=all) */
const scopeAll = computed(() => route.query.scope === "all" && store.isSuperAdmin);
/** B1 建站权限拆分:校级(学校上下文内)可自助创建院系子站;超管向导行为不变 */
const isSchoolAdmin = computed(() => !store.isSuperAdmin && !!store.currentSchool);
const canCreateSite = computed(() => store.isSuperAdmin || isSchoolAdmin.value);
const rows = ref<SiteVo[]>([]);
const loading = ref(false);
const tableHeight = Utils.useTableHeight({ isOperat: true });
@@ -214,8 +218,9 @@ async function save() {
id: form.id,
code: form.code,
parentSiteId: form.parentSiteId || 0,
schId: form.schId,
schName: form.schName || undefined,
// B1:校级角色隐藏学校信息字段,留空由服务端继承主站(防伪造通道)
schId: isSchoolAdmin.value ? undefined : form.schId,
schName: isSchoolAdmin.value ? undefined : form.schName || undefined,
name: form.name,
theme: form.theme || undefined,
configJson: t ? mergeThemeParamsIntoConfigJson(form.configJson || "", t, themeParams) : form.configJson || undefined,
@@ -285,10 +290,10 @@ watch(() => store.currentSchool?.schId, () => run());
<a href="javascript:void(0);" @click="goBackWorkbench">返回学校工作台</a>
</Alert>
</div>
<div class="fix">
<div class="fix" v-if="canCreateSite">
<Button class="fl" type="primary" size="large" @click="openWizard">
<Icon type="ios-add" />
新建站点(向导)
{{ isSchoolAdmin ? "新建院系子站" : "新建站点(向导)" }}
</Button>
</div>
<Table :columns="columns" :data="rows" :height="tableHeight" :loading="loading" no-data-text="暂无站点" />
@@ -303,15 +308,15 @@ watch(() => store.currentSchool?.schId, () => run());
<Input v-model="form.name" :maxlength="128" placeholder="如 XX学校门户网站" />
</FormItem>
<FormItem label="上级站点">
<Select v-model="form.parentSiteId" clearable placeholder="空=顶层校站点;选主站则为院系子站" style="width: 320px">
<Select v-model="form.parentSiteId" :clearable="!isSchoolAdmin" placeholder="空=顶层校站点;选主站则为院系子站" style="width: 320px">
<Option v-for="s in parentOptions" :key="s.id" :value="s.id">{{ s.name }}({{ s.code }})</Option>
</Select>
<p class="form-tip">院系子站挂在主站下,门户 header 右上出现"专业院系"下拉;层级固定两层。</p>
<p class="form-tip">院系子站挂在主站下,门户 header 右上出现"专业院系"下拉;层级固定两层。{{ isSchoolAdmin ? "校级角色仅可在本校主站之间改挂。" : "" }}</p>
</FormItem>
<FormItem label="学校ID">
<FormItem v-if="store.isSuperAdmin" label="学校ID">
<InputNumber v-model="form.schId" :min="1" placeholder="UserBase sys_group.id" style="width: 200px" />
</FormItem>
<FormItem label="学校名称">
<FormItem v-if="store.isSuperAdmin" label="学校名称">
<Input v-model="form.schName" :maxlength="128" />
</FormItem>
<FormItem label="皮肤包">
@@ -340,8 +345,8 @@ watch(() => store.currentSchool?.schId, () => run());
<ThemePreviewFrame v-if="previewVisible && editTheme" :site-code="form.code" :theme="form.theme" :theme-params="editThemeParams" />
</Modal>
<!-- 新建站点三步向导 -->
<SiteWizard v-model:visible="wizardVisible" :sites="rows" @created="onWizardCreated" />
<!-- 新建站点三步向导(B1:校级锁定为本校主站下建院系子站) -->
<SiteWizard v-model:visible="wizardVisible" :sites="rows" :lock-parent-id="isSchoolAdmin ? store.currentSchool?.mainSiteId : undefined" @created="onWizardCreated" />
</div>
</div>
</template>