cloud-web-corejs 1.0.54-dev.757 → 1.0.54-dev.759
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/components/jsonImport/mixins.js +350 -350
- package/src/components/langImport/mixins.js +502 -502
- package/src/components/wf/wf.js +2221 -2221
- package/src/components/xform/form-designer/designer.js +2027 -2027
- package/src/components/xform/form-designer/form-widget/dialog/importDialogMixin.js +1774 -1774
- package/src/components/xform/form-designer/setting-panel/form-setting.vue +1553 -1553
- package/src/components/xform/form-designer/setting-panel/indexMixin.js +370 -370
- package/src/components/xform/form-designer/toolbar-panel/indexMixin.js +655 -655
- package/src/components/xform/form-render/container-item/detail-h5-item.vue +173 -173
- package/src/components/xform/form-render/container-item/detail-item.vue +287 -287
- package/src/components/xform/form-render/indexMixin.js +23 -23
- package/src/components/xform/utils/util.js +5 -5
- package/src/index.js +2 -0
- package/src/microRouter/index.js +68 -7
- package/src/store/modules/micro.js +5 -0
- package/src/store/modules/permission.js +46 -1
- package/src/views/user/home/default2.vue +1158 -1158
- package/src/views/user/login/indexMixin.js +661 -661
package/src/index.js
CHANGED
|
@@ -269,6 +269,8 @@ export async function mount(props = {}) {
|
|
|
269
269
|
menus: Array.isArray(props.menus) ? props.menus : null,
|
|
270
270
|
mainAdapter: props.mainAdapter || null,
|
|
271
271
|
lang: props.lang || "",
|
|
272
|
+
// 主应用经本地调试覆盖装载:允许 URL 直达未配菜单的页面
|
|
273
|
+
debug: !!props.microDebug,
|
|
272
274
|
});
|
|
273
275
|
// 再次挂载时 unmount 已重置路由,而 roles 仍在会使守卫跳过路由生成,这里主动补一次
|
|
274
276
|
if (store.getters.roles && store.getters.roles.length > 0) {
|
package/src/microRouter/index.js
CHANGED
|
@@ -73,18 +73,47 @@ export function getAppRegistry() {
|
|
|
73
73
|
);
|
|
74
74
|
}
|
|
75
75
|
|
|
76
|
+
const DEBUG_URL_PARAMS = ["microDebug", "microDebugAppCode", "microDebugEntry"];
|
|
77
|
+
|
|
78
|
+
/** 取 URL 上某个查询参数(hash 前后都找),非法转义按原文处理 */
|
|
79
|
+
function readUrlParam(href, name) {
|
|
80
|
+
const matched = href.match(new RegExp("[?&]" + name + "=([^&#]*)"));
|
|
81
|
+
if (!matched) return null;
|
|
82
|
+
const raw = matched[1] || "";
|
|
83
|
+
let value = raw;
|
|
84
|
+
try {
|
|
85
|
+
value = decodeURIComponent(raw);
|
|
86
|
+
} catch (e) {
|
|
87
|
+
// 非法转义(如值里有裸 %)会抛 URIError,按原文处理,不能让它中断注册表加载
|
|
88
|
+
value = raw;
|
|
89
|
+
}
|
|
90
|
+
return value.trim();
|
|
91
|
+
}
|
|
92
|
+
|
|
76
93
|
/**
|
|
77
94
|
* 从 URL 读调试开关并落盘 localStorage,读到后即从地址栏抹掉(避免被收藏/分享扩散)。
|
|
78
95
|
* 支持 hash 前后两种位置:?microDebug=xx#/... 与 #/...?microDebug=xx。
|
|
79
|
-
*
|
|
96
|
+
* 两种写法:
|
|
97
|
+
* ?microDebug=xx 取值同 localStorage 四档写法;off/0 清除
|
|
98
|
+
* ?microDebugAppCode=mkwebµDebugEntry=17527 拆成两个参数,值里不含 "="
|
|
99
|
+
* 后者存在的原因:部分网关/WAF 对查询串里出现第二个裸 "=" 直接返 500(整页打不开),
|
|
100
|
+
* 拆成两个参数后每个值都没有 "=",无需编码即可通过。entry 可写端口号简写。
|
|
80
101
|
* 存在意义:settings.microDebugEnabled 是构建期常量、全体用户共用,生产构建里必须失效;
|
|
81
102
|
* 生产环境主应用要装本机子应用,只能靠这种"按浏览器生效"的通道。
|
|
82
103
|
*/
|
|
83
104
|
function readDebugFromUrl() {
|
|
84
105
|
const href = window.location.href || "";
|
|
85
|
-
const
|
|
86
|
-
|
|
87
|
-
const
|
|
106
|
+
const single = readUrlParam(href, "microDebug");
|
|
107
|
+
const appCode = readUrlParam(href, "microDebugAppCode");
|
|
108
|
+
const entry = readUrlParam(href, "microDebugEntry");
|
|
109
|
+
let value = null;
|
|
110
|
+
if (appCode) {
|
|
111
|
+
// 双参数写法:entry 缺省时落到默认入口(由 getDebugOverrides 补)
|
|
112
|
+
value = entry ? appCode + "=" + entry : appCode;
|
|
113
|
+
} else if (single !== null) {
|
|
114
|
+
value = single;
|
|
115
|
+
}
|
|
116
|
+
if (value === null) return;
|
|
88
117
|
try {
|
|
89
118
|
if (!value || value === "off" || value === "0") {
|
|
90
119
|
window.localStorage.removeItem(DEBUG_STORAGE_KEY);
|
|
@@ -96,15 +125,33 @@ function readDebugFromUrl() {
|
|
|
96
125
|
return;
|
|
97
126
|
}
|
|
98
127
|
try {
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
.replace(
|
|
128
|
+
let cleaned = href;
|
|
129
|
+
DEBUG_URL_PARAMS.forEach((name) => {
|
|
130
|
+
cleaned = cleaned.replace(
|
|
131
|
+
new RegExp("([?&])" + name + "=[^&#]*&?"),
|
|
132
|
+
"$1"
|
|
133
|
+
);
|
|
134
|
+
});
|
|
135
|
+
cleaned = cleaned.replace(/[?&](?=#|$)/, ""); // 抹掉可能残留的空查询串
|
|
102
136
|
window.history.replaceState(null, "", cleaned);
|
|
103
137
|
} catch (e) {
|
|
104
138
|
// replaceState 失败不影响开关本身,忽略
|
|
105
139
|
}
|
|
106
140
|
}
|
|
107
141
|
|
|
142
|
+
/**
|
|
143
|
+
* entry 规范化:允许只写端口号(如 "17527")代替完整地址。
|
|
144
|
+
* 完整地址里的 ":" 与 "//" 放在 URL 查询串上容易被地址栏或服务端重定向吃掉,
|
|
145
|
+
* 端口简写让 ?microDebug=mkweb=17527 这种最省事的写法可用。
|
|
146
|
+
*/
|
|
147
|
+
function normalizeDebugEntry(entry) {
|
|
148
|
+
const value = (entry == null ? "" : String(entry)).trim();
|
|
149
|
+
if (/^\d{2,5}$/.test(value)) {
|
|
150
|
+
return "http://localhost:" + value + "/";
|
|
151
|
+
}
|
|
152
|
+
return value;
|
|
153
|
+
}
|
|
154
|
+
|
|
108
155
|
/**
|
|
109
156
|
* 本机调试覆盖,三种触发方式(localStorage 优先于 settings 开关):
|
|
110
157
|
* 1) URL 参数 ?microDebug=xx —— 任何环境(含生产构建)都生效,值写入 localStorage
|
|
@@ -127,6 +174,11 @@ function getDebugOverrides() {
|
|
|
127
174
|
raw = null;
|
|
128
175
|
}
|
|
129
176
|
raw = raw ? raw.trim() : "";
|
|
177
|
+
// off / 0 一律视为关闭:与 URL 形态语义一致,
|
|
178
|
+
// 否则会被当成一个名叫 off 的 appCode 注册出去
|
|
179
|
+
if (raw === "off" || raw === "0" || raw === "false") {
|
|
180
|
+
raw = "";
|
|
181
|
+
}
|
|
130
182
|
const defaults = {
|
|
131
183
|
appCode: settings.microDebugAppCode || DEBUG_DEFAULT_APP_CODE,
|
|
132
184
|
entry: settings.microDebugEntry || DEBUG_DEFAULT_ENTRY,
|
|
@@ -168,6 +220,10 @@ function getDebugOverrides() {
|
|
|
168
220
|
return { appCode: code, entry };
|
|
169
221
|
});
|
|
170
222
|
}
|
|
223
|
+
items = items.map((item) => ({
|
|
224
|
+
appCode: item.appCode,
|
|
225
|
+
entry: normalizeDebugEntry(item.entry),
|
|
226
|
+
}));
|
|
171
227
|
items = items.filter((item) => {
|
|
172
228
|
if (!DEBUG_APP_CODE_REG.test(item.appCode || "") || !item.entry) {
|
|
173
229
|
console.error(
|
|
@@ -190,6 +246,8 @@ function applyDebugOverrides(apps) {
|
|
|
190
246
|
if (existing) {
|
|
191
247
|
existing.entry = override.entry;
|
|
192
248
|
existing.enabled = true;
|
|
249
|
+
// 打标记:子应用据此启用"URL 直达未配菜单页面"的调试兜底路由
|
|
250
|
+
existing.debugOverride = true;
|
|
193
251
|
} else {
|
|
194
252
|
result.push({
|
|
195
253
|
appCode: override.appCode,
|
|
@@ -197,6 +255,7 @@ function applyDebugOverrides(apps) {
|
|
|
197
255
|
entry: override.entry,
|
|
198
256
|
hasCorejs: true,
|
|
199
257
|
enabled: true,
|
|
258
|
+
debugOverride: true,
|
|
200
259
|
});
|
|
201
260
|
}
|
|
202
261
|
console.warn(
|
|
@@ -256,6 +315,8 @@ export function registerSubApps(apps, options = {}) {
|
|
|
256
315
|
lang: localStorage.getItem("i18n-lang") || "",
|
|
257
316
|
userInfo,
|
|
258
317
|
mainAdapter,
|
|
318
|
+
// 本地调试覆盖装载的应用:允许 URL 直达未配菜单的页面(见 permission.js 调试兜底路由)
|
|
319
|
+
microDebug: !!app.debugOverride,
|
|
259
320
|
},
|
|
260
321
|
};
|
|
261
322
|
});
|
|
@@ -14,6 +14,9 @@ const state = {
|
|
|
14
14
|
selfManaged: false,
|
|
15
15
|
// 保活隐藏期间置 true:路由守卫直接 next(false),防止隐藏的子应用响应主应用的 URL 变化
|
|
16
16
|
routerPaused: false,
|
|
17
|
+
// 主应用经本地调试覆盖装载本应用时为 true:启用"URL 直达未配菜单页面"的兜底路由。
|
|
18
|
+
// 正式注册表装载时为 false——菜单即权限边界,不能让任意路径都能打开组件
|
|
19
|
+
debug: false,
|
|
17
20
|
};
|
|
18
21
|
|
|
19
22
|
const mutations = {
|
|
@@ -24,6 +27,7 @@ const mutations = {
|
|
|
24
27
|
state.menus = payload.menus || [];
|
|
25
28
|
state.mainAdapter = payload.mainAdapter || null;
|
|
26
29
|
state.lang = payload.lang || "";
|
|
30
|
+
state.debug = !!payload.debug;
|
|
27
31
|
},
|
|
28
32
|
SET_ROUTER_PAUSED: (state, paused) => {
|
|
29
33
|
state.routerPaused = !!paused;
|
|
@@ -36,6 +40,7 @@ const mutations = {
|
|
|
36
40
|
state.lang = "";
|
|
37
41
|
state.selfManaged = false;
|
|
38
42
|
state.routerPaused = false;
|
|
43
|
+
state.debug = false;
|
|
39
44
|
},
|
|
40
45
|
};
|
|
41
46
|
|
|
@@ -21,6 +21,44 @@ import MenuFallback from "@base/views/user/menuFallback/index.vue";
|
|
|
21
21
|
let hostRegistryApps = [];
|
|
22
22
|
let hostMicroRoutes = [];
|
|
23
23
|
|
|
24
|
+
// 子应用被"本地调试覆盖"装载时置 true:启用按访问路径直接解析组件的兜底路由,
|
|
25
|
+
// 使联调期可用 URL 直达尚未配置菜单的页面。正式注册表装载时恒为 false——
|
|
26
|
+
// 菜单即权限边界,不能让任意路径都能打开组件
|
|
27
|
+
let debugPathEnabled = false;
|
|
28
|
+
|
|
29
|
+
// 按路径解析出的异步组件工厂按路径缓存:Vue 2 依工厂函数标识做结果缓存,
|
|
30
|
+
// 每次 render 新建工厂会导致重复请求同一 chunk
|
|
31
|
+
let debugPathFactories = {};
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* 调试兜底路由:把当前访问路径当作菜单 url 走同一套组件解析
|
|
35
|
+
* (剥归属前缀 → /base 命名空间 → loadView),解析不出则落 menuFallback 提示页。
|
|
36
|
+
*/
|
|
37
|
+
function createDebugPathRoute() {
|
|
38
|
+
return {
|
|
39
|
+
path: "*",
|
|
40
|
+
name: "microDebugPath",
|
|
41
|
+
meta: { title: "调试直达", microDebugPath: true },
|
|
42
|
+
component: {
|
|
43
|
+
name: "microDebugPathView",
|
|
44
|
+
render(h) {
|
|
45
|
+
const path = (this.$route && this.$route.path) || "";
|
|
46
|
+
const componentPath = resolveComponentPath(
|
|
47
|
+
{ url: path },
|
|
48
|
+
settings.appCode || ""
|
|
49
|
+
);
|
|
50
|
+
if (!componentPath) {
|
|
51
|
+
return h(MenuFallback, { props: { componentPath: path } });
|
|
52
|
+
}
|
|
53
|
+
if (!debugPathFactories[componentPath]) {
|
|
54
|
+
debugPathFactories[componentPath] = loadView(componentPath);
|
|
55
|
+
}
|
|
56
|
+
return h(debugPathFactories[componentPath], { key: path });
|
|
57
|
+
},
|
|
58
|
+
},
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
|
|
24
62
|
// 下发给子应用的登录信息快照(props.userInfo,协议第 5 节);注册时快照,非实时
|
|
25
63
|
function buildUserInfoSnapshot(userState = {}) {
|
|
26
64
|
return {
|
|
@@ -221,7 +259,9 @@ const actions = {
|
|
|
221
259
|
});
|
|
222
260
|
},
|
|
223
261
|
// qiankun 子应用模式:主应用经 props 下发菜单,替代 getRouters 自拉
|
|
224
|
-
generateRoutesFromProps({ dispatch }, menus = []) {
|
|
262
|
+
generateRoutesFromProps({ dispatch, rootState }, menus = []) {
|
|
263
|
+
// 调试覆盖装载时允许 URL 直达未配菜单的页面(handleMenuRoutes 追加兜底路由)
|
|
264
|
+
debugPathEnabled = !!(rootState.micro && rootState.micro.debug);
|
|
225
265
|
return dispatch("setSidebarRoute", menus);
|
|
226
266
|
},
|
|
227
267
|
setSidebarRoute({ commit, dispatch }, rows = []) {
|
|
@@ -285,6 +325,11 @@ function handleMenuRoutes(routes) {
|
|
|
285
325
|
children.push(microRoute);
|
|
286
326
|
});
|
|
287
327
|
|
|
328
|
+
// 调试兜底放在全局 * → /404 之前,未配菜单的路径由它按路径解析组件
|
|
329
|
+
if (debugPathEnabled) {
|
|
330
|
+
children.push(createDebugPathRoute());
|
|
331
|
+
}
|
|
332
|
+
|
|
288
333
|
sidebarRoutes.children = children;
|
|
289
334
|
var result = [sidebarRoutes];
|
|
290
335
|
result.push({
|