feat(t10-admin): 管理员体系前端——应用设置双 tab+单表单管理员+选人组件移植
build / build (push) Successful in 3m8s

- AppSettings.vue 应用设置页(基础/字典两 tab);修复 P86:Tabs 写 :value 而受控 prop 是 modelValue,致 ?tab=dicts 深链静默失效,改后深链实拍生效
- UserCheckModal.vue 自 notice 移植(view-ui-plus+ztree,sources 注入式数据源);public/libs 收录 jquery+ztree 本地件(index.html 引用)
- api/module/admin.ts + mock/adminapi.ts + types/admin.ts;AdminListPanel/FormAdminModal 组件
- routes/menuNav/menuRoute/modulePerms 适配管理员菜单与权限位;tree-icon 图标资源
This commit is contained in:
chenxing
2026-10-15 20:25:39 +08:00
parent 14d45f7e3c
commit d8f1a1fbfa
30 changed files with 1377 additions and 33 deletions
+54
View File
@@ -0,0 +1,54 @@
<script setup lang="ts">
/**
* 应用设置(`/admin/app`,T10 方案 §3/§6.1):UserBase 侧一行模块行,页内两个 tab。
*
* - **角色设置** = 校级表单管理员名单(`school_admin`);
* - **字典管理** = 原 `/admin/dicts` 整页迁入(`Dicts.vue` 原样复用,守卫行随本行换到 `/admin/app`)。
*
* 两条口径:
* 1. **tab 不占模块行、不进导航**(同设计器子页),所以高亮/面包屑挂本行;`?tab=dicts` 可深链,
* 旧地址 `/admin/dicts` 由路由重定向到这里的字典 tab;
* ——深链落在模板的 {@code :model-value} 上:view-ui-plus 的 Tabs 受控 prop 是 modelValue,
* 写 {@code :value} 会落进 attrs 不被消费(T10 验收轮实拍证伪过一次),勿"顺手改回";
* 2. **一行把关两个 tab 与字典 API**:能不能进来由 UserBase 的 `/admin/app` 决定,
* 前端不做"进了页再按身份藏 tab"——藏按钮不等于授权(契约 §7 身份行)。
*/
import { computed } from "vue";
import { useRoute, useRouter } from "vue-router";
import AdminListPanel from "@/components/admin/AdminListPanel.vue";
import Dicts from "./Dicts.vue";
const route = useRoute();
const router = useRouter();
/** 缺省落角色设置(本页新增的主用途);只认 dicts 这一个显式值,其它 query 一律按缺省 */
const tab = computed(() => (route.query.tab === "dicts" ? "dicts" : "roles"));
function change(next: string) {
router.replace({ path: "/admin/app", query: { ...route.query, tab: next } });
}
</script>
<template>
<div class="page-wrapper yh-fill">
<div class="main-container">
<Tabs :model-value="tab" @on-click="change">
<TabPane label="角色设置" name="roles">
<AdminListPanel mode="school" />
</TabPane>
<TabPane label="字典管理" name="dicts">
<Dicts />
</TabPane>
</Tabs>
</div>
</div>
</template>
<style scoped>
/* 迁入的字典页原本是一整页(自带 page-wrapper 的填充高度),嵌进 tab 后高度要交回内容本身,
否则 yh-fill 会把 tab 面板撑成视口高、列表区跟着溢出滚动条。 */
:deep(.page-wrapper.yh-fill) {
height: auto;
padding: 0;
}
</style>