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

@@ -1,6 +1,12 @@
import { SYSTEM_SERVICE_PREFIX } from '@/constants/service';
import { request } from '../request';
import type { ServiceRequestResult } from './shared';
import {
type ServiceRequestResult,
mapServiceResult,
normalizeNullableStringId,
normalizeStringId,
safeJsonRequestConfig
} from './shared';
import UserManagementRelationQueryReqVO = Api.SystemManage.UserManagementRelationQueryReqVO;
const ROLE_PREFIX = `${SYSTEM_SERVICE_PREFIX}/role`;
@@ -45,10 +51,18 @@ function createRolePageQuery(params?: Api.SystemManage.RoleSearchParams) {
}
});
if (params.scopeType) {
query.append('scopeType', params.scopeType);
}
if (params.objectType) {
query.append('objectType', params.objectType);
}
return query.toString();
}
function createBatchDeleteQuery(ids: number[]) {
function createBatchDeleteQuery(ids: Array<string | number>) {
const query = new URLSearchParams();
ids.forEach(id => {
@@ -58,39 +72,160 @@ function createBatchDeleteQuery(ids: number[]) {
return query.toString();
}
type UserSimpleResponse = Omit<Api.SystemManage.UserSimple, 'id'> & {
id: string | number;
};
type RoleResponse = Omit<Api.SystemManage.Role, 'id'> & {
id: string | number;
};
type RolePageResponse = Api.SystemManage.PageResult<RoleResponse>;
type RoleSimpleResponse = Omit<Api.SystemManage.RoleSimple, 'id'> & {
id: string | number;
};
type MenuResponse = Omit<Api.SystemManage.Menu, 'id' | 'parentId' | 'children'> & {
id: string | number;
parentId: string | number;
children?: MenuResponse[] | null;
};
type MenuSimpleResponse = Omit<Api.SystemManage.MenuSimple, 'id' | 'parentId' | 'children'> & {
id: string | number;
parentId: string | number;
children?: MenuSimpleResponse[] | null;
};
type UserManagementRelationResponse = Omit<
Api.SystemManage.UserManagementRelation,
'id' | 'managerUserId' | 'subordinateUserId'
> & {
id: string | number | null;
managerUserId: string | number | null;
subordinateUserId: string | number | null;
};
type UserManagementRelationTreeResponse = Omit<
Api.SystemManage.UserManagementRelationTreeRespVO,
'id' | 'userId' | 'managerUserId' | 'children'
> & {
id: string | number | null;
userId: string | number;
managerUserId: string | number | null;
children?: UserManagementRelationTreeResponse[] | null;
};
function normalizeUserSimple(user: UserSimpleResponse): Api.SystemManage.UserSimple {
return {
...user,
id: normalizeStringId(user.id)
};
}
function normalizeRole(role: RoleResponse): Api.SystemManage.Role {
return {
...role,
id: normalizeStringId(role.id)
};
}
function normalizeRoleSimple(role: RoleSimpleResponse): Api.SystemManage.RoleSimple {
return {
...role,
id: normalizeStringId(role.id)
};
}
function normalizeMenu(menu: MenuResponse): Api.SystemManage.Menu {
return {
...menu,
id: normalizeStringId(menu.id),
parentId: normalizeStringId(menu.parentId),
children: menu.children?.map(normalizeMenu) ?? null
};
}
function normalizeMenuSimple(menu: MenuSimpleResponse): Api.SystemManage.MenuSimple {
return {
...menu,
id: normalizeStringId(menu.id),
parentId: normalizeStringId(menu.parentId),
children: menu.children?.map(normalizeMenuSimple) ?? null
};
}
function normalizeUserManagementRelation(
relation: UserManagementRelationResponse
): Api.SystemManage.UserManagementRelation {
return {
...relation,
id: normalizeNullableStringId(relation.id),
managerUserId: normalizeNullableStringId(relation.managerUserId),
subordinateUserId: normalizeNullableStringId(relation.subordinateUserId)
};
}
function normalizeUserManagementRelationTree(
relation: UserManagementRelationTreeResponse
): Api.SystemManage.UserManagementRelationTreeRespVO {
return {
...relation,
id: normalizeNullableStringId(relation.id),
userId: normalizeStringId(relation.userId),
managerUserId: normalizeNullableStringId(relation.managerUserId),
children: relation.children?.map(normalizeUserManagementRelationTree) ?? null
};
}
/** 获取角色分页 */
export function fetchGetRolePage(params?: Api.SystemManage.RoleSearchParams) {
export async function fetchGetRolePage(params?: Api.SystemManage.RoleSearchParams) {
const query = createRolePageQuery(params);
return request<Api.SystemManage.RoleList>({
const result = await request<RolePageResponse>({
...safeJsonRequestConfig,
url: query ? `${ROLE_PREFIX}/page?${query}` : `${ROLE_PREFIX}/page`,
method: 'get'
});
return mapServiceResult(result as ServiceRequestResult<RolePageResponse>, data => ({
...data,
list: data.list.map(normalizeRole)
}));
}
/** 为兼容旧代码保留原函数名 */
export const fetchGetRoleList = fetchGetRolePage;
/** 获取角色详情 */
export function fetchGetRole(id: number) {
return request<Api.SystemManage.Role>({
export async function fetchGetRole(id: string) {
const result = await request<RoleResponse>({
...safeJsonRequestConfig,
url: `${ROLE_PREFIX}/get`,
method: 'get',
params: { id }
});
return mapServiceResult(result as ServiceRequestResult<RoleResponse>, normalizeRole);
}
/** 创建角色 */
export function fetchCreateRole(data: Api.SystemManage.SaveRoleParams) {
return request<number>({
export async function fetchCreateRole(data: Api.SystemManage.SaveRoleParams) {
const result = await request<string | number>({
...safeJsonRequestConfig,
url: `${ROLE_PREFIX}/create`,
method: 'post',
data
});
return mapServiceResult(result as ServiceRequestResult<string | number>, normalizeStringId);
}
/** 更新角色 */
export function fetchUpdateRole(data: { id: number } & Api.SystemManage.SaveRoleParams) {
export function fetchUpdateRole(
data: { id: string } & Omit<Api.SystemManage.SaveRoleParams, 'scopeType' | 'objectType'>
) {
return request<boolean>({
url: `${ROLE_PREFIX}/update`,
method: 'put',
@@ -99,7 +234,7 @@ export function fetchUpdateRole(data: { id: number } & Api.SystemManage.SaveRole
}
/** 删除角色 */
export function fetchDeleteRole(id: number) {
export function fetchDeleteRole(id: string) {
return request<boolean>({
url: `${ROLE_PREFIX}/delete`,
method: 'delete',
@@ -108,7 +243,7 @@ export function fetchDeleteRole(id: number) {
}
/** 批量删除角色 */
export function fetchBatchDeleteRole(ids: number[]) {
export function fetchBatchDeleteRole(ids: string[]) {
return request<boolean>({
url: `${ROLE_PREFIX}/delete-list?${createBatchDeleteQuery(ids)}`,
method: 'delete'
@@ -121,7 +256,8 @@ export function fetchBatchDeleteRole(ids: number[]) {
* 为当前用户页面保留 `roleName / roleCode` 字段,直到该页面完成重构
*/
export async function fetchGetAllRoles(): Promise<ServiceRequestResult<Api.SystemManage.AllRole[]>> {
const result = await request<Api.SystemManage.RoleSimpleList>({
const result = await request<RoleSimpleResponse[]>({
...safeJsonRequestConfig,
url: `${ROLE_PREFIX}/simple-list`,
method: 'get'
});
@@ -132,20 +268,28 @@ export async function fetchGetAllRoles(): Promise<ServiceRequestResult<Api.Syste
return {
...result,
data: result.data.map(item => ({
...item,
roleName: item.name,
roleCode: item.code
}))
data: result.data.map(item => {
const role = normalizeRoleSimple(item);
return {
...role,
roleName: role.name,
roleCode: role.code
};
})
};
}
/** 获取启用状态的角色简表 */
export function fetchGetRoleSimpleList() {
return request<Api.SystemManage.RoleSimpleList>({
export async function fetchGetRoleSimpleList(params?: Api.SystemManage.ScopeQueryParams) {
const result = await request<RoleSimpleResponse[]>({
...safeJsonRequestConfig,
url: `${ROLE_PREFIX}/simple-list`,
method: 'get'
method: 'get',
params
});
return mapServiceResult(result as ServiceRequestResult<RoleSimpleResponse[]>, data => data.map(normalizeRoleSimple));
}
/** 获取部门列表 */
@@ -300,10 +444,13 @@ export function fetchBatchDeletePost(ids: number[]) {
/** 获取用户简单列表(用于用户选择下拉框) */
export function fetchGetUserSimpleList() {
return request<Api.SystemManage.UserSimple[]>({
return request<UserSimpleResponse[]>({
...safeJsonRequestConfig,
url: `${USER_PREFIX}/simple-list`,
method: 'get'
});
}).then(result =>
mapServiceResult(result as ServiceRequestResult<UserSimpleResponse[]>, data => data.map(normalizeUserSimple))
);
}
/** 获取用户分页 */
@@ -320,11 +467,14 @@ export const fetchGetUserList = fetchGetUserPage;
/** 通过部门id获取用户详情 */
export function fetchGetUserListByDeptId(deptId: any) {
return request<Api.SystemManage.UserSimple[]>({
return request<UserSimpleResponse[]>({
...safeJsonRequestConfig,
url: `${USER_PREFIX}/list-by-dept-id`,
method: 'get',
params: { deptId }
});
}).then(result =>
mapServiceResult(result as ServiceRequestResult<UserSimpleResponse[]>, data => data.map(normalizeUserSimple))
);
}
/** 获取用户详情 */
@@ -390,34 +540,45 @@ export function fetchBatchDeleteUser(ids: number[]) {
}
/** 获取菜单列表 */
export function fetchGetMenuList(params?: Api.SystemManage.MenuSearchParams) {
return request<Api.SystemManage.MenuList>({
export async function fetchGetMenuList(params?: Api.SystemManage.MenuSearchParams) {
const result = await request<MenuResponse[]>({
...safeJsonRequestConfig,
url: `${MENU_PREFIX}/list`,
method: 'get',
params
});
return mapServiceResult(result as ServiceRequestResult<MenuResponse[]>, data => data.map(normalizeMenu));
}
/** 获取菜单详情 */
export function fetchGetMenu(id: number) {
return request<Api.SystemManage.Menu>({
export async function fetchGetMenu(id: string) {
const result = await request<MenuResponse>({
...safeJsonRequestConfig,
url: `${MENU_PREFIX}/get`,
method: 'get',
params: { id }
});
return mapServiceResult(result as ServiceRequestResult<MenuResponse>, normalizeMenu);
}
/** 创建菜单 */
export function fetchCreateMenu(data: Api.SystemManage.SaveMenuParams) {
return request<number>({
export async function fetchCreateMenu(data: Api.SystemManage.SaveMenuParams) {
const result = await request<string | number>({
...safeJsonRequestConfig,
url: `${MENU_PREFIX}/create`,
method: 'post',
data
});
return mapServiceResult(result as ServiceRequestResult<string | number>, normalizeStringId);
}
/** 更新菜单 */
export function fetchUpdateMenu(data: { id: number } & Api.SystemManage.SaveMenuParams) {
export function fetchUpdateMenu(
data: { id: string } & Omit<Api.SystemManage.SaveMenuParams, 'scopeType' | 'objectType'>
) {
return request<boolean>({
url: `${MENU_PREFIX}/update`,
method: 'put',
@@ -426,7 +587,7 @@ export function fetchUpdateMenu(data: { id: number } & Api.SystemManage.SaveMenu
}
/** 删除菜单 */
export function fetchDeleteMenu(id: number) {
export function fetchDeleteMenu(id: string) {
return request<boolean>({
url: `${MENU_PREFIX}/delete`,
method: 'delete',
@@ -435,7 +596,7 @@ export function fetchDeleteMenu(id: number) {
}
/** 批量删除菜单 */
export function fetchBatchDeleteMenu(ids: number[]) {
export function fetchBatchDeleteMenu(ids: string[]) {
return request<boolean>({
url: `${MENU_PREFIX}/delete-list?${createBatchDeleteQuery(ids)}`,
method: 'delete'
@@ -443,20 +604,27 @@ export function fetchBatchDeleteMenu(ids: number[]) {
}
/** 获取启用状态的菜单简表 */
export function fetchGetMenuSimpleList() {
return request<Api.SystemManage.MenuSimpleList>({
export async function fetchGetMenuSimpleList(params?: Api.SystemManage.ScopeQueryParams) {
const result = await request<MenuSimpleResponse[]>({
...safeJsonRequestConfig,
url: `${MENU_PREFIX}/simple-list`,
method: 'get'
method: 'get',
params
});
return mapServiceResult(result as ServiceRequestResult<MenuSimpleResponse[]>, data => data.map(normalizeMenuSimple));
}
/** 获取角色关联的菜单 ID 列表 */
export function fetchGetRoleMenuIds(roleId: number) {
return request<number[]>({
export async function fetchGetRoleMenuIds(roleId: string) {
const result = await request<Array<string | number>>({
...safeJsonRequestConfig,
url: `${PERMISSION_PREFIX}/list-role-menus`,
method: 'get',
params: { roleId }
});
return mapServiceResult(result as ServiceRequestResult<Array<string | number>>, data => data.map(normalizeStringId));
}
/** 分配角色菜单 */
@@ -469,12 +637,15 @@ export function fetchAssignRoleMenus(data: Api.SystemManage.AssignRoleMenuParams
}
/** 获取用户关联的角色 ID 列表 */
export function fetchGetUserRoleIds(userId: number) {
return request<number[]>({
export async function fetchGetUserRoleIds(userId: number) {
const result = await request<Array<string | number>>({
...safeJsonRequestConfig,
url: `${PERMISSION_PREFIX}/list-user-roles`,
method: 'get',
params: { userId }
});
return mapServiceResult(result as ServiceRequestResult<Array<string | number>>, data => data.map(normalizeStringId));
}
/** 分配用户角色 */
@@ -497,11 +668,16 @@ export function fetchAssignUserRoles(data: Api.SystemManage.AssignUserRoleParams
* - 叶子节点:基层员工,没有下级
*/
export function fetchGetUserManagementRelationTree(query: UserManagementRelationQueryReqVO) {
return request<Api.SystemManage.UserManagementRelationTreeRespVO[]>({
return request<UserManagementRelationTreeResponse[]>({
...safeJsonRequestConfig,
url: `${USER_MANAGEMENT_RELATION_PREFIX}/tree`,
method: 'get',
params: query
});
}).then(result =>
mapServiceResult(result as ServiceRequestResult<UserManagementRelationTreeResponse[]>, data =>
data.map(normalizeUserManagementRelationTree)
)
);
}
/**
@@ -509,11 +685,16 @@ export function fetchGetUserManagementRelationTree(query: UserManagementRelation
* 用于树形控件展示,包含用户的上下级层级关系
*/
export function fetchGetUserManagementRelationQuery(query: UserManagementRelationQueryReqVO) {
return request<Api.SystemManage.UserManagementRelationTreeRespVO[]>({
return request<UserManagementRelationTreeResponse[]>({
...safeJsonRequestConfig,
url: `${USER_MANAGEMENT_RELATION_PREFIX}/query`,
method: 'get',
params: query
});
}).then(result =>
mapServiceResult(result as ServiceRequestResult<UserManagementRelationTreeResponse[]>, data =>
data.map(normalizeUserManagementRelationTree)
)
);
}
/**
@@ -523,12 +704,15 @@ export function fetchGetUserManagementRelationQuery(query: UserManagementRelatio
*
* @param id 关系记录主键 ID
*/
export function fetchGetUserManagementRelation(id: number) {
return request<Api.SystemManage.UserManagementRelation>({
export function fetchGetUserManagementRelation(id: string) {
return request<UserManagementRelationResponse>({
...safeJsonRequestConfig,
url: `${USER_MANAGEMENT_RELATION_PREFIX}/get`,
method: 'get',
params: { id }
});
}).then(result =>
mapServiceResult(result as ServiceRequestResult<UserManagementRelationResponse>, normalizeUserManagementRelation)
);
}
/**
@@ -539,11 +723,12 @@ export function fetchGetUserManagementRelation(id: number) {
* @param data 创建请求参数
*/
export function fetchCreateUserManagementRelation(data: Api.SystemManage.UserManagementRelationSaveReqVO) {
return request<number>({
return request<string | number>({
...safeJsonRequestConfig,
url: `${USER_MANAGEMENT_RELATION_PREFIX}/create`,
method: 'post',
data
});
}).then(result => mapServiceResult(result as ServiceRequestResult<string | number>, normalizeStringId));
}
/**
@@ -554,7 +739,7 @@ export function fetchCreateUserManagementRelation(data: Api.SystemManage.UserMan
* @param data 更新请求参数(包含 id
*/
export function fetchUpdateUserManagementRelation(
data: { id: number } & Api.SystemManage.UserManagementRelationSaveReqVO
data: { id: string } & Api.SystemManage.UserManagementRelationSaveReqVO
) {
return request<boolean>({
url: `${USER_MANAGEMENT_RELATION_PREFIX}/update`,
@@ -570,7 +755,7 @@ export function fetchUpdateUserManagementRelation(
*
* @param id 关系记录主键 ID
*/
export function fetchDeleteUserManagementRelation(id: number | null) {
export function fetchDeleteUserManagementRelation(id: string | null) {
return request<boolean>({
url: `${USER_MANAGEMENT_RELATION_PREFIX}/delete`,
method: 'delete',
@@ -585,7 +770,7 @@ export function fetchDeleteUserManagementRelation(id: number | null) {
*
* @param ids 关系记录主键 ID 列表
*/
export function fetchBatchDeleteUserManagementRelation(ids: number[]) {
export function fetchBatchDeleteUserManagementRelation(ids: string[]) {
return request<boolean>({
url: `${USER_MANAGEMENT_RELATION_PREFIX}/delete-list?${createBatchDeleteQuery(ids)}`,
method: 'delete'