From d00451c92458efeb741fbf69a8db4072f3c502ed Mon Sep 17 00:00:00 2001 From: TermiNexus Date: Mon, 28 Sep 2026 17:42:55 +0800 Subject: [PATCH] =?UTF-8?q?feat(app):=20=E5=BA=94=E7=94=A8=E5=B8=82?= =?UTF-8?q?=E5=9C=BA=E5=8D=A1=E7=89=87=E6=94=AF=E6=8C=81=E5=8F=B3=E4=BE=A7?= =?UTF-8?q?=E8=AF=A6=E6=83=85=E6=8A=BD=E5=B1=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 卡片主体点击弹出 el-drawer,展示图标/名称/简介/标签与安装管理 - 配置入口仍跳转原独立页面 /app/config - 操作区阻止冒泡,避免误触抽屉 --- src/views/app/AppMarket.vue | 225 +++++++++++++++++++++++++++++++++++- 1 file changed, 223 insertions(+), 2 deletions(-) diff --git a/src/views/app/AppMarket.vue b/src/views/app/AppMarket.vue index d9bc79f..eaecd41 100644 --- a/src/views/app/AppMarket.vue +++ b/src/views/app/AppMarket.vue @@ -275,6 +275,31 @@ function openConfig(a: AppItem): void { router.push({ path: '/app/config', query: { AppUUID: a.AppUUID, AppName: a.AppName } }) } +// ==================== 应用详情抽屉(仿 VSCode 扩展详情:右侧展开) ==================== +const detailVisible = ref(false) +/** 当前在抽屉中查看的应用 */ +const detailApp = ref(null) + +/** 点击卡片主体:右侧抽屉展示 icon / 名称 / 简介 / 安装管理 */ +function openDetail(a: AppItem): void { + detailApp.value = a + detailVisible.value = true +} + +/** 抽屉内「打开应用」:先收抽屉再跳转(页面被 tab 缓存,避免返回时抽屉仍开着) */ +function OpenAppFromDetail(): void { + const a = detailApp.value + detailVisible.value = false + if (a) openApp(a) +} + +/** 抽屉内「配置」:配置仍走原本的独立页面(/app/config) */ +function OpenConfigFromDetail(): void { + const a = detailApp.value + detailVisible.value = false + if (a) openConfig(a) +} + // ==================== 应用-职务绑定(管理员) ==================== const bindDialogVisible = ref(false) /** 绑定弹窗 Tab:direct=直接职务 / virtual=虚拟职务 */ @@ -326,7 +351,7 @@ onMounted(loadMarket)
-
+
@@ -360,7 +385,8 @@ onMounted(loadMarket) :class="{ ok: a.ApplyStatus === 2, err: a.ApplyStatus === 3 }" >{{ statusRowText(a) }}
-
+ +
@@ -425,6 +451,133 @@ onMounted(loadMarket)
+ + + + +