refactor platform domain states and permissions

This commit is contained in:
david
2026-07-29 14:25:38 +08:00
parent d4799cd320
commit 35a52c4b06
42 changed files with 507 additions and 364 deletions

View File

@@ -2,8 +2,8 @@ import { request } from './http';
import { resourceApi } from './resource';
/** 平台角色、菜单、账号和工作台接口。 */
export type PlatformRole = { identity: string; role_code: string; name: string; data_scope: string; is_system: boolean; status: number };
export type PlatformMenu = { identity: string; parent_identity?: string; menu_code: string; name: string; icon: string; path: string; sort_no: number };
export type PlatformRole = { identity: string; role_code: string; name: string; location_scope: string; is_system: boolean; status: number };
export type PlatformMenu = { identity: string; parent_identity?: string; group_code: string; name: string; icon: string; path: string; sort_no: number };
export const platformApi = {
overview: () => request<Record<string, number>>('/dashboard/overview'),

View File

@@ -76,13 +76,21 @@ const fieldLabels: Record<string, string> = {
params: '产品参数',
produced_at: '生产时间',
enabled_at: '启用时间',
is_enabled: '是否启用',
product_status: '产品生命周期',
contract_status: '合同状态',
order_status: '订单状态',
previous_order_status: '异常前订单状态',
payment_status: '支付状态',
refund_status: '退款状态',
apply_status: '提现状态',
ticket_status: '工单状态',
reconciliation_status: '对账状态',
repair_no: '检修单号',
repair_type: '检修类型',
started_at: '开始时间',
completed_at: '完成时间',
result: '检修结果',
target_status: '目标状态',
target_product_status: '目标产品状态',
content: '内容',
operator: '操作人员',
remark: '备注',
@@ -175,9 +183,9 @@ const fieldLabels: Record<string, string> = {
ticket_no: '工单号',
category: '分类',
priority: '优先级',
data_scope: '数据范围',
location_scope: '坐标权限',
parent_identity: '父级',
menu_code: '菜单编码',
group_code: '菜单分组编码',
icon: '图标',
path: '路由',
menu_identities: '菜单权限',
@@ -186,7 +194,7 @@ const fieldLabels: Record<string, string> = {
const numbers = new Set([
'sort_no', 'stock_quantity', 'quantity', 'score', 'version_no',
'attempt_no', 'target_status',
'attempt_no', 'target_product_status',
]);
const money = new Set([
'unit_price', 'amount', 'fee', 'balance', 'withdrawal_balance',
@@ -194,7 +202,7 @@ const money = new Set([
'discount_amount', 'total_amount', 'delivery_fee', 'price_amount',
'sale_amount', 'difference_amount',
]);
const booleans = new Set(['is_default', 'is_enabled', 'is_cover', 'selected', 'withdrawable']);
const booleans = new Set(['is_default', 'is_cover', 'selected', 'withdrawable']);
const dates = new Set(['bill_date']);
const datetimes = new Set([
'expired_at', 'produced_at', 'enabled_at', 'started_at', 'completed_at',
@@ -279,11 +287,11 @@ export const resources: ResourceUiDefinition[] = [
define('user_service_relation', '用户服务关系', 'writable', [relation('user_account_identity', '/user_account', true), relation('gas_basic_identity', '/gas_basic'), relation('delivery_basic_identity', '/delivery_basic'), relation('staff_account_identity', '/staff_account')]),
define('product_type', '产品类型', 'editable', [f('code', { required: true }), f('name', { required: true })]),
define('product_warehouse', '库房', 'editable', [f('code', { required: true }), f('name', { required: true }), f('address'), f('manager'), f('phone'), f('is_enabled')]),
define('product_info', '产品信息', 'editable', [f('code', { required: true }), f('name', { required: true }), relation('product_type_identity', '/product_type', true), f('params', { required: true }), relation('warehouse_identity', '/product_warehouse'), relation('gas_basic_identity', '/gas_basic'), relation('delivery_basic_identity', '/delivery_basic'), relation('user_account_identity', '/user_account'), f('produced_at', { required: true }), f('is_enabled')], 'list', [
{ name: '修改产品状态', resource: '/product_info/:identity/status', method: 'PATCH', fields: [f('status', { required: true, type: 'select', options: [{ label: '待处理', value: 10 }, { label: '在库', value: 28 }, { label: '运输中', value: 29 }, { label: '使用中', value: 30 }, { label: '维修中', value: 31 }, { label: '已报废', value: 27 }] })] },
define('product_warehouse', '库房', 'editable', [f('code', { required: true }), f('name', { required: true }), f('address'), f('manager'), f('phone')]),
define('product_info', '产品信息', 'editable', [f('code', { required: true }), f('name', { required: true }), relation('product_type_identity', '/product_type', true), f('params', { required: true }), relation('warehouse_identity', '/product_warehouse'), relation('gas_basic_identity', '/gas_basic'), relation('delivery_basic_identity', '/delivery_basic'), relation('user_account_identity', '/user_account'), f('produced_at', { required: true })], 'list', [
{ name: '修改产品生命周期', resource: '/product_info/:identity/lifecycle', method: 'PATCH', fields: [f('product_status', { required: true, type: 'select', options: [{ label: '待处理', value: 10 }, { label: '在库', value: 28 }, { label: '运输中', value: 29 }, { label: '使用中', value: 30 }, { label: '维修中', value: 31 }, { label: '已报废', value: 27 }] })] },
]),
define('product_repair', '产品检修记录', 'editable', [relation('product_info_identity', '/product_info', true), f('repair_no', { required: true }), f('repair_type', { required: true }), f('started_at', { required: true }), f('completed_at'), f('result', { type: 'select', options: [{ label: '待处理', value: 'pending' }, { label: '通过', value: 'passed' }, { label: '未通过', value: 'failed' }] }), f('target_status', { type: 'select', options: [{ label: '在库', value: 28 }, { label: '运输中', value: 29 }, { label: '使用中', value: 30 }, { label: '报废', value: 27 }] }), f('content'), f('operator'), f('remark')]),
define('product_repair', '产品检修记录', 'editable', [relation('product_info_identity', '/product_info', true), f('repair_no', { required: true }), f('repair_type', { required: true }), f('started_at', { required: true }), f('completed_at'), f('result', { type: 'select', options: [{ label: '待处理', value: 'pending' }, { label: '通过', value: 'passed' }, { label: '未通过', value: 'failed' }] }), f('target_product_status', { type: 'select', options: [{ label: '在库', value: 28 }, { label: '运输中', value: 29 }, { label: '使用中', value: 30 }, { label: '报废', value: 27 }] }), f('content'), f('operator'), f('remark')]),
define('product_owner', '产品归属记录', 'readonly', []),
define('gasorder_contract', '配送合同', 'managed', [f('contract_no', { required: true }), relation('user_account_identity', '/user_account', true), relation('gas_basic_identity', '/gas_basic', true), relation('delivery_basic_identity', '/delivery_basic'), f('title', { required: true }), f('terms'), f('file_uri'), f('default_delivery_fee'), f('signed_at', { required: true }), f('effective_at', { required: true }), f('expired_at')], 'list', [
@@ -318,10 +326,10 @@ export const resources: ResourceUiDefinition[] = [
define('ec_product', '商品', 'writable', [relation('ec_category_identity', '/ec_category', true), f('product_code', { required: true }), f('name', { required: true }), f('price_amount', { required: true }), f('stock_quantity')]),
define('ec_product_attribute', '商品属性', 'writable', [relation('ec_product_identity', '/ec_product', true), f('name', { required: true }), f('value', { required: true }), f('sort_no')]),
define('ec_product_image', '商品图片', 'writable', [relation('ec_product_identity', '/ec_product', true), f('image_uri', { required: true }), f('sort_no'), f('is_cover')]),
define('ec_cart', '购物车', 'writable', [relation('user_account_identity', '/user_account', true), relation('ec_product_identity', '/ec_product', true), f('quantity', { required: true }), f('selected')]),
define('ec_order', '商城订单', 'writable', [relation('user_account_identity', '/user_account', true), relation('gas_basic_identity', '/gas_basic'), relation('delivery_basic_identity', '/delivery_basic'), f('order_no', { required: true }), f('total_amount', { required: true })]),
define('ec_order_item', '商城订单明细', 'writable', [relation('ec_order_identity', '/ec_order', true), relation('ec_product_identity', '/ec_product', true), f('product_snapshot', { required: true }), f('quantity', { required: true }), f('sale_amount', { required: true })]),
define('ec_review', '商品评价', 'writable', [relation('ec_order_identity', '/ec_order', true), relation('ec_product_identity', '/ec_product', true), relation('user_account_identity', '/user_account', true), f('score', { required: true }), f('content', { required: true })]),
define('ec_cart', '购物车', 'readonly', []),
define('ec_order', '商城订单', 'readonly', []),
define('ec_order_item', '商城订单明细', 'readonly', []),
define('ec_review', '商品评价', 'readonly', []),
define('wallet_basic', '钱包', 'readonly', [f('owner_type'), f('owner_identity'), f('alipay_id'), f('alipay_name'), f('wxpay_id'), f('wxpay_name'), f('balance'), f('withdrawal_balance')], 'list', [
{ name: '后台充值', resource: '/wallet_basic/:identity/recharge', fields: [f('request_no', { required: true }), f('amount', { required: true }), f('withdrawable'), ...reason, f('remark')] },
@@ -336,13 +344,13 @@ export const resources: ResourceUiDefinition[] = [
{ name: '审核驳回', resource: '/wallet_apply_cash/:identity/reject', danger: true, fields: reason },
]),
define('fin_payment', '财务支付记录', 'writable', [relation('ec_order_identity', '/ec_order', true), f('channel', { required: true }), f('amount', { required: true }), f('paid_at')]),
define('fin_payment', '财务支付记录', 'readonly', []),
define('fin_settlement', '财务结算', 'writable', [f('settlement_no', { required: true }), f('subject_type', { required: true }), f('subject_identity', { required: true }), f('period_start', { required: true }), f('period_end', { required: true })]),
define('fin_reconciliation', '财务对账', 'writable', [f('channel', { required: true }), f('bill_date', { required: true }), f('difference_amount', { required: true })]),
define('fin_reconciliation', '财务对账', 'readonly', []),
define('cms_content', '内容', 'writable', [f('content_type', { required: true }), f('title', { required: true }), f('body', { required: true }), f('version_no'), f('publish_status')]),
define('cs_ticket', '客服工单', 'writable', [relation('user_account_identity', '/user_account', true), f('ticket_no', { required: true }), f('category', { required: true }), f('priority', { required: true })]),
define('platform_account', '平台账户', 'writable', [f('username', { required: true }), f('password', { required: true }), f('display_name'), f('avatar'), f('platform_role_code', { required: true }), f('phone')]),
define('platform_role', '平台角色', 'writable', [f('role_code', { required: true }), f('name', { required: true }), f('data_scope', { required: true })], 'list', [
define('platform_role', '平台角色', 'writable', [f('role_code', { required: true }), f('name', { required: true }), f('location_scope', { required: true, type: 'select', options: [{ label: '脱敏坐标', value: 'standard' }, { label: '精确坐标', value: 'precise' }] })], 'list', [
{ name: '分配菜单', resource: '/platform_role/:identity/menu', method: 'PUT', fields: [f('menu_identities', { type: 'identity-list', relation: '/platform_menu' })] },
]),
define('platform_menu', '平台菜单', 'readonly', [], 'tree'),

File diff suppressed because one or more lines are too long

View File

@@ -55,80 +55,80 @@ const routes: AppRouteRecordRaw[] = [
redirect: '/dashboard/overview',
meta: { title: '首页', requiresAuth: true, icon: 'icon-dashboard', order: 0, menuCode: 'dashboard' },
children: [
{ path: 'overview', name: 'dashboard-overview', component: () => import('@/views/dashboard/DashboardPage.vue'), meta: { title: '数据概览', requiresAuth: true, menuCode: 'dashboard' } },
{ path: 'reports', name: 'dashboard-reports', component: () => import('@/views/dashboard/ReportPage.vue'), meta: { title: '统计报表', requiresAuth: true, menuCode: 'dashboard' } },
{ path: 'overview', name: 'dashboard-overview', component: () => import('@/views/dashboard/DashboardPage.vue'), meta: { title: '数据概览', requiresAuth: true, menuCode: 'dashboard_overview' } },
{ path: 'reports', name: 'dashboard-reports', component: () => import('@/views/dashboard/ReportPage.vue'), meta: { title: '统计报表', requiresAuth: true, menuCode: 'dashboard_reports' } },
],
},
group('gas', 'gas', '气站管理', 'icon-storage', 10, [
child('gas', 'gas-basic', 'basic', '气站', '/gas_basic'),
child('gas', 'gas-account', 'account', '气站账户', '/gas_account'),
child('gas', 'gas-basic', 'basic', '气站', '/gas_basic', 'gas_basic'),
child('gas', 'gas-account', 'account', '气站账户', '/gas_account', 'gas_account'),
]),
group('delivery', 'delivery', '配送站管理', 'icon-send', 20, [
child('delivery', 'delivery-basic', 'basic', '配送站', '/delivery_basic'),
child('delivery', 'delivery-account', 'account', '配送站账户', '/delivery_account'),
child('delivery', 'delivery-basic', 'basic', '配送站', '/delivery_basic', 'delivery_basic'),
child('delivery', 'delivery-account', 'account', '配送站账户', '/delivery_account', 'delivery_account'),
]),
group('staff', 'staff', '工作人员管理', 'icon-user-group', 30, [
child('staff', 'staff-account', 'account', '工作人员', '/staff_account'),
child('staff', 'staff-credential', 'credential', '人员资质', '/staff_credential'),
child('staff', 'staff-account', 'account', '工作人员', '/staff_account', 'staff_account'),
child('staff', 'staff-credential', 'credential', '人员资质', '/staff_credential', 'staff_credential'),
]),
group('user', 'user', '用户管理', 'icon-user', 40, [
child('user', 'user-account', 'account', '用户账户', '/user_account'),
child('user', 'user-address', 'address', '用户地址', '/user_address'),
child('user', 'service-relation', 'service-relation', '服务关系', '/user_service_relation'),
child('user', 'user-account', 'account', '用户账户', '/user_account', 'user_account'),
child('user', 'user-address', 'address', '用户地址', '/user_address', 'user_address'),
child('user', 'service-relation', 'service-relation', '服务关系', '/user_service_relation', 'user_service_relation'),
]),
group('product', 'product', '产品管理', 'icon-common', 50, [
child('product', 'product-type', 'type', '产品类型', '/product_type', 'device'),
child('product', 'warehouse', 'warehouse', '库房', '/product_warehouse', 'device'),
child('product', 'product-info', 'info', '产品信息', '/product_info', 'device'),
child('product', 'repair', 'repair', '检修记录', '/product_repair', 'device', true, 'product-info'),
child('product', 'owner', 'owner', '归属记录', '/product_owner', 'device', true, 'product-info'),
child('product', 'product-type', 'type', '产品类型', '/product_type', 'product_type'),
child('product', 'warehouse', 'warehouse', '库房', '/product_warehouse', 'product_warehouse'),
child('product', 'product-info', 'info', '产品信息', '/product_info', 'product_info'),
child('product', 'repair', 'repair', '检修记录', '/product_repair', 'product_info', true, 'product-info'),
child('product', 'owner', 'owner', '归属记录', '/product_owner', 'product_info', true, 'product-info'),
], 'device'),
group('gasorder', 'gasorder', '气体配送订单管理', 'icon-list', 60, [
child('gasorder', 'contracts', 'contracts', '合同管理', '/gasorder_contract', 'delivery'),
child('gasorder', 'contract-products', 'contract-products', '合同气瓶', '/gasorder_contract_product', 'delivery', true, 'gasorder-contracts'),
child('gasorder', 'contract-revisions', 'contract-revisions', '合同修订记录', '/gasorder_contract_revision', 'delivery', true, 'gasorder-contracts'),
child('gasorder', 'orders', 'orders', '配送订单', '/gasorder_basic', 'delivery'),
child('gasorder', 'order-items', 'order-items', '订单明细', '/gasorder_item', 'delivery', true, 'gasorder-orders'),
child('gasorder', 'assignments', 'assignments', '分配记录', '/gasorder_assign', 'delivery', true, 'gasorder-orders'),
child('gasorder', 'statuses', 'statuses', '状态记录', '/gasorder_status', 'delivery', true, 'gasorder-orders'),
child('gasorder', 'tracks', 'tracks', '运行轨迹', '/gasorder_track', 'delivery'),
child('gasorder', 'track-points', 'track-points', '轨迹点', '/gasorder_track_point', 'delivery', true, 'gasorder-tracks'),
child('gasorder', 'confirms', 'confirms', '确认记录', '/gasorder_confirm', 'delivery', true, 'gasorder-orders'),
child('gasorder', 'payments', 'payments', '订单支付记录', '/gasorder_payment', 'delivery', true, 'gasorder-orders'),
child('gasorder', 'contracts', 'contracts', '合同管理', '/gasorder_contract', 'gasorder_contract'),
child('gasorder', 'contract-products', 'contract-products', '合同气瓶', '/gasorder_contract_product', 'gasorder_contract', true, 'gasorder-contracts'),
child('gasorder', 'contract-revisions', 'contract-revisions', '合同修订记录', '/gasorder_contract_revision', 'gasorder_contract', true, 'gasorder-contracts'),
child('gasorder', 'orders', 'orders', '配送订单', '/gasorder_basic', 'gasorder_basic'),
child('gasorder', 'order-items', 'order-items', '订单明细', '/gasorder_item', 'gasorder_basic', true, 'gasorder-orders'),
child('gasorder', 'assignments', 'assignments', '分配记录', '/gasorder_assign', 'gasorder_basic', true, 'gasorder-orders'),
child('gasorder', 'statuses', 'statuses', '状态记录', '/gasorder_status', 'gasorder_basic', true, 'gasorder-orders'),
child('gasorder', 'tracks', 'tracks', '运行轨迹', '/gasorder_track', 'gasorder_track'),
child('gasorder', 'track-points', 'track-points', '轨迹点', '/gasorder_track_point', 'gasorder_track', true, 'gasorder-tracks'),
child('gasorder', 'confirms', 'confirms', '确认记录', '/gasorder_confirm', 'gasorder_basic', true, 'gasorder-orders'),
child('gasorder', 'payments', 'payments', '订单支付记录', '/gasorder_payment', 'gasorder_basic', true, 'gasorder-orders'),
], 'delivery'),
group('ec', 'ec', '商城管理', 'icon-gift', 70, [
child('ec', 'categories', 'categories', '商品分类', '/ec_category'),
child('ec', 'products', 'products', '商品', '/ec_product'),
child('ec', 'attributes', 'attributes', '商品属性', '/ec_product_attribute', 'ec', true, 'ec-products'),
child('ec', 'images', 'images', '商品图片', '/ec_product_image', 'ec', true, 'ec-products'),
child('ec', 'carts', 'carts', '购物车', '/ec_cart'),
child('ec', 'orders', 'orders', '商城订单', '/ec_order'),
child('ec', 'order-items', 'order-items', '订单明细', '/ec_order_item', 'ec', true, 'ec-orders'),
child('ec', 'reviews', 'reviews', '商品评价', '/ec_review'),
child('ec', 'categories', 'categories', '商品分类', '/ec_category', 'ec_category'),
child('ec', 'products', 'products', '商品', '/ec_product', 'ec_product'),
child('ec', 'attributes', 'attributes', '商品属性', '/ec_product_attribute', 'ec_product', true, 'ec-products'),
child('ec', 'images', 'images', '商品图片', '/ec_product_image', 'ec_product', true, 'ec-products'),
child('ec', 'carts', 'carts', '购物车', '/ec_cart', 'ec_cart'),
child('ec', 'orders', 'orders', '商城订单', '/ec_order', 'ec_order'),
child('ec', 'order-items', 'order-items', '订单明细', '/ec_order_item', 'ec_order', true, 'ec-orders'),
child('ec', 'reviews', 'reviews', '商品评价', '/ec_review', 'ec_review'),
]),
group('wallet', 'wallet', '钱包管理', 'icon-safe', 80, [
child('wallet', 'wallet-basic', 'basic', '钱包', '/wallet_basic'),
child('wallet', 'banks', 'banks', '银行卡', '/wallet_bank'),
child('wallet', 'payments', 'payments', '支付记录', '/wallet_payment'),
child('wallet', 'records', 'records', '钱包流水', '/wallet_record'),
child('wallet', 'refunds', 'refunds', '退款记录', '/wallet_refund'),
child('wallet', 'apply-cash', 'apply-cash', '提现申请', '/wallet_apply_cash'),
child('wallet', 'wallet-basic', 'basic', '钱包', '/wallet_basic', 'wallet_basic'),
child('wallet', 'banks', 'banks', '银行卡', '/wallet_bank', 'wallet_bank'),
child('wallet', 'payments', 'payments', '支付记录', '/wallet_payment', 'wallet_payment'),
child('wallet', 'records', 'records', '钱包流水', '/wallet_record', 'wallet_record'),
child('wallet', 'refunds', 'refunds', '退款记录', '/wallet_refund', 'wallet_refund'),
child('wallet', 'apply-cash', 'apply-cash', '提现申请', '/wallet_apply_cash', 'wallet_apply_cash'),
]),
group('finance', 'finance', '财务管理', 'icon-bar-chart', 90, [
child('finance', 'payments', 'payments', '支付记录', '/fin_payment'),
child('finance', 'settlements', 'settlements', '财务结算', '/fin_settlement'),
child('finance', 'reconciliations', 'reconciliations', '财务对账', '/fin_reconciliation'),
child('finance', 'payments', 'payments', '支付记录', '/fin_payment', 'fin_payment'),
child('finance', 'settlements', 'settlements', '财务结算', '/fin_settlement', 'fin_settlement'),
child('finance', 'reconciliations', 'reconciliations', '财务对账', '/fin_reconciliation', 'fin_reconciliation'),
]),
group('content', 'content', '内容管理', 'icon-file', 100, [
child('content', 'contents', 'contents', '内容', '/cms_content'),
child('content', 'contents', 'contents', '内容', '/cms_content', 'cms_content'),
]),
group('customer-service', 'customer_service', '客服管理', 'icon-customer-service', 110, [
child('customer_service', 'tickets', 'tickets', '客服工单', '/cs_ticket'),
child('customer_service', 'tickets', 'tickets', '客服工单', '/cs_ticket', 'cs_ticket'),
]),
group('platform', 'platform', '平台管理', 'icon-settings', 120, [
child('platform', 'accounts', 'accounts', '平台账户', '/platform_account'),
child('platform', 'roles', 'roles', '平台角色', '/platform_role'),
child('platform', 'menus', 'menus', '平台菜单', '/platform_menu'),
child('platform', 'accounts', 'accounts', '平台账户', '/platform_account', 'platform_account'),
child('platform', 'roles', 'roles', '平台角色', '/platform_role', 'platform_role'),
child('platform', 'menus', 'menus', '平台菜单', '/platform_menu', 'platform_menu'),
]),
];

View File

@@ -24,7 +24,7 @@
<a-switch v-else-if="field.type === 'boolean'" v-model="form[field.key]" />
<a-select v-else-if="field.type === 'identity'" v-model="form[field.key]" allow-clear allow-search>
<a-option v-for="option in list.filter((item) => item.identity !== editingIdentity)" :key="option.identity" :value="option.identity">
{{ option.name ?? option.menu_code ?? option.identity }}
{{ option.name ?? option.group_code ?? option.identity }}
</a-option>
</a-select>
<a-input v-else v-model="form[field.key]" />