refactor: 重构项目接口与API调用体系,统一类型管理

1.  合并拆分的API类型定义到统一的api/interface.ts文件
2.  删除旧的api/client.ts与api/types.ts文件
3.  重构所有页面与组件的API调用方式,统一使用api/index.ts导出的接口
4.  调整组件文件结构,将分散的组件按模块整理
5.  统一类型导入路径,移除冗余的类型重复定义
This commit is contained in:
2026-07-02 14:57:06 +08:00
parent e160476ecf
commit 3451d373bc
54 changed files with 1106 additions and 930 deletions

View File

@@ -1,18 +1,6 @@
import { useMemo } from "react";
import { Tree } from "@arco-design/web-react";
import type { Permission } from "../api/types";
type PermissionTreeNode = {
key: string;
title: string;
children?: PermissionTreeNode[];
};
type PermissionModuleConfig = {
prefix: string;
title: string;
subject: string;
};
import type { Permission, PermissionModuleConfig, PermissionTreeNode, PermissionTreePickerProps } from "../interface";
const systemPermissionModules: PermissionModuleConfig[] = [
{ prefix: "permission", title: "权限管理", subject: "权限" },
@@ -123,15 +111,7 @@ function collectExpandedKeys(nodes: PermissionTreeNode[]) {
return keys;
}
export function PermissionTreePicker({
permissions,
value,
onChange,
}: {
permissions: Permission[];
value: number[];
onChange: (permissionIds: number[]) => void;
}) {
export function PermissionTreePicker({ permissions, value, onChange }: PermissionTreePickerProps) {
const treeData = useMemo(() => buildPermissionTree(permissions), [permissions]);
const expandedKeys = useMemo(() => collectExpandedKeys(treeData), [treeData]);
const checkedKeys = value.map((id) => permissionKey(id));

View File

@@ -1,14 +1,14 @@
import { useState } from "react";
import { Button, Card, Form, Input, Message, Modal, Space, Table, Tag } from "@arco-design/web-react";
import { IconPlus } from "@arco-design/web-react/icon";
import type { Permission, Role } from "../api/types";
import { createRole as createRoleApi, updateRolePermissions } from "../api/roles";
import { roleApi } from "../api";
import { usePageData } from "../hooks/usePageData";
import { PermissionTreePicker } from "./PermissionTreePicker";
import { PermissionTreePicker } from "./components/PermissionTreePicker";
import type { CreateRoleFormValues, Permission, Role } from "./interface";
function RolesPage() {
const { data, loading, reload, changePage } = usePageData<Role>("/api/admin/v1/roles");
const permissions = usePageData<Permission>("/api/admin/v1/permissions");
const { data, loading, reload, changePage } = usePageData<Role>(roleApi.listRoles);
const permissions = usePageData<Permission>(roleApi.listPermissions);
const [createForm] = Form.useForm();
const [createVisible, setCreateVisible] = useState(false);
const [creatingRole, setCreatingRole] = useState(false);
@@ -24,10 +24,10 @@ function RolesPage() {
setCreateVisible(true);
};
const createRole = async (values: { code: string; name: string; description?: string }) => {
const createRole = async (values: CreateRoleFormValues) => {
setCreatingRole(true);
try {
await createRoleApi({
await roleApi.createRole({
...values,
permissionIds: createPermissionIds,
});
@@ -51,7 +51,7 @@ function RolesPage() {
}
setSavingPermissions(true);
try {
await updateRolePermissions(selectedRole.id, selectedPermissionIds);
await roleApi.updateRolePermissions(selectedRole.id, selectedPermissionIds);
Message.success("角色权限已更新");
setAssignmentVisible(false);
await reload();

27
src/Role/interface.ts Normal file
View File

@@ -0,0 +1,27 @@
import type { Permission, Role } from "../api";
export type { Permission, Role };
export type CreateRoleFormValues = {
code: string;
name: string;
description?: string;
};
export type PermissionTreeNode = {
key: string;
title: string;
children?: PermissionTreeNode[];
};
export type PermissionModuleConfig = {
prefix: string;
title: string;
subject: string;
};
export type PermissionTreePickerProps = {
permissions: Permission[];
value: number[];
onChange: (permissionIds: number[]) => void;
};