-- 云泽系统数据库初始化脚本
-- 创建时间: 2024
-- 描述: 包含所有系统表的创建和初始化数据

-- 设置字符集
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- =============================================
-- 1. 用户相关表
-- =============================================

-- 创建用户表
CREATE TABLE yz_users (
    id INT PRIMARY KEY AUTO_INCREMENT COMMENT '用户ID',
    username VARCHAR(50) NOT NULL COMMENT '用户名',
    password VARCHAR(255) NOT NULL COMMENT '加密后的密码',
    salt VARCHAR(100) NOT NULL COMMENT '密码盐值',
    email VARCHAR(100) DEFAULT NULL COMMENT '邮箱地址',
    avatar VARCHAR(500) DEFAULT NULL COMMENT '头像URL',
    nickname VARCHAR(50) DEFAULT NULL COMMENT '昵称',
    role VARCHAR(20) DEFAULT 'user' COMMENT '用户角色：admin-管理员，user-普通用户',
    status TINYINT DEFAULT 1 COMMENT '用户状态：0-禁用，1-启用',
    last_login_time DATETIME DEFAULT NULL COMMENT '最后登录时间',
    last_login_ip VARCHAR(45) DEFAULT NULL COMMENT '最后登录IP',
    login_count INT DEFAULT 0 COMMENT '登录次数',
    create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
    create_by VARCHAR(50) DEFAULT NULL COMMENT '创建人',
    update_by VARCHAR(50) DEFAULT NULL COMMENT '更新人',
    
    -- 索引
    UNIQUE KEY uk_username (username),
    INDEX idx_email (email),
    INDEX idx_role (role),
    INDEX idx_status (status),
    INDEX idx_create_time (create_time)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户表';

-- =============================================
-- 2. 菜单相关表
-- =============================================

-- 创建菜单表（增强版，包含完整父子级别参数）
CREATE TABLE yz_menus (
    id INT PRIMARY KEY AUTO_INCREMENT COMMENT '菜单ID',
    name VARCHAR(100) NOT NULL COMMENT '菜单名称',
    path VARCHAR(255) NOT NULL COMMENT '菜单路径',
    parent_id INT DEFAULT 0 COMMENT '父菜单ID，0表示顶级菜单',
    icon VARCHAR(100) DEFAULT NULL COMMENT '菜单图标',
    `order` INT DEFAULT 0 COMMENT '排序序号',
    `status` TINYINT DEFAULT 1 COMMENT '状态：0-禁用，1-启用',
    component_path VARCHAR(500) DEFAULT NULL COMMENT '组件路径',
    is_external TINYINT DEFAULT 0 COMMENT '是否外部链接：0-内部路由，1-外部链接',
    external_url VARCHAR(1000) DEFAULT NULL COMMENT '外部链接地址',
    menu_type TINYINT DEFAULT 1 COMMENT '菜单类型：1-普通菜单，2-分组菜单，3-按钮菜单',
    permission VARCHAR(200) DEFAULT NULL COMMENT '权限标识',
    description VARCHAR(500) DEFAULT NULL COMMENT '菜单描述',
    create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
    create_by VARCHAR(100) DEFAULT NULL COMMENT '创建人',
    update_by VARCHAR(100) DEFAULT NULL COMMENT '更新人',
    
    -- 索引
    INDEX idx_parent_id (parent_id),
    INDEX idx_status (`status`),
    INDEX idx_order (`order`),
    INDEX idx_menu_type (menu_type)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='菜单表（增强版）';

-- =============================================
-- 3. 程序管理相关表
-- =============================================

-- 创建程序分类表
CREATE TABLE yz_program_category (
    category_id INT PRIMARY KEY AUTO_INCREMENT COMMENT '分类ID',
    category_name VARCHAR(100) NOT NULL COMMENT '分类名称',
    category_desc VARCHAR(500) DEFAULT NULL COMMENT '分类描述',
    parent_id INT DEFAULT 0 COMMENT '父分类ID，0表示顶级分类',
    sort_order INT DEFAULT 0 COMMENT '排序序号，用于展示顺序',
    create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
    
    -- 索引
    INDEX idx_parent_id (parent_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='程序分类表';

-- 创建程序信息表
CREATE TABLE yz_program_info (
    program_id INT PRIMARY KEY AUTO_INCREMENT COMMENT '程序ID',
    category_id INT NOT NULL COMMENT '所属分类ID',
    program_name VARCHAR(200) NOT NULL COMMENT '程序名称',
    program_desc TEXT COMMENT '程序描述',
    jump_url VARCHAR(1000) NOT NULL COMMENT '跳转地址',
    icon_url VARCHAR(1000) DEFAULT NULL COMMENT '程序图标地址',
    version VARCHAR(50) DEFAULT NULL COMMENT '程序版本',
    status TINYINT DEFAULT 1 COMMENT '状态：0-禁用，1-启用',
    sort_order INT DEFAULT 0 COMMENT '排序序号，用于展示顺序',
    create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
    
    -- 索引
    INDEX idx_category_id (category_id),
    INDEX idx_status (status),
    CONSTRAINT yz_fk_program_category FOREIGN KEY (category_id) REFERENCES yz_program_category (category_id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='程序信息表';

-- =============================================
-- 4. 租户管理相关表
-- =============================================

-- 创建租户表
CREATE TABLE yz_tenants (
    id INT PRIMARY KEY AUTO_INCREMENT COMMENT '租户ID',
    
    -- 基本信息
    name VARCHAR(100) NOT NULL COMMENT '租户名称',
    code VARCHAR(50) NOT NULL COMMENT '租户编码（唯一）',
    owner VARCHAR(50) NOT NULL COMMENT '负责人',
    phone VARCHAR(20) DEFAULT NULL COMMENT '联系电话',
    email VARCHAR(100) DEFAULT NULL COMMENT '邮箱地址',
    
    -- 状态信息
    status VARCHAR(20) DEFAULT 'enabled' COMMENT '状态：enabled-启用，disabled-禁用',
    audit_status VARCHAR(20) DEFAULT 'pending' COMMENT '审核状态：pending-待审核，approved-已通过，rejected-已拒绝',
    
    -- 审核信息
    audit_comment TEXT DEFAULT NULL COMMENT '审核意见',
    audit_by VARCHAR(50) DEFAULT NULL COMMENT '审核人',
    audit_time DATETIME DEFAULT NULL COMMENT '审核时间',
    
    -- 其他信息
    remark TEXT DEFAULT NULL COMMENT '备注',
    
    -- 时间戳
    create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
    create_by VARCHAR(50) DEFAULT NULL COMMENT '创建人',
    update_by VARCHAR(50) DEFAULT NULL COMMENT '更新人',
    
    -- 索引
    UNIQUE KEY uk_code (code),
    INDEX idx_name (name),
    INDEX idx_owner (owner),
    INDEX idx_status (status),
    INDEX idx_audit_status (audit_status),
    INDEX idx_create_time (create_time)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='租户表';

-- =============================================
-- 5. 文件管理相关表
-- =============================================

-- 创建文件表
CREATE TABLE yz_files (
    id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '文件ID',
    tenant_id VARCHAR(64) NOT NULL COMMENT '租户ID',
    user_id INT NOT NULL DEFAULT 0 COMMENT '用户ID',
    
    -- 文件基础信息
    file_name VARCHAR(255) NOT NULL COMMENT '文件名称',
    original_name VARCHAR(255) NOT NULL COMMENT '原始文件名',
    file_path VARCHAR(500) NOT NULL COMMENT '文件存储路径',
    file_url VARCHAR(500) COMMENT '文件访问URL',
    file_size BIGINT NOT NULL DEFAULT 0 COMMENT '文件大小(字节)',
    file_type VARCHAR(50) NOT NULL COMMENT '文件类型',
    file_ext VARCHAR(20) NOT NULL COMMENT '文件扩展名',
    
    -- 分类信息
    category VARCHAR(100) NOT NULL COMMENT '文件分类',
    sub_category VARCHAR(100) COMMENT '子分类',
    
    -- 状态信息
    status TINYINT DEFAULT 1 COMMENT '状态(1:正常, 0:删除)',
    is_public TINYINT DEFAULT 0 COMMENT '是否公开(1:是, 0:否)',
    
    -- 上传信息
    upload_by VARCHAR(100) NOT NULL COMMENT '上传人',
    upload_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '上传时间',
    
    -- 索引
    INDEX idx_tenant (tenant_id),
    INDEX idx_user (user_id),
    INDEX idx_category (category),
    INDEX idx_upload_time (upload_time),
    INDEX idx_status (status)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='文件表';

-- =============================================
-- 6. 插入初始数据
-- =============================================

-- 插入默认租户数据
INSERT INTO yz_tenants (name, code, owner, phone, email, status, audit_status, audit_comment, audit_by, audit_time, remark, create_by) VALUES
('默认租户', 'default', 'admin', '13800138000', 'admin@yunzer.com', 'enabled', 'approved', '系统默认租户，自动通过审核', 'system', NOW(), '系统默认租户，用于初始化数据', 'system'),
('示例租户A', 'demo-a', '张三', '13900139000', 'zhangsan@demo.com', 'enabled', 'approved', '资料完整，审核通过', 'admin', DATE_SUB(NOW(), INTERVAL 30 DAY), '演示租户A，用于展示功能', 'admin'),
('示例租户B', 'demo-b', '李四', '13700137000', 'lisi@demo.com', 'enabled', 'pending', NULL, NULL, NULL, '待审核租户，资料已提交', 'admin');

-- 插入默认管理员用户
-- 注意：实际使用时需要生成真实的加密密码和盐值
INSERT INTO yz_users (username, password, salt, email, nickname, role, status, create_by) VALUES
('admin', 'encrypted_password_here', 'salt_here', 'admin@yunzer.com', '超级管理员', 'admin', 1, 'system'),
('test', 'encrypted_password_here', 'salt_here', 'test@yunzer.com', '测试用户', 'user', 1, 'system');

-- 插入默认菜单数据
INSERT INTO yz_menus (name, path, parent_id, icon, `order`, status, component_path, menu_type, description) VALUES
('仪表盘', '/dashboard', 0, 'fa-solid fa-gauge', 1, 1, '@/views/dashboard/index.vue', 1, '系统仪表盘，展示关键指标'),
('系统管理', '/system', 0, 'fa-solid fa-screwdriver-wrench', 4, 1, null, 2, '系统管理功能模块'),
('系统设置', '/settings', 0, 'fa-solid fa-gear', 99, 1, '@/views/settings/index.vue', 1, '系统参数设置'),
('应用管理', '/apps', 0, 'fa-solid fa-gear', 4, 1, null, 2, '应用管理功能模块'),
('文件管理', '/system/files', 2, 'fa-solid fa-folder', 3, 1, '@/views/system/files/index.vue', 1, '文件管理系统'),
('租户管理', '/system/tenant', 2, 'fas fa-user-friends', 2, 1, '@/views/system/tenant/index.vue', 1, '租户管理'),
('用户管理', '/system/users', 2, 'fa-solid fa-user', 1, 1, '@/views/system/users/index.vue', 1, '用户信息管理'),
('角色管理', '/system/roles', 2, 'fa-solid fa-user-tag', 2, 1, '@/views/system/roles/index.vue', 1, '角色权限管理'),
('权限管理', '/system/permissions', 2, 'fa-solid fa-key', 2, 1, '@/views/system/permissions/index.vue', 1, '权限管理'),
('菜单管理', '/system/menus', 2, 'fa-solid fa-bars-progress', 2, 1, '@/views/system/menus/manager.vue', 1, '菜单权限管理'),
('程序管理', '/system/programs', 2, 'fa-solid fa-grip', 3, 1, '@/views/system/programs/index.vue', 1, '程序功能管理'),
('知识库', '/apps/knowledge', 4, 'fa-solid fa-book', 1, 1, '@/views/apps/knowledge/index.vue', 1, '知识库管理'),
('编辑', '/apps/knowledge/edit', 11, '', 1, 1, '@/views/apps/knowledge/components/edit.vue', 1, '知识库编辑'),
('详情', '/apps/knowledge/detail', 11, '', 1, 1, '@/views/apps/knowledge/components/detail.vue', 1, '知识库详情');

-- =============================================
-- 4. 知识库相关表
-- =============================================

-- 创建知识库分类表
CREATE TABLE IF NOT EXISTS yz_knowledge_category (
  category_id INT PRIMARY KEY AUTO_INCREMENT COMMENT '分类ID',
  category_name VARCHAR(100) NOT NULL COMMENT '分类名称',
  category_desc VARCHAR(500) DEFAULT NULL COMMENT '分类描述',
  parent_id INT DEFAULT 0 COMMENT '父分类ID，0表示顶级分类',
  sort_order INT DEFAULT 0 COMMENT '排序序号',
  create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  INDEX idx_parent_id (parent_id),
  INDEX idx_sort_order (sort_order)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='知识库分类表';

-- 创建知识库标签表
CREATE TABLE IF NOT EXISTS yz_knowledge_tags (
  tag_id INT PRIMARY KEY AUTO_INCREMENT COMMENT '标签ID',
  tag_name VARCHAR(50) NOT NULL COMMENT '标签名称',
  tag_color VARCHAR(20) DEFAULT NULL COMMENT '标签颜色',
  usage_count INT DEFAULT 0 COMMENT '使用次数',
  create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  UNIQUE KEY uk_tag_name (tag_name),
  INDEX idx_usage_count (usage_count)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='知识库标签表';

-- 创建知识库内容表
CREATE TABLE IF NOT EXISTS yz_knowledge (
  knowledge_id INT PRIMARY KEY AUTO_INCREMENT COMMENT '知识ID',
  title VARCHAR(200) NOT NULL COMMENT '标题',
  category_id INT DEFAULT NULL COMMENT '分类ID',
  tags TEXT COMMENT '标签JSON数组，存储标签名称',
  author VARCHAR(50) NOT NULL COMMENT '作者',
  content LONGTEXT COMMENT '正文内容（富文本）',
  summary VARCHAR(500) DEFAULT NULL COMMENT '摘要',
  cover_url VARCHAR(500) DEFAULT NULL COMMENT '封面图片URL',
  status TINYINT DEFAULT 0 COMMENT '状态：0-草稿，1-已发布，2-已归档',
  view_count INT DEFAULT 0 COMMENT '查看次数',
  like_count INT DEFAULT 0 COMMENT '点赞数',
  is_recommend TINYINT DEFAULT 0 COMMENT '是否推荐：0-否，1-是',
  is_top TINYINT DEFAULT 0 COMMENT '是否置顶：0-否，1-是',
  create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  create_by VARCHAR(50) DEFAULT NULL COMMENT '创建人',
  update_by VARCHAR(50) DEFAULT NULL COMMENT '更新人',
  INDEX idx_category_id (category_id),
  INDEX idx_author (author),
  INDEX idx_title (title),
  INDEX idx_status (status),
  INDEX idx_create_time (create_time),
  INDEX idx_view_count (view_count),
  INDEX idx_is_recommend (is_recommend),
  INDEX idx_is_top (is_top)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='知识库内容表';

-- 创建知识库收藏表
CREATE TABLE IF NOT EXISTS yz_knowledge_favorites (
  favorite_id INT PRIMARY KEY AUTO_INCREMENT COMMENT '收藏ID',
  knowledge_id INT NOT NULL COMMENT '知识ID',
  user_id INT NOT NULL COMMENT '用户ID',
  create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  UNIQUE KEY uk_knowledge_user (knowledge_id, user_id),
  INDEX idx_user_id (user_id),
  CONSTRAINT yz_fk_fav_knowledge FOREIGN KEY (knowledge_id) REFERENCES yz_knowledge (knowledge_id) ON DELETE CASCADE,
  CONSTRAINT yz_fk_fav_user FOREIGN KEY (user_id) REFERENCES yz_users (id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='知识库收藏表';

-- 插入默认知识库分类
INSERT INTO yz_knowledge_category (category_name, category_desc, parent_id, sort_order) VALUES
('技术文档', '技术相关的文档资料', 0, 1),
('产品手册', '产品使用手册和说明', 0, 2),
('用户指南', '用户操作指南和教程', 0, 3),
('常见问题', '常见问题解答', 0, 4),
('API文档', 'API接口文档', 0, 5),
('Vue', 'Vue框架相关', 1, 101),
('React', 'React框架相关', 1, 102),
('Go', 'Go语言相关', 1, 103);

-- 插入默认知识库标签
INSERT INTO yz_knowledge_tags (tag_name, tag_color, usage_count) VALUES
('Vue', '#4CAF50', 0),
('React', '#42A5F5', 0),
('TypeScript', '#3178C6', 0),
('Element Plus', '#409EFF', 0),
('Vue Router', '#4FC08D', 0),
('Pinia', '#FFD54F', 0),
('Go', '#00ADD8', 0),
('Python', '#3776AB', 0);

-- 插入默认程序分类
INSERT INTO yz_program_category (category_name, category_desc, parent_id, sort_order) VALUES
('办公软件', '办公相关程序', 0, 1),
('开发工具', '开发相关工具', 0, 2),
('系统工具', '系统管理工具', 0, 3);

-- 插入默认程序信息
INSERT INTO yz_program_info (category_id, program_name, program_desc, jump_url, icon_url, version, status, sort_order) VALUES
(1, '文档编辑器', '在线文档编辑工具', '/editor', '/icons/editor.png', '1.0.0', 1, 1),
(2, '代码编辑器', '在线代码编辑工具', '/code', '/icons/code.png', '1.0.0', 1, 1),
(3, '系统监控', '系统状态监控工具', '/monitor', '/icons/monitor.png', '1.0.0', 1, 1);

-- 恢复外键检查
SET FOREIGN_KEY_CHECKS = 1;

-- 完成初始化
SELECT 'Database initialization completed successfully!' as message;





