1. 新增在线协同文档功能 v 1

This commit is contained in:
chenbowen
2025-09-01 10:01:35 +08:00
parent 827ab022ed
commit 1ed31a4f49
43 changed files with 2734 additions and 3 deletions

144
sql/dm/doc_management.sql Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,39 @@
-- 在线文档管理功能菜单数据DM 格式)
-- 说明:达梦脚本使用与 patch.sql 相同的精简列形式,省略布尔列与时间列,使用默认值。
-- 清理旧数据,保持可重复执行
DELETE FROM system_menu WHERE id IN (6000,6001,6002,600101,600102,600103,600104,600105,600106,600107,600108,600109,600110);
-- 顶级目录(父级假定已存在 id=2 的“基础设施/Infra”或同级目录
INSERT INTO system_menu (
id, name, permission, type, sort, parent_id,
path, icon, component, status, component_name
) VALUES (
6000, '在线文档', '', 1, 15, 2,
'doc', 'fa:file-text-o', '', 0, NULL
);
-- 文档管理主页面
INSERT INTO system_menu (
id, name, permission, type, sort, parent_id,
path, icon, component, status, component_name
) VALUES (
6001, '文档管理', 'infra:doc:query', 2, 1, 6000,
'doc-file', 'fa:file-text', 'infra/doc/index', 0, 'DocFile'
);
-- 按钮权限(操作项)
INSERT INTO system_menu (
id, name, permission, type, sort, parent_id,
path, icon, component, status
) VALUES
(600101,'文档查询','infra:doc:query',3,1,6001,'','','',0),
(600102,'文档创建','infra:doc:create',3,2,6001,'','','',0),
(600103,'文档更新','infra:doc:update',3,3,6001,'','','',0),
(600104,'文档删除','infra:doc:delete',3,4,6001,'','','',0),
(600105,'文档导出','infra:doc:export',3,5,6001,'','','',0),
(600106,'文档上传','infra:doc:upload',3,6,6001,'','','',0),
(600107,'文档编辑','infra:doc:edit',3,7,6001,'','','',0),
(600108,'文档预览','infra:doc:preview',3,8,6001,'','','',0),
(600109,'文档下载','infra:doc:download',3,9,6001,'','','',0),
(600110,'权限管理','infra:doc:permission',3,10,6001,'','','',0);

View File

@@ -155,7 +155,7 @@ INSERT INTO system_menu(
path, icon, component, status, component_name
)
VALUES (
'1953701540574969857', '系统序列号管理', '', 2, 0, ${table.parentMenuId},
'1953701540574969857', '系统序列号管理', '', 2, 0, 1,
'sequence', '', 'system/sequence/index', 0, 'Sequence'
);
@@ -259,4 +259,4 @@ VALUES
(5021, 1, '固定值', 'FIXED', 'system_sequence_detail_rule_type', 0, 'primary', '', '固定字符串值', 'admin', SYSDATE, 'admin', SYSDATE, 0),
(5022, 2, '日期格式', 'DATE', 'system_sequence_detail_rule_type', 0, 'success', '', '日期格式规则', 'admin', SYSDATE, 'admin', SYSDATE, 0),
(5023, 3, '数字格式', 'NUMBER', 'system_sequence_detail_rule_type', 0, 'info', '', '数字格式规则', 'admin', SYSDATE, 'admin', SYSDATE, 0),
(5024, 4, '自定义格式', 'CUSTOM', 'system_sequence_detail_rule_type', 0, 'warning', '', '自定义格式规则', 'admin', SYSDATE, 'admin', SYSDATE, 0); (5024, 4, '自定义格式', 'CUSTOM', 'system_sequence_detail_rule_type', 0, 'warning', '', '自定义格式规则', 'admin', NOW(), 'admin', NOW(), b'0');
(5024, 4, '自定义格式', 'CUSTOM', 'system_sequence_detail_rule_type', 0, 'warning', '', '自定义格式规则', 'admin', SYSDATE, 'admin', SYSDATE, 0);

View File

@@ -0,0 +1,75 @@
-- 在线文档管理功能相关表结构
-- 在线文档表
CREATE TABLE `infra_doc_file` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '文档编号',
`title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '文档标题',
`file_id` bigint DEFAULT NULL COMMENT '文件编号',
`file_type` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '文件类型(docx/xlsx/pptx)',
`space_type` tinyint NOT NULL DEFAULT '1' COMMENT '空间类型(1-个人空间 2-团队空间)',
`description` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '文档描述',
`latest_version_id` bigint DEFAULT NULL COMMENT '最新版本编号',
`owner_user_id` bigint NOT NULL COMMENT '所有者用户编号',
`status` tinyint NOT NULL DEFAULT '1' COMMENT '状态(0-禁用 1-启用)',
`creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '创建者',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '更新者',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
`tenant_id` bigint NOT NULL DEFAULT '0' COMMENT '租户编号',
PRIMARY KEY (`id`) USING BTREE,
KEY `idx_owner_user_id` (`owner_user_id`) USING BTREE,
KEY `idx_space_type` (`space_type`) USING BTREE,
KEY `idx_file_type` (`file_type`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='在线文档表';
-- 文档版本表
CREATE TABLE `infra_doc_file_version` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '版本编号',
`doc_file_id` bigint NOT NULL COMMENT '文档编号',
`version_no` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '版本号',
`file_id` bigint NOT NULL COMMENT '文件编号',
`change_description` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '变更说明',
`creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '创建者',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '更新者',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
`tenant_id` bigint NOT NULL DEFAULT '0' COMMENT '租户编号',
PRIMARY KEY (`id`) USING BTREE,
KEY `idx_doc_file_id` (`doc_file_id`) USING BTREE,
KEY `idx_version_no` (`version_no`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='文档版本表';
-- 文档权限表
CREATE TABLE `infra_doc_file_permission` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '权限编号',
`doc_file_id` bigint NOT NULL COMMENT '文档编号',
`role_id` bigint NOT NULL COMMENT '角色编号',
`permission_type` tinyint NOT NULL DEFAULT '1' COMMENT '权限类型(1-只读 2-编辑 3-管理)',
`expire_time` datetime DEFAULT NULL COMMENT '过期时间',
`creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '创建者',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '更新者',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
`tenant_id` bigint NOT NULL DEFAULT '0' COMMENT '租户编号',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE KEY `uk_doc_role` (`doc_file_id`,`role_id`,`deleted`) USING BTREE,
KEY `idx_role_id` (`role_id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='文档权限表';
-- 文档编辑历史表
CREATE TABLE `infra_doc_edit_history` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '历史编号',
`doc_file_id` bigint NOT NULL COMMENT '文档编号',
`user_id` bigint NOT NULL COMMENT '编辑用户编号',
`user_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '编辑用户名称',
`edit_type` tinyint NOT NULL DEFAULT '1' COMMENT '编辑类型(1-创建 2-编辑 3-删除 4-重命名)',
`description` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '操作描述',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`tenant_id` bigint NOT NULL DEFAULT '0' COMMENT '租户编号',
PRIMARY KEY (`id`) USING BTREE,
KEY `idx_doc_file_id` (`doc_file_id`) USING BTREE,
KEY `idx_user_id` (`user_id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='文档编辑历史表';

View File

@@ -0,0 +1,24 @@
-- 在线文档管理功能菜单数据
-- 菜单 SQL
-- 约定6000 顶级目录6001 子菜单60010x 按钮6002 编辑器隐藏子页面
DELETE FROM system_menu WHERE id IN (6000,6001,6002,600101,600102,600103,600104,600105,600106,600107,600108,600109,600110);
INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted)
VALUES (6000, '在线文档', '', 1, 15, 2, 'doc', 'fa:file-text-o', '', 0, true, true, true, 'admin', NOW(), '', NOW(), false);
INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted)
VALUES (6001, '文档管理', 'infra:doc:query', 2, 1, 6000, 'doc-file', 'fa:file-text', 'infra/doc/index', 0, true, true, true, 'admin', NOW(), '', NOW(), false);
-- 文档管理的操作权限
INSERT INTO system_menu (id,name, permission, type, sort, parent_id, path, icon, component, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES
(600101,'文档查询','infra:doc:query',3,1,6001,'','','',0,true,true,true,'admin',NOW(),'admin',NOW(),false),
(600102,'文档创建','infra:doc:create',3,2,6001,'','','',0,true,true,true,'admin',NOW(),'admin',NOW(),false),
(600103,'文档更新','infra:doc:update',3,3,6001,'','','',0,true,true,true,'admin',NOW(),'admin',NOW(),false),
(600104,'文档删除','infra:doc:delete',3,4,6001,'','','',0,true,true,true,'admin',NOW(),'admin',NOW(),false),
(600105,'文档导出','infra:doc:export',3,5,6001,'','','',0,true,true,true,'admin',NOW(),'admin',NOW(),false),
(600106,'文档上传','infra:doc:upload',3,6,6001,'','','',0,true,true,true,'admin',NOW(),'admin',NOW(),false),
(600107,'文档编辑','infra:doc:edit',3,7,6001,'','','',0,true,true,true,'admin',NOW(),'admin',NOW(),false),
(600108,'文档预览','infra:doc:preview',3,8,6001,'','','',0,true,true,true,'admin',NOW(),'admin',NOW(),false),
(600109,'文档下载','infra:doc:download',3,9,6001,'','','',0,true,true,true,'admin',NOW(),'admin',NOW(),false),
(600110,'权限管理','infra:doc:permission',3,10,6001,'','','',0,true,true,true,'admin',NOW(),'admin',NOW(),false);

View File

@@ -86,4 +86,5 @@ public interface ErrorCodeConstants {
ErrorCode STANDARD_NAME_NOT_EXISTS = new ErrorCode(1_002_030_000, "数据命名与简写标准不存在");
ErrorCode STD_ABBR_NOT_EXISTS = new ErrorCode(1_002_030_001, "字段名 {} 不存在命名规范定义,请核对字段定义");
ErrorCode DOC_NOT_EXISTS = new ErrorCode(1_002_031_000, "文档不存在");
}

View File

@@ -32,6 +32,12 @@
<version>${revision}</version>
</dependency>
<dependency>
<groupId>cn.iocoder.cloud</groupId>
<artifactId>yudao-module-system-api</artifactId>
<version>${revision}</version>
</dependency>
<!-- 业务组件 -->
<dependency>
<groupId>cn.iocoder.cloud</groupId>

View File

@@ -0,0 +1,30 @@
package cn.iocoder.yudao.module.infra.config;
import cn.iocoder.yudao.module.infra.websocket.DocWebSocketHandler;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.config.annotation.EnableWebSocket;
import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;
import jakarta.annotation.Resource;
/**
* WebSocket 配置
*
* @author 芋道源码
*/
@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {
@Resource
private DocWebSocketHandler docWebSocketHandler;
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
// 注册文档协作WebSocket处理器
registry.addHandler(docWebSocketHandler, "/doc-collaboration")
.setAllowedOrigins("*") // 允许跨域,生产环境应该限制域名
.withSockJS(); // 启用SockJS支持
}
}

View File

@@ -0,0 +1,99 @@
package cn.iocoder.yudao.module.infra.controller.admin.doc.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Schema(description = "管理后台 - OnlyOffice 编辑器配置 Response VO")
@Data
public class DocEditorConfigRespVO {
@Schema(description = "文档类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "text")
private String documentType;
@Schema(description = "文档配置", requiredMode = Schema.RequiredMode.REQUIRED)
private DocumentConfig document;
@Schema(description = "编辑器配置", requiredMode = Schema.RequiredMode.REQUIRED)
private EditorConfig editorConfig;
@Schema(description = "文档高度", requiredMode = Schema.RequiredMode.REQUIRED, example = "100%")
private String height;
@Schema(description = "令牌", requiredMode = Schema.RequiredMode.REQUIRED)
private String token;
@Schema(description = "OnlyOffice服务器地址", requiredMode = Schema.RequiredMode.REQUIRED, example = "http://localhost:8085")
private String documentServerUrl;
@Schema(description = "文档配置")
@Data
public static class DocumentConfig {
@Schema(description = "文件类型", example = "docx")
private String fileType;
@Schema(description = "文档key", example = "doc123")
private String key;
@Schema(description = "文档标题", example = "技术文档")
private String title;
@Schema(description = "文档地址")
private String url;
@Schema(description = "权限配置")
private Permissions permissions;
}
@Schema(description = "权限配置")
@Data
public static class Permissions {
@Schema(description = "是否可编辑", example = "true")
private Boolean edit;
@Schema(description = "是否可下载", example = "true")
private Boolean download;
@Schema(description = "是否可打印", example = "true")
private Boolean print;
}
@Schema(description = "编辑器配置")
@Data
public static class EditorConfig {
@Schema(description = "回调地址")
private String callbackUrl;
@Schema(description = "语言", example = "zh-CN")
private String lang;
@Schema(description = "模式", example = "edit")
private String mode;
@Schema(description = "用户配置")
private User user;
@Schema(description = "协作配置")
private CoEditing coEditing;
}
@Schema(description = "用户配置")
@Data
public static class User {
@Schema(description = "用户ID", example = "1")
private String id;
@Schema(description = "用户名", example = "admin")
private String name;
}
@Schema(description = "协作配置")
@Data
public static class CoEditing {
@Schema(description = "协作模式", example = "fast")
private String mode;
@Schema(description = "是否允许更改", example = "true")
private Boolean change;
}
}

Some files were not shown because too many files have changed in this diff Show More