mirror of
https://github.com/fastapiadmin/FastapiAdmin.git
synced 2026-10-13 04:39:41 +00:00
refactor: 完成项目代码结构优化与权限清理
主要变更: 1. 重构健康检查模块,迁移目录结构并合并重复代码 2. 清理路由标签冗余的"系统管理/平台管理"前缀,简化标签名称 3. 重构工作流相关目录与API,统一命名为flow和nodes 4. 重命名缓存删除接口为clear,同步前后端路由与权限 5. 简化接口参数描述,统一批量状态修改的请求体格式 6. 重构动态路由加载逻辑,优化初始化流程 7. 清理废弃的self_service模块,整合租户自助服务到租户API 8. 重构发票管理接口,统一路由前缀与权限控制 9. 优化代码生成模板,补全参数注解与描述 10: 修复日志删除接口的参数解析逻辑
This commit is contained in:
@@ -100,7 +100,7 @@ export const MANUAL_SYSTEM_TAIL_PAGES: CompactManualPage[] = [
|
||||
"检索:FaSearchBar + 分页表。",
|
||||
"工具栏:新增、批量删除、刷新、列配置(无导出/更多 patch 于顶栏)。",
|
||||
"弹层:详情;新增/编辑 Dialog(名称、编码、起止时间、状态、描述等)。",
|
||||
"权限:`module_system:tenant:create|delete` + 行级 update/detail/delete。",
|
||||
"权限:`module_platform:tenant:create|delete` + 行级 update/detail/delete。",
|
||||
],
|
||||
},
|
||||
{
|
||||
@@ -204,23 +204,23 @@ export const MANUAL_MODULES_AFTER_SYSTEM: ManualModuleSection[] = [
|
||||
{
|
||||
anchor: "page-workflow",
|
||||
title: "流程编排",
|
||||
path: "module_task/workflow/definition/index.vue",
|
||||
path: "module_task/workflow/flow/index.vue",
|
||||
notes: [
|
||||
"检索:FaSearchBar(可展开)。",
|
||||
"工具栏:新增、批量删除、刷新、列配置。",
|
||||
"行操作:草稿「发布」;已发布「执行」下拉;「编辑」打开 `WorkflowDesignDrawer` 画布;删除。",
|
||||
"权限:`module_task:workflow:definition:create|delete|update|execute` 等(见行内 v-hasPerm)。",
|
||||
"权限:`module_task:workflow:flow:create|delete|update|execute` 等(见行内 v-hasPerm)。",
|
||||
],
|
||||
},
|
||||
{
|
||||
anchor: "page-nodetype",
|
||||
title: "节点类型",
|
||||
path: "module_task/workflow/node-type/index.vue",
|
||||
path: "module_task/workflow/nodes/index.vue",
|
||||
notes: [
|
||||
"检索:FaSearchBar(可展开)。",
|
||||
"工具栏:新增、批量删除、刷新、列配置。",
|
||||
"行操作:编辑(打开表单/脚本配置)、删除等(见 `node-type-operation` 槽)。",
|
||||
"权限:`module_task:workflow:node-type:create|delete|update` + 行级操作。",
|
||||
"行操作:编辑(打开表单/脚本配置)、删除等(见 `nodes-operation` 槽)。",
|
||||
"权限:`module_task:workflow:nodes:create|delete|update` + 行级操作。",
|
||||
],
|
||||
},
|
||||
],
|
||||
|
||||
@@ -61,7 +61,7 @@
|
||||
上传文件
|
||||
</ElButton>
|
||||
<ElButton
|
||||
v-hasPerm="['module_monitor:resource:create_dir']"
|
||||
v-hasPerm="['module_monitor:resource:mkdir']"
|
||||
type="primary"
|
||||
plain
|
||||
:icon="FolderAdd"
|
||||
@@ -158,7 +158,7 @@
|
||||
<template #footer>
|
||||
<ElButton @click="createDirDialogVisible = false">取消</ElButton>
|
||||
<ElButton
|
||||
v-hasPerm="['module_monitor:resource:create_dir']"
|
||||
v-hasPerm="['module_monitor:resource:mkdir']"
|
||||
type="primary"
|
||||
@click="handleCreateDirConfirm"
|
||||
>
|
||||
|
||||
@@ -28,8 +28,8 @@
|
||||
<template #left>
|
||||
<FaTableHeaderLeft
|
||||
:remove-ids="selectedIds"
|
||||
:perm-create="['module_system:tenant:create']"
|
||||
:perm-delete="['module_system:tenant:delete']"
|
||||
:perm-create="['module_platform:tenant:create']"
|
||||
:perm-delete="['module_platform:tenant:delete']"
|
||||
:delete-loading="batchDeleting"
|
||||
:create-loading="createLoading"
|
||||
@add="handleAdd"
|
||||
@@ -264,7 +264,7 @@ function buildTenantRowActions(
|
||||
key: "detail",
|
||||
label: "详情",
|
||||
artType: "view",
|
||||
perm: "module_system:tenant:query",
|
||||
perm: "module_platform:tenant:query",
|
||||
run: () => ctx.onDetail(row.id!),
|
||||
},
|
||||
{
|
||||
@@ -272,7 +272,7 @@ function buildTenantRowActions(
|
||||
label: "编辑",
|
||||
artType: "edit",
|
||||
icon: "ri:edit-2-line",
|
||||
perm: "module_system:tenant:update",
|
||||
perm: "module_platform:tenant:update",
|
||||
run: () => ctx.onEdit(row.id!),
|
||||
},
|
||||
{
|
||||
@@ -280,7 +280,7 @@ function buildTenantRowActions(
|
||||
label: row.status === 0 ? "禁用" : "启用",
|
||||
artType: "edit",
|
||||
icon: row.status === 0 ? "ri:forbid-2-line" : "ri:checkbox-circle-line",
|
||||
perm: "module_system:tenant:patch",
|
||||
perm: "module_platform:tenant:patch",
|
||||
run: () => ctx.onToggleStatus(row.id!),
|
||||
},
|
||||
{
|
||||
@@ -288,7 +288,7 @@ function buildTenantRowActions(
|
||||
label: "删除",
|
||||
artType: "delete",
|
||||
icon: "ri:delete-bin-4-line",
|
||||
perm: "module_system:tenant:delete",
|
||||
perm: "module_platform:tenant:delete",
|
||||
run: () => ctx.onDelete(row.id!),
|
||||
},
|
||||
];
|
||||
|
||||
+9
-9
@@ -253,7 +253,7 @@
|
||||
<span class="text-warning">影响角色:</span>
|
||||
<span
|
||||
v-for="r in preview.affected_roles"
|
||||
:key="r"
|
||||
:key="String(r)"
|
||||
style="margin-left: 4px; color: #e6a23c"
|
||||
>{{ r }}</span
|
||||
>
|
||||
@@ -282,17 +282,17 @@ import FaStatsCard from "@/components/cards/fa-stats-card/index.vue";
|
||||
import FaProgressCard from "@/components/cards/fa-progress-card/index.vue";
|
||||
import FaTimelineListCard from "@/components/cards/fa-timeline-list-card/index.vue";
|
||||
import FaBasicBanner from "@/components/banners/fa-basic-banner/index.vue";
|
||||
import SelfServiceAPI from "@/api/module_platform/self_service";
|
||||
import TenantAPI from "@/api/module_platform/tenant";
|
||||
import type {
|
||||
AvailablePackage,
|
||||
PackageChangePreview,
|
||||
SelfServiceOrderItem,
|
||||
WorkspaceData,
|
||||
} from "@/api/module_platform/self_service";
|
||||
} from "@/api/module_platform/tenant";
|
||||
import { resolveStatusColumns } from "@utils";
|
||||
import type { DescriptionsItem } from "@/components/others/fa-descriptions/index.vue";
|
||||
|
||||
defineOptions({ name: "SelfService" });
|
||||
defineOptions({ name: "TenantWorkspace" });
|
||||
|
||||
const router = useRouter();
|
||||
const activeTab = ref("workspace");
|
||||
@@ -323,7 +323,7 @@ const recentOrderTimeline = computed(() => {
|
||||
async function loadWorkspace() {
|
||||
workspaceLoading.value = true;
|
||||
try {
|
||||
const { data: res } = await SelfServiceAPI.getWorkspace();
|
||||
const { data: res } = await TenantAPI.getWorkspace();
|
||||
workspace.value = (res?.data as WorkspaceData) || null;
|
||||
} catch {
|
||||
// ignore
|
||||
@@ -348,7 +348,7 @@ const {
|
||||
handleCurrentChange: handleOrderCurrentChange,
|
||||
} = useTable({
|
||||
core: {
|
||||
apiFn: SelfServiceAPI.listMyOrders,
|
||||
apiFn: TenantAPI.listMyOrders,
|
||||
apiParams: {
|
||||
page_no: 1,
|
||||
page_size: 20,
|
||||
@@ -439,7 +439,7 @@ function actionTypeTag(
|
||||
async function loadPackages() {
|
||||
packagesLoading.value = true;
|
||||
try {
|
||||
const { data: res } = await SelfServiceAPI.getAvailablePackages();
|
||||
const { data: res } = await TenantAPI.getAvailablePackages();
|
||||
const payload = res?.data as unknown as { packages?: AvailablePackage[] } | undefined;
|
||||
packages.value = payload?.packages || [];
|
||||
} catch {
|
||||
@@ -465,7 +465,7 @@ async function handleAction(action: string, pkg: AvailablePackage) {
|
||||
actionDialogVisible.value = true;
|
||||
|
||||
try {
|
||||
const { data: res } = await SelfServiceAPI.previewPackageChange(pkg.id);
|
||||
const { data: res } = await TenantAPI.previewPackageChange(pkg.id);
|
||||
preview.value = (res?.data as PackageChangePreview) || null;
|
||||
} catch {
|
||||
actionDialogVisible.value = false;
|
||||
@@ -478,7 +478,7 @@ async function confirmAction() {
|
||||
if (!currentPackage.value) return;
|
||||
actionSubmitting.value = true;
|
||||
try {
|
||||
const { data: res } = await SelfServiceAPI.createOrder({
|
||||
const { data: res } = await TenantAPI.createOrder({
|
||||
package_id: currentPackage.value.id,
|
||||
order_type: currentAction.value as "buy" | "renew" | "upgrade" | "downgrade",
|
||||
});
|
||||
+1
-3
@@ -68,9 +68,7 @@ import {
|
||||
} from "element-plus";
|
||||
import { Close } from "@element-plus/icons-vue";
|
||||
import type { FormItem } from "@/components/forms/fa-form/index.vue";
|
||||
import WorkflowNodeTypeAPI, {
|
||||
type WorkflowNodeTypeOption,
|
||||
} from "@/api/module_task/workflow/node-type";
|
||||
import WorkflowNodeTypeAPI, { type WorkflowNodeTypeOption } from "@/api/module_task/workflow/nodes";
|
||||
|
||||
interface Props {
|
||||
node?: Record<string, any>;
|
||||
+2
-2
@@ -203,8 +203,8 @@ import type FaForm from "@/components/forms/fa-form/index.vue";
|
||||
import WorkflowDefinitionAPI, {
|
||||
type WorkflowTable,
|
||||
type WorkflowForm,
|
||||
} from "@/api/module_task/workflow/definition";
|
||||
import WorkflowNodeTypeAPI from "@/api/module_task/workflow/node-type";
|
||||
} from "@/api/module_task/workflow/flow";
|
||||
import WorkflowNodeTypeAPI from "@/api/module_task/workflow/nodes";
|
||||
import FaNodeConfigPanel from "./FaNodeConfigPanel.vue";
|
||||
import FaEdgeConfigPanel from "./FaEdgeConfigPanel.vue";
|
||||
|
||||
+7
-7
@@ -28,8 +28,8 @@
|
||||
<template #left>
|
||||
<FaTableHeaderLeft
|
||||
:remove-ids="selectedIds"
|
||||
:perm-create="['module_task:workflow:definition:create']"
|
||||
:perm-delete="['module_task:workflow:definition:delete']"
|
||||
:perm-create="['module_task:workflow:flow:create']"
|
||||
:perm-delete="['module_task:workflow:flow:delete']"
|
||||
:delete-loading="batchDeleting"
|
||||
:create-loading="createLoading"
|
||||
@add="handleAdd"
|
||||
@@ -66,7 +66,7 @@ defineOptions({
|
||||
inheritAttrs: false,
|
||||
});
|
||||
|
||||
import WorkflowDefinitionAPI, { type WorkflowTable } from "@/api/module_task/workflow/definition";
|
||||
import WorkflowDefinitionAPI, { type WorkflowTable } from "@/api/module_task/workflow/flow";
|
||||
import type { SearchFormItem } from "@/components/forms/fa-search-bar/index.vue";
|
||||
import type FaSearchBar from "@/components/forms/fa-search-bar/index.vue";
|
||||
import FaWorkflowDesignDrawer from "./components/FaWorkflowDesignDrawer.vue";
|
||||
@@ -194,7 +194,7 @@ function buildWorkflowRowActions(row: WorkflowTable): TableOperationAction[] {
|
||||
key: "publish",
|
||||
label: "发布",
|
||||
artType: "add",
|
||||
perm: "module_task:workflow:definition:update",
|
||||
perm: "module_task:workflow:flow:update",
|
||||
run: () => handlePublish(row),
|
||||
});
|
||||
}
|
||||
@@ -203,7 +203,7 @@ function buildWorkflowRowActions(row: WorkflowTable): TableOperationAction[] {
|
||||
key: "execute",
|
||||
label: "执行",
|
||||
artType: "view",
|
||||
perm: "module_task:workflow:definition:execute",
|
||||
perm: "module_task:workflow:flow:execute",
|
||||
run: () => handleExecute("execute", row),
|
||||
});
|
||||
}
|
||||
@@ -212,14 +212,14 @@ function buildWorkflowRowActions(row: WorkflowTable): TableOperationAction[] {
|
||||
key: "edit",
|
||||
label: "编辑",
|
||||
artType: "edit",
|
||||
perm: "module_task:workflow:definition:update",
|
||||
perm: "module_task:workflow:flow:update",
|
||||
run: () => handleEdit(row),
|
||||
},
|
||||
{
|
||||
key: "delete",
|
||||
label: "删除",
|
||||
artType: "delete",
|
||||
perm: "module_task:workflow:definition:delete",
|
||||
perm: "module_task:workflow:flow:delete",
|
||||
run: () => deleteWorkflowRow(row.id),
|
||||
}
|
||||
);
|
||||
+5
-5
@@ -28,8 +28,8 @@
|
||||
<template #left>
|
||||
<FaTableHeaderLeft
|
||||
:remove-ids="selectedIds"
|
||||
:perm-create="['module_task:workflow:node-type:create']"
|
||||
:perm-delete="['module_task:workflow:node-type:delete']"
|
||||
:perm-create="['module_task:workflow:nodes:create']"
|
||||
:perm-delete="['module_task:workflow:nodes:delete']"
|
||||
:delete-loading="batchDeleting"
|
||||
:create-loading="createLoading"
|
||||
@add="handleAdd"
|
||||
@@ -154,7 +154,7 @@ defineOptions({
|
||||
import WorkflowNodeTypeAPI, {
|
||||
type WorkflowNodeTypeForm,
|
||||
type WorkflowNodeTypeTable,
|
||||
} from "@/api/module_task/workflow/node-type";
|
||||
} from "@/api/module_task/workflow/nodes";
|
||||
import type { SearchFormItem } from "@/components/forms/fa-search-bar/index.vue";
|
||||
import type FaSearchBar from "@/components/forms/fa-search-bar/index.vue";
|
||||
import type { FormItem } from "@/components/forms/fa-form/index.vue";
|
||||
@@ -313,7 +313,7 @@ function buildNodeTypeRowActions(row: WorkflowNodeTypeTable): TableOperationActi
|
||||
label: "编辑",
|
||||
artType: "edit",
|
||||
icon: "ri:edit-2-line",
|
||||
perm: "module_task:workflow:node-type:update",
|
||||
perm: "module_task:workflow:nodes:update",
|
||||
run: () => void openDialog(row.id),
|
||||
},
|
||||
{
|
||||
@@ -321,7 +321,7 @@ function buildNodeTypeRowActions(row: WorkflowNodeTypeTable): TableOperationActi
|
||||
label: "删除",
|
||||
artType: "delete",
|
||||
icon: "ri:delete-bin-4-line",
|
||||
perm: "module_task:workflow:node-type:delete",
|
||||
perm: "module_task:workflow:nodes:delete",
|
||||
run: () => void deleteNodeTypeRow(row),
|
||||
},
|
||||
];
|
||||
Reference in New Issue
Block a user