1. 新增附件下载预览的短链功能

This commit is contained in:
chenbowen
2025-07-25 19:18:39 +08:00
parent 9f1fad0096
commit 296cb6d59d
10 changed files with 199 additions and 351 deletions

View File

@@ -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 = '用户组';

View File

@@ -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='流程抄送';

View File

@@ -21,7 +21,6 @@ import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.Valid; import jakarta.validation.Valid;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
@@ -29,9 +28,6 @@ import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import java.io.IOException; 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.common.pojo.CommonResult.success;
import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
@@ -49,25 +45,8 @@ public class FileController {
@Resource @Resource
private FileService fileService; private FileService fileService;
@Value("${yudao.kkfile:}")
private String onlinePreview;
@GetMapping("/download-url") @GetMapping("/get")
@Operation(summary = "获取文件下载地址", description = "根据 fileId 返回文件下载 url")
public CommonResult<FileRespVO> 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")
@Operation(summary = "获取文件预览地址", description = "根据 fileId 返回文件预览 urlkkfile") @Operation(summary = "获取文件预览地址", description = "根据 fileId 返回文件预览 urlkkfile")
public CommonResult<FileRespVO> getPreviewUrl(@RequestParam("fileId") Long fileId) { public CommonResult<FileRespVO> getPreviewUrl(@RequestParam("fileId") Long fileId) {
FileDO fileDO = fileService.getActiveFileById(fileId); FileDO fileDO = fileService.getActiveFileById(fileId);
@@ -76,11 +55,6 @@ public class FileController {
} }
// FileDO 转换为 FileRespVO // FileDO 转换为 FileRespVO
FileRespVO fileRespVO = BeanUtils.toBean(fileDO, FileRespVO.class); 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); return success(fileRespVO);
} }
@@ -99,11 +73,6 @@ public class FileController {
MultipartFile file = uploadReqVO.getFile(); MultipartFile file = uploadReqVO.getFile();
byte[] content = IoUtil.readBytes(file.getInputStream()); byte[] content = IoUtil.readBytes(file.getInputStream());
FileRespVO fileWhitReturn = fileService.createFileWhitReturn(content, file.getOriginalFilename(), uploadReqVO.getDirectory(), file.getContentType(), uploadReqVO.getEncrypt()); 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); return success(fileWhitReturn);
} }

View File

@@ -1,13 +1,34 @@
package cn.iocoder.yudao.module.infra.controller.admin.file.vo.file; 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 io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;
import java.nio.charset.StandardCharsets;
import java.time.LocalDateTime; 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 字段,太大") @Schema(description = "管理后台 - 文件 Response VO,不返回 content 字段,太大")
@Data @Data
public class FileRespVO { 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") @Schema(description = "文件编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
private Long id; private Long id;
@@ -28,6 +49,26 @@ public class FileRespVO {
@Schema(description = "附件预览地址", example = "https://www.iocoder.cn/yudao.jpg") @Schema(description = "附件预览地址", example = "https://www.iocoder.cn/yudao.jpg")
private String previewUrl; 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") @Schema(description = "文件MIME类型", example = "application/octet-stream")
private String type; private String type;

View File

@@ -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<String> 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<byte[]> parseShortLink(@PathVariable("shortKey") String shortKey) {
String realUrl = shortLinkService.parseShortLink(shortKey);
if (realUrl != null) {
RestTemplate restTemplate = new RestTemplate();
try {
ResponseEntity<byte[]> 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());
}
}
}

View File

@@ -33,8 +33,9 @@ public class DatabaseTableServiceImpl implements DatabaseTableService {
@Override @Override
public List<TableInfo> getTableList(Long dataSourceConfigId, String nameLike, String commentLike) { public List<TableInfo> getTableList(Long dataSourceConfigId, String nameLike, String commentLike) {
List<TableInfo> tables = getTableList0(dataSourceConfigId, null); List<TableInfo> tables = getTableList0(dataSourceConfigId, null);
return tables.stream().filter(tableInfo -> (StrUtil.isEmpty(nameLike) || tableInfo.getName().contains(nameLike)) return tables.stream().filter(tableInfo ->
&& (StrUtil.isEmpty(commentLike) || tableInfo.getComment().contains(commentLike))) (StrUtil.isEmpty(nameLike) || tableInfo.getName().toLowerCase().contains(nameLike.toLowerCase()))
&& (StrUtil.isEmpty(commentLike) || tableInfo.getComment().contains(commentLike)))
.collect(Collectors.toList()); .collect(Collectors.toList());
} }

View File

@@ -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);
}

View File

@@ -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);
}
}

View File

@@ -114,5 +114,8 @@ spring:
context-path: /admin # 配置 Spring context-path: /admin # 配置 Spring
--- #################### 芋道相关配置 #################### --- #################### 芋道相关配置 ####################
yudao:
shortlink:
server: "http://172.16.46.63:48080/admin-api/infra/shortlink/"

View File

@@ -139,4 +139,6 @@ yudao:
access-log: # 访问日志的配置项 access-log: # 访问日志的配置项
enable: true enable: true
# 固定验证码 # 固定验证码
verify-code: 666666 verify-code: 666666
shortlink:
server: "http://localhost:48080/admin-api/infra/shortlink/"