多管理端
DVHA 框架支持在同一应用中运行多个独立的管理端,每个管理端可以有独立的认证、数据、路由和主题系统。
设计理念
- 🔐 隔离性 - 各管理端间数据和权限完全隔离
- 🎯 专业性 - 每个管理端专注于特定的业务场景
- 🔄 独立性 - 每个管理端可独立开发、部署和维护
- 🛠️ 可扩展性 - 可以轻松添加新的管理端
- 🎨 差异化 - 每个管理端可以有独特的界面和体验
API架构策略
DVHA 框架支持多种API架构模式,可以根据业务需求选择合适的方案。
统一API架构
所有管理端共享一个统一的API服务,适合小型到中型应用。
js
// 创建统一的数据提供者
const dataProvider = simpleDataProvider({
apiUrl: 'https://api.example.com'
})
const app = createDux({
dataProvider, // 全局数据提供者
manages: [
{
name: 'admin',
title: '系统管理',
routePrefix: '/admin'
},
{
name: 'merchant',
title: '商家中心',
routePrefix: '/merchant'
}
]
})
适用场景: 业务关联度高、团队规模小、对性能要求不高的应用
分布式API架构
每个管理端使用独立的API服务,适合大型企业级应用。
js
const app = createDux({
manages: [
{
name: 'admin',
title: '系统管理',
dataProvider: simpleDataProvider({
apiUrl: 'https://admin-api.example.com'
}),
routePrefix: '/admin'
},
{
name: 'merchant',
title: '商家中心',
dataProvider: simpleDataProvider({
apiUrl: 'https://merchant-api.example.com'
}),
routePrefix: '/merchant'
}
]
})
适用场景: 大型企业应用、业务域独立、多团队协作开发
多数据源架构
单个管理端连接多个API服务,适合微服务场景。
js
const app = createDux({
manages: [
{
name: 'merchant',
title: '商家中心',
dataProvider: {
default: simpleDataProvider({
apiUrl: 'https://merchant-api.example.com'
}),
analytics: simpleDataProvider({
apiUrl: 'https://analytics-api.example.com'
}),
payment: simpleDataProvider({
apiUrl: 'https://payment-api.example.com'
})
},
routePrefix: '/merchant'
}
]
})
适用场景: 微服务架构、复杂业务系统、需要连接多个后端服务
典型应用场景
企业级应用
js
const app = createDux({
defaultManage: 'admin',
manages: [
// 系统管理端 - 超级管理员使用
{
name: 'admin',
title: '系统管理',
routePrefix: '/admin',
authProvider: adminAuthProvider,
dataProvider: adminDataProvider
},
// 企业管理端 - 企业管理员使用
{
name: 'enterprise',
title: '企业管理',
routePrefix: '/enterprise',
authProvider: enterpriseAuthProvider,
dataProvider: enterpriseDataProvider
},
// 部门管理端 - 部门负责人使用
{
name: 'department',
title: '部门管理',
routePrefix: '/dept',
authProvider: departmentAuthProvider,
dataProvider: departmentDataProvider
},
// 员工中心 - 普通员工使用
{
name: 'employee',
title: '员工中心',
routePrefix: '/employee',
authProvider: employeeAuthProvider,
dataProvider: employeeDataProvider
}
]
})
电商平台
js
const app = createDux({
defaultManage: 'platform',
manages: [
// 平台管理端 - 平台运营人员
{
name: 'platform',
title: '平台管理',
routePrefix: '/platform',
authProvider: platformAuthProvider,
dataProvider: platformDataProvider,
menus: [
{ name: 'dashboard', label: '平台概览', path: 'dashboard' },
{ name: 'merchants', label: '商家管理', path: 'merchants' },
{ name: 'categories', label: '分类管理', path: 'categories' },
{ name: 'orders', label: '订单监控', path: 'orders' }
]
},
// 商家管理端 - 商家使用
{
name: 'merchant',
title: '商家中心',
routePrefix: '/merchant',
authProvider: merchantAuthProvider,
dataProvider: merchantDataProvider,
register: true,
forgotPassword: true,
menus: [
{ name: 'dashboard', label: '店铺概览', path: 'dashboard' },
{ name: 'products', label: '商品管理', path: 'products' },
{ name: 'orders', label: '订单管理', path: 'orders' },
{ name: 'finance', label: '财务中心', path: 'finance' }
]
},
// 用户中心 - 消费者使用
{
name: 'user',
title: '用户中心',
routePrefix: '/user',
authProvider: userAuthProvider,
dataProvider: userDataProvider,
register: true,
forgotPassword: true,
menus: [
{ name: 'profile', label: '个人资料', path: 'profile' },
{ name: 'orders', label: '我的订单', path: 'orders' },
{ name: 'addresses', label: '收货地址', path: 'addresses' },
{ name: 'wallet', label: '我的钱包', path: 'wallet' }
]
},
// 配送管理端 - 物流人员使用
{
name: 'delivery',
title: '配送管理',
routePrefix: '/delivery',
authProvider: deliveryAuthProvider,
dataProvider: deliveryDataProvider,
menus: [
{ name: 'dashboard', label: '配送概览', path: 'dashboard' },
{ name: 'routes', label: '配送路线', path: 'routes' },
{ name: 'drivers', label: '配送员管理', path: 'drivers' },
{ name: 'vehicles', label: '车辆管理', path: 'vehicles' }
]
}
]
})
SaaS平台
js
const app = createDux({
defaultManage: 'admin',
manages: [
// SaaS管理端 - 平台管理员
{
name: 'admin',
title: 'SaaS管理',
routePrefix: '/admin',
authProvider: adminAuthProvider,
dataProvider: adminDataProvider,
menus: [
{ name: 'dashboard', label: '平台概览', path: 'dashboard' },
{ name: 'tenants', label: '租户管理', path: 'tenants' },
{ name: 'billing', label: '计费管理', path: 'billing' },
{ name: 'monitoring', label: '系统监控', path: 'monitoring' }
]
},
// 租户管理端 - 企业管理员
{
name: 'tenant',
title: '企业管理',
routePrefix: '/tenant',
authProvider: tenantAuthProvider,
dataProvider: tenantDataProvider,
menus: [
{ name: 'dashboard', label: '企业概览', path: 'dashboard' },
{ name: 'users', label: '用户管理', path: 'users' },
{ name: 'settings', label: '企业设置', path: 'settings' },
{ name: 'billing', label: '账单管理', path: 'billing' }
]
},
// 工作台 - 普通用户
{
name: 'workspace',
title: '工作台',
routePrefix: '/workspace',
authProvider: workspaceAuthProvider,
dataProvider: workspaceDataProvider,
menus: [
{ name: 'dashboard', label: '工作台', path: 'dashboard' },
{ name: 'projects', label: '项目管理', path: 'projects' },
{ name: 'tasks', label: '任务管理', path: 'tasks' },
{ name: 'profile', label: '个人设置', path: 'profile' }
]
}
]
})
数据隔离策略
基于选择的API架构,DVHA提供多种数据隔离实现方案,确保不同管理端间的数据安全和隔离。
基于统一API的数据隔离
在统一API架构下,通过业务逻辑层面实现数据隔离。
js
// 基于管理端类型的数据过滤
const unifiedDataProvider = {
getList: async (options, manage, auth) => {
const response = await fetch(`${apiUrl}${options.path}`, {
headers: {
'Authorization': `Bearer ${auth.token}`,
'X-Manage-Type': manage.config.name,
'X-Tenant-ID': auth.tenantId, // 租户隔离
'Content-Type': 'application/json'
}
})
const data = await response.json()
// 客户端数据过滤(可选的额外安全层)
return filterDataByManageType(data, manage.config.name)
}
}
// 数据过滤函数
const filterDataByManageType = (data, manageType) => {
if (manageType === 'user') {
// 用户端只能看到自己的数据
return data.filter(item => item.userId === auth.userId)
} else if (manageType === 'merchant') {
// 商家端只能看到自己店铺的数据
return data.filter(item => item.merchantId === auth.merchantId)
}
// 管理端可以看到所有数据
return data
}
基于分布式API的数据隔离
在分布式API架构下,通过物理隔离实现最高级别的数据安全。
js
// 完全独立的数据库和API服务
const createIsolatedDataProvider = (config) => ({
getList: async (options, manage, auth) => {
// 每个管理端连接到独立的API服务
const response = await fetch(`${config.apiUrl}${options.path}`, {
headers: {
'Authorization': `Bearer ${auth.token}`,
'X-Database': config.database, // 指定数据库
'X-Schema': config.schema, // 指定模式
'Content-Type': 'application/json'
}
})
return await response.json()
}
})
const app = createDux({
manages: [
{
name: 'admin',
dataProvider: createIsolatedDataProvider({
apiUrl: 'https://admin-api.example.com',
database: 'admin_db',
schema: 'admin_schema'
})
},
{
name: 'merchant',
dataProvider: createIsolatedDataProvider({
apiUrl: 'https://merchant-api.example.com',
database: 'merchant_db',
schema: 'merchant_schema'
})
}
]
})
基于微服务的数据隔离
在微服务架构下,通过服务边界和数据域隔离。
js
// 微服务数据隔离策略
const microserviceDataProvider = {
getList: async (options, manage, auth) => {
const serviceName = getServiceByPath(options.path)
// 检查管理端是否有权限访问该服务
if (!hasServiceAccess(manage.config.name, serviceName)) {
throw new Error(`管理端 ${manage.config.name} 无权限访问 ${serviceName}`)
}
const serviceUrl = serviceRegistry[serviceName]
const response = await fetch(`${serviceUrl}${options.path}`, {
headers: {
'Authorization': `Bearer ${auth.token}`,
'X-Manage-Type': manage.config.name,
'X-Service-Domain': getServiceDomain(serviceName),
'X-Data-Scope': getDataScope(manage.config.name, serviceName),
'Content-Type': 'application/json'
}
})
return await response.json()
}
}
// 服务访问权限控制
const hasServiceAccess = (manageName, serviceName) => {
const serviceAccessMap = {
admin: ['*'], // 管理端可以访问所有服务
merchant: ['product-service', 'order-service', 'merchant-service'],
user: ['user-service', 'order-service'],
delivery: ['delivery-service', 'order-service']
}
const allowedServices = serviceAccessMap[manageName] || []
return allowedServices.includes('*') || allowedServices.includes(serviceName)
}
// 数据范围控制
const getDataScope = (manageName, serviceName) => {
const scopeMap = {
'admin': 'global', // 全局数据访问
'merchant': 'tenant', // 租户级数据访问
'user': 'personal', // 个人数据访问
'delivery': 'regional' // 区域数据访问
}
return scopeMap[manageName] || 'limited'
}
数据库级别隔离
针对最高安全要求的场景,实现物理数据库隔离。
js
// 数据库级别隔离配置
const databaseConfigs = {
admin: {
host: 'admin-db.example.com',
port: 5432,
database: 'admin_system',
user: 'admin_user',
password: 'admin_pass',
ssl: true
},
merchant: {
host: 'merchant-db.example.com',
port: 5432,
database: 'merchant_system',
user: 'merchant_user',
password: 'merchant_pass',
ssl: true
},
user: {
host: 'user-db.example.com',
port: 5432,
database: 'user_system',
user: 'user_user',
password: 'user_pass',
ssl: true
}
}
// 为不同管理端创建独立的数据库连接
const createDatabaseProvider = (dbConfig) => ({
getList: async (options, manage, auth) => {
const db = await createConnection(dbConfig)
try {
// 使用独立的数据库连接查询
const result = await db.query(
buildQuery(options.path, options.filters),
options.params
)
return result.rows
} finally {
await db.close()
}
},
create: async (options, manage, auth) => {
const db = await createConnection(dbConfig)
try {
const result = await db.query(
buildInsertQuery(options.path, options.data),
Object.values(options.data)
)
return result.rows[0]
} finally {
await db.close()
}
}
})
const app = createDux({
manages: [
{
name: 'admin',
dataProvider: createDatabaseProvider(databaseConfigs.admin)
},
{
name: 'merchant',
dataProvider: createDatabaseProvider(databaseConfigs.merchant)
},
{
name: 'user',
dataProvider: createDatabaseProvider(databaseConfigs.user)
}
]
})
租户级别隔离
在SaaS模式下,通过租户ID实现多租户数据隔离。
js
// 多租户数据隔离
const createMultiTenantDataProvider = (baseUrl) => ({
getList: async (options, manage, auth) => {
// 确保所有请求都包含租户信息
const tenantId = auth.tenantId || manage.config.defaultTenantId
if (!tenantId) {
throw new Error('缺少租户ID,无法访问数据')
}
const response = await fetch(`${baseUrl}${options.path}`, {
headers: {
'Authorization': `Bearer ${auth.token}`,
'X-Tenant-ID': tenantId,
'X-Manage-Type': manage.config.name,
'X-Data-Isolation': 'tenant', // 明确指定隔离级别
'Content-Type': 'application/json'
}
})
const data = await response.json()
// 客户端再次验证数据属于正确的租户
validateTenantData(data, tenantId)
return data
},
create: async (options, manage, auth) => {
const tenantId = auth.tenantId || manage.config.defaultTenantId
// 自动添加租户ID到创建的数据中
const dataWithTenant = {
...options.data,
tenantId: tenantId,
createdBy: auth.userId,
createdFrom: manage.config.name
}
const response = await fetch(`${baseUrl}${options.path}`, {
method: 'POST',
headers: {
'Authorization': `Bearer ${auth.token}`,
'X-Tenant-ID': tenantId,
'X-Manage-Type': manage.config.name,
'Content-Type': 'application/json'
},
body: JSON.stringify(dataWithTenant)
})
return await response.json()
}
})
// 租户数据验证
const validateTenantData = (data, expectedTenantId) => {
if (Array.isArray(data)) {
data.forEach(item => {
if (item.tenantId && item.tenantId !== expectedTenantId) {
throw new Error('数据租户ID不匹配,可能存在数据泄露')
}
})
} else if (data.tenantId && data.tenantId !== expectedTenantId) {
throw new Error('数据租户ID不匹配,可能存在数据泄露')
}
}
API级别隔离
通过不同的API端点实现业务隔离。
js
// API级别的路径隔离
const createApiIsolatedProvider = (config) => ({
getList: async (options, manage, auth) => {
// 根据管理端类型选择不同的API路径前缀
const apiPath = getApiPath(manage.config.name, options.path)
const response = await fetch(`${config.baseUrl}${apiPath}`, {
headers: {
'Authorization': `Bearer ${auth.token}`,
'X-API-Version': config.apiVersion,
'X-Source': manage.config.name,
'Content-Type': 'application/json'
}
})
return await response.json()
}
})
// 根据管理端类型生成API路径
const getApiPath = (manageName, originalPath) => {
const pathPrefixes = {
admin: '/admin/api',
merchant: '/merchant/api',
user: '/user/api',
delivery: '/delivery/api'
}
const prefix = pathPrefixes[manageName] || '/common/api'
return `${prefix}${originalPath}`
}
// 应用配置
const app = createDux({
manages: [
{
name: 'admin',
dataProvider: createApiIsolatedProvider({
baseUrl: 'https://api.example.com',
apiVersion: 'v1'
})
},
{
name: 'merchant',
dataProvider: createApiIsolatedProvider({
baseUrl: 'https://api.example.com',
apiVersion: 'v1'
})
}
]
})
认证隔离策略
独立认证系统
js
// 每个管理端使用完全独立的认证系统
const createAuthProvider = (authConfig) => ({
login: async (params, manage) => {
const response = await fetch(`${authConfig.baseUrl}/login`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
...params,
manage: manage.config.name
})
})
return await response.json()
},
check: async (params, manage) => {
const response = await fetch(`${authConfig.baseUrl}/check`, {
headers: {
'Authorization': `Bearer ${params.token}`,
'X-Manage': manage.config.name
}
})
return await response.json()
}
})
const app = createDux({
manages: [
{
name: 'admin',
authProvider: createAuthProvider({
baseUrl: 'https://admin-auth.example.com'
})
},
{
name: 'merchant',
authProvider: createAuthProvider({
baseUrl: 'https://merchant-auth.example.com'
})
}
]
})
统一认证中心
js
// 使用统一的认证中心,通过角色和权限区分
const unifiedAuthProvider = {
login: async (params, manage) => {
const response = await fetch('/api/auth/login', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
...params,
manage_type: manage.config.name
})
})
const result = await response.json()
// 检查用户是否有权限访问当前管理端
if (!result.user.manages.includes(manage.config.name)) {
return {
success: false,
message: '无权限访问此管理端'
}
}
return result
}
}
权限隔离策略
基于角色的权限控制
js
// 不同管理端定义不同的角色体系
const rolePermissions = {
admin: {
'super_admin': ['*'],
'system_admin': ['user.read', 'user.write', 'system.read'],
'auditor': ['user.read', 'log.read']
},
merchant: {
'shop_owner': ['product.*', 'order.*', 'finance.read'],
'shop_manager': ['product.read', 'order.read', 'order.write'],
'shop_staff': ['product.read', 'order.read']
},
user: {
'vip_user': ['profile.*', 'order.*', 'wallet.*'],
'normal_user': ['profile.*', 'order.read']
}
}
// 在菜单配置中使用权限控制
const adminMenus = [
{
name: 'users',
label: '用户管理',
path: 'users',
meta: {
permissions: ['user.read']
}
}
]
基于管理端的权限控制
js
// 权限检查中间件
const checkManagePermission = (manage, user) => {
const userManages = user.manages || []
if (!userManages.includes(manage.config.name)) {
throw new Error(`用户无权限访问 ${manage.config.name} 管理端`)
}
return true
}
// 在数据提供者中使用
const secureDataProvider = {
getList: async (options, manage, auth) => {
checkManagePermission(manage, auth)
// 继续执行数据获取逻辑
const response = await fetch(`/api/${manage.config.name}${options.path}`)
return await response.json()
}
}
主题差异化
独立主题配置
js
const app = createDux({
manages: [
// 管理端 - 专业深色主题
{
name: 'admin',
title: '系统管理',
theme: {
logo: '/admin-logo.png',
darkLogo: '/admin-logo-dark.png',
banner: '/admin-banner.jpg',
primaryColor: '#1890ff',
darkMode: true
}
},
// 商家端 - 活力橙色主题
{
name: 'merchant',
title: '商家中心',
theme: {
logo: '/merchant-logo.png',
banner: '/merchant-banner.jpg',
primaryColor: '#ff6600',
darkMode: false
}
},
// 用户端 - 温馨绿色主题
{
name: 'user',
title: '用户中心',
theme: {
logo: '/user-logo.png',
banner: '/user-banner.jpg',
primaryColor: '#52c41a',
darkMode: false
}
}
]
})
动态主题切换
vue
<template>
<div :class="themeClass">
<!-- 管理端内容 -->
</div>
</template>
<script setup>
import { computed } from 'vue'
import { useManage, useTheme } from '@duxweb/dvha-core'
const manage = useManage()
const { theme } = useTheme()
const themeClass = computed(() => {
return `manage-${manage.config.name} theme-${theme.value}`
})
</script>
<style scoped>
.manage-admin {
--primary-color: #1890ff;
--bg-color: #001529;
}
.manage-merchant {
--primary-color: #ff6600;
--bg-color: #fff;
}
.manage-user {
--primary-color: #52c41a;
--bg-color: #f0f2f5;
}
</style>
部署策略
单应用部署
bash
# 构建包含所有管理端的单一应用
npm run build
# 部署到单一域名,通过路由前缀区分
# example.com/admin - 系统管理端
# example.com/merchant - 商家管理端
# example.com/user - 用户中心
独立应用部署
js
// 为每个管理端构建独立的应用
// admin.config.js
export default {
manages: [
{
name: 'admin',
title: '系统管理',
routePrefix: '/', // 根路径
// ... 其他配置
}
]
}
// merchant.config.js
export default {
manages: [
{
name: 'merchant',
title: '商家中心',
routePrefix: '/', // 根路径
// ... 其他配置
}
]
}
bash
# 分别构建和部署
npm run build:admin # 构建管理端应用
npm run build:merchant # 构建商家端应用
# 部署到不同子域名
# admin.example.com - 系统管理端
# merchant.example.com - 商家管理端
# user.example.com - 用户中心
微前端部署
js
// 使用微前端架构,每个管理端作为独立的微应用
const microApps = [
{
name: 'admin',
entry: 'https://admin.example.com',
activeRule: '/admin'
},
{
name: 'merchant',
entry: 'https://merchant.example.com',
activeRule: '/merchant'
},
{
name: 'user',
entry: 'https://user.example.com',
activeRule: '/user'
}
]
开发模式
独立开发
bash
# 团队结构
admin-team/ # 系统管理端团队
├── src/
├── package.json
└── vite.config.js
merchant-team/ # 商家端团队
├── src/
├── package.json
└── vite.config.js
user-team/ # 用户端团队
├── src/
├── package.json
└── vite.config.js
共享开发
bash
# 共享代码库结构
packages/
├── core/ # DVHA核心包
├── shared/ # 共享组件和工具
├── admin/ # 管理端代码
├── merchant/ # 商家端代码
└── user/ # 用户端代码
apps/
├── admin/ # 管理端应用
├── merchant/ # 商家端应用
└── user/ # 用户端应用
管理端通信
跨管理端导航
js
// 管理端选择器组件
const ManageSelector = {
setup() {
const router = useRouter()
const currentManage = useManage()
const switchToManage = (manageName) => {
const manage = useManage(manageName)
// 检查用户是否有权限访问目标管理端
if (hasAccessToManage(manageName)) {
router.push(manage.getRoutePath(''))
} else {
// 重新登录或显示错误
router.push(manage.getRoutePath('login'))
}
}
return { switchToManage }
}
}
数据共享
js
// 跨管理端数据共享
const sharedDataProvider = {
getSharedData: async (type) => {
const response = await fetch(`/api/shared/${type}`)
return await response.json()
}
}
// 在不同管理端中使用共享数据
const { data: notifications } = useCustom({
path: '/shared/notifications',
dataProvider: sharedDataProvider
})
注意事项
架构相关
- API选择: 根据业务复杂度和团队能力选择合适的API架构模式
- 数据一致性: 在分布式API架构下要特别注意跨服务的数据一致性
- 服务治理: 微服务架构需要完善的服务监控、熔断、限流等治理机制
- 网络延迟: 分布式架构会增加网络调用,需考虑延迟对用户体验的影响
安全相关
- 跨域安全: 多API端点部署时需要正确配置CORS策略
- 令牌管理: 不同管理端的认证令牌应该有适当的作用域限制
- 数据加密: 敏感数据在传输和存储时都应该加密
- 访问控制: 实施基于角色和资源的细粒度访问控制
性能相关
- 缓存策略: 统一API下的缓存失效策略需要考虑多管理端的影响
- 负载均衡: 分布式API需要合理的负载均衡策略
- 数据库连接: 数据库级隔离会增加连接数,需要合理的连接池配置
- 监控指标: 建立完善的性能监控指标和告警机制
开发维护
- 版本兼容: 不同管理端和API服务间的版本兼容性管理
- 测试策略: 多管理端环境下的集成测试和端到端测试策略
- 文档管理: 维护各个API服务和管理端的文档同步
- 团队协作: 制定清晰的团队协作和代码共享规范
运维部署
- 环境一致: 确保开发、测试、生产环境的配置一致性
- 容灾备份: 分布式架构下的数据备份和容灾恢复策略
- 日志聚合: 多服务环境下的日志收集和分析策略
- 配置管理: 统一的配置中心管理多个服务的配置
业务相关
- 用户体验: 避免用户在不同管理端间迷失方向
- 数据迁移: 架构升级时的数据迁移和业务连续性保证
- 业务隔离: 确保不同管理端的业务逻辑完全独立
- 审计合规: 满足不同业务域的审计和合规要求
企业级多管理端配置
js
import { createDux, simpleDataProvider } from '@duxweb/dvha-core'
// 认证提供者
const createAuthProvider = (baseUrl) => ({
login: async (params) => {
const response = await fetch(`${baseUrl}/auth/login`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(params)
})
return await response.json()
},
logout: async () => {
await fetch(`${baseUrl}/auth/logout`, { method: 'POST' })
return { success: true }
}
})
const app = createDux({
// 全局配置
title: '企业管理平台',
copyright: '© 2024 Enterprise Corp',
defaultManage: 'admin',
manages: [
// 系统管理端
{
name: 'admin',
title: '系统管理',
description: '企业系统管理后台',
routePrefix: '/admin',
authProvider: createAuthProvider('https://admin-api.example.com'),
dataProvider: simpleDataProvider({
apiUrl: 'https://admin-api.example.com'
}),
register: false,
forgotPassword: true,
menus: [
{
name: 'dashboard',
label: '系统概览',
path: 'dashboard',
icon: 'dashboard',
component: () => import('./admin/Dashboard.vue')
},
{
name: 'users',
label: '用户管理',
path: 'users',
icon: 'users',
component: () => import('./admin/Users.vue')
}
],
theme: {
logo: '/logos/admin-logo.png',
banner: '/banners/admin-banner.jpg'
},
components: {
authLayout: () => import('./layouts/AdminLayout.vue'),
noAuthLayout: () => import('./layouts/AdminLogin.vue')
}
},
// 用户中心
{
name: 'user',
title: '用户中心',
description: '用户个人管理中心',
routePrefix: '/user',
authProvider: createAuthProvider('https://user-api.example.com'),
dataProvider: simpleDataProvider({
apiUrl: 'https://user-api.example.com'
}),
register: true,
forgotPassword: true,
updatePassword: true,
menus: [
{
name: 'profile',
label: '个人资料',
path: 'profile',
icon: 'user',
component: () => import('./user/Profile.vue')
},
{
name: 'settings',
label: '账户设置',
path: 'settings',
icon: 'settings',
component: () => import('./user/Settings.vue')
}
],
theme: {
logo: '/logos/user-logo.png',
banner: '/banners/user-banner.jpg'
},
components: {
authLayout: () => import('./layouts/UserLayout.vue'),
noAuthLayout: () => import('./layouts/UserLogin.vue')
}
},
// 商家后台 - 使用多数据提供者
{
name: 'merchant',
title: '商家后台',
description: '商家店铺管理后台',
routePrefix: '/merchant',
authProvider: createAuthProvider('https://merchant-api.example.com'),
// 多数据提供者配置
dataProvider: {
default: simpleDataProvider({
apiUrl: 'https://merchant-api.example.com'
}),
analytics: simpleDataProvider({
apiUrl: 'https://analytics-api.example.com'
}),
payment: simpleDataProvider({
apiUrl: 'https://payment-api.example.com'
}),
logistics: simpleDataProvider({
apiUrl: 'https://logistics-api.example.com'
})
},
register: true,
forgotPassword: true,
updatePassword: true,
apiRoutePath: '/api/merchant/menus', // 动态菜单
menus: [
{
name: 'dashboard',
label: '店铺概览',
path: 'dashboard',
icon: 'dashboard',
component: () => import('./merchant/Dashboard.vue')
}
],
theme: {
logo: '/logos/merchant-logo.png',
banner: '/banners/merchant-banner.jpg'
},
components: {
authLayout: () => import('./layouts/MerchantLayout.vue'),
noAuthLayout: () => import('./layouts/MerchantLogin.vue')
}
}
]
})
使用管理端配置
vue
<script setup>
import { useManage } from '@duxweb/dvha-core'
// 获取当前管理端配置
const manage = useManage()
console.log('管理端名称:', manage.config.name)
console.log('管理端标题:', manage.config.title)
// 生成路由路径
const dashboardPath = manage.getRoutePath('dashboard')
console.log('仪表盘路径:', dashboardPath)
// 生成API地址 - 使用默认数据提供者
const usersApiUrl = manage.getApiUrl('users')
console.log('用户API地址:', usersApiUrl)
// 生成API地址 - 使用指定的数据提供者
const analyticsApiUrl = manage.getApiUrl('stats', 'analytics')
console.log('分析API地址:', analyticsApiUrl)
const paymentApiUrl = manage.getApiUrl('transactions', 'payment')
console.log('支付API地址:', paymentApiUrl)
</script>