feat(tenant-platform): 应用详情页显示 BugCollect 服务 + 服务管理菜单新增崩溃收集

- AppDetailView: 新增崩溃收集服务卡片(开通/关闭/跳转概览&错误列表)
- serviceLabel/serviceHelp: 补充 BUG_COLLECT 对应文案
- MainLayout: 服务管理子菜单新增「崩溃收集」入口(/services/bugcollect)
- router: 注册 services/bugcollect 路由 → BugCollectOverview

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
这个提交包含在:
XuqmGroup 2026-06-16 19:22:02 +08:00
父节点 a6c929e406
当前提交 b75efcefd8
共有 3 个文件被更改,包括 53 次插入1 次删除

查看文件

@ -101,6 +101,10 @@ const router = createRouter({
path: 'services/license/:appKey?', path: 'services/license/:appKey?',
component: () => import('@/views/license/LicenseManagementView.vue'), component: () => import('@/views/license/LicenseManagementView.vue'),
}, },
{
path: 'services/bugcollect/:appKey?',
component: () => import('@/views/bug-collect/BugCollectOverview.vue'),
},
{ {
path: 'system-logs', path: 'system-logs',
component: () => import('@/views/system/ServerLogsView.vue'), component: () => import('@/views/system/ServerLogsView.vue'),

查看文件

@ -172,6 +172,45 @@
</div> </div>
</el-card> </el-card>
<el-card class="info-card" style="margin-top:16px">
<template #header>崩溃收集</template>
<div class="service-grid">
<el-card class="service-card">
<div class="service-header">
<div class="service-title-block">
<span class="service-name">{{ serviceLabel('BUG_COLLECT') }}</span>
<span class="service-help">{{ serviceHelp('BUG_COLLECT') }}</span>
</div>
<el-switch
:model-value="isServiceEnabled('BUG_COLLECT')"
@change="(val: boolean) => onToggleService('BUG_COLLECT', val)"
/>
</div>
<div class="service-status-row">
<el-tag :type="isServiceEnabled('BUG_COLLECT') ? 'success' : 'info'" size="small">
{{ isServiceEnabled('BUG_COLLECT') ? '已开通' : '未开通' }}
</el-tag>
<span class="service-status-text">
采集 App 崩溃异常与自定义事件支持漏斗分析和 Webhook 告警
</span>
</div>
<div class="service-actions">
<template v-if="isServiceEnabled('BUG_COLLECT')">
<el-button size="small" type="primary" plain @click="$router.push('/bugcollect/overview')">
崩溃概览
</el-button>
<el-button size="small" @click="$router.push('/bugcollect/issues')">
错误列表
</el-button>
</template>
<el-button v-else size="small" type="primary" plain @click="openActivationRequest('BUG_COLLECT')">
申请开通
</el-button>
</div>
</el-card>
</div>
</el-card>
<!-- API Key 管理 --> <!-- API Key 管理 -->
<el-card class="info-card" style="margin-top:16px"> <el-card class="info-card" style="margin-top:16px">
<template #header> <template #header>
@ -484,7 +523,13 @@ function isServiceEnabled(svcType: string) {
} }
function serviceLabel(type: string) { function serviceLabel(type: string) {
return { IM: '即时通讯 (IM)', PUSH: '离线推送', UPDATE: '版本管理', LICENSE: '授权管理' }[type] ?? type return {
IM: '即时通讯 (IM)',
PUSH: '离线推送',
UPDATE: '版本管理',
LICENSE: '授权管理',
BUG_COLLECT: '崩溃收集 (BugCollect)',
}[type] ?? type
} }
function serviceHelp(type: string) { function serviceHelp(type: string) {
@ -493,6 +538,7 @@ function serviceHelp(type: string) {
PUSH: '一次开通后,可在推送配置页按厂商维护配置。', PUSH: '一次开通后,可在推送配置页按厂商维护配置。',
UPDATE: '一次开通后,版本管理页独立管理版本上传、商店配置和灰度发布。', UPDATE: '一次开通后,版本管理页独立管理版本上传、商店配置和灰度发布。',
LICENSE: '管理 PAD 设备的授权注册与验证。', LICENSE: '管理 PAD 设备的授权注册与验证。',
BUG_COLLECT: '采集 App 崩溃与自定义事件,支持漏斗分析和 Webhook 告警。',
}[type] ?? '' }[type] ?? ''
} }

查看文件

@ -21,6 +21,7 @@
<el-menu-item index="/services/push"><el-icon><Bell /></el-icon><span>线</span></el-menu-item> <el-menu-item index="/services/push"><el-icon><Bell /></el-icon><span>线</span></el-menu-item>
<el-menu-item index="/services/update"><el-icon><Upload /></el-icon><span></span></el-menu-item> <el-menu-item index="/services/update"><el-icon><Upload /></el-icon><span></span></el-menu-item>
<el-menu-item index="/services/license"><el-icon><Key /></el-icon><span></span></el-menu-item> <el-menu-item index="/services/license"><el-icon><Key /></el-icon><span></span></el-menu-item>
<el-menu-item index="/services/bugcollect"><el-icon><DataLine /></el-icon><span></span></el-menu-item>
</el-sub-menu> </el-sub-menu>
<el-menu-item index="/security"><el-icon><Lock /></el-icon><span></span></el-menu-item> <el-menu-item index="/security"><el-icon><Lock /></el-icon><span></span></el-menu-item>
<el-sub-menu index="ops"> <el-sub-menu index="ops">
@ -71,6 +72,7 @@
<el-menu-item index="/services/push"><el-icon><Bell /></el-icon><span>线</span></el-menu-item> <el-menu-item index="/services/push"><el-icon><Bell /></el-icon><span>线</span></el-menu-item>
<el-menu-item index="/services/update"><el-icon><Upload /></el-icon><span></span></el-menu-item> <el-menu-item index="/services/update"><el-icon><Upload /></el-icon><span></span></el-menu-item>
<el-menu-item index="/services/license"><el-icon><Key /></el-icon><span></span></el-menu-item> <el-menu-item index="/services/license"><el-icon><Key /></el-icon><span></span></el-menu-item>
<el-menu-item index="/services/bugcollect"><el-icon><DataLine /></el-icon><span></span></el-menu-item>
</el-sub-menu> </el-sub-menu>
<el-menu-item index="/security"><el-icon><Lock /></el-icon><span></span></el-menu-item> <el-menu-item index="/security"><el-icon><Lock /></el-icon><span></span></el-menu-item>
<el-sub-menu index="ops"> <el-sub-menu index="ops">