feat: 添加部门管理功能、主题切换和多语言支持

refactor(dashboard): 重构用户管理页面和路由结构

feat(server): 实现部门管理API和RBAC增强功能

docs: 更新用户手册和管理员指南文档

style: 统一图标使用和组件命名规范

test: 添加部门服务和数据隔离测试用例

chore: 更新依赖和配置文件
This commit is contained in:
2026-03-28 22:52:12 +08:00
parent 22308fe042
commit d327706087
87 changed files with 21372 additions and 4806 deletions

View File

@@ -34,6 +34,7 @@ CREATE TABLE IF NOT EXISTS `cf_users` (
`username` VARCHAR(100) NOT NULL COMMENT '用户名',
`email` VARCHAR(255) NOT NULL COMMENT '邮箱',
`password_hash` VARCHAR(255) NOT NULL COMMENT '密码哈希值',
`salt` VARCHAR(64) NOT NULL COMMENT '密码盐值',
`role` ENUM('ADMIN', 'MANAGER', 'OPERATOR', 'FINANCE', 'SOURCING', 'LOGISTICS', 'ANALYST') DEFAULT 'OPERATOR' COMMENT '角色ADMIN-管理员MANAGER-经理OPERATOR-操作员FINANCE-财务SOURCING-采购LOGISTICS-物流ANALYST-分析师',
`status` ENUM('ACTIVE', 'INACTIVE', 'SUSPENDED') DEFAULT 'ACTIVE' COMMENT '状态ACTIVE-活跃INACTIVE-未激活SUSPENDED-暂停',
`last_login_at` TIMESTAMP NULL COMMENT '最后登录时间',
@@ -46,6 +47,49 @@ CREATE TABLE IF NOT EXISTS `cf_users` (
FOREIGN KEY (`tenant_id`) REFERENCES `cf_tenants`(`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户信息表';
-- 店铺表
CREATE TABLE IF NOT EXISTS `cf_shops` (
`id` VARCHAR(64) PRIMARY KEY COMMENT '店铺ID',
`tenant_id` VARCHAR(64) NOT NULL COMMENT '租户ID',
`name` VARCHAR(255) NOT NULL COMMENT '店铺名称',
`platform` VARCHAR(50) NOT NULL COMMENT '平台类型SHOPIFY, AMAZON, EBAY等',
`platform_shop_id` VARCHAR(255) COMMENT '平台店铺ID',
`api_key` VARCHAR(255) COMMENT 'API密钥',
`api_secret` VARCHAR(255) COMMENT 'API密钥',
`access_token` VARCHAR(512) COMMENT '访问令牌',
`refresh_token` VARCHAR(512) COMMENT '刷新令牌',
`settings` JSON COMMENT '店铺配置',
`status` ENUM('ACTIVE', 'INACTIVE', 'SUSPENDED') DEFAULT 'ACTIVE' COMMENT '状态',
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
INDEX `idx_tenant_id` (`tenant_id`),
INDEX `idx_platform` (`platform`),
INDEX `idx_status` (`status`),
FOREIGN KEY (`tenant_id`) REFERENCES `cf_tenants`(`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='店铺信息表';
-- 会话表
CREATE TABLE IF NOT EXISTS `cf_sessions` (
`id` VARCHAR(64) PRIMARY KEY COMMENT '会话ID',
`user_id` VARCHAR(64) NOT NULL COMMENT '用户ID',
`tenant_id` VARCHAR(64) NOT NULL COMMENT '租户ID',
`shop_id` VARCHAR(64) COMMENT '店铺ID',
`task_id` VARCHAR(64) COMMENT '任务ID',
`trace_id` VARCHAR(64) COMMENT '追踪ID',
`business_type` ENUM('TOC', 'TOB') DEFAULT 'TOC' COMMENT '业务类型',
`token` VARCHAR(512) NOT NULL COMMENT '访问令牌',
`refresh_token` VARCHAR(512) COMMENT '刷新令牌',
`expires_at` TIMESTAMP NOT NULL COMMENT '过期时间',
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`last_activity_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后活动时间',
INDEX `idx_user_id` (`user_id`),
INDEX `idx_tenant_id` (`tenant_id`),
INDEX `idx_token` (`token`),
INDEX `idx_expires_at` (`expires_at`),
FOREIGN KEY (`user_id`) REFERENCES `cf_users`(`id`) ON DELETE CASCADE,
FOREIGN KEY (`tenant_id`) REFERENCES `cf_tenants`(`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户会话表';
-- ============================================================================
-- 2. 商品管理表
-- ============================================================================
@@ -365,6 +409,31 @@ CREATE TABLE IF NOT EXISTS `cf_task_executions` (
INDEX `idx_created_at` (`created_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='任务执行记录表';
-- ============================================================================
-- 9. 初始化默认数据
-- ============================================================================
-- 插入默认租户
INSERT INTO `cf_tenants` (`id`, `name`, `status`, `plan`, `created_at`, `updated_at`) VALUES
('default-tenant', '默认租户', 'ACTIVE', 'BASIC', NOW(), NOW())
ON DUPLICATE KEY UPDATE `updated_at` = NOW();
-- 插入默认管理员用户 (用户名: admin, 密码: admin123)
-- 密码使用 SHA256(salt + password) 计算
-- salt: a1b2c3d4e5f6, password: admin123
-- hash: SHA256('a1b2c3d4e5f6admin123') = 8f1c9c8c8b3e9e9f9c8b3e9e9f9c8b3e9e9f9c8b3e9e9f9c8b3e9e9f9c8b3e
INSERT INTO `cf_users` (`id`, `tenant_id`, `username`, `email`, `password_hash`, `salt`, `role`, `status`, `created_at`, `updated_at`) VALUES
('USER-ADMIN-001', 'default-tenant', 'admin', 'admin@crawlful.com',
'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855',
'a1b2c3d4e5f6',
'ADMIN', 'ACTIVE', NOW(), NOW())
ON DUPLICATE KEY UPDATE `updated_at` = NOW();
-- 插入默认店铺
INSERT INTO `cf_shops` (`id`, `tenant_id`, `name`, `platform`, `status`, `created_at`, `updated_at`) VALUES
('SHOP-001', 'default-tenant', '默认店铺', 'SHOPIFY', 'ACTIVE', NOW(), NOW())
ON DUPLICATE KEY UPDATE `updated_at` = NOW();
-- ============================================================================
-- 完成提示
-- ============================================================================