【分享】草稿箱多版本功能设计

项目场景:

在项目中,有一个报表功能多版本的需求,觉得非常有意思,做一次分享给大家:
报表多版本要求:

  • 一个报表分为未发布(编辑版本)版本和发布(查看版本)版本,编辑版本操作过程中不影响别人查看当前版本
  • 报表支持版本回退,比如当前报表版本已经是V3了,可以回退到V1版本
  • 报表支持多版本预览,比如报表可以分享当前指定版本给用户查看

实体图

在这里插入图片描述


数据库表设计

新增报表信息表report_info

CREATE TABLE `report_info` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键id',
  `group_id` bigint DEFAULT NULL COMMENT '文件组ID',
  `tenant_id` bigint DEFAULT '0' COMMENT '租户id',
  `report_code` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '报表编码',
  `name` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '名称',
  `update_model_relation` varchar(64) DEFAULT NULL COMMENT '更新数据联动的模块',
  `issue_flag` int DEFAULT '0' COMMENT '是否发布 0=未发布  1=已发布',
  `run_env` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '项目运行环境',
  `bg_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '背景图链接',
  `version` bigint DEFAULT '0' COMMENT '版本号',
  `create_by` bigint DEFAULT NULL COMMENT '创建人',
  `update_by` bigint DEFAULT NULL COMMENT '更新人',
  `creator` varchar(50) DEFAULT NULL COMMENT '创建人',
  `updater` varchar(50) DEFAULT NULL COMMENT '更新人',
  `create_time` timestamp NULL DEFAULT NULL COMMENT '创建时间',
  `update_time` timestamp NULL DEFAULT NULL COMMENT '更新时间',
  `publisher` varchar(50) DEFAULT NULL COMMENT '发布人名称',
  `publish_time` timestamp NULL DEFAULT NULL COMMENT '发布时间',
  `delete_flag` int DEFAULT '0' COMMENT '1 删除 0未删除',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='报表信息表';

新增画布主要信息表canvas_info

CREATE TABLE `canvas_info` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '自增id',
  `tenant_id` bigint DEFAULT '0' COMMENT '租户id',
  `report_id` bigint DEFAULT '0' COMMENT '报表id',
  `create_by` bigint DEFAULT NULL COMMENT '创建人id',
  `update_by` bigint DEFAULT NULL COMMENT '最新修改人ID',
  `creator` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '创建用户',
  `updater` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '更新用户',
  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
  `update_time` datetime DEFAULT NULL COMMENT '最新修改时间',
  `delete_flag` int DEFAULT '0' COMMENT '逻辑删除',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='画布主要信息表';

新增画布详细配置表canvas_config

CREATE TABLE `canvas_config` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '自增id',
  `canvas_id` bigint DEFAULT NULL COMMENT '报表id',
  `orgin_id` bigint DEFAULT NULL COMMENT '报表源ID',
  `tenant_id` bigint DEFAULT '0' COMMENT '租户id',
  `name` varchar(255) DEFAULT NULL COMMENT '报表名称',
  `version` bigint DEFAULT '0' COMMENT '版本号',
  `config` json DEFAULT NULL COMMENT '联动,下钻的配置条件',
  `issue_flag` int DEFAULT '0' COMMENT '是否发布 0=未发布  1=已发布',
  `sort` int DEFAULT '0' COMMENT '排序号',
  `preview_status` varchar(50) DEFAULT 'UNLOCK' COMMENT '预览状态',
  `canvas_template_id` bigint DEFAULT NULL COMMENT '模版id,有模版ID的为模版报表',
  `set_template` tinyint DEFAULT '0' COMMENT '是否设为模版',
  `from_template_id` bigint DEFAULT NULL COMMENT '该报表来自哪个模版(即该报表由哪个模版生成)',
  `update_model_relation` varchar(64) DEFAULT NULL COMMENT '更新数据联动的模块',
  `uuid` varchar(45) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '唯一业务标识',
  `create_by` bigint DEFAULT NULL COMMENT '创建人id',
  `update_by` bigint DEFAULT NULL COMMENT '最新修改人ID',
  `creator` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '创建用户',
  `updater` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '更新用户',
  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
  `update_time` datetime DEFAULT NULL COMMENT '最新修改时间',
  `delete_flag` int DEFAULT '0' COMMENT '逻辑删除',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='画布详细配置';

新增图表主要信息表icon_info

CREATE TABLE `icon_info` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '自增id',
  `tenant_id` bigint DEFAULT '0' COMMENT '租户id',
  `canvas_id` bigint DEFAULT '0' COMMENT '画布id',
  `create_by` bigint DEFAULT NULL COMMENT '创建人',
  `update_by` bigint DEFAULT NULL COMMENT '更新人',
  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
  `delete_flag` int DEFAULT '0' COMMENT '逻辑删除标记; 删除:1,未删除:0',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='图表主要信息表';

新增图表详细配置表icon_config

CREATE TABLE `icon_config` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '自增id',
  `canvas_id` bigint DEFAULT NULL COMMENT '画布id',
  `orgin_id` bigint DEFAULT NULL COMMENT '报表源ID',
  `tenant_id` bigint DEFAULT '0' COMMENT '租户id',
  `name` varchar(255) DEFAULT NULL,
  `version` bigint DEFAULT '0' COMMENT '版本号',
  `data_model_id` bigint DEFAULT NULL COMMENT '数据模型id',
  `uuid` varchar(100) DEFAULT NULL COMMENT '图表uuid',
  `config` json DEFAULT NULL COMMENT '图表配置信息',
  `issue_flag` int DEFAULT '0' COMMENT '是否发布 0=未发布  1=已发布',
  `request_info` json DEFAULT NULL COMMENT '请求信息',
  `template_data` json DEFAULT NULL COMMENT '图表模版的数据',
  `sql` varchar(1000) DEFAULT NULL COMMENT '数据源后经过计算的sql',
  `update_model_relation` varchar(64) DEFAULT NULL COMMENT '更新数据联动的模块',
  `create_by` bigint DEFAULT NULL COMMENT '创建人',
  `update_by` bigint DEFAULT NULL COMMENT '更新人',
  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
  `delete_flag` int DEFAULT '0' COMMENT '逻辑删除标记; 删除:1,未删除:0',
  PRIMARY KEY (`id`) USING BTREE,
  UNIQUE KEY `icon_unique` (`canvas_id`,`uuid`),
  KEY `index_name_idx` (`canvas_id`),
  KEY `data_model_id_idx` (`data_model_id`),
  KEY `uuid_idx` (`uuid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='图表详细配置表';

发布流程:

在这里插入图片描述

下面是发布操作

在这里插入图片描述
在这里插入图片描述


总结

每次发布这里使用到COW(copy to write)写时拷贝的思想,发布的时候拷贝副本作为上一个版本的快照,方便切换版本的操作。

还有一种是ROW(redirect to write)写时重定向,记录报表操作的变更,每次读取的时候指向新的版本也可以。具体看实际场景,我这边目前是写少读多用COW读取非常快。

猜你喜欢

转载自blog.csdn.net/weixin_42380504/article/details/126417626