From 296cb6d59d23aea91415390df865649a824971ab Mon Sep 17 00:00:00 2001 From: chenbowen Date: Fri, 25 Jul 2025 19:18:39 +0800 Subject: [PATCH] =?UTF-8?q?1.=20=E6=96=B0=E5=A2=9E=E9=99=84=E4=BB=B6?= =?UTF-8?q?=E4=B8=8B=E8=BD=BD=E9=A2=84=E8=A7=88=E7=9A=84=E7=9F=AD=E9=93=BE?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sql/mysql/bpm/bpm.sql | 145 --------------- sql/mysql/bpm/bpm_tables.sql | 171 ------------------ .../controller/admin/file/FileController.java | 33 +--- .../admin/file/vo/file/FileRespVO.java | 41 +++++ .../admin/shortlink/ShortLinkController.java | 77 ++++++++ .../service/db/DatabaseTableServiceImpl.java | 5 +- .../service/shortlink/ShortLinkService.java | 13 ++ .../shortlink/ShortLinkServiceImpl.java | 58 ++++++ .../src/main/resources/application-dev.yaml | 3 + .../src/main/resources/application-local.yaml | 4 +- 10 files changed, 199 insertions(+), 351 deletions(-) delete mode 100644 sql/mysql/bpm/bpm.sql delete mode 100644 sql/mysql/bpm/bpm_tables.sql create mode 100644 yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/shortlink/ShortLinkController.java create mode 100644 yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/service/shortlink/ShortLinkService.java create mode 100644 yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/service/shortlink/ShortLinkServiceImpl.java diff --git a/sql/mysql/bpm/bpm.sql b/sql/mysql/bpm/bpm.sql deleted file mode 100644 index 1c97ee39..00000000 --- a/sql/mysql/bpm/bpm.sql +++ /dev/null @@ -1,145 +0,0 @@ -DROP TABLE IF EXISTS `bpm_category`; -CREATE TABLE `bpm_category` ( - `id` bigint(0) NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT '分类编号', - `name` varchar(255) DEFAULT NULL COMMENT '分类名', - `code` varchar(255) DEFAULT NULL COMMENT '分类标志', - `description` varchar(255) DEFAULT NULL COMMENT '分类描述', - `status` int(11) DEFAULT NULL COMMENT '分类状态,枚举 CommonStatusEnum', - `sort` int(11) DEFAULT NULL COMMENT '分类排序', - `create_time` datetime COMMENT '创建时间', - `update_time` datetime COMMENT '最后更新时间', - `creator` varchar(255) COMMENT '创建者,目前使用 SysUser 的 id 编号', - `updater` varchar(255) COMMENT '更新者,目前使用 SysUser 的 id 编号', - `deleted` tinyint(1) DEFAULT NULL COMMENT '是否删除', - `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号' -) ENGINE=InnoDB COMMENT='流程分类'; - -DROP TABLE IF EXISTS `bpm_form`; -CREATE TABLE `bpm_form` ( - `id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号', - `name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '表单名', - `status` tinyint NOT NULL COMMENT '开启状态', - `conf` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '表单的配置', - `fields` varchar(5000) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '表单项的数组', - `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '备注', - `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者', - `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL 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 -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '工作流的表单定义'; - - -DROP TABLE IF EXISTS `bpm_oa_leave`; -CREATE TABLE `bpm_oa_leave` ( - `id` bigint NOT NULL AUTO_INCREMENT COMMENT '请假表单主键', - `user_id` bigint NOT NULL COMMENT '申请人的用户编号', - `type` tinyint NOT NULL COMMENT '请假类型', - `reason` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '请假原因', - `start_time` datetime NOT NULL COMMENT '开始时间', - `end_time` datetime NOT NULL COMMENT '结束时间', - `day` tinyint NOT NULL COMMENT '请假天数', - `result` tinyint NOT NULL COMMENT '请假结果', - `process_instance_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '流程实例的编号', - `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者', - `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL 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 -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = 'OA 请假申请表'; - - -DROP TABLE IF EXISTS `bpm_process_definition_info`; -CREATE TABLE `bpm_process_definition_info` ( - `id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号', - `process_definition_id` varchar(64) NOT NULL COMMENT '流程定义的编号', - `model_id` varchar(64) NOT NULL COMMENT '流程模型的编号', - `icon` varchar(255) DEFAULT NULL COMMENT '图标', - `description` varchar(255) DEFAULT NULL COMMENT '描述', - `form_type` tinyint NOT NULL COMMENT '表单类型', - `form_id` bigint NULL DEFAULT NULL COMMENT '表单编号', - `form_conf` varchar(1000) DEFAULT NULL COMMENT '表单的配置', - `form_fields` varchar(5000) DEFAULT NULL COMMENT '表单项的数组', - `form_custom_create_path` varchar(255) DEFAULT NULL COMMENT '自定义表单的提交路径', - `form_custom_view_path` varchar(255) DEFAULT NULL COMMENT '自定义表单的查看路径', - `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者', - `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL 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 -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = 'Bpm 流程定义信息表'; - - -DROP TABLE IF EXISTS `bpm_process_expression`; -CREATE TABLE `bpm_process_expression` ( - `id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号', - `name` varchar(64) DEFAULT NULL COMMENT '流程实例的名字', - `status` tinyint NOT NULL COMMENT '流程实例的状态', - `expression` varchar(5000) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '表达式', - `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者', - `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL 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 -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '流程表达式'; - -DROP TABLE IF EXISTS `bpm_process_instance_copy`; -CREATE TABLE `bpm_process_instance_copy` ( - `id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号', - `start_user_id` bigint NOT NULL COMMENT '发起流程的用户编号', - `process_instance_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '流程实例的名字', - `process_instance_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '流程实例的编号', - `category` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '流程分类', - `task_id` varchar(64) DEFAULT NULL COMMENT '任务主键', - `task_name` varchar(64) DEFAULT NULL COMMENT '任务名称', - `user_id` bigint NOT NULL COMMENT '用户编号(被抄送的用户编号)', - `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者', - `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL 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 -) ENGINE = InnoDB AUTO_INCREMENT = 296 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '流程抄送表'; - -DROP TABLE IF EXISTS `bpm_process_listener`; -CREATE TABLE `bpm_process_listener` ( - `id` bigint(20) NOT NULL COMMENT '主键 ID,自增', - `name` varchar(255) DEFAULT NULL COMMENT '监听器名字', - `status` int(11) DEFAULT NULL COMMENT '状态', - `type` varchar(255) DEFAULT NULL COMMENT '监听类型', - `event` varchar(255) DEFAULT NULL COMMENT '监听事件', - `value_type` varchar(255) DEFAULT NULL COMMENT '值类型', - `value` varchar(255) DEFAULT NULL COMMENT '值', - `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者', - `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL 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 -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='流程监听器'; - -DROP TABLE IF EXISTS `bpm_user_group`; -CREATE TABLE `bpm_user_group` ( - `id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号', - `name` varchar(30) DEFAULT '' COMMENT '组名', - `description` varchar(255) DEFAULT '' COMMENT '描述', - `status` tinyint NOT NULL COMMENT '状态(0正常 1停用)', - `user_ids` varchar(1024) DEFAULT '0' COMMENT '成员编号数组', - `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者', - `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL 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 -) ENGINE = InnoDB AUTO_INCREMENT = 113 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '用户组'; diff --git a/sql/mysql/bpm/bpm_tables.sql b/sql/mysql/bpm/bpm_tables.sql deleted file mode 100644 index 7bab8041..00000000 --- a/sql/mysql/bpm/bpm_tables.sql +++ /dev/null @@ -1,171 +0,0 @@ --- 删除表,如果已存在 -DROP TABLE IF EXISTS `bpm_category`; -CREATE TABLE `bpm_category` ( - `id` bigint NOT NULL AUTO_INCREMENT COMMENT '分类编号', - `name` varchar(255) NOT NULL COMMENT '分类名', - `code` varchar(255) NOT NULL COMMENT '分类标志', - `description` varchar(255) DEFAULT NULL COMMENT '分类描述', - `status` int NOT NULL COMMENT '分类状态', - `sort` int DEFAULT NULL COMMENT '分类排序', - `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号', - `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后更新时间', - `creator` varchar(64) DEFAULT NULL COMMENT '创建者', - `updater` varchar(64) DEFAULT NULL COMMENT '更新者', - `deleted` bit(1) NOT NULL DEFAULT 0 COMMENT '是否删除', - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='BPM 流程分类'; - --- 删除表,如果已存在 -DROP TABLE IF EXISTS `bpm_form`; -CREATE TABLE `bpm_form` ( - `id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号', - `name` varchar(255) NOT NULL COMMENT '表单名', - `status` int NOT NULL COMMENT '状态', - `conf` varchar(2000) DEFAULT NULL COMMENT '表单的配置', - `fields` varchar(2000) DEFAULT NULL COMMENT '表单项的数组', - `remark` varchar(255) DEFAULT NULL COMMENT '备注', - `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号', - `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后更新时间', - `creator` varchar(64) DEFAULT NULL COMMENT '创建者', - `updater` varchar(64) DEFAULT NULL COMMENT '更新者', - `deleted` bit(1) NOT NULL DEFAULT 0 COMMENT '是否删除', - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='BPM 工作流的表单定义'; - --- 删除表,如果已存在 -DROP TABLE IF EXISTS `bpm_process_definition_info`; -CREATE TABLE `bpm_process_definition_info` ( - `id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号', - `process_definition_id` varchar(255) NOT NULL COMMENT '流程定义的编号', - `model_id` varchar(255) DEFAULT NULL COMMENT '流程模型的编号', - `model_type` int DEFAULT NULL COMMENT '流程模型的类型', - `category` varchar(255) DEFAULT NULL COMMENT '流程分类的编码', - `icon` varchar(255) DEFAULT NULL COMMENT '图标', - `description` varchar(255) DEFAULT NULL COMMENT '描述', - `form_type` int DEFAULT NULL COMMENT '表单类型', - `form_id` bigint DEFAULT NULL COMMENT '动态表单编号', - `form_conf` varchar(2000) DEFAULT NULL COMMENT '表单的配置', - `form_fields` varchar(2000) DEFAULT NULL COMMENT '表单项的数组', - `form_custom_create_path` varchar(255) DEFAULT NULL COMMENT '自定义表单的提交路径', - `form_custom_view_path` varchar(255) DEFAULT NULL COMMENT '自定义表单的查看路径', - `simple_model` varchar(2000) DEFAULT NULL COMMENT 'SIMPLE 设计器模型数据 json 格式', - `visible` bit(1) DEFAULT NULL COMMENT '是否可见', - `sort` bigint DEFAULT NULL COMMENT '排序值', - `start_user_ids` varchar(2000) DEFAULT NULL COMMENT '可发起用户编号数组', - `start_dept_ids` varchar(2000) DEFAULT NULL COMMENT '可发起部门编号数组', - `manager_user_ids` varchar(2000) DEFAULT NULL COMMENT '可管理用户编号数组', - `allow_cancel_running_process` bit(1) DEFAULT NULL COMMENT '是否允许撤销审批中的申请', - `process_id_rule` varchar(2000) DEFAULT NULL COMMENT '流程 ID 规则', - `auto_approval_type` int DEFAULT NULL COMMENT '自动去重类型', - `title_setting` varchar(2000) DEFAULT NULL COMMENT '标题设置', - `summary_setting` varchar(2000) DEFAULT NULL COMMENT '摘要设置', - `process_before_trigger_setting` varchar(2000) DEFAULT NULL COMMENT '流程前置通知设置', - `process_after_trigger_setting` varchar(2000) DEFAULT NULL COMMENT '流程后置通知设置', - `task_before_trigger_setting` varchar(2000) DEFAULT NULL COMMENT '任务前置通知设置', - `task_after_trigger_setting` varchar(2000) DEFAULT NULL COMMENT '任务后置通知设置', - `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号', - `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后更新时间', - `creator` varchar(64) DEFAULT NULL COMMENT '创建者', - `updater` varchar(64) DEFAULT NULL COMMENT '更新者', - `deleted` bit(1) NOT NULL DEFAULT 0 COMMENT '是否删除', - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='BPM 流程定义的拓信息'; - --- 删除表,如果已存在 -DROP TABLE IF EXISTS `bpm_process_expression`; -CREATE TABLE `bpm_process_expression` ( - `id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号', - `name` varchar(255) NOT NULL COMMENT '表达式名字', - `status` int NOT NULL COMMENT '表达式状态', - `expression` varchar(2000) NOT NULL COMMENT '表达式', - `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号', - `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后更新时间', - `creator` varchar(64) DEFAULT NULL COMMENT '创建者', - `updater` varchar(64) DEFAULT NULL COMMENT '更新者', - `deleted` bit(1) NOT NULL DEFAULT 0 COMMENT '是否删除', - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='BPM 流程表达式'; - --- 删除表,如果已存在 -DROP TABLE IF EXISTS `bpm_process_listener`; -CREATE TABLE `bpm_process_listener` ( - `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键 ID', - `name` varchar(255) NOT NULL COMMENT '监听器名字', - `status` int NOT NULL COMMENT '状态', - `type` varchar(64) NOT NULL COMMENT '监听类型', - `event` varchar(64) DEFAULT NULL COMMENT '监听事件', - `value_type` varchar(64) DEFAULT NULL COMMENT '值类型', - `value` varchar(255) DEFAULT NULL COMMENT '值', - `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号', - `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后更新时间', - `creator` varchar(64) DEFAULT NULL COMMENT '创建者', - `updater` varchar(64) DEFAULT NULL COMMENT '更新者', - `deleted` bit(1) NOT NULL DEFAULT 0 COMMENT '是否删除', - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='BPM 流程监听器'; - --- 删除表,如果已存在 -DROP TABLE IF EXISTS `bpm_user_group`; -CREATE TABLE `bpm_user_group` ( - `id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号', - `name` varchar(255) NOT NULL COMMENT '组名', - `description` varchar(255) DEFAULT NULL COMMENT '描述', - `status` int NOT NULL COMMENT '状态', - `user_ids` varchar(2000) DEFAULT NULL COMMENT '成员用户编号数组', - `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号', - `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后更新时间', - `creator` varchar(64) DEFAULT NULL COMMENT '创建者', - `updater` varchar(64) DEFAULT NULL COMMENT '更新者', - `deleted` bit(1) NOT NULL DEFAULT 0 COMMENT '是否删除', - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='BPM 用户组'; - --- 删除表,如果已存在 -DROP TABLE IF EXISTS `bpm_oa_leave`; -CREATE TABLE `bpm_oa_leave` ( - `id` bigint NOT NULL AUTO_INCREMENT COMMENT '请假表单主键', - `user_id` bigint NOT NULL COMMENT '申请人的用户编号', - `type` varchar(255) NOT NULL COMMENT '请假类型', - `reason` varchar(255) DEFAULT NULL COMMENT '原因', - `start_time` datetime DEFAULT NULL COMMENT '开始时间', - `end_time` datetime DEFAULT NULL COMMENT '结束时间', - `day` bigint DEFAULT NULL COMMENT '请假天数', - `status` int DEFAULT NULL COMMENT '审批结果', - `process_instance_id` varchar(255) DEFAULT NULL COMMENT '对应的流程编号', - `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号', - `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后更新时间', - `creator` varchar(64) DEFAULT NULL COMMENT '创建者', - `updater` varchar(64) DEFAULT NULL COMMENT '更新者', - `deleted` bit(1) NOT NULL DEFAULT 0 COMMENT '是否删除', - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='OA 请假申请'; - --- 删除表,如果已存在 -DROP TABLE IF EXISTS `bpm_process_instance_copy`; -CREATE TABLE `bpm_process_instance_copy` ( - `id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号', - `start_user_id` bigint DEFAULT NULL COMMENT '发起人 Id', - `process_instance_name` varchar(255) DEFAULT NULL COMMENT '流程名', - `process_instance_id` varchar(255) DEFAULT NULL COMMENT '流程实例的编号', - `process_definition_id` varchar(255) DEFAULT NULL COMMENT '流程实例的流程定义编号', - `category` varchar(255) DEFAULT NULL COMMENT '流程分类', - `activity_id` varchar(255) DEFAULT NULL COMMENT '流程活动的编号', - `activity_name` varchar(255) DEFAULT NULL COMMENT '流程活动的名字', - `task_id` varchar(255) DEFAULT NULL COMMENT '流程活动的编号', - `user_id` bigint DEFAULT NULL COMMENT '用户编号(被抄送的用户编号)', - `reason` varchar(255) DEFAULT NULL COMMENT '抄送意见', - `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号', - `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后更新时间', - `creator` varchar(64) DEFAULT NULL COMMENT '创建者', - `updater` varchar(64) DEFAULT NULL COMMENT '更新者', - `deleted` bit(1) NOT NULL DEFAULT 0 COMMENT '是否删除', - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='流程抄送'; diff --git a/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/file/FileController.java b/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/file/FileController.java index 2711f784..2c3bb85f 100644 --- a/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/file/FileController.java +++ b/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/file/FileController.java @@ -21,7 +21,6 @@ import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import jakarta.validation.Valid; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Value; import org.springframework.http.HttpStatus; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; @@ -29,9 +28,6 @@ import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import java.io.IOException; -import java.net.URLEncoder; -import java.nio.charset.StandardCharsets; -import java.util.Base64; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; @@ -49,25 +45,8 @@ public class FileController { @Resource private FileService fileService; - @Value("${yudao.kkfile:}") - private String onlinePreview; - @GetMapping("/download-url") - @Operation(summary = "获取文件下载地址", description = "根据 fileId 返回文件下载 url") - public CommonResult getDownloadUrl(@RequestParam("fileId") Long fileId) { - FileDO fileDO = fileService.getActiveFileById(fileId); - if (fileDO == null) { - return CommonResult.error(HttpStatus.NOT_FOUND.value(), "文件不存在"); - } - // FileDO 转换为 FileRespVO - FileRespVO fileRespVO = BeanUtils.toBean(fileDO, FileRespVO.class); - if (StrUtil.isEmpty(onlinePreview) || StrUtil.isEmpty(fileRespVO.getUrl())) { - return CommonResult.error(HttpStatus.BAD_REQUEST.value(), "文件 URL 为空"); - } - return success(fileRespVO); - } - - @GetMapping("/preview-url") + @GetMapping("/get") @Operation(summary = "获取文件预览地址", description = "根据 fileId 返回文件预览 url(kkfile)") public CommonResult getPreviewUrl(@RequestParam("fileId") Long fileId) { FileDO fileDO = fileService.getActiveFileById(fileId); @@ -76,11 +55,6 @@ public class FileController { } // FileDO 转换为 FileRespVO FileRespVO fileRespVO = BeanUtils.toBean(fileDO, FileRespVO.class); - if (StrUtil.isEmpty(onlinePreview) || StrUtil.isEmpty(fileRespVO.getUrl())) { - return CommonResult.error(HttpStatus.BAD_REQUEST.value(), "在线预览地址未配置或文件 URL 为空"); - } - String previewUrl = onlinePreview + URLEncoder.encode(Base64.getEncoder().encodeToString(fileRespVO.getUrl().getBytes(StandardCharsets.UTF_8)), StandardCharsets.UTF_8); - fileRespVO.setPreviewUrl(previewUrl); return success(fileRespVO); } @@ -99,11 +73,6 @@ public class FileController { MultipartFile file = uploadReqVO.getFile(); byte[] content = IoUtil.readBytes(file.getInputStream()); FileRespVO fileWhitReturn = fileService.createFileWhitReturn(content, file.getOriginalFilename(), uploadReqVO.getDirectory(), file.getContentType(), uploadReqVO.getEncrypt()); - if (StrUtil.isEmpty(onlinePreview) || StrUtil.isEmpty(fileWhitReturn.getUrl())) { - fileWhitReturn.setPreviewUrl(fileWhitReturn.getUrl()); - return success(fileWhitReturn); - } - fileWhitReturn.setPreviewUrl(onlinePreview + URLEncoder.encode(fileWhitReturn.getUrl(), StandardCharsets.UTF_8)); return success(fileWhitReturn); } diff --git a/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/file/vo/file/FileRespVO.java b/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/file/vo/file/FileRespVO.java index bb20dad4..2ef0ac68 100644 --- a/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/file/vo/file/FileRespVO.java +++ b/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/file/vo/file/FileRespVO.java @@ -1,13 +1,34 @@ package cn.iocoder.yudao.module.infra.controller.admin.file.vo.file; +import cn.iocoder.yudao.framework.common.util.spring.SpringUtils; +import cn.iocoder.yudao.module.infra.service.shortlink.ShortLinkService; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; +import java.nio.charset.StandardCharsets; import java.time.LocalDateTime; +import java.util.Base64; +import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; + +/** + * @author chenbowen + */ @Schema(description = "管理后台 - 文件 Response VO,不返回 content 字段,太大") @Data public class FileRespVO { + public String getUrl() { + if (this.url == null || this.url.isEmpty()) return null; + Long fileId = this.id; + Long userId = null; + try { + userId = getLoginUserId(); + } catch (Exception ignored) {} + ShortLinkService shortLinkService = SpringUtils.getBean(ShortLinkService.class); + String serverPrefix = SpringUtils.getProperty("yudao.shortlink.server"); + String key = (userId != null ? userId : "anonymous") + "_" + (fileId != null ? fileId : "nofile"); + return serverPrefix + shortLinkService.generateShortLink(key, this.url); + } @Schema(description = "文件编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") private Long id; @@ -28,6 +49,26 @@ public class FileRespVO { @Schema(description = "附件预览地址", example = "https://www.iocoder.cn/yudao.jpg") private String previewUrl; + public String getPreviewUrl() { + // 仅当 url 不为空时生成 + if (this.url == null || this.url.isEmpty()) { + return null; + } + // 这里的 onlinePreview 通过 SpringUtils 获取 + String onlinePreview = SpringUtils.getProperty("yudao.kkfile"); + if (onlinePreview == null || onlinePreview.isEmpty()) { + return null; + } + String shortUrl = this.getUrl(); + if (shortUrl == null || shortUrl.isEmpty()) { + return null; + } + String base64ShortUrl = Base64.getUrlEncoder().encodeToString(shortUrl.getBytes(StandardCharsets.UTF_8)); + return onlinePreview + base64ShortUrl +// + "&fileName=" + URLEncoder.encode(this.getName(), StandardCharsets.UTF_8) + "&watermarkTxt=中国铜业" + ; + } + @Schema(description = "文件MIME类型", example = "application/octet-stream") private String type; diff --git a/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/shortlink/ShortLinkController.java b/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/shortlink/ShortLinkController.java new file mode 100644 index 00000000..af115f79 --- /dev/null +++ b/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/shortlink/ShortLinkController.java @@ -0,0 +1,77 @@ +package cn.iocoder.yudao.module.infra.controller.admin.shortlink; + +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.tenant.core.aop.TenantIgnore; +import cn.iocoder.yudao.module.infra.service.shortlink.ShortLinkService; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.security.PermitAll; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.*; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.client.RestTemplate; + +/** + * @author chenbowen + */ +@Tag(name = "管理后台 - 文件存储") +@Validated +@Slf4j +@RestController +@RequestMapping("/infra/shortlink") +public class ShortLinkController { + + @Autowired + private ShortLinkService shortLinkService; + + + /** + * 生成短链接 + */ + @PostMapping("/generate") + public CommonResult generateShortLink(@RequestParam("key") String key, @RequestParam("url") String url) { + String shortLink = "/infra/shortlink/" + shortLinkService.generateShortLink(key, url); + return CommonResult.success(shortLink); + } + + /** + * 解析短链接并重定向 + */ + @GetMapping("/{shortKey}") + @PermitAll + @TenantIgnore + public ResponseEntity parseShortLink(@PathVariable("shortKey") String shortKey) { + String realUrl = shortLinkService.parseShortLink(shortKey); + if (realUrl != null) { + RestTemplate restTemplate = new RestTemplate(); + try { + ResponseEntity entity = restTemplate.exchange(realUrl, HttpMethod.GET, HttpEntity.EMPTY, byte[].class); + HttpHeaders headers = new HttpHeaders(); + // 只透传部分常用header,可根据需要扩展 + if (entity.getHeaders().getContentType() != null) { + headers.setContentType(entity.getHeaders().getContentType()); + } + if (entity.getHeaders().getContentLength() > 0) { + headers.setContentLength(entity.getHeaders().getContentLength()); + } + // 透传 disposition/encoding 等 + String disposition = entity.getHeaders().getFirst(HttpHeaders.CONTENT_DISPOSITION); + if (disposition != null) { + headers.set(HttpHeaders.CONTENT_DISPOSITION, disposition); + } + String encoding = entity.getHeaders().getFirst(HttpHeaders.CONTENT_ENCODING); + if (encoding != null) { + headers.set(HttpHeaders.CONTENT_ENCODING, encoding); + } + return new ResponseEntity<>(entity.getBody(), headers, entity.getStatusCode()); + } catch (Exception e) { + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body(("目标链接内容获取异常: " + e.getMessage()).getBytes()); + } + } else { + return ResponseEntity.status(HttpStatus.NOT_FOUND) + .body("当前文件请求链接已失效,请从系统重新进行请求操作".getBytes()); + } + } +} diff --git a/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/service/db/DatabaseTableServiceImpl.java b/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/service/db/DatabaseTableServiceImpl.java index 289cae1e..fb9c1b8b 100644 --- a/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/service/db/DatabaseTableServiceImpl.java +++ b/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/service/db/DatabaseTableServiceImpl.java @@ -33,8 +33,9 @@ public class DatabaseTableServiceImpl implements DatabaseTableService { @Override public List getTableList(Long dataSourceConfigId, String nameLike, String commentLike) { List tables = getTableList0(dataSourceConfigId, null); - return tables.stream().filter(tableInfo -> (StrUtil.isEmpty(nameLike) || tableInfo.getName().contains(nameLike)) - && (StrUtil.isEmpty(commentLike) || tableInfo.getComment().contains(commentLike))) + return tables.stream().filter(tableInfo -> + (StrUtil.isEmpty(nameLike) || tableInfo.getName().toLowerCase().contains(nameLike.toLowerCase())) + && (StrUtil.isEmpty(commentLike) || tableInfo.getComment().contains(commentLike))) .collect(Collectors.toList()); } diff --git a/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/service/shortlink/ShortLinkService.java b/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/service/shortlink/ShortLinkService.java new file mode 100644 index 00000000..438c1c87 --- /dev/null +++ b/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/service/shortlink/ShortLinkService.java @@ -0,0 +1,13 @@ +package cn.iocoder.yudao.module.infra.service.shortlink; + +public interface ShortLinkService { + /** + * 生成短链接 + */ + String generateShortLink(String key, String url); + + /** + * 解析短链接 + */ + String parseShortLink(String shortKey); +} diff --git a/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/service/shortlink/ShortLinkServiceImpl.java b/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/service/shortlink/ShortLinkServiceImpl.java new file mode 100644 index 00000000..a7bb9a98 --- /dev/null +++ b/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/service/shortlink/ShortLinkServiceImpl.java @@ -0,0 +1,58 @@ +package cn.iocoder.yudao.module.infra.service.shortlink; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.stereotype.Service; + +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.util.concurrent.TimeUnit; + +@Service + +public class ShortLinkServiceImpl implements ShortLinkService { + private final StringRedisTemplate redisTemplate; + + @Value("${yudao.shortlink.expire-seconds:30}") + private long expireSeconds; + + public ShortLinkServiceImpl(StringRedisTemplate redisTemplate) { + this.redisTemplate = redisTemplate; + } + + /** + * 生成短链接 + */ + @Override + public String generateShortLink(String key, String url) { + // 使用url生成hash作为短链key + String hashKey = hashUrl(url); + // 存入Redis并设置过期时间 + redisTemplate.opsForValue().set(hashKey, url, expireSeconds, TimeUnit.SECONDS); + return hashKey; + } + + private String hashUrl(String url) { + try { + MessageDigest digest = MessageDigest.getInstance("SHA-256"); + byte[] hash = digest.digest(url.getBytes()); + StringBuilder sb = new StringBuilder(); + // 只取前8字节,够短链用 + for (int i = 0; i < 8 && i < hash.length; i++) { + sb.append(String.format("%02x", hash[i])); + } + return sb.toString(); + } catch (NoSuchAlgorithmException e) { + throw new RuntimeException("Hash算法异常", e); + } + } + + /** + * 解析短链接 + */ + @Override + public String parseShortLink(String shortKey) { + // 直接从Redis获取 + return redisTemplate.opsForValue().get(shortKey); + } +} diff --git a/yudao-module-infra/yudao-module-infra-server/src/main/resources/application-dev.yaml b/yudao-module-infra/yudao-module-infra-server/src/main/resources/application-dev.yaml index 269cb96d..938636ad 100644 --- a/yudao-module-infra/yudao-module-infra-server/src/main/resources/application-dev.yaml +++ b/yudao-module-infra/yudao-module-infra-server/src/main/resources/application-dev.yaml @@ -114,5 +114,8 @@ spring: context-path: /admin # 配置 Spring --- #################### 芋道相关配置 #################### +yudao: + shortlink: + server: "http://172.16.46.63:48080/admin-api/infra/shortlink/" diff --git a/yudao-module-infra/yudao-module-infra-server/src/main/resources/application-local.yaml b/yudao-module-infra/yudao-module-infra-server/src/main/resources/application-local.yaml index eb1abc80..5cb5e4d1 100644 --- a/yudao-module-infra/yudao-module-infra-server/src/main/resources/application-local.yaml +++ b/yudao-module-infra/yudao-module-infra-server/src/main/resources/application-local.yaml @@ -139,4 +139,6 @@ yudao: access-log: # 访问日志的配置项 enable: true # 固定验证码 - verify-code: 666666 \ No newline at end of file + verify-code: 666666 + shortlink: + server: "http://localhost:48080/admin-api/infra/shortlink/" \ No newline at end of file