-- X-Server 用户多飞书应用绑定功能 -- 执行方式:在数据库中直接执行此SQL USE xserver; -- ===================================== -- 1. 添加 users 表唯一约束 -- ===================================== -- 删除可能存在的旧索引 ALTER TABLE users DROP INDEX IF EXISTS idx_email; ALTER TABLE users DROP INDEX IF EXISTS idx_phone; -- 添加 email 唯一索引(同一公司内邮箱唯一) CREATE UNIQUE INDEX uk_users_company_email ON users(company_id, email); -- 添加 phone 唯一索引(同一公司内手机号唯一) CREATE UNIQUE INDEX uk_users_company_phone ON users(company_id, phone); -- ===================================== -- 2. 创建用户飞书应用绑定表 -- ===================================== DROP TABLE IF EXISTS user_feishu_apps; CREATE TABLE `user_feishu_apps` ( `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT "ID", `user_id` bigint unsigned NOT NULL COMMENT "用户ID", `company_id` bigint unsigned NOT NULL COMMENT "公司ID", `feishu_app_id` int unsigned NOT NULL COMMENT "飞书应用配置ID", -- 该应用中的飞书用户信息 `feishu_user_id` varchar(60) DEFAULT NULL COMMENT "该应用的飞书用户ID", `feishu_open_id` varchar(60) DEFAULT NULL COMMENT "该应用的飞书OpenID", `tenant_key` varchar(60) DEFAULT NULL COMMENT "该应用的租户Key", -- 绑定信息 `is_default` tinyint NOT NULL DEFAULT 0 COMMENT "是否为默认应用: 1=是, 0=否", `last_login_at` timestamp NULL DEFAULT NULL COMMENT "最后一次通过此应用登录时间", `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT "绑定时间", `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT "更新时间", PRIMARY KEY (`id`), UNIQUE KEY `uk_user_app` (`user_id`, `company_id`, `feishu_app_id`), KEY `idx_user_default` (`user_id`, `company_id`, `is_default`), KEY `idx_feishu_user_id` (`feishu_user_id`), KEY `idx_feishu_open_id` (`feishu_open_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT="用户飞书应用绑定表"; -- ===================================== -- 3. 修改 users 表,移除不需要的飞书字段 -- ===================================== -- 注意:为了兼容性,先保留现有字段,后续可考虑迁移 -- ALTER TABLE users DROP COLUMN feishu_user_id; -- ALTER TABLE users DROP COLUMN feishu_open_id; -- ALTER TABLE users DROP COLUMN tenant_key; -- 临时方案:添加 feishu_app_id 记录最后登录的应用 ALTER TABLE users ADD COLUMN `feishu_app_id` int unsigned DEFAULT NULL COMMENT '最后登录的飞书应用ID' AFTER `tenant_key`; ALTER TABLE users ADD INDEX `idx_feishu_app_id` (`feishu_app_id`); -- ===================================== -- 4. 迁移现有用户飞书绑定数据(如果有的话) -- ===================================== -- 将现有 users 表中的飞书信息迁移到绑定表 -- 只处理有 feishu_user_id 的用户 INSERT INTO user_feishu_apps ( user_id, company_id, feishu_app_id, feishu_user_id, feishu_open_id, tenant_key, is_default, last_login_at ) SELECT u.id as user_id, u.company_id, u.feishu_app_id as feishu_app_id, u.feishu_user_id, u.feishu_open_id, u.tenant_key, 1 as is_default, NOW() as last_login_at FROM users u WHERE u.feishu_user_id IS NOT NULL AND u.feishu_app_id IS NOT NULL ON DUPLICATE KEY UPDATE last_login_at = NOW(); -- ===================================== -- 验证结果 -- ===================================== SELECT "=== 用户表唯一约束 ===" as ""; SHOW INDEX FROM users WHERE Key_name LIKE 'uk_users_company%'; SELECT "=== 飞书应用绑定表结构 ===" as ""; DESCRIBE user_feishu_apps; SELECT "=== 现有用户飞书绑定数据 ===" as ""; SELECT u.id as user_id, u.name, u.company_id, u.feishu_app_id, COUNT(ufa.id) as app_count FROM users u LEFT JOIN user_feishu_apps ufa ON u.id = ufa.user_id GROUP BY u.id, u.name, u.company_id, u.feishu_app_id;