- 构建:Vue CLI 4 → Vite 5,入口迁至根 index.html(含 env-config + 主题通道 loader)
- 技术栈:Vue 2.6 → Vue 3.4,view-design → view-ui-plus 1.3.24,vue-router 3 → 4(hash)
- 壳层重写:App.vue / components/layout.vue 对齐 Notice 骨架(logo-badge、icon-* 通道图标、resolveMenuPage、crumb-home 基线)
- 机械转换:具名 slot → template #x、.sync → v-model:、@click.native、$set、beforeDestroy、/deep/ → :deep()
- render:h('Button')/h('Input') → 真组件 + 扁平 props/onClick
- 组件适配:vuedraggable 4 的 #item 插槽;vue-treeselect → @zanmato/vue3-treeselect;Page 分页改 v-model + pageSize 显式回写
- 清理:删除 Vue2 死代码(layout_old/bak/child、App.Net、codeModal、未引用组件)
- 修复:深链接首次加载被重定向到首个模块(router.isReady)
验证:vite build 通过;headless CDP 全 15 路由无异常;教师列表 2 行渲染、操作列按钮点击弹窗正常。
55 lines
2.6 KiB
HTML
55 lines
2.6 KiB
HTML
<!DOCTYPE html>
|
||
<html lang="zh-CN">
|
||
|
||
<head>
|
||
<meta charset="UTF-8" />
|
||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||
<meta content="telephone=no,email=no" name="format-detection" />
|
||
<!-- 运行时配置引导:在任何应用模块执行前同步拉取 /<contextPath>/api/env-config
|
||
(后端免登录端点,projman 配置管理在线维护),替代生产构建环境变量。
|
||
本应用产物部署于 /{contextPath}/front/,target 取 URL 第 2 段。 -->
|
||
<script>
|
||
(function () {
|
||
try {
|
||
var seg = location.pathname.split("/").filter(Boolean);
|
||
if (seg.length < 2) return; // 本地开发(根路径):走 .env.dev / .env.mock
|
||
var xhr = new XMLHttpRequest();
|
||
xhr.open("GET", "/" + seg[0] + "/api/env-config?target=" + encodeURIComponent(seg[1]), false);
|
||
xhr.send(null);
|
||
if (xhr.status === 200) {
|
||
var conf = JSON.parse(xhr.responseText);
|
||
if (conf && typeof conf === "object") window.__APP_CONFIG__ = conf;
|
||
}
|
||
} catch (e) {
|
||
/* 拉取失败保持未设置,走同域推导兜底 */
|
||
}
|
||
})();
|
||
</script>
|
||
<!-- 主题通道引导(A 类免插件接入,YschTheme《管理端主题远程化与公共静态通道方案》§11):
|
||
唯一接入点。FOUC 门、manifest 预取、主题 <link> 追加与排序(晚于 viewuiplus.css)全由
|
||
通道 yh-theme-init.js 承担;主题升级走 /static 通道,本应用无需重新构建。
|
||
origin 零写死,优先级四档:__APP_CONFIG__.staticHost > __APP_CONFIG__.baseHost
|
||
> %VITE_THEME_HOST%(仅 dev) > 同源相对 "/static/…"(生产常态,本地 dev 走 vite 代理)。 -->
|
||
<script>
|
||
(function () {
|
||
var c = window.__APP_CONFIG__ || {};
|
||
var themeHost = "%VITE_THEME_HOST%";
|
||
if (themeHost.charAt(0) === "%") themeHost = "";
|
||
var host = String(c.staticHost || c.baseHost || themeHost).replace(/\/+$/, "");
|
||
document.write('<script src="' + host + '/static/js/yh-theme-init.js"><\/script>');
|
||
})();
|
||
</script>
|
||
<title><%- title %></title>
|
||
<link rel="stylesheet" href="./libs/ztree/zTreeStyle.css" />
|
||
<script src="./libs/jquery.min.js"></script>
|
||
<script src="./libs/ztree/jquery.ztree.all.min.js"></script>
|
||
<%- injectScript %>
|
||
</head>
|
||
|
||
<body>
|
||
<div id="app"></div>
|
||
<script type="module" src="/src/main.ts"></script>
|
||
</body>
|
||
|
||
</html>
|