refactor: 完成项目代码结构优化与权限清理

主要变更:
1. 重构健康检查模块,迁移目录结构并合并重复代码
2. 清理路由标签冗余的"系统管理/平台管理"前缀,简化标签名称
3. 重构工作流相关目录与API,统一命名为flow和nodes
4. 重命名缓存删除接口为clear,同步前后端路由与权限
5. 简化接口参数描述,统一批量状态修改的请求体格式
6. 重构动态路由加载逻辑,优化初始化流程
7. 清理废弃的self_service模块,整合租户自助服务到租户API
8. 重构发票管理接口,统一路由前缀与权限控制
9. 优化代码生成模板,补全参数注解与描述
10: 修复日志删除接口的参数解析逻辑
This commit is contained in:
zhangtao
2026-07-02 00:10:02 +08:00
parent fa5bfc2a4f
commit 64bd82ee75
74 changed files with 1434 additions and 1547 deletions
@@ -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!),
},
];
@@ -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",
});
@@ -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>;
@@ -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";
@@ -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),
}
);
@@ -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),
},
];