feat(product): 新增产品管理模块与字典组件功能

- 新增产品管理相关路由和页面(dashboard、list、requirement、setting)
- 实现产品基础信息编辑弹窗组件(base-info-dialog.vue)
- 添加运行时字典功能(dict-select、dict-text、dict-tag组件)
- 集成字典管理store和API调用
- 规范ID类型定义为string避免精度丢失问题
- 完善国际化资源文件支持中英文对照
- 新增对象上下文业务域入口页导航实现说明
- 添加Vue DevTools浮动入口注释说明
- 统一权限控制支持全局和对象作用域区分
- 规范分页查询参数类型定义与使用方式
This commit is contained in:
2026-04-23 09:05:55 +08:00
parent c5911ea34b
commit 4122dfa50d
95 changed files with 9581 additions and 801 deletions

View File

@@ -17,6 +17,20 @@ export const commonStatusOptions = [
{ value: 1, label: commonStatusRecord[1] }
] satisfies CommonType.Option<Api.SystemManage.CommonStatus, App.I18n.I18nKey>[];
export const scopeTypeRecord: Record<Api.SystemManage.ScopeType, App.I18n.I18nKey> = {
global: 'page.system.common.scopeType.global',
object: 'page.system.common.scopeType.object'
};
export const scopeTypeOptions = transformRecordToOption(scopeTypeRecord);
export const objectTypeRecord: Record<Api.SystemManage.ObjectType, App.I18n.I18nKey> = {
product: 'page.system.common.objectType.product',
project: 'page.system.common.objectType.project'
};
export const objectTypeOptions = transformRecordToOption(objectTypeRecord);
export const dictStatusRecord: Record<'0' | '1', App.I18n.I18nKey> = {
'0': 'page.system.common.status.enable',
'1': 'page.system.common.status.disable'

37
src/constants/dict.ts Normal file
View File

@@ -0,0 +1,37 @@
/**
* 运行时字典编码常量
*
* 约定:
* 1. 不要在业务页面硬编码 dictType。
* 2. 新增字典编码前,先从“后端接口文档 / 后端字段契约 / 系统字典管理页”确认真实 dictType。
* 3. 确认后再收敛到本文件,并补上中文注释说明“这个编码对应哪个业务字段”。
*/
/**
* 对象方向字典编码
*
* 对应业务字段:产品、项目及后续其他对象中的 directionCode / direction
* 来源口径:
* 1. 方向类业务语义已经纠正为“对象通用方向”
* 2. 后端字典编码已准备切到更准确的 rdms_object_direction
*
* 说明:
* 前端页面统一使用本常量,不再继续使用带 product 痕迹的旧命名。
*/
export const RDMS_OBJECT_DIRECTION_DICT_CODE = 'rdms_object_direction';
/**
* 对象方向历史字典编码
*
* 用途:
* 仅用于前后端切换期间兼容旧数据,不允许新页面直接使用。
*/
export const RDMS_OBJECT_DIRECTION_LEGACY_DICT_CODE = 'rdms_product_direction';
/**
* 用户所属公司字典编码
*
* 对应业务字段:用户相关接口和页面中的 company
* 来源口径:当前系统“用户管理”页面按系统字典 system_user_company 做下拉和文案回显
*/
export const SYSTEM_USER_COMPANY_DICT_CODE = 'system_user_company';

View File

@@ -0,0 +1,59 @@
import { WEB_SERVICE_PREFIX } from './service';
export const OBJECT_CONTEXT_QUERY_KEY = 'objectId' as const;
export const objectContextDomainConfigs: App.ObjectContext.DomainConfig[] = [
{
domainKey: 'project',
mode: 'object-context',
objectType: 'project',
routePathPrefixes: ['/project'],
entryRouteKey: 'project_list',
entryRoutePath: '/project/list',
fallbackDefaultRouteKey: 'project_dashboard',
fallbackDefaultRoutePath: '/project/dashboard',
contextApiPath: `${WEB_SERVICE_PREFIX}/project/context`,
contextApiObjectIdParamKey: 'projectId',
contextApiObjectIdPlacement: 'query',
objectIdQueryKey: OBJECT_CONTEXT_QUERY_KEY
},
{
domainKey: 'product',
mode: 'object-context',
objectType: 'product',
routePathPrefixes: ['/product'],
entryRouteKey: 'product_list',
entryRoutePath: '/product/list',
fallbackDefaultRouteKey: 'product_dashboard',
fallbackDefaultRoutePath: '/product/dashboard',
contextApiPath: `${WEB_SERVICE_PREFIX}/project/product/{id}/context`,
contextApiObjectIdParamKey: 'id',
contextApiObjectIdPlacement: 'path',
objectIdQueryKey: OBJECT_CONTEXT_QUERY_KEY
}
];
function normalizePath(path: string) {
if (!path) {
return '/';
}
return path.endsWith('/') && path !== '/' ? path.slice(0, -1) : path;
}
function isPathMatchedByPrefix(path: string, prefix: string) {
const normalizedPath = normalizePath(path);
const normalizedPrefix = normalizePath(prefix);
return normalizedPath === normalizedPrefix || normalizedPath.startsWith(`${normalizedPrefix}/`);
}
export function getObjectContextDomainConfigByPath(path: string) {
return objectContextDomainConfigs.find(config =>
config.routePathPrefixes.some(prefix => isPathMatchedByPrefix(path, prefix))
);
}
export function isObjectContextEntryPath(path: string, config: App.ObjectContext.DomainConfig) {
return normalizePath(path) === normalizePath(config.entryRoutePath);
}

View File

@@ -0,0 +1,455 @@
export interface DemoProductRequirement {
id: string;
title: string;
status: '待评审' | '设计中' | '开发中' | '验证中' | '已完成';
priority: 'P0' | 'P1' | 'P2';
owner: string;
module: string;
updatedAt: string;
}
export interface DemoProductRoadmapItem {
id: string;
title: string;
window: string;
status: '已排期' | '推进中' | '风险关注';
summary: string;
}
export type DemoProductManageStatus = '启用产品' | '归档产品' | '暂停产品' | '废弃产品';
export interface DemoProduct {
id: string;
name: string;
code: string;
owner: string;
department: string;
status: '规划中' | '研发中' | '稳定运营';
manageStatus: DemoProductManageStatus;
stage: '探索' | '增长' | '平台化';
version: string;
releaseTarget: string;
updatedAt: string;
health: '健康' | '关注' | '加速';
summary: string;
tags: string[];
teamCount: number;
requirementCount: number;
bugCount: number;
focus: string[];
requirements: DemoProductRequirement[];
roadmap: DemoProductRoadmapItem[];
}
export const demoProducts: DemoProduct[] = [
{
id: 'product-alpha',
name: '产品中台 Alpha',
code: 'ALPHA',
owner: '林语辰',
department: '平台产品部',
status: '研发中',
manageStatus: '启用产品',
stage: '平台化',
version: 'v2.8.0',
releaseTarget: '2026-05-10',
updatedAt: '2026-04-16',
health: '健康',
summary: '面向多业务线复用的产品主数据与流程配置中台,当前重点在规则编排和版本发布节奏收口。',
tags: ['平台能力', '规则编排', '统一发布'],
teamCount: 14,
requirementCount: 26,
bugCount: 5,
focus: ['统一配置台账', '版本灰度策略', '对象权限接入'],
requirements: [
{
id: 'REQ-101',
title: '支持产品对象上下文的头部导航切换',
status: '开发中',
priority: 'P0',
owner: '赵明远',
module: '工作台',
updatedAt: '2026-04-15'
},
{
id: 'REQ-108',
title: '接入对象成员角色模板的快捷查看',
status: '设计中',
priority: 'P1',
owner: '姜知夏',
module: '权限',
updatedAt: '2026-04-13'
},
{
id: 'REQ-112',
title: '支持发布包差异对比摘要',
status: '待评审',
priority: 'P1',
owner: '周承安',
module: '发布',
updatedAt: '2026-04-11'
}
],
roadmap: [
{
id: 'RM-1',
title: '对象上下文导航试点',
window: '2026 Q2',
status: '推进中',
summary: '先在产品域打通对象入口、头部导航、按钮权限隔离。'
},
{
id: 'RM-2',
title: '规则编排配置台账',
window: '2026 Q2',
status: '已排期',
summary: '把历史分散配置统一归档到产品规则台账。'
},
{
id: 'RM-3',
title: '发布治理看板',
window: '2026 Q3',
status: '风险关注',
summary: '依赖后端事件流与测试数据沉淀,排期受联调进度影响。'
}
]
},
{
id: 'product-orbit',
name: 'Orbit 客户协同端',
code: 'ORBIT',
owner: '程清和',
department: '客户体验部',
status: '稳定运营',
manageStatus: '归档产品',
stage: '增长',
version: 'v1.9.3',
releaseTarget: '2026-04-28',
updatedAt: '2026-04-14',
health: '关注',
summary: '围绕客户协同与交付反馈的门户产品,近期重点是降低工单回流和优化首屏转化链路。',
tags: ['客户协同', '交付门户', '反馈闭环'],
teamCount: 10,
requirementCount: 18,
bugCount: 9,
focus: ['首屏引导改版', '交付看板合并', '通知触达回收'],
requirements: [
{
id: 'REQ-203',
title: '重构客户交付看板首页信息密度',
status: '验证中',
priority: 'P0',
owner: '顾思远',
module: '门户',
updatedAt: '2026-04-15'
},
{
id: 'REQ-217',
title: '补充客户联系人生命周期标签',
status: '开发中',
priority: 'P1',
owner: '何嘉宁',
module: '客户画像',
updatedAt: '2026-04-12'
}
],
roadmap: [
{
id: 'RM-4',
title: '客户首页分群策略升级',
window: '2026 Q2',
status: '推进中',
summary: '把静态首页切分为按客户阶段动态呈现的版本。'
},
{
id: 'RM-5',
title: '交付反馈闭环自动催办',
window: '2026 Q3',
status: '已排期',
summary: '通过规则任务减少人工跟进成本。'
}
]
},
{
id: 'product-lighthouse',
name: 'Lighthouse 经营驾驶舱',
code: 'LIGHT',
owner: '宋知序',
department: '商业产品部',
status: '稳定运营',
manageStatus: '启用产品',
stage: '增长',
version: 'v3.2.1',
releaseTarget: '2026-05-22',
updatedAt: '2026-04-15',
health: '健康',
summary: '承接经营看板、指标订阅和异常播报的统一产品驾驶舱,当前聚焦跨部门指标口径收敛与高频场景提效。',
tags: ['经营分析', '指标订阅', '统一驾驶舱'],
teamCount: 12,
requirementCount: 21,
bugCount: 3,
focus: ['指标口径治理', '异常订阅编排', '高层驾驶舱视图'],
requirements: [
{
id: 'REQ-221',
title: '支持核心经营指标的口径版本管理',
status: '开发中',
priority: 'P0',
owner: '孟之遥',
module: '指标中心',
updatedAt: '2026-04-14'
},
{
id: 'REQ-228',
title: '补齐驾驶舱异常波动播报模板',
status: '待评审',
priority: 'P1',
owner: '韩屿川',
module: '播报',
updatedAt: '2026-04-11'
}
],
roadmap: [
{
id: 'RM-8',
title: '经营指标主题化看板升级',
window: '2026 Q2',
status: '推进中',
summary: '将现有指标页按经营主题重组,减少跨页面跳转成本。'
}
]
},
{
id: 'product-pulse',
name: 'Pulse 消息协同台',
code: 'PULSE',
owner: '许闻洲',
department: '协同平台部',
status: '规划中',
manageStatus: '启用产品',
stage: '探索',
version: 'v0.6.4',
releaseTarget: '2026-05-30',
updatedAt: '2026-04-13',
health: '关注',
summary: '统一承接站内消息、流程通知与消息编排的试点产品,当前重点是通知模板复用与多渠道触达一致性。',
tags: ['消息编排', '流程通知', '多渠道触达'],
teamCount: 7,
requirementCount: 13,
bugCount: 2,
focus: ['模板复用', '渠道一致性', '消息审计留痕'],
requirements: [
{
id: 'REQ-331',
title: '梳理流程类通知的统一模板规范',
status: '设计中',
priority: 'P1',
owner: '丁和畅',
module: '模板中心',
updatedAt: '2026-04-12'
}
],
roadmap: [
{
id: 'RM-9',
title: '流程消息中心试点',
window: '2026 Q2',
status: '已排期',
summary: '先打通审批、告警两条主链路,验证模板与渠道编排能力。'
}
]
},
{
id: 'product-nova',
name: 'Nova 数据服务台',
code: 'NOVA',
owner: '陆闻笙',
department: '数据中台部',
status: '研发中',
manageStatus: '暂停产品',
stage: '探索',
version: 'v0.9.0',
releaseTarget: '2026-06-18',
updatedAt: '2026-04-12',
health: '加速',
summary: '承接跨系统数据接入、数据模型装配与查询服务的试点产品,当前仍在能力边界探索阶段。',
tags: ['数据服务', '模型装配', '试点产品'],
teamCount: 8,
requirementCount: 11,
bugCount: 4,
focus: ['接入链路模板化', '查询 SLA 监控', '多租户样例沉淀'],
requirements: [
{
id: 'REQ-301',
title: '沉淀数据接入模板库',
status: '开发中',
priority: 'P0',
owner: '沈南舟',
module: '接入',
updatedAt: '2026-04-16'
},
{
id: 'REQ-306',
title: '接入失败告警卡片化展示',
status: '设计中',
priority: 'P2',
owner: '夏安宁',
module: '监控',
updatedAt: '2026-04-10'
}
],
roadmap: [
{
id: 'RM-6',
title: '试点租户接入扩容',
window: '2026 Q2',
status: '推进中',
summary: '把当前 2 个试点租户扩到 6 个,验证模型复用率。'
}
]
},
{
id: 'product-atlas',
name: 'Atlas 组织配置台',
code: 'ATLAS',
owner: '冯见山',
department: '企业应用部',
status: '稳定运营',
manageStatus: '归档产品',
stage: '平台化',
version: 'v2.6.8',
releaseTarget: '2026-02-28',
updatedAt: '2026-04-09',
health: '健康',
summary: '曾用于统一组织架构、岗位映射和通讯录同步的配置平台,现已完成能力迁移,仅作为历史归档保留。',
tags: ['组织配置', '历史归档', '同步映射'],
teamCount: 6,
requirementCount: 8,
bugCount: 0,
focus: ['历史配置追溯', '迁移审计', '只读查询'],
requirements: [
{
id: 'REQ-510',
title: '补充组织配置迁移后的审计说明',
status: '已完成',
priority: 'P2',
owner: '罗听雪',
module: '审计',
updatedAt: '2026-04-06'
}
],
roadmap: [
{
id: 'RM-10',
title: '归档访问范围收口',
window: '2026 Q2',
status: '已排期',
summary: '控制仅审计角色可访问历史配置详情,普通角色只看摘要。'
}
]
},
{
id: 'product-sprint',
name: 'Sprint 交付排期台',
code: 'SPRINT',
owner: '魏书言',
department: '交付效能部',
status: '研发中',
manageStatus: '暂停产品',
stage: '增长',
version: 'v1.3.0',
releaseTarget: '2026-06-08',
updatedAt: '2026-04-08',
health: '关注',
summary: '面向交付里程碑排期、风险跟踪和协作节奏对齐的产品,当前因上游流程调整进入阶段性暂停。',
tags: ['交付排期', '风险跟踪', '协作节奏'],
teamCount: 9,
requirementCount: 15,
bugCount: 6,
focus: ['排期模板统一', '跨团队风险同步', '里程碑预警'],
requirements: [
{
id: 'REQ-612',
title: '梳理暂停期间保留的风险同步能力范围',
status: '待评审',
priority: 'P1',
owner: '徐青禾',
module: '风险中心',
updatedAt: '2026-04-07'
}
],
roadmap: [
{
id: 'RM-11',
title: '暂停期能力边界梳理',
window: '2026 Q2',
status: '风险关注',
summary: '待交付流程新方案确定后,再决定是否恢复后续迭代。'
}
]
},
{
id: 'product-legacy',
name: 'Legacy 营销活动台',
code: 'LEGACY',
owner: '陈念初',
department: '增长运营部',
status: '稳定运营',
manageStatus: '废弃产品',
stage: '增长',
version: 'v3.4.1',
releaseTarget: '2026-03-18',
updatedAt: '2026-03-25',
health: '关注',
summary: '面向历史营销活动配置与投放归档的旧产品,目前仅保留数据查询和审计访问能力,不再纳入持续建设计划。',
tags: ['历史归档', '活动投放', '审计留痕'],
teamCount: 5,
requirementCount: 6,
bugCount: 1,
focus: ['历史活动追溯', '旧投放数据迁移', '权限范围收敛'],
requirements: [
{
id: 'REQ-401',
title: '补充历史活动包的只读访问说明',
status: '已完成',
priority: 'P2',
owner: '白昭宁',
module: '审计',
updatedAt: '2026-03-20'
}
],
roadmap: [
{
id: 'RM-7',
title: '历史活动数据归档收尾',
window: '2026 Q1',
status: '已排期',
summary: '只保留审计查询链路,后续不再承接新的活动能力建设。'
}
]
}
];
export function getDemoProductById(productId: string) {
return demoProducts.find(item => item.id === productId) || null;
}
export function getProductStatusType(status: DemoProduct['status']) {
const statusTypeMap: Record<DemoProduct['status'], 'success' | 'warning' | 'info'> = {
: 'info',
: 'warning',
: 'success'
};
return statusTypeMap[status];
}
export function getProductHealthType(health: DemoProduct['health']) {
const healthTypeMap: Record<DemoProduct['health'], 'success' | 'warning' | 'danger'> = {
: 'success',
: 'warning',
: 'danger'
};
return healthTypeMap[health];
}