Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 18 additions & 0 deletions .github/workflows/docker_publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -33,13 +33,22 @@ jobs:
- name: Checkout Code
uses: actions/checkout@v7.0.1

- name: Checkout OpenSabre Framework
uses: actions/checkout@v7.0.1
with:
repository: opensabre/opensabre-framework
path: opensabre-framework

- name: Set up JDK
uses: actions/setup-java@v5.6.0
with:
java-version: '25'
distribution: 'temurin'
cache: maven

- name: Install OpenSabre Framework Snapshot
run: mvn --batch-mode --no-transfer-progress -f opensabre-framework/pom.xml -DskipTests install

- name: Run Tests
run: mvn --batch-mode --no-transfer-progress verify

Expand All @@ -66,13 +75,22 @@ jobs:
- name: Checkout Code
uses: actions/checkout@v7.0.1

- name: Checkout OpenSabre Framework
uses: actions/checkout@v7.0.1
with:
repository: opensabre/opensabre-framework
path: opensabre-framework

- name: Set up JDK
uses: actions/setup-java@v5.6.0
with:
java-version: '25'
distribution: 'temurin'
cache: maven

- name: Install OpenSabre Framework Snapshot
run: mvn --batch-mode --no-transfer-progress -f opensabre-framework/pom.xml -DskipTests install

- name: Resolve image tags
id: image
shell: bash
Expand Down
2 changes: 1 addition & 1 deletion docs/development.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# 开发与运行

1. 基于 `resources/db/` 初始化数据库;已有环境按版本顺序评估并执行 `migrations/`。
1. 数据库变更写入 `resources/db/migration/mysql/`,由发布阶段的独立 Flyway 进程执行;应用 Pod 启动时不执行迁移。
2. 配置注册中心、数据库、缓存和通知渠道等依赖,再通过 Maven 启动。
3. 变更后按模块验证 API、数据持久化、权限和异常路径。

Expand Down
6 changes: 5 additions & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
<parent>
<artifactId>opensabre-base-dependencies</artifactId>
<groupId>io.github.opensabre</groupId>
<version>1.1.2</version>
<version>1.1.3-SNAPSHOT</version>
</parent>

<artifactId>base-sysadmin</artifactId>
Expand Down Expand Up @@ -45,6 +45,10 @@
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>io.github.opensabre</groupId>
<artifactId>opensabre-starter-migration</artifactId>
</dependency>
<dependency>
<groupId>io.github.opensabre</groupId>
<artifactId>opensabre-starter-register</artifactId>
Expand Down
3 changes: 3 additions & 0 deletions src/main/resources/application.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
server:
port: ${SERVER_PORT:8020}
spring:
# Database changes are executed by the dedicated release migration process, never by app pods.
flyway:
enabled: false
application:
name: base-sysadmin
cloud:
Expand Down
164 changes: 164 additions & 0 deletions src/main/resources/db/migration/mysql/V20260701_00__baseline.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,164 @@
SET NAMES utf8;
-- 审计日志表
DROP TABLE IF EXISTS base_sys_audit_log;
CREATE TABLE IF NOT EXISTS `base_sys_audit_log` (
`id` varchar(32) NOT NULL COMMENT '主键ID',
`operation_type` varchar(50) NOT NULL COMMENT '操作类型',
`operation_time` datetime NOT NULL COMMENT '操作时间',
`operator_username` varchar(100) NOT NULL COMMENT '操作人用户名',
`module` varchar(100) NOT NULL COMMENT '操作模块',
`description` varchar(500) COMMENT '操作描述',
`client_ip` varchar(50) COMMENT '操作IP地址',
`target_key` varchar(50) COMMENT '操作目标关键key',
`user_agent` varchar(500) COMMENT '用户代理',
`request_method` varchar(10) COMMENT '请求方法',
`request_url` varchar(500) COMMENT '请求URL',
`request` text COMMENT '请求参数',
`response` text COMMENT '操作结果',
`error_message` text COMMENT '错误信息',
`execution_time` bigint COMMENT '执行时间(毫秒)',
`created_by` varchar(100) NOT NULL COMMENT '创建人',
`created_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_by` varchar(100) NOT NULL COMMENT '更新人',
`updated_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
KEY `idx_operator_username` (`operator_username`),
KEY `idx_operation_time` (`operation_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='审计日志表';

DROP TABLE IF EXISTS base_sys_captcha_scene;
CREATE TABLE IF NOT EXISTS `base_sys_captcha_scene` (
`id` varchar(32) NOT NULL COMMENT '主键ID',
`scene_code` varchar(64) NOT NULL COMMENT '场景编码',
`scene_name` varchar(128) NOT NULL COMMENT '场景名称',
`captcha_type` varchar(32) NOT NULL COMMENT '验证码类型',
`template_code` varchar(64) DEFAULT NULL COMMENT '消息模板编码',
`notification_template_id` varchar(64) DEFAULT NULL COMMENT '通知模板ID',
`description` varchar(255) DEFAULT NULL COMMENT '描述',
`captcha_length` int NOT NULL DEFAULT 4 COMMENT '验证码长度',
`captcha_expire_time` int NOT NULL DEFAULT 300 COMMENT '过期时间(秒)',
`captcha_attempts` int NOT NULL DEFAULT 3 COMMENT '最大尝试次数',
`min_interval` int NOT NULL DEFAULT 60 COMMENT '最小间隔(秒)',
`max_limit_count` int NOT NULL DEFAULT 100 COMMENT '单用户生成限制次数',
`enabled` tinyint(1) NOT NULL DEFAULT 1 COMMENT '是否启用',
`created_by` varchar(100) NOT NULL COMMENT '创建人',
`created_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_by` varchar(100) NOT NULL COMMENT '更新人',
`updated_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_scene_code` (`scene_code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='验证码场景表';

DROP TABLE IF EXISTS base_sys_ratelimit_scene;
CREATE TABLE IF NOT EXISTS `base_sys_ratelimit_scene` (
`id` varchar(32) NOT NULL COMMENT '主键ID',
`scene_code` varchar(64) NOT NULL COMMENT '场景编码',
`scene_name` varchar(128) NOT NULL COMMENT '场景名称',
`algorithm` varchar(32) NOT NULL COMMENT '限次算法',
`dimensions` varchar(255) DEFAULT NULL COMMENT '维度代码,逗号分隔',
`key_prefix` varchar(100) DEFAULT NULL COMMENT '业务前缀',
`max_count` int NOT NULL DEFAULT 5 COMMENT '最大次数',
`period` int NOT NULL DEFAULT 60 COMMENT '时间窗口(秒)',
`enabled` tinyint(1) NOT NULL DEFAULT 1 COMMENT '是否启用',
`description` varchar(255) DEFAULT NULL COMMENT '描述',
`created_by` varchar(100) NOT NULL COMMENT '创建人',
`created_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_by` varchar(100) NOT NULL COMMENT '更新人',
`updated_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_scene_code` (`scene_code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='限次场景表';

DROP TABLE IF EXISTS base_sys_notification_record;
DROP TABLE IF EXISTS base_sys_notification_template;
DROP TABLE IF EXISTS base_sys_notification_scene;
CREATE TABLE IF NOT EXISTS `base_sys_notification_scene` (
`id` varchar(32) NOT NULL COMMENT '主键ID',
`scene_code` varchar(64) NOT NULL COMMENT '场景编码',
`scene_name` varchar(128) NOT NULL COMMENT '场景名称',
`description` varchar(255) DEFAULT NULL COMMENT '描述',
`enabled` tinyint(1) NOT NULL DEFAULT 1 COMMENT '是否启用',
`created_by` varchar(100) NOT NULL COMMENT '创建人',
`created_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_by` varchar(100) NOT NULL COMMENT '更新人',
`updated_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_scene_code` (`scene_code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='通知场景表';

CREATE TABLE IF NOT EXISTS `base_sys_notification_template` (
`id` varchar(32) NOT NULL COMMENT '主键ID',
`scene_code` varchar(64) NOT NULL COMMENT '场景编码',
`channel` varchar(32) NOT NULL COMMENT '发送渠道',
`template_name` varchar(128) NOT NULL COMMENT '模板名称',
`title` varchar(255) DEFAULT NULL COMMENT '标题',
`content` text NOT NULL COMMENT '模板内容',
`param_schema` varchar(1000) DEFAULT NULL COMMENT '参数说明',
`sort` int NOT NULL DEFAULT 1 COMMENT '排序',
`enabled` tinyint(1) NOT NULL DEFAULT 1 COMMENT '是否启用',
`created_by` varchar(100) NOT NULL COMMENT '创建人',
`created_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_by` varchar(100) NOT NULL COMMENT '更新人',
`updated_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_scene_channel` (`scene_code`, `channel`),
KEY `idx_scene_enabled_sort` (`scene_code`, `enabled`, `sort`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='通知渠道模板表';

CREATE TABLE IF NOT EXISTS `base_sys_notification_record` (
`id` varchar(32) NOT NULL COMMENT '主键ID',
`scene_code` varchar(64) NOT NULL COMMENT '场景编码',
`channel` varchar(32) NOT NULL COMMENT '发送渠道',
`target` varchar(255) NOT NULL COMMENT '发送目标',
`template_id` varchar(32) DEFAULT NULL COMMENT '模板ID',
`template_title` varchar(255) DEFAULT NULL COMMENT '标题快照',
`template_content` text COMMENT '内容快照',
`args_json` text COMMENT '参数JSON',
`status` varchar(32) NOT NULL COMMENT '发送状态',
`message_id` varchar(128) DEFAULT NULL COMMENT '消息ID',
`failure_reason` text COMMENT '失败原因',
`retry_count` int NOT NULL DEFAULT 0 COMMENT '重试次数',
`next_retry_time` datetime DEFAULT NULL COMMENT '下次重试时间',
`sent_time` datetime DEFAULT NULL COMMENT '发送时间',
`created_by` varchar(100) NOT NULL COMMENT '创建人',
`created_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_by` varchar(100) NOT NULL COMMENT '更新人',
`updated_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
KEY `idx_scene_channel_status` (`scene_code`, `channel`, `status`),
KEY `idx_created_time` (`created_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='通知发送记录表';

DROP TABLE IF EXISTS base_sys_dict_item;
DROP TABLE IF EXISTS base_sys_dict_type;
CREATE TABLE IF NOT EXISTS `base_sys_dict_type` (
`id` varchar(32) NOT NULL COMMENT '主键ID',
`name` varchar(128) NOT NULL COMMENT '字典名称',
`dict_code` varchar(64) NOT NULL COMMENT '字典编码',
`status` tinyint NOT NULL DEFAULT 1 COMMENT '状态(1:启用;0:禁用)',
`remark` varchar(255) DEFAULT NULL COMMENT '备注',
`created_by` varchar(100) NOT NULL COMMENT '创建人',
`created_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_by` varchar(100) NOT NULL COMMENT '更新人',
`updated_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_dict_code` (`dict_code`),
KEY `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='字典类型表';

CREATE TABLE IF NOT EXISTS `base_sys_dict_item` (
`id` varchar(32) NOT NULL COMMENT '主键ID',
`dict_code` varchar(64) NOT NULL COMMENT '字典编码',
`label` varchar(128) NOT NULL COMMENT '字典项标签',
`value` varchar(128) NOT NULL COMMENT '字典项值',
`status` tinyint NOT NULL DEFAULT 1 COMMENT '状态(1:启用;0:禁用)',
`sort` int NOT NULL DEFAULT 1 COMMENT '排序',
`tag_type` varchar(16) NOT NULL DEFAULT 'N' COMMENT '标签类型(N/P/S/W/I/D)',
`created_by` varchar(100) NOT NULL COMMENT '创建人',
`created_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_by` varchar(100) NOT NULL COMMENT '更新人',
`updated_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_dict_value` (`dict_code`, `value`),
KEY `idx_dict_status_sort` (`dict_code`, `status`, `sort`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='字典项表';
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
USE os_base_sysadmin;
SET NAMES utf8mb4;

CREATE TABLE IF NOT EXISTS `base_sys_ratelimit_scene` (
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
USE os_base_sysadmin;
SET NAMES utf8mb4;

INSERT INTO base_sys_ratelimit_scene
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
SET NAMES utf8mb4;

-- 站内信:消息主体与收件人快照。发布时由应用将目标用户名固化为收件人记录。
CREATE TABLE IF NOT EXISTS `base_sys_internal_message` (
`id` varchar(32) NOT NULL COMMENT '主键ID',
`kind` varchar(32) NOT NULL COMMENT '消息类型:ANNOUNCEMENT/NOTIFICATION',
`title` varchar(255) NOT NULL COMMENT '标题',
`content` text NOT NULL COMMENT '富文本内容',
`level` varchar(16) NOT NULL DEFAULT 'L' COMMENT '消息等级',
`target_scope` varchar(32) NOT NULL COMMENT '目标范围',
`target_usernames` text NOT NULL COMMENT '草稿目标用户名快照,逗号分隔',
`target_url` varchar(500) DEFAULT NULL COMMENT '站内跳转地址',
`status` varchar(32) NOT NULL COMMENT '状态:DRAFT/PUBLISHED/REVOKED',
`publish_time` datetime DEFAULT NULL COMMENT '发布时间',
`expire_time` datetime DEFAULT NULL COMMENT '到期时间',
`created_by` varchar(100) NOT NULL COMMENT '创建人',
`created_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_by` varchar(100) NOT NULL COMMENT '更新人',
`updated_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
KEY `idx_status_publish_time` (`status`, `publish_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='站内信主体表';

CREATE TABLE IF NOT EXISTS `base_sys_internal_message_recipient` (
`id` varchar(32) NOT NULL COMMENT '主键ID',
`message_id` varchar(32) NOT NULL COMMENT '站内信ID',
`username` varchar(100) NOT NULL COMMENT '接收用户名',
`read_time` datetime DEFAULT NULL COMMENT '阅读时间',
`created_by` varchar(100) NOT NULL COMMENT '创建人',
`created_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_by` varchar(100) NOT NULL COMMENT '更新人',
`updated_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_message_username` (`message_id`, `username`),
KEY `idx_username_read_time` (`username`, `read_time`, `created_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='站内信收件人表';
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
USE os_base_sysadmin;
SET NAMES utf8mb4;

-- 此版本迁移仅执行一次。DATETIME 不进行时区转换;历史记录已截断的毫秒无法恢复。
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,3 +33,25 @@ ON DUPLICATE KEY UPDATE
`sort` = VALUES(`sort`),
`tag_type` = VALUES(`tag_type`),
`updated_by` = 'system';

INSERT INTO `base_sys_dict_type`
(`id`, `name`, `dict_code`, `source_application`, `status`, `remark`, `created_by`, `updated_by`)
VALUES
('DICT_IQC_CONVERSATION_CHANNEL', '会话渠道', 'iqc_conversation_channel', 'iqc-platform', 1, 'IQC 会话来源渠道(系统枚举)', 'system', 'system'),
('DICT_IQC_BUSINESS_TYPE', '业务类型', 'iqc_business_type', NULL, 1, 'IQC 业务类型(管理员可维护)', 'system', 'system')
ON DUPLICATE KEY UPDATE
`name` = VALUES(`name`), `status` = 1, `remark` = VALUES(`remark`), `updated_by` = 'system';

INSERT INTO `base_sys_dict_item`
(`id`, `dict_code`, `label`, `value`, `status`, `sort`, `tag_type`, `created_by`, `updated_by`)
VALUES
('DICT_IQC_CHANNEL_WEB', 'iqc_conversation_channel', '网页', 'WEB', 1, 10, 'P', 'system', 'system'),
('DICT_IQC_CHANNEL_PHONE', 'iqc_conversation_channel', '电话', 'PHONE', 1, 20, 'S', 'system', 'system'),
('DICT_IQC_CHANNEL_WECHAT', 'iqc_conversation_channel', '微信', 'WECHAT', 1, 30, 'P', 'system', 'system'),
('DICT_IQC_CHANNEL_APP', 'iqc_conversation_channel', 'App', 'APP', 1, 40, 'S', 'system', 'system'),
('DICT_IQC_CHANNEL_OTHER', 'iqc_conversation_channel', '其他', 'OTHER', 1, 99, 'N', 'system', 'system'),
('DICT_IQC_BUSINESS_ORDER', 'iqc_business_type', '订单', 'ORDER', 1, 10, 'P', 'system', 'system'),
('DICT_IQC_BUSINESS_TICKET', 'iqc_business_type', '工单', 'TICKET', 1, 20, 'W', 'system', 'system'),
('DICT_IQC_BUSINESS_COMPLAINT', 'iqc_business_type', '投诉', 'COMPLAINT', 1, 30, 'D', 'system', 'system')
ON DUPLICATE KEY UPDATE
`label` = VALUES(`label`), `status` = 1, `sort` = VALUES(`sort`), `tag_type` = VALUES(`tag_type`), `updated_by` = 'system';
Loading
Loading