-- 3.5.8 安全方案设计及实现脚本
-- 该脚本用于实现员工考勤管理系统中的安全方案，包括用户角色设计和权限管理。

-- ========================================
-- 1. 创建角色表 (UserRoles)
-- ========================================
CREATE TABLE IF NOT EXISTS UserRoles (
    RoleID VARCHAR(50) PRIMARY KEY,            -- 角色ID
    RoleName VARCHAR(50) NOT NULL,             -- 角色名称 (管理员、经理、员工等)
    RoleDescription VARCHAR(255) NOT NULL      -- 角色描述
);

-- ========================================
-- 2. 创建用户表 (UserLogin)
-- ========================================
CREATE TABLE IF NOT EXISTS UserLogin (
    UserID VARCHAR(50) PRIMARY KEY,            -- 用户ID
    EmployeeID VARCHAR(50) NOT NULL,           -- 员工ID，关联到 Employee 表
    RoleID VARCHAR(50) NOT NULL,               -- 角色ID，关联到 UserRoles 表
    Username VARCHAR(50) NOT NULL,             -- 用户名
    Password VARCHAR(255) NOT NULL,            -- 密码（应加密存储）
    LastLoginTime DATETIME,                    -- 上次登录时间
    AccountStatus VARCHAR(20) NOT NULL,        -- 账户状态 (有效、无效)
    FOREIGN KEY (RoleID) REFERENCES UserRoles(RoleID),   -- 外键，关联到 UserRoles 表
    FOREIGN KEY (EmployeeID) REFERENCES Employee(EmployeeID)  -- 外键，关联到 Employee 表
);

-- ========================================
-- 3. 插入角色数据
-- ========================================
INSERT INTO UserRoles (RoleID, RoleName, RoleDescription) VALUES
('admin', '管理员', '具有完全访问权限，包括管理用户和所有数据操作'),
('manager', '经理', '可以管理本部门员工的考勤、假期等信息，不能管理系统用户'),
('employee', '员工', '只能查看和管理自己的信息，提交假期申请');

-- ========================================
-- 4. 插入用户数据
-- ========================================
-- 假设已有一些员工数据，插入一些示例用户数据
INSERT INTO UserLogin (UserID, EmployeeID, RoleID, Username, Password, AccountStatus) VALUES
('user1', 'E001', 'admin', 'admin_user', 'hashed_admin_password', '有效'),
('user2', 'E002', 'manager', 'manager_user', 'hashed_manager_password', '有效'),
('user3', 'E003', 'employee', 'employee_user', 'hashed_employee_password', '有效');

-- ========================================
-- 7. 权限控制实现（应用级）
-- ========================================
-- 权限控制可以通过应用程序实现，根据角色在业务逻辑中进行权限判断。比如：
-- 根据用户角色判断是否有权限执行某个操作
-- 如果是管理员，允许所有操作
-- 如果是经理，只允许本部门的员工操作
-- 如果是员工，只允许自己提交假期申请、查看个人信息等

-- ========================================
-- 8. 总结
-- ========================================
-- 通过上述的角色设计和权限管理，我们可以确保系统中的每个用户仅能够访问和操作他们有权限的部分数据。
-- 管理员具有完全权限，经理可以管理本部门的员工信息，员工只能管理和查看自己的信息。

-- 注：上述 SQL 脚本仅为示例，实际开发中可能会根据具体需求调整和优化。
-- 为了提高安全性，密码应进行加密存储，不应使用明文密码。
