From 0b0f86218a1b41061943000733677c45c72c1a07 Mon Sep 17 00:00:00 2001
From: ouyangxq <775153912@qq.com>
Date: Thu, 30 Jul 2026 21:23:39 +0800
Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/api/platformIam.ts | 8 +++----
src/utils/platformPermission.test.ts | 36 ++++++++++++++++++++++++++++
src/utils/platformPermission.ts | 17 +++++++++++++
src/views/CounterpartiesView.vue | 2 +-
src/views/CustomersView.vue | 18 +++++++-------
src/views/EnterpriseReviewsView.vue | 18 +++++++-------
src/views/ExpressCompaniesView.vue | 2 +-
src/views/FirstLegOrdersView.vue | 2 +-
src/views/InternalUsersView.vue | 2 +-
src/views/PermissionsView.vue | 21 ++++------------
src/views/RolesView.vue | 2 +-
src/views/WarehousesView.vue | 6 ++---
12 files changed, 87 insertions(+), 47 deletions(-)
create mode 100644 src/utils/platformPermission.test.ts
create mode 100644 src/utils/platformPermission.ts
diff --git a/src/api/platformIam.ts b/src/api/platformIam.ts
index 96fcaeeb..8c1f2c87 100644
--- a/src/api/platformIam.ts
+++ b/src/api/platformIam.ts
@@ -1,11 +1,11 @@
import { http, unwrapApiResponse, type ApiEnvelope } from '@/api/http'
export interface PlatformPermissionResource {
- id: number
- tenantId: number
+ id: number | string
+ tenantId: number | string
appCode: 'PLATFORM'
permissionType: 'MENU' | 'BUTTON'
- parentId: number
+ parentId: number | string
permissionCode: string
permissionName: string
routePath: string | null
@@ -64,7 +64,7 @@ export interface CreatePlatformPermissionRequest {
type: 'MENU' | 'BUTTON'
code: string
name: string
- parentId: number
+ parentId: number | string
routePath: string | null
httpMethod: null
sortNo: number
diff --git a/src/utils/platformPermission.test.ts b/src/utils/platformPermission.test.ts
new file mode 100644
index 00000000..381a73ee
--- /dev/null
+++ b/src/utils/platformPermission.test.ts
@@ -0,0 +1,36 @@
+import { describe, expect, it } from 'vitest'
+import { mapPlatformPermission } from '@/utils/platformPermission'
+
+describe('mapPlatformPermission', () => {
+ it('treats the string root parent as a root node and preserves long ids', () => {
+ expect(mapPlatformPermission({
+ id: '2082813911786024961',
+ tenantId: '0',
+ appCode: 'PLATFORM',
+ permissionType: 'MENU',
+ parentId: '0',
+ permissionCode: 'platform:audit',
+ permissionName: '审计管理',
+ routePath: '/audit',
+ httpMethod: null,
+ sortNo: 50,
+ status: 'ACTIVE',
+ })).toMatchObject({ id: '2082813911786024961', parentId: null, code: 'platform:audit' })
+ })
+
+ it('preserves a long string parent id for child resources', () => {
+ expect(mapPlatformPermission({
+ id: '2082813911786024962',
+ tenantId: '0',
+ appCode: 'PLATFORM',
+ permissionType: 'BUTTON',
+ parentId: '2082813911786024961',
+ permissionCode: 'platform:audit:list',
+ permissionName: '操作日志',
+ routePath: null,
+ httpMethod: null,
+ sortNo: 10,
+ status: 'ACTIVE',
+ })).toMatchObject({ id: '2082813911786024962', parentId: '2082813911786024961', type: '按钮' })
+ })
+})
diff --git a/src/utils/platformPermission.ts b/src/utils/platformPermission.ts
new file mode 100644
index 00000000..05e4638c
--- /dev/null
+++ b/src/utils/platformPermission.ts
@@ -0,0 +1,17 @@
+import type { PlatformPermissionResource } from '@/api/platformIam'
+import type { Permission } from '@/types/admin'
+
+export function mapPlatformPermission(item: PlatformPermissionResource): Permission {
+ const parentId = String(item.parentId)
+ return {
+ id: String(item.id),
+ parentId: parentId === '0' ? null : parentId,
+ name: item.permissionName,
+ code: item.permissionCode,
+ type: item.permissionType === 'BUTTON' ? '按钮' : '菜单',
+ path: item.routePath ?? '',
+ method: item.httpMethod ?? '-',
+ status: item.status === 'ACTIVE' ? '启用' : '停用',
+ sort: item.sortNo,
+ }
+}
diff --git a/src/views/CounterpartiesView.vue b/src/views/CounterpartiesView.vue
index 49d32e32..143024d2 100644
--- a/src/views/CounterpartiesView.vue
+++ b/src/views/CounterpartiesView.vue
@@ -120,12 +120,12 @@ function addressText(item: Counterparty) {
+ 详情编辑{{ (row as Counterparty).status === '启用' ? '停用' : '启用' }}
{{ (row as Counterparty).name }}{{ (row as Counterparty).code }}
{{ type }}
{{ (row as Counterparty).contactName }}{{ (row as Counterparty).contactPhone }}
{{ (row as Counterparty).country }} · {{ (row as Counterparty).city }}{{ (row as Counterparty).address }}
- 详情编辑{{ (row as Counterparty).status === '启用' ? '停用' : '启用' }}
diff --git a/src/views/CustomersView.vue b/src/views/CustomersView.vue
index a411cbc5..a437536e 100644
--- a/src/views/CustomersView.vue
+++ b/src/views/CustomersView.vue
@@ -135,6 +135,15 @@ function exportCustomers() {
客户档案
共 {{ filteredRows.length }} 家企业,客户资料与注册审核统一管理。
+
+
+
+
详情
+
编辑
+
{{ row.status === '停用' ? '启用' : '停用' }}
+
+
+
{{ row.name }}{{ row.creditCode }}
@@ -144,15 +153,6 @@ function exportCustomers() {
{{ row.packageName }}{{ row.period }} 天账期
-
-
-
-
详情
-
编辑
-
{{ row.status === '停用' ? '启用' : '停用' }}
-
-
-
diff --git a/src/views/EnterpriseReviewsView.vue b/src/views/EnterpriseReviewsView.vue
index 7364860b..83dc6bdb 100644
--- a/src/views/EnterpriseReviewsView.vue
+++ b/src/views/EnterpriseReviewsView.vue
@@ -216,6 +216,15 @@ onBeforeUnmount(clearPreviewUrl)
企业资料审核
仅展示后端返回的待审核记录,提交审核时使用审核单 ID。
+
+
+
+ 详情
+ 通过
+ 驳回
+
+
+
{{ displayText((row as EnterpriseReview).tenantName) }}{{ displayText((row as EnterpriseReview).tenantCode) }} · 租户 {{ (row as EnterpriseReview).tenantId }}
@@ -233,15 +242,6 @@ onBeforeUnmount(clearPreviewUrl)
{{ formatDate((row as EnterpriseReview).submittedAt ?? (row as EnterpriseReview).createdAt) }}
待审核
-
-
-
- 详情
- 通过
- 驳回
-
-
-
diff --git a/src/views/ExpressCompaniesView.vue b/src/views/ExpressCompaniesView.vue
index 70d355ed..8acb130c 100644
--- a/src/views/ExpressCompaniesView.vue
+++ b/src/views/ExpressCompaniesView.vue
@@ -104,12 +104,12 @@ async function toggleStatus(company: ExpressCompany) {
快递公司名录
编码和名称必须唯一;停用后不允许新增引用,历史订单快照不受影响。
+ 详情编辑{{ (row as ExpressCompany).status === '合作中' ? '停用' : '启用' }}
{{ (row as ExpressCompany).name }}{{ (row as ExpressCompany).id }} · {{ (row as ExpressCompany).updatedAt }}
{{ (row as ExpressCompany).code }}
{{ (row as ExpressCompany).website }}—
{{ (row as ExpressCompany).phone || '—' }}
- 详情编辑{{ (row as ExpressCompany).status === '合作中' ? '停用' : '启用' }}
diff --git a/src/views/FirstLegOrdersView.vue b/src/views/FirstLegOrdersView.vue
index 7263990e..cffd0e22 100644
--- a/src/views/FirstLegOrdersView.vue
+++ b/src/views/FirstLegOrdersView.vue
@@ -188,6 +188,7 @@ function exportOrders() { ElMessage.success(`已生成 ${filteredRows.value.leng
+
{{ row.no }}{{ row.referenceNo || '无客户参考号' }} · {{ row.createdAt }}
{{ row.customerName }}{{ row.businessType }} · {{ row.priority }}
@@ -198,7 +199,6 @@ function exportOrders() { ElMessage.success(`已生成 ${filteredRows.value.leng
{{ row.currency === 'CNY' ? '¥' : '$' }}{{ row.amount.toLocaleString() }}
{{ row.operator }}
-
diff --git a/src/views/InternalUsersView.vue b/src/views/InternalUsersView.vue
index 0c8ef0e9..ce76d9a2 100644
--- a/src/views/InternalUsersView.vue
+++ b/src/views/InternalUsersView.vue
@@ -100,13 +100,13 @@ async function toggleStatus(row: InternalUser) {
内部用户
维护平台员工账号,并通过角色控制菜单和操作权限。
+ 编辑重置密码{{ row.status === '正常' ? '停用' : '启用' }}
{{ row.name.slice(0,1) }}{{ row.name }}{{ row.account }}
{{ roleName(roleId) }}
{{ row.phone }}{{ row.email }}
- 编辑重置密码{{ row.status === '正常' ? '停用' : '启用' }}
diff --git a/src/views/PermissionsView.vue b/src/views/PermissionsView.vue
index 0807e21e..bbde3450 100644
--- a/src/views/PermissionsView.vue
+++ b/src/views/PermissionsView.vue
@@ -4,7 +4,7 @@ import { ElMessage, ElMessageBox } from 'element-plus'
import { Braces, FolderTree, Pencil, Plus, Search, ShieldCheck } from '@lucide/vue'
import MetricStrip from '@/components/MetricStrip.vue'
import StatusBadge from '@/components/StatusBadge.vue'
-import { createPlatformPermission, listPlatformPermissions, type PlatformPermissionResource } from '@/api/platformIam'
+import { createPlatformPermission, listPlatformPermissions } from '@/api/platformIam'
import { getApiErrorDetails, getApiErrorMessage, type ApiErrorDetails } from '@/api/http'
import ApiErrorMeta from '@/components/ApiErrorMeta.vue'
import { useUnsavedWorkRegistration } from '@/composables/useUnsavedWorkRegistration'
@@ -12,6 +12,7 @@ import { useAccessPreviewStore } from '@/stores/accessPreview'
import { useAdminDataStore } from '@/stores/adminData'
import type { Permission, PermissionType } from '@/types/admin'
import { buildPermissionTree, getDescendantIds } from '@/utils/permissionTree'
+import { mapPlatformPermission } from '@/utils/platformPermission'
const store = useAdminDataStore()
const access = useAccessPreviewStore()
@@ -55,20 +56,6 @@ const metrics = computed(() => [
{ label: '停用资源', value: permissions.value.filter((item) => item.status === '停用').length, note: '当前不可分配' },
])
-function mapPlatformPermission(item: PlatformPermissionResource): Permission {
- return {
- id: String(item.id),
- parentId: item.parentId === 0 ? null : String(item.parentId),
- name: item.permissionName,
- code: item.permissionCode,
- type: item.permissionType === 'BUTTON' ? '按钮' : '菜单',
- path: item.routePath ?? '',
- method: item.httpMethod ?? '-',
- status: item.status === 'ACTIVE' ? '启用' : '停用',
- sort: item.sortNo,
- }
-}
-
async function loadPermissions() {
if (!access.usesServerPermissions) return
loading.value = true
@@ -97,7 +84,7 @@ async function savePermission() {
type: form.type === '按钮' ? 'BUTTON' : 'MENU',
code: form.code.trim(),
name: form.name.trim(),
- parentId: form.parentId ? Number(form.parentId) : 0,
+ parentId: form.parentId || '0',
routePath: form.type === '菜单' ? form.path.trim() : null,
httpMethod: null,
sortNo: form.sort,
@@ -147,13 +134,13 @@ onMounted(loadPermissions)
+ 编辑添加下级{{ row.status === '启用' ? '停用' : '启用' }}
{{ row.name }}
{{ row.code }}
{{ row.method }}{{ row.path || '-' }}
- 编辑添加下级{{ row.status === '启用' ? '停用' : '启用' }}
diff --git a/src/views/RolesView.vue b/src/views/RolesView.vue
index 94f71382..e0a40c54 100644
--- a/src/views/RolesView.vue
+++ b/src/views/RolesView.vue
@@ -186,13 +186,13 @@ onMounted(loadRoles)
+ 接口待补齐配置{{ row.status === '启用' ? '停用' : '启用' }}删除
{{ row.name }}{{ row.code }}
{{ permissionSummary(row as Role) }}{{ access.usesServerPermissions ? '数据范围待接口提供' : row.dataScope }}
{{ access.usesServerPermissions ? '—' : row.userCount }}
{{ row.builtIn ? '系统内置' : '自定义' }}
- 接口待补齐配置{{ row.status === '启用' ? '停用' : '启用' }}删除
diff --git a/src/views/WarehousesView.vue b/src/views/WarehousesView.vue
index fe4492bc..3cca7f82 100644
--- a/src/views/WarehousesView.vue
+++ b/src/views/WarehousesView.vue
@@ -128,6 +128,9 @@ async function toggleStatus(warehouse: Warehouse) {
+
+ 编辑{{ (row as Warehouse).status === 'ACTIVE' ? '停用' : '启用' }} 仅查看
+
{{ (row as Warehouse).name }}{{ (row as Warehouse).code }}
@@ -136,9 +139,6 @@ async function toggleStatus(warehouse: Warehouse) {
{{ (row as Warehouse).contactName || '-' }}{{ (row as Warehouse).contactPhone || '-' }}
{{ (row as Warehouse).status === 'ACTIVE' ? '启用' : '停用' }}
-
- 编辑{{ (row as Warehouse).status === 'ACTIVE' ? '停用' : '启用' }} 仅查看
-