[v2.1] A 去壳任务办理:App 增 bare 任务形态(/task/*?embed=1 保 CAS 去布局),TaskHandle 办理成功/查看业务/高度变化 postMessage 回父页,bare 不跳工作台
build / build (push) Successful in 2m30s
build / build (push) Successful in 2m30s
This commit is contained in:
+21
-10
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user