[v2.1] A 去壳任务办理:App 增 bare 任务形态(/task/*?embed=1 保 CAS 去布局),TaskHandle 办理成功/查看业务/高度变化 postMessage 回父页,bare 不跳工作台
build / build (push) Successful in 2m30s

This commit is contained in:
chenxing
2026-10-19 16:50:49 +08:00
parent 04fd54e945
commit ba448fc7a0
3 changed files with 181 additions and 21 deletions
+21 -10
View File
@@ -5,22 +5,29 @@ import { useRouter } from "vue-router";
import config from "@/assets/config/host.config";
import { baseApi } from "@/api/module/base";
import { resolveMenuPage } from "@/utils/menuRoute";
import { isBareTaskRoute } from "@/utils/taskEmbed";
import { Message } from "view-ui-plus";
const router = useRouter();
const isLogin = ref(false);
// 嵌入页旁路(/embed/**,iframe 免签嵌入):子应用 Drawer 里打开,带不了本应用 CAS 会话,
// 也不该出现菜单壳。判定用路由前缀而非 query 标记——刷新/直链/分享均稳定
const isEmbed = computed(() => router.currentRoute.value.path.startsWith("/embed/"));
const isTokenEmbed = computed(() => router.currentRoute.value.path.startsWith("/embed/"));
// 去壳任务页(/task/{taskId}?embed=1,v2.1 完整办理内嵌):只去菜单壳,CAS 一律保留——
// 办理是写操作,旁路鉴权等于把审批动作挂在免签 URL 上。与 token 页共享"无壳"渲染,
// 但鉴权分支只走 isTokenEmbed
const isBareTask = computed(() =>
isBareTaskRoute(router.currentRoute.value.path, router.currentRoute.value.query.embed));
const isShellless = computed(() => isTokenEmbed.value || isBareTask.value);
// 嵌入页必须旁路全局 body 的 min-width(assets/styles/base/_base.scss 的 1200px):
// 上面 isEmbed 只旁路了组件壳,管不到全局 CSS,740px 的 iframe 里页面仍按 ≥1200px 排版,
// 上面 isShellless 只旁路了组件壳,管不到全局 CSS,740px 的 iframe 里页面仍按 ≥1200px 排版,
// 表现为整体右偏 + 右侧被裁。用内联样式覆盖(优先级高于样式表),非嵌入态移除内联属性回落到原值
function syncEmbedLayout(embed: boolean) {
if (embed) document.body.style.minWidth = "0";
else document.body.style.removeProperty("min-width");
}
watch(isEmbed, syncEmbedLayout, { immediate: true });
watch(isShellless, syncEmbedLayout, { immediate: true });
onBeforeUnmount(() => syncEmbedLayout(false));
const layoutData = reactive({
@@ -37,8 +44,9 @@ onMounted(async () => {
// 首次导航异步完成:mount 时 currentRoute 可能仍是初始 "/",先等路由就绪再判嵌入前缀,
// 否则直链 /#/embed/* 会在旁路前误发鉴权请求
await router.isReady();
// 嵌入页:跳过两个鉴权请求(失败会弹错误 Message 且渲染带菜单壳的 layout,嵌入场景均不可接受)
if (isEmbed.value) {
// 嵌入页:跳过两个鉴权请求(失败会弹错误 Message 且渲染带菜单壳的 layout,嵌入场景均不可接受)。
// 去壳任务页不走这个分支——它是写面,getUserInfo/getUserMod 正是触发 CAS 的地方
if (isTokenEmbed.value) {
isLogin.value = true;
return;
}
@@ -97,11 +105,14 @@ onMounted(async () => {
</script>
<template>
<!-- 嵌入页:裸渲染,不套 layout 与 base-wrap-main(嵌入页自己管理样式与滚动) -->
<router-view v-if="isEmbed" />
<template v-else>
<layout v-if="isLogin" :layoutData="layoutData" />
<div v-if="isLogin" class="base-wrap-main" :class="{ 'alone-page': layoutData.isAlone }">
<!-- 嵌入页:裸渲染,不套 layout 与 base-wrap-main(嵌入页自己管理样式与滚动)。
token 页维持"不等鉴权先渲染"(它本来就不发鉴权请求);去壳任务页要等 CAS 那一路走完,
否则未登录时 iframe 里先闪一个能点的办理面板 -->
<router-view v-if="isTokenEmbed" />
<router-view v-else-if="isBareTask && isLogin" />
<template v-else-if="isLogin">
<layout :layoutData="layoutData" />
<div class="base-wrap-main" :class="{ 'alone-page': layoutData.isAlone }">
<div class="main-wrapper">
<router-view />
</div>