mirror of
https://github.com/kuaifan/dootask.git
synced 2025-12-19 16:22:52 +00:00
feat: 优化 openMicroApp 方法,增强参数校验和微应用 ID 解析逻辑
This commit is contained in:
parent
d94ebfe04c
commit
353a05f344
@ -2669,7 +2669,7 @@ export default {
|
|||||||
id: 'okr',
|
id: 'okr',
|
||||||
name: 'okr_details',
|
name: 'okr_details',
|
||||||
url: 'apps/okr/#details',
|
url: 'apps/okr/#details',
|
||||||
props: {type: 'details', id},
|
props: {open_type: 'details', id},
|
||||||
keep_alive: false,
|
keep_alive: false,
|
||||||
transparent: true,
|
transparent: true,
|
||||||
});
|
});
|
||||||
|
|||||||
42
resources/assets/js/store/actions.js
vendored
42
resources/assets/js/store/actions.js
vendored
@ -5076,14 +5076,35 @@ export default {
|
|||||||
* 更多说明详见 https://appstore.dootask.com/development/manual
|
* 更多说明详见 https://appstore.dootask.com/development/manual
|
||||||
*/
|
*/
|
||||||
async openMicroApp({state}, data) {
|
async openMicroApp({state}, data) {
|
||||||
|
// 参数基础校验:必须是对象且包含 id/name/url
|
||||||
if (!data || !$A.isJson(data)) {
|
if (!data || !$A.isJson(data)) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if (!data.id || !data.name || !data.url) {
|
if (!data.id || !data.name || !data.url) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
const serverLocation = new URL($A.mainUrl(''))
|
|
||||||
data.url = data.url
|
// 解析微应用实际 ID(支持传入短 ID)
|
||||||
|
let microAppId = data.id
|
||||||
|
if (!state.microAppsIds.includes(microAppId)) {
|
||||||
|
microAppId = state.microAppsIds.find(item => typeof item === 'string' && item.endsWith(microAppId)) || null
|
||||||
|
}
|
||||||
|
if (!microAppId) {
|
||||||
|
$A.modalWarning(`应用「${data.id}」未安装`)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// 以「匹配到的应用菜单第一个 menu(microAppsMenus 中该应用的第一条记录)」作为基础数据,合并出本次打开的 data
|
||||||
|
if (data.skip_base_menu !== true) {
|
||||||
|
const baseMenu = state.microAppsMenus.find(item => item?.id === microAppId) || null
|
||||||
|
if ($A.isJson(baseMenu)) {
|
||||||
|
data = Object.assign({}, baseMenu, data)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 处理 url 中的占位符/相对路径(以当前系统 baseUrl 为准)
|
||||||
|
const serverLocation = new URL($A.mainUrl())
|
||||||
|
const url = data.url
|
||||||
.replace(/^\/+/, '')
|
.replace(/^\/+/, '')
|
||||||
.replace(/^\:(\d+)/ig, (_, port) => {
|
.replace(/^\:(\d+)/ig, (_, port) => {
|
||||||
return serverLocation.protocol + '//' + serverLocation.hostname + ':' + port;
|
return serverLocation.protocol + '//' + serverLocation.hostname + ':' + port;
|
||||||
@ -5095,10 +5116,11 @@ export default {
|
|||||||
})
|
})
|
||||||
.replace(/\{system_base_url}/g, serverLocation.origin)
|
.replace(/\{system_base_url}/g, serverLocation.origin)
|
||||||
|
|
||||||
|
// 组装打开微应用所需的最终 config(用于 MicroApps 组件渲染/启动)
|
||||||
const config = {
|
const config = {
|
||||||
id: data.id,
|
id: microAppId,
|
||||||
name: data.name,
|
name: data.name,
|
||||||
url: $A.mainUrl(data.url),
|
url: $A.mainUrl(url),
|
||||||
type: data.type || data.url_type,
|
type: data.type || data.url_type,
|
||||||
background: data.background || null,
|
background: data.background || null,
|
||||||
capsule: $A.isJson(data.capsule) ? data.capsule : {},
|
capsule: $A.isJson(data.capsule) ? data.capsule : {},
|
||||||
@ -5109,14 +5131,8 @@ export default {
|
|||||||
immersive: typeof data.immersive == 'boolean' ? data.immersive : false,
|
immersive: typeof data.immersive == 'boolean' ? data.immersive : false,
|
||||||
props: $A.isJson(data.props) ? data.props : {},
|
props: $A.isJson(data.props) ? data.props : {},
|
||||||
}
|
}
|
||||||
if (!state.microAppsIds.includes(config.id)) {
|
|
||||||
const matchedId = state.microAppsIds.find(item => typeof item === 'string' && item.endsWith(config.id))
|
// 将运行时变量注入到 url(用户信息/主题/语言等)
|
||||||
if (!matchedId) {
|
|
||||||
$A.modalWarning(`应用「${config.id}」未安装`);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
config.id = matchedId;
|
|
||||||
}
|
|
||||||
config.url = config.url
|
config.url = config.url
|
||||||
.replace(/\{user_id}/g, state.userId)
|
.replace(/\{user_id}/g, state.userId)
|
||||||
.replace(/\{user_nickname}/g, encodeURIComponent(state.userInfo.nickname))
|
.replace(/\{user_nickname}/g, encodeURIComponent(state.userInfo.nickname))
|
||||||
@ -5125,6 +5141,8 @@ export default {
|
|||||||
.replace(/\{user_token}/g, encodeURIComponent(state.userToken))
|
.replace(/\{user_token}/g, encodeURIComponent(state.userToken))
|
||||||
.replace(/\{system_theme}/g, state.themeName)
|
.replace(/\{system_theme}/g, state.themeName)
|
||||||
.replace(/\{system_lang}/g, languageName);
|
.replace(/\{system_lang}/g, languageName);
|
||||||
|
|
||||||
|
// 通知 MicroApps 容器打开应用
|
||||||
emitter.emit('observeMicroApp:open', config);
|
emitter.emit('observeMicroApp:open', config);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user