500 lines
25 KiB
SQL
500 lines
25 KiB
SQL
-- =============================================
|
||
-- 星撰个人综合平台 - 基础用户系统数据库结构导出
|
||
-- 版本: M2 基础用户系统
|
||
-- 生成时间: 2024-12-30
|
||
-- 数据库: MySQL 8.0+
|
||
-- =============================================
|
||
|
||
SET NAMES utf8mb4;
|
||
SET FOREIGN_KEY_CHECKS = 0;
|
||
|
||
-- =============================================
|
||
-- 1. 用户表 (sys_users)
|
||
-- =============================================
|
||
DROP TABLE IF EXISTS `sys_users`;
|
||
CREATE TABLE `sys_users` (
|
||
`id` BIGINT NOT NULL COMMENT '主键,雪花ID',
|
||
`username` VARCHAR(50) NOT NULL COMMENT '用户名,唯一',
|
||
`email` VARCHAR(100) NOT NULL COMMENT '邮箱,唯一',
|
||
`mobile` VARCHAR(20) NULL COMMENT '手机号',
|
||
`password_hash` VARCHAR(255) NOT NULL COMMENT '密码哈希值',
|
||
`avatar` VARCHAR(255) NULL COMMENT '头像URL',
|
||
`nickname` VARCHAR(100) NULL COMMENT '昵称',
|
||
`status` VARCHAR(20) NOT NULL DEFAULT 'active' COMMENT '状态:active-正常,inactive-未激活,locked-锁定,disabled-禁用',
|
||
`gender` TINYINT NULL DEFAULT 0 COMMENT '性别:0-未知,1-男,2-女',
|
||
`birthday` DATE NULL COMMENT '生日',
|
||
`bio` VARCHAR(500) NULL COMMENT '个人简介',
|
||
`login_count` INT NOT NULL DEFAULT 0 COMMENT '登录次数',
|
||
`last_login_at` DATETIME NULL COMMENT '最后登录时间',
|
||
`last_login_ip` VARCHAR(45) NULL COMMENT '最后登录IP',
|
||
`failed_attempts` INT NOT NULL DEFAULT 0 COMMENT '连续失败尝试次数',
|
||
`locked_until` DATETIME NULL COMMENT '锁定截止时间',
|
||
`is_root` BOOLEAN NOT NULL DEFAULT FALSE COMMENT '是否超级管理员',
|
||
`extra` JSON NULL COMMENT '扩展信息,JSON格式',
|
||
`created_by` BIGINT NULL COMMENT '创建人ID',
|
||
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||
`updated_by` BIGINT NULL COMMENT '更新人ID',
|
||
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||
`deleted_at` DATETIME NULL COMMENT '删除时间,软删除标记',
|
||
`version` INT NOT NULL DEFAULT 1 COMMENT '乐观锁版本号',
|
||
PRIMARY KEY (`id`)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户表';
|
||
|
||
-- 用户表索引
|
||
CREATE UNIQUE INDEX `uk_username` ON `sys_users` (`username`, `deleted_at`);
|
||
CREATE UNIQUE INDEX `uk_email` ON `sys_users` (`email`, `deleted_at`);
|
||
CREATE INDEX `idx_mobile` ON `sys_users` (`mobile`);
|
||
CREATE INDEX `idx_status` ON `sys_users` (`status`);
|
||
CREATE INDEX `idx_created_at` ON `sys_users` (`created_at`);
|
||
CREATE INDEX `idx_deleted_at` ON `sys_users` (`deleted_at`);
|
||
CREATE INDEX `idx_is_root` ON `sys_users` (`is_root`);
|
||
CREATE INDEX `idx_last_login` ON `sys_users` (`last_login_at`);
|
||
|
||
-- =============================================
|
||
-- 2. 角色表 (sys_roles)
|
||
-- =============================================
|
||
DROP TABLE IF EXISTS `sys_roles`;
|
||
CREATE TABLE `sys_roles` (
|
||
`id` BIGINT NOT NULL COMMENT '主键',
|
||
`code` VARCHAR(50) NOT NULL COMMENT '角色代码,唯一',
|
||
`name` VARCHAR(100) NOT NULL COMMENT '角色名称',
|
||
`description` TEXT NULL COMMENT '角色描述',
|
||
`pid` BIGINT NULL DEFAULT 0 COMMENT '父角色ID,0表示顶级',
|
||
`path` VARCHAR(500) NULL COMMENT '层级路径,如:/1/2/3/',
|
||
`level` INT NOT NULL DEFAULT 1 COMMENT '层级深度',
|
||
`sort_order` INT NOT NULL DEFAULT 0 COMMENT '同级排序号',
|
||
`status` VARCHAR(20) NOT NULL DEFAULT 'active' COMMENT '状态:active-启用,inactive-禁用',
|
||
`is_system` BOOLEAN NOT NULL DEFAULT FALSE COMMENT '是否系统内置角色',
|
||
`permissions_snapshot` JSON NULL COMMENT '权限快照,用于优化查询',
|
||
`extra` JSON NULL COMMENT '扩展信息',
|
||
`created_by` BIGINT NULL COMMENT '创建人ID',
|
||
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||
`updated_by` BIGINT NULL COMMENT '更新人ID',
|
||
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||
`deleted_at` DATETIME NULL COMMENT '删除时间',
|
||
`version` INT NOT NULL DEFAULT 1 COMMENT '版本号',
|
||
PRIMARY KEY (`id`)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='角色表';
|
||
|
||
-- 角色表索引
|
||
CREATE UNIQUE INDEX `uk_code` ON `sys_roles` (`code`, `deleted_at`);
|
||
CREATE INDEX `idx_name` ON `sys_roles` (`name`);
|
||
CREATE INDEX `idx_pid` ON `sys_roles` (`pid`);
|
||
CREATE INDEX `idx_path` ON `sys_roles` (`path`);
|
||
CREATE INDEX `idx_status` ON `sys_roles` (`status`);
|
||
CREATE INDEX `idx_deleted_at` ON `sys_roles` (`deleted_at`);
|
||
CREATE INDEX `idx_is_system` ON `sys_roles` (`is_system`);
|
||
CREATE INDEX `idx_sort` ON `sys_roles` (`pid`, `sort_order`);
|
||
|
||
-- =============================================
|
||
-- 3. 权限表 (sys_permissions)
|
||
-- =============================================
|
||
DROP TABLE IF EXISTS `sys_permissions`;
|
||
CREATE TABLE `sys_permissions` (
|
||
`id` BIGINT NOT NULL COMMENT '主键',
|
||
`code` VARCHAR(100) NOT NULL COMMENT '权限代码,唯一',
|
||
`name` VARCHAR(100) NOT NULL COMMENT '权限名称',
|
||
`type` VARCHAR(20) NOT NULL COMMENT '权限类型:menu-菜单,button-按钮,api-接口,data-数据',
|
||
`resource` VARCHAR(50) NULL COMMENT '资源标识,如:user,role,post',
|
||
`action` VARCHAR(50) NULL COMMENT '操作标识,如:read,create,update,delete',
|
||
`description` TEXT NULL COMMENT '权限描述',
|
||
`pid` BIGINT NULL DEFAULT 0 COMMENT '父权限ID',
|
||
`path` VARCHAR(500) NULL COMMENT '层级路径',
|
||
`level` INT NOT NULL DEFAULT 1 COMMENT '层级深度',
|
||
`sort_order` INT NOT NULL DEFAULT 0 COMMENT '排序号',
|
||
`status` VARCHAR(20) NOT NULL DEFAULT 'active' COMMENT '状态',
|
||
`meta` JSON NULL COMMENT '元数据,如:图标、路由等',
|
||
`created_by` BIGINT NULL COMMENT '创建人ID',
|
||
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||
`updated_by` BIGINT NULL COMMENT '更新人ID',
|
||
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||
`deleted_at` DATETIME NULL COMMENT '删除时间',
|
||
PRIMARY KEY (`id`)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='权限表';
|
||
|
||
-- 权限表索引
|
||
CREATE UNIQUE INDEX `uk_code` ON `sys_permissions` (`code`, `deleted_at`);
|
||
CREATE INDEX `idx_type` ON `sys_permissions` (`type`);
|
||
CREATE INDEX `idx_resource_action` ON `sys_permissions` (`resource`, `action`);
|
||
CREATE INDEX `idx_pid` ON `sys_permissions` (`pid`);
|
||
CREATE INDEX `idx_deleted_at` ON `sys_permissions` (`deleted_at`);
|
||
CREATE INDEX `idx_status` ON `sys_permissions` (`status`);
|
||
CREATE INDEX `idx_sort` ON `sys_permissions` (`pid`, `sort_order`);
|
||
|
||
-- =============================================
|
||
-- 4. 组织架构表 (sys_organizations)
|
||
-- =============================================
|
||
DROP TABLE IF EXISTS `sys_organizations`;
|
||
CREATE TABLE `sys_organizations` (
|
||
`id` BIGINT NOT NULL COMMENT '主键',
|
||
`code` VARCHAR(100) NOT NULL COMMENT '组织代码,唯一',
|
||
`name` VARCHAR(200) NOT NULL COMMENT '组织名称',
|
||
`full_name` VARCHAR(200) NULL COMMENT '组织全称',
|
||
`description` TEXT NULL COMMENT '组织描述',
|
||
`pid` BIGINT NULL DEFAULT 0 COMMENT '父组织ID',
|
||
`path` VARCHAR(500) NULL COMMENT '层级路径',
|
||
`level` INT NOT NULL DEFAULT 1 COMMENT '层级深度',
|
||
`type` VARCHAR(20) NULL COMMENT '组织类型:company,department,team',
|
||
`status` VARCHAR(20) NOT NULL DEFAULT 'active' COMMENT '状态',
|
||
`sort_order` INT NOT NULL DEFAULT 0 COMMENT '排序号',
|
||
`leader_id` BIGINT NULL COMMENT '负责人ID',
|
||
`address` VARCHAR(200) NULL COMMENT '地址',
|
||
`phone` VARCHAR(50) NULL COMMENT '联系电话',
|
||
`extra` JSON NULL COMMENT '扩展信息',
|
||
`created_by` BIGINT NULL COMMENT '创建人ID',
|
||
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||
`updated_by` BIGINT NULL COMMENT '更新人ID',
|
||
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||
`deleted_at` DATETIME NULL COMMENT '删除时间',
|
||
`version` INT NOT NULL DEFAULT 1 COMMENT '版本号',
|
||
PRIMARY KEY (`id`)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='组织架构表';
|
||
|
||
-- 组织架构表索引
|
||
CREATE UNIQUE INDEX `uk_code` ON `sys_organizations` (`code`, `deleted_at`);
|
||
CREATE INDEX `idx_name` ON `sys_organizations` (`name`);
|
||
CREATE INDEX `idx_pid` ON `sys_organizations` (`pid`);
|
||
CREATE INDEX `idx_path` ON `sys_organizations` (`path`);
|
||
CREATE INDEX `idx_type` ON `sys_organizations` (`type`);
|
||
CREATE INDEX `idx_leader_id` ON `sys_organizations` (`leader_id`);
|
||
CREATE INDEX `idx_deleted_at` ON `sys_organizations` (`deleted_at`);
|
||
CREATE INDEX `idx_status` ON `sys_organizations` (`status`);
|
||
CREATE INDEX `idx_sort` ON `sys_organizations` (`pid`, `sort_order`);
|
||
|
||
-- =============================================
|
||
-- 5. 字典类型表 (sys_dict_types)
|
||
-- =============================================
|
||
DROP TABLE IF EXISTS `sys_dict_types`;
|
||
CREATE TABLE `sys_dict_types` (
|
||
`id` BIGINT NOT NULL COMMENT '主键',
|
||
`code` VARCHAR(50) NOT NULL COMMENT '字典类型代码,唯一',
|
||
`name` VARCHAR(100) NOT NULL COMMENT '字典类型名称',
|
||
`description` TEXT NULL COMMENT '描述',
|
||
`pid` BIGINT NULL DEFAULT 0 COMMENT '父字典类型ID,支持字典分类',
|
||
`path` VARCHAR(500) NULL COMMENT '层级路径',
|
||
`level` INT NOT NULL DEFAULT 1 COMMENT '层级深度',
|
||
`status` VARCHAR(20) NOT NULL DEFAULT 'active' COMMENT '状态:active-启用,inactive-禁用',
|
||
`is_system` BOOLEAN NOT NULL DEFAULT FALSE COMMENT '是否系统内置',
|
||
`sort_order` INT NOT NULL DEFAULT 0 COMMENT '排序号',
|
||
`created_by` BIGINT NULL COMMENT '创建人ID',
|
||
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||
`updated_by` BIGINT NULL COMMENT '更新人ID',
|
||
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||
`deleted_at` DATETIME NULL COMMENT '删除时间',
|
||
PRIMARY KEY (`id`)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='字典类型表';
|
||
|
||
-- 字典类型表索引
|
||
CREATE UNIQUE INDEX `uk_code` ON `sys_dict_types` (`code`, `deleted_at`);
|
||
CREATE INDEX `idx_name` ON `sys_dict_types` (`name`);
|
||
CREATE INDEX `idx_pid` ON `sys_dict_types` (`pid`);
|
||
CREATE INDEX `idx_path` ON `sys_dict_types` (`path`);
|
||
CREATE INDEX `idx_status` ON `sys_dict_types` (`status`);
|
||
CREATE INDEX `idx_deleted_at` ON `sys_dict_types` (`deleted_at`);
|
||
CREATE INDEX `idx_is_system` ON `sys_dict_types` (`is_system`);
|
||
CREATE INDEX `idx_sort` ON `sys_dict_types` (`pid`, `sort_order`);
|
||
|
||
-- =============================================
|
||
-- 6. 字典项表 (sys_dict_items)
|
||
-- =============================================
|
||
DROP TABLE IF EXISTS `sys_dict_items`;
|
||
CREATE TABLE `sys_dict_items` (
|
||
`id` BIGINT NOT NULL COMMENT '主键',
|
||
`type_id` BIGINT NOT NULL COMMENT '字典类型ID',
|
||
`item_key` VARCHAR(50) NOT NULL COMMENT '字典项键',
|
||
`item_value` VARCHAR(200) NOT NULL COMMENT '字典项值',
|
||
`label` VARCHAR(100) NOT NULL COMMENT '显示标签',
|
||
`label_en` VARCHAR(200) NULL COMMENT '英文标签',
|
||
`description` TEXT NULL COMMENT '描述',
|
||
`pid` BIGINT NULL DEFAULT 0 COMMENT '父字典项ID,支持树形字典',
|
||
`path` VARCHAR(500) NULL COMMENT '层级路径',
|
||
`level` INT NOT NULL DEFAULT 1 COMMENT '层级深度',
|
||
`sort_order` INT NOT NULL DEFAULT 0 COMMENT '排序号',
|
||
`status` VARCHAR(20) NOT NULL DEFAULT 'active' COMMENT '状态',
|
||
`css_class` VARCHAR(50) NULL COMMENT 'CSS样式类',
|
||
`color` VARCHAR(50) NULL COMMENT '颜色值,如:#FF0000',
|
||
`extra` JSON NULL COMMENT '扩展属性',
|
||
`created_by` BIGINT NULL COMMENT '创建人ID',
|
||
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||
`updated_by` BIGINT NULL COMMENT '更新人ID',
|
||
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||
`deleted_at` DATETIME NULL COMMENT '删除时间',
|
||
PRIMARY KEY (`id`)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='字典项表';
|
||
|
||
-- 字典项表索引
|
||
CREATE UNIQUE INDEX `uk_type_key` ON `sys_dict_items` (`type_id`, `item_key`, `deleted_at`);
|
||
CREATE INDEX `idx_type_id` ON `sys_dict_items` (`type_id`);
|
||
CREATE INDEX `idx_pid` ON `sys_dict_items` (`pid`);
|
||
CREATE INDEX `idx_status` ON `sys_dict_items` (`status`);
|
||
CREATE INDEX `idx_deleted_at` ON `sys_dict_items` (`deleted_at`);
|
||
CREATE INDEX `idx_sort` ON `sys_dict_items` (`type_id`, `sort_order`);
|
||
CREATE INDEX `idx_key` ON `sys_dict_items` (`item_key`);
|
||
|
||
-- =============================================
|
||
-- 7. 标签表 (sys_tags)
|
||
-- =============================================
|
||
DROP TABLE IF EXISTS `sys_tags`;
|
||
CREATE TABLE `sys_tags` (
|
||
`id` BIGINT NOT NULL COMMENT '主键',
|
||
`name` VARCHAR(50) NOT NULL COMMENT '标签名称',
|
||
`type` VARCHAR(50) NULL DEFAULT 'user' COMMENT '标签类型:user-用户标签,role-角色标签,content-内容标签',
|
||
`color` VARCHAR(50) NULL COMMENT '标签颜色,如:#FF0000',
|
||
`description` TEXT NULL COMMENT '描述',
|
||
`usage_count` INT NOT NULL DEFAULT 0 COMMENT '使用次数统计',
|
||
`created_by` BIGINT NULL COMMENT '创建人ID',
|
||
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||
`deleted_at` DATETIME NULL COMMENT '删除时间',
|
||
PRIMARY KEY (`id`)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='标签表';
|
||
|
||
-- 标签表索引
|
||
CREATE UNIQUE INDEX `uk_name_type` ON `sys_tags` (`name`, `type`, `deleted_at`);
|
||
CREATE INDEX `idx_type` ON `sys_tags` (`type`);
|
||
CREATE INDEX `idx_usage_count` ON `sys_tags` (`usage_count` DESC);
|
||
CREATE INDEX `idx_deleted_at` ON `sys_tags` (`deleted_at`);
|
||
CREATE INDEX `idx_name` ON `sys_tags` (`name`);
|
||
|
||
-- =============================================
|
||
-- 8. 用户角色关联表 (sys_user_roles)
|
||
-- =============================================
|
||
DROP TABLE IF EXISTS `sys_user_roles`;
|
||
CREATE TABLE `sys_user_roles` (
|
||
`id` BIGINT NOT NULL COMMENT '主键',
|
||
`user_id` BIGINT NOT NULL COMMENT '用户ID',
|
||
`role_id` BIGINT NOT NULL COMMENT '角色ID',
|
||
`expired_at` DATETIME NULL COMMENT '过期时间,NULL表示永久',
|
||
`created_by` BIGINT NULL COMMENT '创建人ID',
|
||
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||
PRIMARY KEY (`id`)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户角色关联表';
|
||
|
||
-- 用户角色关联表索引
|
||
CREATE UNIQUE INDEX `uk_user_role` ON `sys_user_roles` (`user_id`, `role_id`);
|
||
CREATE INDEX `idx_user_id` ON `sys_user_roles` (`user_id`);
|
||
CREATE INDEX `idx_role_id` ON `sys_user_roles` (`role_id`);
|
||
CREATE INDEX `idx_expired_at` ON `sys_user_roles` (`expired_at`);
|
||
CREATE INDEX `idx_created_at` ON `sys_user_roles` (`created_at`);
|
||
|
||
-- =============================================
|
||
-- 9. 角色权限关联表 (sys_role_permissions)
|
||
-- =============================================
|
||
DROP TABLE IF EXISTS `sys_role_permissions`;
|
||
CREATE TABLE `sys_role_permissions` (
|
||
`id` BIGINT NOT NULL COMMENT '主键',
|
||
`role_id` BIGINT NOT NULL COMMENT '角色ID',
|
||
`permission_id` BIGINT NOT NULL COMMENT '权限ID',
|
||
`is_half` BOOLEAN NOT NULL DEFAULT FALSE COMMENT '是否半选状态(树形权限)',
|
||
`created_by` BIGINT NULL COMMENT '创建人ID',
|
||
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||
PRIMARY KEY (`id`)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='角色权限关联表';
|
||
|
||
-- 角色权限关联表索引
|
||
CREATE UNIQUE INDEX `uk_role_permission` ON `sys_role_permissions` (`role_id`, `permission_id`);
|
||
CREATE INDEX `idx_role_id` ON `sys_role_permissions` (`role_id`);
|
||
CREATE INDEX `idx_permission_id` ON `sys_role_permissions` (`permission_id`);
|
||
CREATE INDEX `idx_is_half` ON `sys_role_permissions` (`is_half`);
|
||
|
||
-- =============================================
|
||
-- 10. 用户组织关联表 (sys_user_organizations)
|
||
-- =============================================
|
||
DROP TABLE IF EXISTS `sys_user_organizations`;
|
||
CREATE TABLE `sys_user_organizations` (
|
||
`id` BIGINT NOT NULL COMMENT '主键',
|
||
`user_id` BIGINT NOT NULL COMMENT '用户ID',
|
||
`organization_id` BIGINT NOT NULL COMMENT '组织ID',
|
||
`is_primary` BOOLEAN NOT NULL DEFAULT FALSE COMMENT '是否主组织',
|
||
`position` VARCHAR(100) NULL COMMENT '职位',
|
||
`joined_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '加入时间',
|
||
`created_by` BIGINT NULL COMMENT '创建人ID',
|
||
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||
PRIMARY KEY (`id`)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户组织关联表';
|
||
|
||
-- 用户组织关联表索引
|
||
CREATE UNIQUE INDEX `uk_user_org` ON `sys_user_organizations` (`user_id`, `organization_id`);
|
||
CREATE INDEX `idx_user_id` ON `sys_user_organizations` (`user_id`);
|
||
CREATE INDEX `idx_organization_id` ON `sys_user_organizations` (`organization_id`);
|
||
CREATE INDEX `idx_is_primary` ON `sys_user_organizations` (`is_primary`);
|
||
CREATE INDEX `idx_joined_at` ON `sys_user_organizations` (`joined_at`);
|
||
|
||
-- =============================================
|
||
-- 11. 用户标签关联表 (sys_user_tags)
|
||
-- =============================================
|
||
DROP TABLE IF EXISTS `sys_user_tags`;
|
||
CREATE TABLE `sys_user_tags` (
|
||
`id` BIGINT NOT NULL COMMENT '主键',
|
||
`user_id` BIGINT NOT NULL COMMENT '用户ID',
|
||
`tag_id` BIGINT NOT NULL COMMENT '标签ID',
|
||
`created_by` BIGINT NULL COMMENT '创建人ID',
|
||
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||
PRIMARY KEY (`id`)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户标签关联表';
|
||
|
||
-- 用户标签关联表索引
|
||
CREATE UNIQUE INDEX `uk_user_tag` ON `sys_user_tags` (`user_id`, `tag_id`);
|
||
CREATE INDEX `idx_user_id` ON `sys_user_tags` (`user_id`);
|
||
CREATE INDEX `idx_tag_id` ON `sys_user_tags` (`tag_id`);
|
||
CREATE INDEX `idx_created_at` ON `sys_user_tags` (`created_at`);
|
||
|
||
-- =============================================
|
||
-- 12. 操作日志表 (sys_operation_logs)
|
||
-- =============================================
|
||
DROP TABLE IF EXISTS `sys_operation_logs`;
|
||
CREATE TABLE `sys_operation_logs` (
|
||
`id` BIGINT NOT NULL COMMENT '主键',
|
||
`user_id` BIGINT NULL COMMENT '操作用户ID',
|
||
`username` VARCHAR(100) NULL COMMENT '操作用户名',
|
||
`module` VARCHAR(50) NOT NULL COMMENT '操作模块',
|
||
`action` VARCHAR(50) NOT NULL COMMENT '操作类型',
|
||
`target` VARCHAR(200) NULL COMMENT '操作对象描述',
|
||
`target_id` BIGINT NULL COMMENT '操作对象ID',
|
||
`request_data` TEXT NULL COMMENT '请求数据',
|
||
`response_data` TEXT NULL COMMENT '响应数据',
|
||
`status` VARCHAR(20) NOT NULL COMMENT '操作状态:success-成功,fail-失败',
|
||
`ip` VARCHAR(45) NULL COMMENT 'IP地址',
|
||
`user_agent` VARCHAR(200) NULL COMMENT '用户代理',
|
||
`duration` BIGINT NULL COMMENT '操作耗时(毫秒)',
|
||
`error_msg` TEXT NULL COMMENT '错误信息',
|
||
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||
PRIMARY KEY (`id`)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='操作日志表';
|
||
|
||
-- 操作日志表索引
|
||
CREATE INDEX `idx_user_id` ON `sys_operation_logs` (`user_id`);
|
||
CREATE INDEX `idx_module_action` ON `sys_operation_logs` (`module`, `action`);
|
||
CREATE INDEX `idx_target` ON `sys_operation_logs` (`target_id`);
|
||
CREATE INDEX `idx_status` ON `sys_operation_logs` (`status`);
|
||
CREATE INDEX `idx_created_at` ON `sys_operation_logs` (`created_at`);
|
||
CREATE INDEX `idx_ip` ON `sys_operation_logs` (`ip`);
|
||
|
||
-- =============================================
|
||
-- 初始化数据
|
||
-- =============================================
|
||
|
||
-- -- 1. 系统初始用户
|
||
-- INSERT INTO `sys_users` (`id`, `username`, `email`, `password_hash`, `nickname`, `is_root`, `status`)
|
||
-- VALUES (1, 'root', 'root@system.local', '$2b$12$LQv3c1yqBWVHxkd0LHAkCOYz6TtxMQJqhN8/LewYpfQaXUIkRrPJK', '超级管理员', TRUE, 'active');
|
||
|
||
-- INSERT INTO `sys_users` (`id`, `username`, `email`, `password_hash`, `nickname`, `status`)
|
||
-- VALUES (2, 'admin', 'admin@system.local', '$2b$12$LQv3c1yqBWVHxkd0LHAkCOYz6TtxMQJqhN8/LewYpfQaXUIkRrPJK', '系统管理员', 'active');
|
||
|
||
-- -- 2. 系统初始角色
|
||
-- INSERT INTO `sys_roles` (`id`, `code`, `name`, `description`, `is_system`, `status`)
|
||
-- VALUES (1, 'super_admin', '超级管理员', '拥有系统所有权限', TRUE, 'active');
|
||
|
||
-- INSERT INTO `sys_roles` (`id`, `code`, `name`, `description`, `is_system`, `status`, `pid`, `path`, `level`)
|
||
-- VALUES (2, 'admin', '系统管理员', '负责系统配置和用户管理', TRUE, 'active', 1, '/1/2/', 2);
|
||
|
||
-- INSERT INTO `sys_roles` (`id`, `code`, `name`, `description`, `is_system`, `status`)
|
||
-- VALUES (3, 'user', '普通用户', '普通注册用户默认角色', TRUE, 'active');
|
||
|
||
-- -- 3. 分配角色
|
||
-- INSERT INTO `sys_user_roles` (`user_id`, `role_id`) VALUES (1, 1);
|
||
-- INSERT INTO `sys_user_roles` (`user_id`, `role_id`) VALUES (2, 2);
|
||
|
||
-- -- 4. 字典分类
|
||
-- INSERT INTO `sys_dict_types` (`id`, `code`, `name`, `is_system`) VALUES
|
||
-- (1, 'system', '系统字典', TRUE),
|
||
-- (2, 'business', '业务字典', TRUE);
|
||
|
||
-- -- 5. 用户状态字典
|
||
-- INSERT INTO `sys_dict_types` (`id`, `code`, `name`, `is_system`, `pid`, `path`) VALUES
|
||
-- (10, 'user_status', '用户状态', TRUE, 1, '/1/10/');
|
||
|
||
-- INSERT INTO `sys_dict_items` (`type_id`, `item_key`, `item_value`, `label`, `color`, `sort_order`) VALUES
|
||
-- (10, 'active', 'active', '正常', '#52c41a', 1),
|
||
-- (10, 'inactive', 'inactive', '未激活', '#faad14', 2),
|
||
-- (10, 'locked', 'locked', '锁定', '#ff4d4f', 3),
|
||
-- (10, 'disabled', 'disabled', '禁用', '#d9d9d9', 4);
|
||
|
||
-- -- 6. 组织类型字典
|
||
-- INSERT INTO `sys_dict_types` (`id`, `code`, `name`, `is_system`, `pid`, `path`) VALUES
|
||
-- (11, 'org_type', '组织类型', TRUE, 1, '/1/11/');
|
||
|
||
-- INSERT INTO `sys_dict_items` (`type_id`, `item_key`, `item_value`, `label`, `sort_order`) VALUES
|
||
-- (11, 'company', 'company', '公司', 1),
|
||
-- (11, 'department', 'department', '部门', 2),
|
||
-- (11, 'team', 'team', '团队', 3),
|
||
-- (11, 'group', 'group', '小组', 4);
|
||
|
||
-- -- 7. 性别字典
|
||
-- INSERT INTO `sys_dict_types` (`id`, `code`, `name`, `is_system`, `pid`, `path`) VALUES
|
||
-- (12, 'gender', '性别', TRUE, 1, '/1/12/');
|
||
|
||
-- INSERT INTO `sys_dict_items` (`type_id`, `item_key`, `item_value`, `label`, `sort_order`) VALUES
|
||
-- (12, '0', '0', '未知', 1),
|
||
-- (12, '1', '1', '男', 2),
|
||
-- (12, '2', '2', '女', 3);
|
||
|
||
-- -- 8. 权限类型字典
|
||
-- INSERT INTO `sys_dict_types` (`id`, `code`, `name`, `is_system`, `pid`, `path`) VALUES
|
||
-- (13, 'permission_type', '权限类型', TRUE, 1, '/1/13/');
|
||
|
||
-- INSERT INTO `sys_dict_items` (`type_id`, `item_key`, `item_value`, `label`, `color`, `sort_order`) VALUES
|
||
-- (13, 'menu', 'menu', '菜单', '#1890ff', 1),
|
||
-- (13, 'button', 'button', '按钮', '#52c41a', 2),
|
||
-- (13, 'api', 'api', '接口', '#fa8c16', 3),
|
||
-- (13, 'data', 'data', '数据', '#722ed1', 4);
|
||
|
||
-- -- 9. 标签类型字典
|
||
-- INSERT INTO `sys_dict_types` (`id`, `code`, `name`, `is_system`, `pid`, `path`) VALUES
|
||
-- (14, 'tag_type', '标签类型', TRUE, 1, '/1/14/');
|
||
|
||
-- INSERT INTO `sys_dict_items` (`type_id`, `item_key`, `item_value`, `label`, `sort_order`) VALUES
|
||
-- (14, 'user', 'user', '用户标签', 1),
|
||
-- (14, 'role', 'role', '角色标签', 2),
|
||
-- (14, 'content', 'content', '内容标签', 3);
|
||
|
||
-- -- 10. 地区字典(示例)
|
||
-- INSERT INTO `sys_dict_types` (`id`, `code`, `name`, `is_system`, `pid`, `path`) VALUES
|
||
-- (20, 'region', '地区', TRUE, 2, '/2/20/');
|
||
|
||
-- INSERT INTO `sys_dict_items` (`type_id`, `item_key`, `item_value`, `label`, `sort_order`) VALUES
|
||
-- (20, 'CN', 'CN', '中国', 1);
|
||
|
||
-- -- 11. 基础权限数据
|
||
-- INSERT INTO `sys_permissions` (`id`, `code`, `name`, `type`, `resource`, `action`) VALUES
|
||
-- (1, 'system:manage', '系统管理', 'menu', 'system', 'manage'),
|
||
-- (2, 'user:read', '查看用户', 'api', 'user', 'read'),
|
||
-- (3, 'user:create', '创建用户', 'api', 'user', 'create'),
|
||
-- (4, 'user:update', '更新用户', 'api', 'user', 'update'),
|
||
-- (5, 'user:delete', '删除用户', 'api', 'user', 'delete'),
|
||
-- (6, 'role:read', '查看角色', 'api', 'role', 'read'),
|
||
-- (7, 'role:create', '创建角色', 'api', 'role', 'create'),
|
||
-- (8, 'role:update', '更新角色', 'api', 'role', 'update'),
|
||
-- (9, 'role:delete', '删除角色', 'api', 'role', 'delete');
|
||
|
||
-- -- 12. 为超级管理员角色分配所有权限
|
||
-- INSERT INTO `sys_role_permissions` (`role_id`, `permission_id`)
|
||
-- SELECT 1, id FROM `sys_permissions`;
|
||
|
||
-- -- 13. 初始组织架构
|
||
-- INSERT INTO `sys_organizations` (`id`, `code`, `name`, `type`, `status`) VALUES
|
||
-- (1, 'ROOT', '星撰集团', 'company', 'active');
|
||
|
||
-- INSERT INTO `sys_organizations` (`id`, `code`, `name`, `type`, `pid`, `path`, `level`, `status`) VALUES
|
||
-- (2, 'TECH', '技术部', 'department', 1, '/1/2/', 2, 'active'),
|
||
-- (3, 'PRODUCT', '产品部', 'department', 1, '/1/3/', 2, 'active'),
|
||
-- (4, 'OPERATE', '运营部', 'department', 1, '/1/4/', 2, 'active');
|
||
|
||
-- -- 14. 示例标签数据
|
||
-- INSERT INTO `sys_tags` (`name`, `type`, `color`, `description`) VALUES
|
||
-- ('VIP', 'user', '#ff4d4f', 'VIP用户'),
|
||
-- ('活跃用户', 'user', '#52c41a', '经常登录的用户'),
|
||
-- ('内容创作者', 'user', '#1890ff', '发布优质内容的用户'),
|
||
-- ('新用户', 'user', '#faad14', '注册不满30天的用户'),
|
||
-- ('核心角色', 'role', '#ff4d4f', '系统核心角色'),
|
||
-- ('业务角色', 'role', '#1890ff', '业务相关角色');
|
||
|
||
-- SET FOREIGN_KEY_CHECKS = 1;
|
||
|
||
-- -- =============================================
|
||
-- -- 导出完成
|
||
-- -- 说明:
|
||
-- -- 1. 默认密码哈希对应的明文密码是 "123456"
|
||
-- -- 2. 所有ID使用雪花算法生成,这里为演示使用了简单数字
|
||
-- -- 3. 建议在生产环境中修改默认密码
|
||
-- -- 4. 可根据实际需求调整初始化数据
|
||
-- -- ============================================= |