feat:聊天后台撤回消息

fix:聊天禁用bug
This commit is contained in:
dzc committed 2026-11-03 19:08:57 +08:00
1 parent e4b079279b
commit 2de8fa02b2
16 files changed
+975 -47

No files matched your search

@@ -0,0 +1,80 @@
-- 聊天列表菜单增量,MySQL 8;在后台业务库中手动执行。
-- 复用已有 chat/list/index 菜单;否则创建为原私聊记录菜单的同级菜单。
-- 不固定菜单/角色/租户 ID,不删除现有菜单或授权;执行后重新登录刷新菜单缓存。
-- 原私聊菜单缺失、存在歧义或同级路由冲突时明确报错,整个 DML 事务回滚。
-- 此文件包含存储过程 DDL,请单独执行,不要包在其它迁移事务中。
DELIMITER $$
DROP PROCEDURE IF EXISTS migrate_chat_conversation_menu_20261103$$
CREATE PROCEDURE migrate_chat_conversation_menu_20261103()
BEGIN
DECLARE source_id BIGINT;
DECLARE target_id BIGINT;
DECLARE source_count INT;
DECLARE target_count INT;
DECLARE migration_lock INT DEFAULT 0;
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
ROLLBACK;
IF migration_lock = 1 THEN
DO RELEASE_LOCK('chat_conversation_menu_20261103');
END IF;
RESIGNAL;
END;
SELECT GET_LOCK('chat_conversation_menu_20261103', 10) INTO migration_lock;
IF COALESCE(migration_lock, 0) <> 1 THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Cannot acquire chat menu migration lock';
END IF;
START TRANSACTION;
SELECT COUNT(*), MIN(id) INTO source_count, source_id
FROM system_menu
WHERE deleted = b'0' AND type = 2
AND TRIM(LEADING '/' FROM component) IN ('chat/private-msg/index', 'chat/private-msg/index.vue');
IF source_count <> 1 THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Expected exactly one active chat/private-msg/index menu';
END IF;
SELECT COUNT(*), MIN(id) INTO target_count, target_id
FROM system_menu
WHERE deleted = b'0'
AND TRIM(LEADING '/' FROM component) IN ('chat/list/index', 'chat/list/index.vue');
IF target_count > 1 THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Multiple active chat/list/index menus exist';
END IF;
IF target_count = 0 THEN
IF EXISTS (SELECT 1 FROM system_menu m JOIN system_menu s ON s.id = source_id
WHERE m.parent_id = s.parent_id AND m.path = 'list' AND m.deleted = b'0') THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Sibling route list already exists; resolve menu path first';
END IF;
INSERT INTO system_menu
(name, permission, type, sort, parent_id, path, icon, component, component_name,
status, visible, keep_alive, always_show, creator, updater, deleted)
SELECT '聊天列表', permission, 2, sort + 1, parent_id, 'list', 'ep:chat-dot-round',
'chat/list/index', 'ChatList', status, visible, keep_alive, always_show,
'migration', 'migration', b'0'
FROM system_menu WHERE id = source_id;
SET target_id = LAST_INSERT_ID();
ELSE
-- 保留已有菜单的路径、父目录、权限和可见性,仅对齐组件位置与缓存组件名。
UPDATE system_menu SET component = 'chat/list/index', component_name = 'ChatList', updater = 'migration'
WHERE id = target_id;
END IF;
INSERT INTO system_role_menu (role_id, menu_id, creator, updater, deleted, tenant_id)
SELECT DISTINCT source.role_id, target_id, 'migration', 'migration', b'0', source.tenant_id
FROM system_role_menu source
WHERE source.menu_id = source_id AND source.deleted = b'0'
AND NOT EXISTS (SELECT 1 FROM system_role_menu target
WHERE target.role_id = source.role_id AND target.tenant_id = source.tenant_id
AND target.menu_id = target_id AND target.deleted = b'0');
COMMIT;
DO RELEASE_LOCK('chat_conversation_menu_20261103');
SELECT target_id AS menu_id, 'chat/list/index' AS component, 'ChatList' AS component_name;
END$$
CALL migrate_chat_conversation_menu_20261103()$$
DROP PROCEDURE migrate_chat_conversation_menu_20261103$$
DELIMITER ;
@@ -0,0 +1,64 @@
-- 管理员屏蔽私聊消息权限,MySQL 8;交付后在后台业务库手动执行。
-- 不修改消息数据。给现有聊天记录/聊天列表页面的角色补充同一操作权限。
-- SQL 不会触发服务端角色权限缓存失效;执行后请在角色管理中重新保存受影响角色的菜单权限,
-- 再重新登录刷新前端权限。应用发布需同时更新 API 与 IM,uni-app 无需更新。
-- 复用现有权限按钮,不固定菜单/角色/租户 ID,不删除已有菜单或授权。
-- 此脚本含存储过程 DDL,请单独执行,不要包在其它迁移事务中。
DELIMITER $$
DROP PROCEDURE IF EXISTS migrate_chat_message_moderation_permission_20261103$$
CREATE PROCEDURE migrate_chat_message_moderation_permission_20261103()
BEGIN
DECLARE source_id BIGINT;
DECLARE target_id BIGINT;
DECLARE migration_lock INT DEFAULT 0;
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
ROLLBACK;
IF migration_lock = 1 THEN
DO RELEASE_LOCK('chat_message_moderation_permission_20261103');
END IF;
RESIGNAL;
END;
SELECT GET_LOCK('chat_message_moderation_permission_20261103', 10) INTO migration_lock;
IF COALESCE(migration_lock, 0) <> 1 THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Cannot acquire chat moderation permission migration lock';
END IF;
START TRANSACTION;
SELECT id INTO source_id FROM system_menu
WHERE deleted = b'0' AND type = 2
AND TRIM(LEADING '/' FROM component) IN
('chat/private-msg/index', 'chat/private-msg/index.vue', 'chat/list/index', 'chat/list/index.vue')
ORDER BY CASE WHEN TRIM(LEADING '/' FROM component) LIKE 'chat/private-msg/%' THEN 0 ELSE 1 END, id
LIMIT 1;
IF source_id IS NULL THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'No active private-message or chat-list menu found';
END IF;
SELECT MIN(id) INTO target_id FROM system_menu
WHERE deleted = b'0' AND type = 3 AND permission = 'chat:private-msg:moderate';
IF target_id IS NULL THEN
INSERT INTO system_menu
(name, permission, type, sort, parent_id, path, icon, component, component_name,
status, visible, keep_alive, always_show, creator, updater, deleted)
VALUES ('屏蔽私聊消息', 'chat:private-msg:moderate', 3, 10, source_id, '', '#', NULL, NULL,
0, b'1', b'1', b'1', 'migration', 'migration', b'0');
SET target_id = LAST_INSERT_ID();
END IF;
INSERT INTO system_role_menu (role_id, menu_id, creator, updater, deleted, tenant_id)
SELECT DISTINCT source.role_id, target_id, 'migration', 'migration', b'0', source.tenant_id
FROM system_role_menu source
JOIN system_menu page ON page.id = source.menu_id AND page.deleted = b'0' AND page.type = 2
WHERE source.deleted = b'0'
AND TRIM(LEADING '/' FROM page.component) IN
('chat/private-msg/index', 'chat/private-msg/index.vue', 'chat/list/index', 'chat/list/index.vue')
AND NOT EXISTS (SELECT 1 FROM system_role_menu target
WHERE target.role_id = source.role_id AND target.tenant_id = source.tenant_id
AND target.menu_id = target_id AND target.deleted = b'0');
COMMIT;
DO RELEASE_LOCK('chat_message_moderation_permission_20261103');
SELECT target_id AS permission_menu_id, 'chat:private-msg:moderate' AS permission;
END$$
CALL migrate_chat_message_moderation_permission_20261103()$$
DROP PROCEDURE migrate_chat_message_moderation_permission_20261103$$
DELIMITER ;