feat: add Go backend

This commit is contained in:
richjohnrambo
2026-10-10 20:56:17 +08:00
parent 50fcfd2d3d
commit f6024f0964
1040 changed files with 107169 additions and 0 deletions
View File
View File
View File
View File
@@ -0,0 +1,62 @@
-- hotgo自动生成菜单权限SQL 通常情况下只在首次生成代码时自动执行一次
-- 如需再次执行请先手动删除生成的菜单权限和SQL文件:/Users/mengshuai/Desktop/gosrc/hotgo_dev/server/storage/data/generate/addons/tenant_order_menu.sql
-- Version: 2.13.1
-- Date: 2024-04-13 23:37:27
-- Link https://github.com/bufanyun/hotgo
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET AUTOCOMMIT = 0;
START TRANSACTION;
--
-- 数据库: `hotgo`
--
-- --------------------------------------------------------
--
-- 插入表中的数据 `hg_admin_menu`
--
SET @now := now();
-- 菜单目录
INSERT INTO `hg_admin_menu` (`id`, `pid`, `title`, `name`, `path`, `icon`, `type`, `redirect`, `permissions`, `permission_name`, `component`, `always_show`, `active_menu`, `is_root`, `is_frame`, `frame_src`, `keep_alive`, `hidden`, `affix`, `level`, `tree`, `sort`, `remark`, `status`, `created_at`, `updated_at`) VALUES (NULL, '2228', '多租户功能演示', 'tenantOrder', '/tenantOrder', '', '1', '/addons/hgexample/tenantOrder/index', '', '', 'ParentLayout', '1', '', '0', '0', '', '0', '0', '0', '3', 'tr_2227 tr_2228 ', '200', '', '1', @now, @now);
SET @dirId = LAST_INSERT_ID();
-- 菜单页面
-- 列表
INSERT INTO `hg_admin_menu` (`id`, `pid`, `title`, `name`, `path`, `icon`, `type`, `redirect`, `permissions`, `permission_name`, `component`, `always_show`, `active_menu`, `is_root`, `is_frame`, `frame_src`, `keep_alive`, `hidden`, `affix`, `level`, `tree`, `sort`, `remark`, `status`, `created_at`, `updated_at`) VALUES (NULL, @dirId, '多租户功能演示列表', 'tenantOrderIndex', 'index', '', '2', '', '/hgexample/tenantOrder/list', '', '/addons/hgexample/tenantOrder/index', '1', 'tenantOrder', '0', '0', '', '0', '1', '0', '4', CONCAT('tr_2227 tr_2228 tr_', @dirId,' '), '10', '', '1', @now, @now);
SET @listId = LAST_INSERT_ID();
-- 详情
INSERT INTO `hg_admin_menu` (`id`, `pid`, `title`, `name`, `path`, `icon`, `type`, `redirect`, `permissions`, `permission_name`, `component`, `always_show`, `active_menu`, `is_root`, `is_frame`, `frame_src`, `keep_alive`, `hidden`, `affix`, `level`, `tree`, `sort`, `remark`, `status`, `created_at`, `updated_at`) VALUES (NULL, @listId, '多租户功能演示详情', 'tenantOrderView', '', '', '3', '', '/hgexample/tenantOrder/view', '', '', '1', '', '0', '0', '', '0', '1', '0', '5', CONCAT('tr_2227 tr_2228 tr_', @dirId, ' tr_', @listId,' '), '10', '', '1', @now, @now);
-- 菜单按钮
-- 编辑
INSERT INTO `hg_admin_menu` (`id`, `pid`, `title`, `name`, `path`, `icon`, `type`, `redirect`, `permissions`, `permission_name`, `component`, `always_show`, `active_menu`, `is_root`, `is_frame`, `frame_src`, `keep_alive`, `hidden`, `affix`, `level`, `tree`, `sort`, `remark`, `status`, `created_at`, `updated_at`) VALUES (NULL, @listId, '编辑/新增多租户功能演示', 'tenantOrderEdit', '', '', '3', '', '/hgexample/tenantOrder/edit', '', '', '1', '', '0', '0', '', '0', '1', '0', '5', CONCAT('tr_2227 tr_2228 tr_', @dirId, ' tr_', @listId,' '), '20', '', '1', @now, @now);
SET @editId = LAST_INSERT_ID();
-- 删除
INSERT INTO `hg_admin_menu` (`id`, `pid`, `title`, `name`, `path`, `icon`, `type`, `redirect`, `permissions`, `permission_name`, `component`, `always_show`, `active_menu`, `is_root`, `is_frame`, `frame_src`, `keep_alive`, `hidden`, `affix`, `level`, `tree`, `sort`, `remark`, `status`, `created_at`, `updated_at`) VALUES (NULL, @listId, '删除多租户功能演示', 'tenantOrderDelete', '', '', '3', '', '/hgexample/tenantOrder/delete', '', '', '1', '', '0', '0', '', '0', '0', '0', '5', CONCAT('tr_2227 tr_2228 tr_', @dirId, ' tr_', @listId,' '), '40', '', '1', @now, @now);
-- 导出
INSERT INTO `hg_admin_menu` (`id`, `pid`, `title`, `name`, `path`, `icon`, `type`, `redirect`, `permissions`, `permission_name`, `component`, `always_show`, `active_menu`, `is_root`, `is_frame`, `frame_src`, `keep_alive`, `hidden`, `affix`, `level`, `tree`, `sort`, `remark`, `status`, `created_at`, `updated_at`) VALUES (NULL, @listId, '导出多租户功能演示', 'tenantOrderExport', '', '', '3', '', '/hgexample/tenantOrder/export', '', '', '1', '', '0', '0', '', '0', '0', '0', '5', CONCAT('tr_2227 tr_2228 tr_', @dirId, ' tr_', @listId,' '), '70', '', '1', @now, @now);
COMMIT;
@@ -0,0 +1,71 @@
-- hotgo自动生成菜单权限SQL 通常情况下只在首次生成代码时自动执行一次
-- 如需再次执行请先手动删除生成的菜单权限和SQL文件:C:\Users\Administrator\Desktop\gosrc\hotgo_dev\server\storage\data\generate\curd_demo_menu.sql
-- Version: 2.13.1
-- Date: 2024-04-08 10:13:25
-- Link https://github.com/bufanyun/hotgo
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET AUTOCOMMIT = 0;
START TRANSACTION;
--
-- 数据库: `hotgo`
--
-- --------------------------------------------------------
--
-- 插入表中的数据 `hg_admin_menu`
--
SET @now := now();
-- 菜单目录
INSERT INTO `hg_admin_menu` (`id`, `pid`, `title`, `name`, `path`, `icon`, `type`, `redirect`, `permissions`, `permission_name`, `component`, `always_show`, `active_menu`, `is_root`, `is_frame`, `frame_src`, `keep_alive`, `hidden`, `affix`, `level`, `tree`, `sort`, `remark`, `status`, `created_at`, `updated_at`) VALUES (NULL, '2366', 'CURD列表', 'curdDemo', '/curdDemo', '', '1', '/develop/generateDemo/curdDemo/index', '', '', 'ParentLayout', '1', '', '0', '0', '', '0', '0', '0', '3', 'tr_2097 tr_2366 ', '10', '', '1', @now, @now);
SET @dirId = LAST_INSERT_ID();
-- 菜单页面
-- 列表
INSERT INTO `hg_admin_menu` (`id`, `pid`, `title`, `name`, `path`, `icon`, `type`, `redirect`, `permissions`, `permission_name`, `component`, `always_show`, `active_menu`, `is_root`, `is_frame`, `frame_src`, `keep_alive`, `hidden`, `affix`, `level`, `tree`, `sort`, `remark`, `status`, `created_at`, `updated_at`) VALUES (NULL, @dirId, 'CURD列表列表', 'curdDemoIndex', 'index', '', '2', '', '/curdDemo/list', '', '/curdDemo/index', '1', 'curdDemo', '0', '0', '', '0', '1', '0', '4', CONCAT('tr_2097 tr_2366 tr_', @dirId,' '), '10', '', '1', @now, @now);
SET @listId = LAST_INSERT_ID();
-- 详情
INSERT INTO `hg_admin_menu` (`id`, `pid`, `title`, `name`, `path`, `icon`, `type`, `redirect`, `permissions`, `permission_name`, `component`, `always_show`, `active_menu`, `is_root`, `is_frame`, `frame_src`, `keep_alive`, `hidden`, `affix`, `level`, `tree`, `sort`, `remark`, `status`, `created_at`, `updated_at`) VALUES (NULL, @listId, 'CURD列表详情', 'curdDemoView', '', '', '3', '', '/curdDemo/view', '', '', '1', '', '0', '0', '', '0', '1', '0', '5', CONCAT('tr_2097 tr_2366 tr_', @dirId, ' tr_', @listId,' '), '10', '', '1', @now, @now);
-- 菜单按钮
-- 编辑
INSERT INTO `hg_admin_menu` (`id`, `pid`, `title`, `name`, `path`, `icon`, `type`, `redirect`, `permissions`, `permission_name`, `component`, `always_show`, `active_menu`, `is_root`, `is_frame`, `frame_src`, `keep_alive`, `hidden`, `affix`, `level`, `tree`, `sort`, `remark`, `status`, `created_at`, `updated_at`) VALUES (NULL, @listId, '编辑/新增CURD列表', 'curdDemoEdit', '', '', '3', '', '/curdDemo/edit', '', '', '1', '', '0', '0', '', '0', '1', '0', '5', CONCAT('tr_2097 tr_2366 tr_', @dirId, ' tr_', @listId,' '), '20', '', '1', @now, @now);
SET @editId = LAST_INSERT_ID();
-- 获取最大排序
INSERT INTO `hg_admin_menu` (`id`, `pid`, `title`, `name`, `path`, `icon`, `type`, `redirect`, `permissions`, `permission_name`, `component`, `always_show`, `active_menu`, `is_root`, `is_frame`, `frame_src`, `keep_alive`, `hidden`, `affix`, `level`, `tree`, `sort`, `remark`, `status`, `created_at`, `updated_at`) VALUES (NULL, @editId, '获取CURD列表最大排序', 'curdDemoMaxSort', '', '', '3', '', '/curdDemo/maxSort', '', '', '1', '', '0', '0', '', '0', '0', '0', '6', CONCAT('tr_2097 tr_2366 tr_', @dirId, ' tr_', @listId, ' tr_', @editId,' '), '30', '', '1', @now, @now);
-- 删除
INSERT INTO `hg_admin_menu` (`id`, `pid`, `title`, `name`, `path`, `icon`, `type`, `redirect`, `permissions`, `permission_name`, `component`, `always_show`, `active_menu`, `is_root`, `is_frame`, `frame_src`, `keep_alive`, `hidden`, `affix`, `level`, `tree`, `sort`, `remark`, `status`, `created_at`, `updated_at`) VALUES (NULL, @listId, '删除CURD列表', 'curdDemoDelete', '', '', '3', '', '/curdDemo/delete', '', '', '1', '', '0', '0', '', '0', '0', '0', '5', CONCAT('tr_2097 tr_2366 tr_', @dirId, ' tr_', @listId,' '), '40', '', '1', @now, @now);
-- 更新状态
INSERT INTO `hg_admin_menu` (`id`, `pid`, `title`, `name`, `path`, `icon`, `type`, `redirect`, `permissions`, `permission_name`, `component`, `always_show`, `active_menu`, `is_root`, `is_frame`, `frame_src`, `keep_alive`, `hidden`, `affix`, `level`, `tree`, `sort`, `remark`, `status`, `created_at`, `updated_at`) VALUES (NULL, @listId, '修改CURD列表状态', 'curdDemoStatus', '', '', '3', '', '/curdDemo/status', '', '', '1', '', '0', '0', '', '0', '0', '0', '5', CONCAT('tr_2097 tr_2366 tr_', @dirId, ' tr_', @listId,' '), '50', '', '1', @now, @now);
-- 操作开关
INSERT INTO `hg_admin_menu` (`id`, `pid`, `title`, `name`, `path`, `icon`, `type`, `redirect`, `permissions`, `permission_name`, `component`, `always_show`, `active_menu`, `is_root`, `is_frame`, `frame_src`, `keep_alive`, `hidden`, `affix`, `level`, `tree`, `sort`, `remark`, `status`, `created_at`, `updated_at`) VALUES (NULL, @listId, '操作CURD列表开关', 'curdDemoSwitch', '', '', '3', '', '/curdDemo/switch', '', '', '1', '', '0', '0', '', '0', '0', '0', '5', CONCAT('tr_2097 tr_2366 tr_', @dirId, ' tr_', @listId,' '), '60', '', '1', @now, @now);
-- 导出
INSERT INTO `hg_admin_menu` (`id`, `pid`, `title`, `name`, `path`, `icon`, `type`, `redirect`, `permissions`, `permission_name`, `component`, `always_show`, `active_menu`, `is_root`, `is_frame`, `frame_src`, `keep_alive`, `hidden`, `affix`, `level`, `tree`, `sort`, `remark`, `status`, `created_at`, `updated_at`) VALUES (NULL, @listId, '导出CURD列表', 'curdDemoExport', '', '', '3', '', '/curdDemo/export', '', '', '1', '', '0', '0', '', '0', '0', '0', '5', CONCAT('tr_2097 tr_2366 tr_', @dirId, ' tr_', @listId,' '), '70', '', '1', @now, @now);
COMMIT;
@@ -0,0 +1,71 @@
-- hotgo自动生成菜单权限SQL 通常情况下只在首次生成代码时自动执行一次
-- 如需再次执行请先手动删除生成的菜单权限和SQL文件:C:\Users\Administrator\Desktop\gosrc\hotgo_dev\server\storage\data\generate\normal_tree_demo_menu.sql
-- Version: 2.13.1
-- Date: 2024-04-09 17:05:12
-- Link https://github.com/bufanyun/hotgo
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET AUTOCOMMIT = 0;
START TRANSACTION;
--
-- 数据库: `hotgo`
--
-- --------------------------------------------------------
--
-- 插入表中的数据 `hg_admin_menu`
--
SET @now := now();
-- 菜单目录
INSERT INTO `hg_admin_menu` (`id`, `pid`, `title`, `name`, `path`, `icon`, `type`, `redirect`, `permissions`, `permission_name`, `component`, `always_show`, `active_menu`, `is_root`, `is_frame`, `frame_src`, `keep_alive`, `hidden`, `affix`, `level`, `tree`, `sort`, `remark`, `status`, `created_at`, `updated_at`) VALUES (NULL, '2366', '普通树表', 'normalTreeDemo', '/normalTreeDemo', '', '1', '/develop/generateDemo/normalTreeDemo/index', '', '', 'ParentLayout', '1', '', '0', '0', '', '0', '0', '0', '3', 'tr_2097 tr_2366 ', '200', '', '1', @now, @now);
SET @dirId = LAST_INSERT_ID();
-- 菜单页面
-- 列表
INSERT INTO `hg_admin_menu` (`id`, `pid`, `title`, `name`, `path`, `icon`, `type`, `redirect`, `permissions`, `permission_name`, `component`, `always_show`, `active_menu`, `is_root`, `is_frame`, `frame_src`, `keep_alive`, `hidden`, `affix`, `level`, `tree`, `sort`, `remark`, `status`, `created_at`, `updated_at`) VALUES (NULL, @dirId, '普通树表列表', 'normalTreeDemoIndex', 'index', '', '2', '', '/normalTreeDemo/list', '', '/normalTreeDemo/index', '1', 'normalTreeDemo', '0', '0', '', '0', '1', '0', '4', CONCAT('tr_2097 tr_2366 tr_', @dirId,' '), '10', '', '1', @now, @now);
SET @listId = LAST_INSERT_ID();
-- 详情
INSERT INTO `hg_admin_menu` (`id`, `pid`, `title`, `name`, `path`, `icon`, `type`, `redirect`, `permissions`, `permission_name`, `component`, `always_show`, `active_menu`, `is_root`, `is_frame`, `frame_src`, `keep_alive`, `hidden`, `affix`, `level`, `tree`, `sort`, `remark`, `status`, `created_at`, `updated_at`) VALUES (NULL, @listId, '普通树表详情', 'normalTreeDemoView', '', '', '3', '', '/normalTreeDemo/view', '', '', '1', '', '0', '0', '', '0', '1', '0', '5', CONCAT('tr_2097 tr_2366 tr_', @dirId, ' tr_', @listId,' '), '10', '', '1', @now, @now);
-- 菜单按钮
-- 编辑
INSERT INTO `hg_admin_menu` (`id`, `pid`, `title`, `name`, `path`, `icon`, `type`, `redirect`, `permissions`, `permission_name`, `component`, `always_show`, `active_menu`, `is_root`, `is_frame`, `frame_src`, `keep_alive`, `hidden`, `affix`, `level`, `tree`, `sort`, `remark`, `status`, `created_at`, `updated_at`) VALUES (NULL, @listId, '编辑/新增普通树表', 'normalTreeDemoEdit', '', '', '3', '', '/normalTreeDemo/edit', '', '', '1', '', '0', '0', '', '0', '1', '0', '5', CONCAT('tr_2097 tr_2366 tr_', @dirId, ' tr_', @listId,' '), '20', '', '1', @now, @now);
SET @editId = LAST_INSERT_ID();
-- 获取最大排序
INSERT INTO `hg_admin_menu` (`id`, `pid`, `title`, `name`, `path`, `icon`, `type`, `redirect`, `permissions`, `permission_name`, `component`, `always_show`, `active_menu`, `is_root`, `is_frame`, `frame_src`, `keep_alive`, `hidden`, `affix`, `level`, `tree`, `sort`, `remark`, `status`, `created_at`, `updated_at`) VALUES (NULL, @editId, '获取普通树表最大排序', 'normalTreeDemoMaxSort', '', '', '3', '', '/normalTreeDemo/maxSort', '', '', '1', '', '0', '0', '', '0', '0', '0', '6', CONCAT('tr_2097 tr_2366 tr_', @dirId, ' tr_', @listId, ' tr_', @editId,' '), '30', '', '1', @now, @now);
-- 删除
INSERT INTO `hg_admin_menu` (`id`, `pid`, `title`, `name`, `path`, `icon`, `type`, `redirect`, `permissions`, `permission_name`, `component`, `always_show`, `active_menu`, `is_root`, `is_frame`, `frame_src`, `keep_alive`, `hidden`, `affix`, `level`, `tree`, `sort`, `remark`, `status`, `created_at`, `updated_at`) VALUES (NULL, @listId, '删除普通树表', 'normalTreeDemoDelete', '', '', '3', '', '/normalTreeDemo/delete', '', '', '1', '', '0', '0', '', '0', '0', '0', '5', CONCAT('tr_2097 tr_2366 tr_', @dirId, ' tr_', @listId,' '), '40', '', '1', @now, @now);
-- 更新状态
INSERT INTO `hg_admin_menu` (`id`, `pid`, `title`, `name`, `path`, `icon`, `type`, `redirect`, `permissions`, `permission_name`, `component`, `always_show`, `active_menu`, `is_root`, `is_frame`, `frame_src`, `keep_alive`, `hidden`, `affix`, `level`, `tree`, `sort`, `remark`, `status`, `created_at`, `updated_at`) VALUES (NULL, @listId, '修改普通树表状态', 'normalTreeDemoStatus', '', '', '3', '', '/normalTreeDemo/status', '', '', '1', '', '0', '0', '', '0', '0', '0', '5', CONCAT('tr_2097 tr_2366 tr_', @dirId, ' tr_', @listId,' '), '50', '', '1', @now, @now);
-- 导出
INSERT INTO `hg_admin_menu` (`id`, `pid`, `title`, `name`, `path`, `icon`, `type`, `redirect`, `permissions`, `permission_name`, `component`, `always_show`, `active_menu`, `is_root`, `is_frame`, `frame_src`, `keep_alive`, `hidden`, `affix`, `level`, `tree`, `sort`, `remark`, `status`, `created_at`, `updated_at`) VALUES (NULL, @listId, '导出普通树表', 'normalTreeDemoExport', '', '', '3', '', '/normalTreeDemo/export', '', '', '1', '', '0', '0', '', '0', '0', '0', '5', CONCAT('tr_2097 tr_2366 tr_', @dirId, ' tr_', @listId,' '), '70', '', '1', @now, @now);
-- 关系树选项
INSERT INTO `hg_admin_menu` (`id`, `pid`, `title`, `name`, `path`, `icon`, `type`, `redirect`, `permissions`, `permission_name`, `component`, `always_show`, `active_menu`, `is_root`, `is_frame`, `frame_src`, `keep_alive`, `hidden`, `affix`, `level`, `tree`, `sort`, `remark`, `status`, `created_at`, `updated_at`) VALUES (NULL, @listId, '获取普通树表关系树选项', 'normalTreeDemoTreeOption', '', '', '3', '', '/normalTreeDemo/treeOption', '', '', '1', '', '0', '0', '', '0', '0', '0', '5', CONCAT('tr_2097 tr_2366 tr_', @dirId, ' tr_', @listId,' '), '70', '', '1', @now, @now);
COMMIT;
@@ -0,0 +1,71 @@
-- hotgo自动生成菜单权限SQL 通常情况下只在首次生成代码时自动执行一次
-- 如需再次执行请先手动删除生成的菜单权限和SQL文件:C:\Users\Administrator\Desktop\gosrc\hotgo_dev\server\storage\data\generate\option_tree_demo_menu.sql
-- Version: 2.13.1
-- Date: 2024-04-09 17:22:28
-- Link https://github.com/bufanyun/hotgo
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET AUTOCOMMIT = 0;
START TRANSACTION;
--
-- 数据库: `hotgo`
--
-- --------------------------------------------------------
--
-- 插入表中的数据 `hg_admin_menu`
--
SET @now := now();
-- 菜单目录
INSERT INTO `hg_admin_menu` (`id`, `pid`, `title`, `name`, `path`, `icon`, `type`, `redirect`, `permissions`, `permission_name`, `component`, `always_show`, `active_menu`, `is_root`, `is_frame`, `frame_src`, `keep_alive`, `hidden`, `affix`, `level`, `tree`, `sort`, `remark`, `status`, `created_at`, `updated_at`) VALUES (NULL, '2366', '选项树表', 'optionTreeDemo', '/optionTreeDemo', '', '1', '/develop/generateDemo/optionTreeDemo/index', '', '', 'ParentLayout', '1', '', '0', '0', '', '0', '0', '0', '3', 'tr_2097 tr_2366 ', '300', '', '1', @now, @now);
SET @dirId = LAST_INSERT_ID();
-- 菜单页面
-- 列表
INSERT INTO `hg_admin_menu` (`id`, `pid`, `title`, `name`, `path`, `icon`, `type`, `redirect`, `permissions`, `permission_name`, `component`, `always_show`, `active_menu`, `is_root`, `is_frame`, `frame_src`, `keep_alive`, `hidden`, `affix`, `level`, `tree`, `sort`, `remark`, `status`, `created_at`, `updated_at`) VALUES (NULL, @dirId, '选项树表列表', 'optionTreeDemoIndex', 'index', '', '2', '', '/optionTreeDemo/list', '', '/optionTreeDemo/index', '1', 'optionTreeDemo', '0', '0', '', '0', '1', '0', '4', CONCAT('tr_2097 tr_2366 tr_', @dirId,' '), '10', '', '1', @now, @now);
SET @listId = LAST_INSERT_ID();
-- 详情
INSERT INTO `hg_admin_menu` (`id`, `pid`, `title`, `name`, `path`, `icon`, `type`, `redirect`, `permissions`, `permission_name`, `component`, `always_show`, `active_menu`, `is_root`, `is_frame`, `frame_src`, `keep_alive`, `hidden`, `affix`, `level`, `tree`, `sort`, `remark`, `status`, `created_at`, `updated_at`) VALUES (NULL, @listId, '选项树表详情', 'optionTreeDemoView', '', '', '3', '', '/optionTreeDemo/view', '', '', '1', '', '0', '0', '', '0', '1', '0', '5', CONCAT('tr_2097 tr_2366 tr_', @dirId, ' tr_', @listId,' '), '10', '', '1', @now, @now);
-- 菜单按钮
-- 编辑
INSERT INTO `hg_admin_menu` (`id`, `pid`, `title`, `name`, `path`, `icon`, `type`, `redirect`, `permissions`, `permission_name`, `component`, `always_show`, `active_menu`, `is_root`, `is_frame`, `frame_src`, `keep_alive`, `hidden`, `affix`, `level`, `tree`, `sort`, `remark`, `status`, `created_at`, `updated_at`) VALUES (NULL, @listId, '编辑/新增选项树表', 'optionTreeDemoEdit', '', '', '3', '', '/optionTreeDemo/edit', '', '', '1', '', '0', '0', '', '0', '1', '0', '5', CONCAT('tr_2097 tr_2366 tr_', @dirId, ' tr_', @listId,' '), '20', '', '1', @now, @now);
SET @editId = LAST_INSERT_ID();
-- 获取最大排序
INSERT INTO `hg_admin_menu` (`id`, `pid`, `title`, `name`, `path`, `icon`, `type`, `redirect`, `permissions`, `permission_name`, `component`, `always_show`, `active_menu`, `is_root`, `is_frame`, `frame_src`, `keep_alive`, `hidden`, `affix`, `level`, `tree`, `sort`, `remark`, `status`, `created_at`, `updated_at`) VALUES (NULL, @editId, '获取选项树表最大排序', 'optionTreeDemoMaxSort', '', '', '3', '', '/optionTreeDemo/maxSort', '', '', '1', '', '0', '0', '', '0', '0', '0', '6', CONCAT('tr_2097 tr_2366 tr_', @dirId, ' tr_', @listId, ' tr_', @editId,' '), '30', '', '1', @now, @now);
-- 删除
INSERT INTO `hg_admin_menu` (`id`, `pid`, `title`, `name`, `path`, `icon`, `type`, `redirect`, `permissions`, `permission_name`, `component`, `always_show`, `active_menu`, `is_root`, `is_frame`, `frame_src`, `keep_alive`, `hidden`, `affix`, `level`, `tree`, `sort`, `remark`, `status`, `created_at`, `updated_at`) VALUES (NULL, @listId, '删除选项树表', 'optionTreeDemoDelete', '', '', '3', '', '/optionTreeDemo/delete', '', '', '1', '', '0', '0', '', '0', '0', '0', '5', CONCAT('tr_2097 tr_2366 tr_', @dirId, ' tr_', @listId,' '), '40', '', '1', @now, @now);
-- 更新状态
INSERT INTO `hg_admin_menu` (`id`, `pid`, `title`, `name`, `path`, `icon`, `type`, `redirect`, `permissions`, `permission_name`, `component`, `always_show`, `active_menu`, `is_root`, `is_frame`, `frame_src`, `keep_alive`, `hidden`, `affix`, `level`, `tree`, `sort`, `remark`, `status`, `created_at`, `updated_at`) VALUES (NULL, @listId, '修改选项树表状态', 'optionTreeDemoStatus', '', '', '3', '', '/optionTreeDemo/status', '', '', '1', '', '0', '0', '', '0', '0', '0', '5', CONCAT('tr_2097 tr_2366 tr_', @dirId, ' tr_', @listId,' '), '50', '', '1', @now, @now);
-- 导出
INSERT INTO `hg_admin_menu` (`id`, `pid`, `title`, `name`, `path`, `icon`, `type`, `redirect`, `permissions`, `permission_name`, `component`, `always_show`, `active_menu`, `is_root`, `is_frame`, `frame_src`, `keep_alive`, `hidden`, `affix`, `level`, `tree`, `sort`, `remark`, `status`, `created_at`, `updated_at`) VALUES (NULL, @listId, '导出选项树表', 'optionTreeDemoExport', '', '', '3', '', '/optionTreeDemo/export', '', '', '1', '', '0', '0', '', '0', '0', '0', '5', CONCAT('tr_2097 tr_2366 tr_', @dirId, ' tr_', @listId,' '), '70', '', '1', @now, @now);
-- 关系树选项
INSERT INTO `hg_admin_menu` (`id`, `pid`, `title`, `name`, `path`, `icon`, `type`, `redirect`, `permissions`, `permission_name`, `component`, `always_show`, `active_menu`, `is_root`, `is_frame`, `frame_src`, `keep_alive`, `hidden`, `affix`, `level`, `tree`, `sort`, `remark`, `status`, `created_at`, `updated_at`) VALUES (NULL, @listId, '获取选项树表关系树选项', 'optionTreeDemoTreeOption', '', '', '3', '', '/optionTreeDemo/treeOption', '', '', '1', '', '0', '0', '', '0', '0', '0', '5', CONCAT('tr_2097 tr_2366 tr_', @dirId, ' tr_', @listId,' '), '70', '', '1', @now, @now);
COMMIT;
@@ -0,0 +1,62 @@
-- hotgo自动生成菜单权限SQL 通常情况下只在首次生成代码时自动执行一次
-- 如需再次执行请先手动删除生成的菜单权限和SQL文件:C:\Users\Administrator\Desktop\gosrc\hotgo_dev\server\storage\data\generate\test_category_menu.sql
-- Version: 2.13.1
-- Date: 2024-04-08 23:26:32
-- Link https://github.com/bufanyun/hotgo
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET AUTOCOMMIT = 0;
START TRANSACTION;
--
-- 数据库: `hotgo`
--
-- --------------------------------------------------------
--
-- 插入表中的数据 `hg_admin_menu`
--
SET @now := now();
-- 菜单目录
INSERT INTO `hg_admin_menu` (`id`, `pid`, `title`, `name`, `path`, `icon`, `type`, `redirect`, `permissions`, `permission_name`, `component`, `always_show`, `active_menu`, `is_root`, `is_frame`, `frame_src`, `keep_alive`, `hidden`, `affix`, `level`, `tree`, `sort`, `remark`, `status`, `created_at`, `updated_at`) VALUES (NULL, '2366', '测试分类', 'testCategory', '/testCategory', '', '1', '/develop/generateDemo/testCategory/index', '', '', 'ParentLayout', '1', '', '0', '0', '', '0', '0', '0', '3', 'tr_2097 tr_2366 ', '1000', '', '1', @now, @now);
SET @dirId = LAST_INSERT_ID();
-- 菜单页面
-- 列表
INSERT INTO `hg_admin_menu` (`id`, `pid`, `title`, `name`, `path`, `icon`, `type`, `redirect`, `permissions`, `permission_name`, `component`, `always_show`, `active_menu`, `is_root`, `is_frame`, `frame_src`, `keep_alive`, `hidden`, `affix`, `level`, `tree`, `sort`, `remark`, `status`, `created_at`, `updated_at`) VALUES (NULL, @dirId, '测试分类列表', 'testCategoryIndex', 'index', '', '2', '', '/testCategory/list', '', '/testCategory/index', '1', 'testCategory', '0', '0', '', '0', '1', '0', '4', CONCAT('tr_2097 tr_2366 tr_', @dirId,' '), '10', '', '1', @now, @now);
SET @listId = LAST_INSERT_ID();
-- 详情
INSERT INTO `hg_admin_menu` (`id`, `pid`, `title`, `name`, `path`, `icon`, `type`, `redirect`, `permissions`, `permission_name`, `component`, `always_show`, `active_menu`, `is_root`, `is_frame`, `frame_src`, `keep_alive`, `hidden`, `affix`, `level`, `tree`, `sort`, `remark`, `status`, `created_at`, `updated_at`) VALUES (NULL, @listId, '测试分类详情', 'testCategoryView', '', '', '3', '', '/testCategory/view', '', '', '1', '', '0', '0', '', '0', '1', '0', '5', CONCAT('tr_2097 tr_2366 tr_', @dirId, ' tr_', @listId,' '), '10', '', '1', @now, @now);
-- 菜单按钮
-- 编辑
INSERT INTO `hg_admin_menu` (`id`, `pid`, `title`, `name`, `path`, `icon`, `type`, `redirect`, `permissions`, `permission_name`, `component`, `always_show`, `active_menu`, `is_root`, `is_frame`, `frame_src`, `keep_alive`, `hidden`, `affix`, `level`, `tree`, `sort`, `remark`, `status`, `created_at`, `updated_at`) VALUES (NULL, @listId, '编辑/新增测试分类', 'testCategoryEdit', '', '', '3', '', '/testCategory/edit', '', '', '1', '', '0', '0', '', '0', '1', '0', '5', CONCAT('tr_2097 tr_2366 tr_', @dirId, ' tr_', @listId,' '), '20', '', '1', @now, @now);
SET @editId = LAST_INSERT_ID();
-- 获取最大排序
INSERT INTO `hg_admin_menu` (`id`, `pid`, `title`, `name`, `path`, `icon`, `type`, `redirect`, `permissions`, `permission_name`, `component`, `always_show`, `active_menu`, `is_root`, `is_frame`, `frame_src`, `keep_alive`, `hidden`, `affix`, `level`, `tree`, `sort`, `remark`, `status`, `created_at`, `updated_at`) VALUES (NULL, @editId, '获取测试分类最大排序', 'testCategoryMaxSort', '', '', '3', '', '/testCategory/maxSort', '', '', '1', '', '0', '0', '', '0', '0', '0', '6', CONCAT('tr_2097 tr_2366 tr_', @dirId, ' tr_', @listId, ' tr_', @editId,' '), '30', '', '1', @now, @now);
-- 删除
INSERT INTO `hg_admin_menu` (`id`, `pid`, `title`, `name`, `path`, `icon`, `type`, `redirect`, `permissions`, `permission_name`, `component`, `always_show`, `active_menu`, `is_root`, `is_frame`, `frame_src`, `keep_alive`, `hidden`, `affix`, `level`, `tree`, `sort`, `remark`, `status`, `created_at`, `updated_at`) VALUES (NULL, @listId, '删除测试分类', 'testCategoryDelete', '', '', '3', '', '/testCategory/delete', '', '', '1', '', '0', '0', '', '0', '0', '0', '5', CONCAT('tr_2097 tr_2366 tr_', @dirId, ' tr_', @listId,' '), '40', '', '1', @now, @now);
COMMIT;
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,161 @@
-- S1 基础治理:审批、审计、幂等、Outbox 与看板汇总
-- MySQL 8.0+
CREATE TABLE IF NOT EXISTS `hg_approval_request` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`tenant_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '租户ID',
`approval_no` varchar(32) NOT NULL COMMENT '审批单号',
`approval_type` varchar(32) NOT NULL COMMENT '审批类型',
`target_type` varchar(32) NOT NULL COMMENT '目标类型',
`target_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '目标ID',
`action` varchar(64) NOT NULL COMMENT '拟执行动作',
`title` varchar(200) NOT NULL COMMENT '审批标题',
`payload_json` json NOT NULL COMMENT '待执行数据快照',
`diff_json` json DEFAULT NULL COMMENT '前后差异',
`risk_level` tinyint NOT NULL DEFAULT 1 COMMENT '风险级别',
`required_approvals` int unsigned NOT NULL DEFAULT 1 COMMENT '需要通过数',
`approval_status` tinyint NOT NULL DEFAULT 1 COMMENT '审批状态',
`applicant_id` bigint unsigned NOT NULL COMMENT '申请人',
`submitted_at` datetime(3) DEFAULT NULL COMMENT '提交时间',
`decided_at` datetime(3) DEFAULT NULL COMMENT '决定时间',
`executed_at` datetime(3) DEFAULT NULL COMMENT '执行时间',
`expire_at` datetime(3) DEFAULT NULL COMMENT '超时时间',
`version` int unsigned NOT NULL DEFAULT 0 COMMENT '乐观锁',
`remark` varchar(500) DEFAULT NULL COMMENT '备注',
`created_by` bigint unsigned NOT NULL DEFAULT 0 COMMENT '创建者',
`updated_by` bigint unsigned NOT NULL DEFAULT 0 COMMENT '更新者',
`created_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间',
`updated_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_approval_no` (`approval_no`),
KEY `idx_approval_type_status` (`tenant_id`,`approval_type`,`approval_status`,`created_at`,`id`),
KEY `idx_approval_target` (`tenant_id`,`target_type`,`target_id`,`created_at`),
KEY `idx_approval_applicant` (`tenant_id`,`applicant_id`,`created_at`),
KEY `idx_approval_expire` (`approval_status`,`expire_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='治理_审批请求';
CREATE TABLE IF NOT EXISTS `hg_approval_action` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`tenant_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '租户ID',
`approval_request_id` bigint unsigned NOT NULL COMMENT '审批请求ID',
`step_no` int unsigned NOT NULL COMMENT '节点顺序',
`actor_id` bigint unsigned NOT NULL COMMENT '操作人',
`action` tinyint NOT NULL COMMENT '审批动作',
`reason_code` varchar(64) DEFAULT NULL COMMENT '原因编码',
`comment` varchar(1000) DEFAULT NULL COMMENT '审批意见',
`snapshot_json` json NOT NULL COMMENT '操作时快照',
`actor_ip_cipher` varchar(512) DEFAULT NULL COMMENT '操作IP密文',
`mfa_verified` tinyint NOT NULL DEFAULT 0 COMMENT '是否二次认证',
`created_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_approval_step_actor` (`approval_request_id`,`step_no`,`actor_id`),
KEY `idx_approval_action_request` (`tenant_id`,`approval_request_id`,`created_at`),
KEY `idx_approval_action_actor` (`tenant_id`,`actor_id`,`created_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='治理_审批动作';
CREATE TABLE IF NOT EXISTS `hg_sensitive_access_log` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`tenant_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '租户ID',
`access_no` varchar(32) NOT NULL COMMENT '查看流水号',
`actor_id` bigint unsigned NOT NULL COMMENT '管理员ID',
`target_type` varchar(32) NOT NULL COMMENT '目标类型',
`target_id` bigint unsigned NOT NULL COMMENT '目标ID',
`field_set` json NOT NULL COMMENT '查看字段集',
`purpose_code` varchar(64) NOT NULL COMMENT '用途编码',
`purpose_text` varchar(500) NOT NULL COMMENT '用途说明',
`authorization_no` varchar(64) DEFAULT NULL COMMENT '授权号',
`mfa_verified` tinyint NOT NULL DEFAULT 0 COMMENT '是否二次认证',
`result` tinyint NOT NULL COMMENT '查看结果',
`trace_id` varchar(64) NOT NULL COMMENT '链路ID',
`created_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_sensitive_access_no` (`access_no`),
KEY `idx_sensitive_actor` (`tenant_id`,`actor_id`,`created_at`),
KEY `idx_sensitive_target` (`tenant_id`,`target_type`,`target_id`,`created_at`),
KEY `idx_sensitive_trace` (`trace_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='治理_敏感数据查看日志';
CREATE TABLE IF NOT EXISTS `hg_biz_audit_log` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`tenant_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '租户ID',
`audit_no` varchar(32) NOT NULL COMMENT '审计号',
`actor_type` tinyint NOT NULL COMMENT '操作人类型',
`actor_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '操作人ID',
`module` varchar(64) NOT NULL COMMENT '业务模块',
`action` varchar(64) NOT NULL COMMENT '操作动作',
`target_type` varchar(64) NOT NULL COMMENT '目标类型',
`target_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '目标ID',
`before_digest` char(64) DEFAULT NULL COMMENT '变更前摘要',
`after_digest` char(64) DEFAULT NULL COMMENT '变更后摘要',
`change_json` json DEFAULT NULL COMMENT '已脱敏差异',
`reason` varchar(500) DEFAULT NULL COMMENT '操作原因',
`approval_no` varchar(32) DEFAULT NULL COMMENT '审批单号',
`trace_id` varchar(64) NOT NULL COMMENT '链路ID',
`prev_hash` char(64) DEFAULT NULL COMMENT '前一条哈希',
`row_hash` char(64) NOT NULL COMMENT '当前行哈希',
`created_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_biz_audit_no` (`audit_no`),
KEY `idx_biz_audit_actor` (`tenant_id`,`actor_id`,`created_at`),
KEY `idx_biz_audit_target` (`tenant_id`,`target_type`,`target_id`,`created_at`),
KEY `idx_biz_audit_module` (`tenant_id`,`module`,`action`,`created_at`),
KEY `idx_biz_audit_trace` (`trace_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='治理_业务审计日志';
CREATE TABLE IF NOT EXISTS `hg_idempotency_record` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`tenant_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '租户ID',
`scope` varchar(64) NOT NULL COMMENT '业务作用域',
`idempotency_key` varchar(128) NOT NULL COMMENT '幂等键',
`request_digest` char(64) NOT NULL COMMENT '请求摘要',
`resource_type` varchar(64) DEFAULT NULL COMMENT '资源类型',
`resource_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '资源ID',
`process_status` tinyint NOT NULL DEFAULT 1 COMMENT '处理状态',
`response_code` int DEFAULT NULL COMMENT '响应码',
`response_digest` char(64) DEFAULT NULL COMMENT '响应摘要',
`expire_at` datetime(3) NOT NULL COMMENT '过期时间',
`created_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间',
`updated_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_idempotency_scope_key` (`tenant_id`,`scope`,`idempotency_key`),
KEY `idx_idempotency_expire` (`expire_at`),
KEY `idx_idempotency_resource` (`tenant_id`,`resource_type`,`resource_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='治理_幂等记录';
CREATE TABLE IF NOT EXISTS `hg_outbox_event` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`tenant_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '租户ID',
`event_no` varchar(32) NOT NULL COMMENT '事件号',
`aggregate_type` varchar(64) NOT NULL COMMENT '聚合根类型',
`aggregate_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '聚合根ID',
`event_type` varchar(128) NOT NULL COMMENT '事件类型',
`payload_json` json NOT NULL COMMENT '已脱敏事件数据',
`publish_status` tinyint NOT NULL DEFAULT 1 COMMENT '发送状态',
`retry_count` int unsigned NOT NULL DEFAULT 0 COMMENT '重试次数',
`next_retry_at` datetime(3) DEFAULT NULL COMMENT '下次重试时间',
`last_error` varchar(1000) DEFAULT NULL COMMENT '最后错误',
`created_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间',
`published_at` datetime(3) DEFAULT NULL COMMENT '发送时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_outbox_event_no` (`event_no`),
KEY `idx_outbox_publish` (`publish_status`,`next_retry_at`,`id`),
KEY `idx_outbox_aggregate` (`tenant_id`,`aggregate_type`,`aggregate_id`,`created_at`),
KEY `idx_outbox_event_type` (`tenant_id`,`event_type`,`created_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='治理_事件出站箱';
CREATE TABLE IF NOT EXISTS `hg_dashboard_daily_stat` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`tenant_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '租户ID',
`stat_date` date NOT NULL COMMENT '统计日期',
`dimension_type` varchar(32) NOT NULL COMMENT '维度类型',
`dimension_value` varchar(64) NOT NULL COMMENT '维度值',
`metric_code` varchar(64) NOT NULL COMMENT '指标编码',
`metric_count` bigint NOT NULL DEFAULT 0 COMMENT '指标数量',
`metric_amount` bigint NOT NULL DEFAULT 0 COMMENT '指标金额(最小货币单位)',
`calculated_at` datetime(3) NOT NULL COMMENT '计算时间',
`created_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间',
`updated_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_dashboard_metric` (`tenant_id`,`stat_date`,`dimension_type`,`dimension_value`,`metric_code`),
KEY `idx_dashboard_date_metric` (`tenant_id`,`stat_date`,`metric_code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='治理_看板日汇总';
@@ -0,0 +1,50 @@
-- S1 基础治理菜单。重复执行安全;普通角色需在“角色权限”中勾选新菜单。
SET @now = NOW();
INSERT INTO `hg_admin_menu`
(`pid`,`level`,`tree`,`title`,`name`,`path`,`icon`,`type`,`redirect`,`permissions`,`permission_name`,`component`,`always_show`,`active_menu`,`is_root`,`is_frame`,`frame_src`,`keep_alive`,`hidden`,`affix`,`sort`,`remark`,`status`,`created_at`,`updated_at`)
SELECT 0,1,'','基础治理','governance','/governance','AuditOutlined',1,'','','','LAYOUT',1,'',0,0,'',0,0,0,90,'审批、审计与安全治理',1,@now,@now
WHERE NOT EXISTS (SELECT 1 FROM `hg_admin_menu` WHERE `name`='governance');
UPDATE `hg_admin_menu` SET `icon`='AuditOutlined', `updated_at`=@now WHERE `name`='governance';
SET @governanceId = (SELECT `id` FROM `hg_admin_menu` WHERE `name`='governance' LIMIT 1);
INSERT INTO `hg_admin_menu`
(`pid`,`level`,`tree`,`title`,`name`,`path`,`icon`,`type`,`redirect`,`permissions`,`permission_name`,`component`,`always_show`,`active_menu`,`is_root`,`is_frame`,`frame_src`,`keep_alive`,`hidden`,`affix`,`sort`,`remark`,`status`,`created_at`,`updated_at`)
SELECT @governanceId,2,CONCAT('tr_',@governanceId,' '),'审批中心','governance_approval','approval','',2,'','/approval/list','','/governance/approval/index',1,'',0,0,'',0,0,0,10,'高风险操作审批',1,@now,@now
WHERE NOT EXISTS (SELECT 1 FROM `hg_admin_menu` WHERE `name`='governance_approval');
SET @approvalId = (SELECT `id` FROM `hg_admin_menu` WHERE `name`='governance_approval' LIMIT 1);
INSERT INTO `hg_admin_menu`
(`pid`,`level`,`tree`,`title`,`name`,`path`,`icon`,`type`,`redirect`,`permissions`,`permission_name`,`component`,`always_show`,`active_menu`,`is_root`,`is_frame`,`frame_src`,`keep_alive`,`hidden`,`affix`,`sort`,`remark`,`status`,`created_at`,`updated_at`)
SELECT @governanceId,2,CONCAT('tr_',@governanceId,' '),'业务审计','governance_biz_audit','biz-audit','',2,'','/bizAudit/list','','/governance/biz-audit/index',1,'',0,0,'',0,0,0,20,'不可变业务审计日志',1,@now,@now
WHERE NOT EXISTS (SELECT 1 FROM `hg_admin_menu` WHERE `name`='governance_biz_audit');
SET @auditId = (SELECT `id` FROM `hg_admin_menu` WHERE `name`='governance_biz_audit' LIMIT 1);
INSERT INTO `hg_admin_menu`
(`pid`,`level`,`tree`,`title`,`name`,`path`,`icon`,`type`,`redirect`,`permissions`,`permission_name`,`component`,`always_show`,`active_menu`,`is_root`,`is_frame`,`frame_src`,`keep_alive`,`hidden`,`affix`,`sort`,`remark`,`status`,`created_at`,`updated_at`)
SELECT @approvalId,3,CONCAT('tr_',@governanceId,' tr_',@approvalId,' '),'审批详情','governance_approval_view','','',3,'','/approval/view','','',1,'',0,0,'',0,1,0,10,'',1,@now,@now
WHERE NOT EXISTS (SELECT 1 FROM `hg_admin_menu` WHERE `name`='governance_approval_view');
INSERT INTO `hg_admin_menu`
(`pid`,`level`,`tree`,`title`,`name`,`path`,`icon`,`type`,`redirect`,`permissions`,`permission_name`,`component`,`always_show`,`active_menu`,`is_root`,`is_frame`,`frame_src`,`keep_alive`,`hidden`,`affix`,`sort`,`remark`,`status`,`created_at`,`updated_at`)
SELECT @approvalId,3,CONCAT('tr_',@governanceId,' tr_',@approvalId,' '),'创建审批','governance_approval_create','','',3,'','/approval/create','','',1,'',0,0,'',0,1,0,20,'',1,@now,@now
WHERE NOT EXISTS (SELECT 1 FROM `hg_admin_menu` WHERE `name`='governance_approval_create');
INSERT INTO `hg_admin_menu`
(`pid`,`level`,`tree`,`title`,`name`,`path`,`icon`,`type`,`redirect`,`permissions`,`permission_name`,`component`,`always_show`,`active_menu`,`is_root`,`is_frame`,`frame_src`,`keep_alive`,`hidden`,`affix`,`sort`,`remark`,`status`,`created_at`,`updated_at`)
SELECT @approvalId,3,CONCAT('tr_',@governanceId,' tr_',@approvalId,' '),'提交审批','governance_approval_submit','','',3,'','/approval/submit','','',1,'',0,0,'',0,1,0,30,'',1,@now,@now
WHERE NOT EXISTS (SELECT 1 FROM `hg_admin_menu` WHERE `name`='governance_approval_submit');
INSERT INTO `hg_admin_menu`
(`pid`,`level`,`tree`,`title`,`name`,`path`,`icon`,`type`,`redirect`,`permissions`,`permission_name`,`component`,`always_show`,`active_menu`,`is_root`,`is_frame`,`frame_src`,`keep_alive`,`hidden`,`affix`,`sort`,`remark`,`status`,`created_at`,`updated_at`)
SELECT @approvalId,3,CONCAT('tr_',@governanceId,' tr_',@approvalId,' '),'通过审批','governance_approval_approve','','',3,'','/approval/approve','','',1,'',0,0,'',0,1,0,40,'',1,@now,@now
WHERE NOT EXISTS (SELECT 1 FROM `hg_admin_menu` WHERE `name`='governance_approval_approve');
INSERT INTO `hg_admin_menu`
(`pid`,`level`,`tree`,`title`,`name`,`path`,`icon`,`type`,`redirect`,`permissions`,`permission_name`,`component`,`always_show`,`active_menu`,`is_root`,`is_frame`,`frame_src`,`keep_alive`,`hidden`,`affix`,`sort`,`remark`,`status`,`created_at`,`updated_at`)
SELECT @approvalId,3,CONCAT('tr_',@governanceId,' tr_',@approvalId,' '),'驳回审批','governance_approval_reject','','',3,'','/approval/reject','','',1,'',0,0,'',0,1,0,50,'',1,@now,@now
WHERE NOT EXISTS (SELECT 1 FROM `hg_admin_menu` WHERE `name`='governance_approval_reject');
INSERT INTO `hg_admin_menu`
(`pid`,`level`,`tree`,`title`,`name`,`path`,`icon`,`type`,`redirect`,`permissions`,`permission_name`,`component`,`always_show`,`active_menu`,`is_root`,`is_frame`,`frame_src`,`keep_alive`,`hidden`,`affix`,`sort`,`remark`,`status`,`created_at`,`updated_at`)
SELECT @approvalId,3,CONCAT('tr_',@governanceId,' tr_',@approvalId,' '),'取消审批','governance_approval_cancel','','',3,'','/approval/cancel','','',1,'',0,0,'',0,1,0,60,'',1,@now,@now
WHERE NOT EXISTS (SELECT 1 FROM `hg_admin_menu` WHERE `name`='governance_approval_cancel');
INSERT INTO `hg_admin_menu`
(`pid`,`level`,`tree`,`title`,`name`,`path`,`icon`,`type`,`redirect`,`permissions`,`permission_name`,`component`,`always_show`,`active_menu`,`is_root`,`is_frame`,`frame_src`,`keep_alive`,`hidden`,`affix`,`sort`,`remark`,`status`,`created_at`,`updated_at`)
SELECT @auditId,3,CONCAT('tr_',@governanceId,' tr_',@auditId,' '),'审计详情','governance_biz_audit_view','','',3,'','/bizAudit/view','','',1,'',0,0,'',0,1,0,10,'',1,@now,@now
WHERE NOT EXISTS (SELECT 1 FROM `hg_admin_menu` WHERE `name`='governance_biz_audit_view');
@@ -0,0 +1,25 @@
-- 首页业务看板接口与敏感金额权限。
SET @now = NOW();
UPDATE `hg_admin_menu`
SET `title`='主页', `icon`='HomeOutlined', `redirect`='/dashboard/console', `sort`=10, `updated_at`=@now
WHERE `name`='Dashboard';
UPDATE `hg_admin_menu`
SET `title`='首页', `icon`='DashboardOutlined', `permissions`='/console/stat,/dashboard/summary', `sort`=10, `updated_at`=@now
WHERE `name`='dashboard_console';
UPDATE `hg_admin_menu`
SET `hidden`=1, `updated_at`=@now
WHERE `name`='dashboard_workplace';
SET @dashboardId = (SELECT `id` FROM `hg_admin_menu` WHERE `name`='dashboard_console' LIMIT 1);
SET @dashboardPid = (SELECT `pid` FROM `hg_admin_menu` WHERE `id`=@dashboardId LIMIT 1);
INSERT INTO `hg_admin_menu`
(`pid`,`level`,`tree`,`title`,`name`,`path`,`icon`,`type`,`redirect`,`permissions`,`permission_name`,`component`,`always_show`,`active_menu`,`is_root`,`is_frame`,`frame_src`,`keep_alive`,`hidden`,`affix`,`sort`,`remark`,`status`,`created_at`,`updated_at`)
SELECT @dashboardId,3,CONCAT('tr_',@dashboardPid,' tr_',@dashboardId,' '),'查看看板金额','dashboard_amount_view','','',3,'','/dashboard/amount','','',1,'',0,0,'',0,1,0,10,'控制首页资金指标、趋势金额和渠道金额可见性',1,@now,@now
WHERE NOT EXISTS (SELECT 1 FROM `hg_admin_menu` WHERE `name`='dashboard_amount_view');
SET @amountMenuId = (SELECT `id` FROM `hg_admin_menu` WHERE `name`='dashboard_amount_view' LIMIT 1);
INSERT IGNORE INTO `hg_admin_role_menu` (`role_id`,`menu_id`)
SELECT `id`, @amountMenuId FROM `hg_admin_role` WHERE `key`='finance';
@@ -0,0 +1,220 @@
-- 第五章:门户、内容、Banner 与手工商城。
-- MySQL 8.0+
CREATE TABLE IF NOT EXISTS `hg_site_config_version` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`tenant_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '租户ID',
`config_no` varchar(32) NOT NULL COMMENT '配置版本号',
`config_group` varchar(64) NOT NULL COMMENT '配置组',
`schema_version` varchar(32) NOT NULL DEFAULT '1.0' COMMENT 'Schema版本',
`config_json` json NOT NULL COMMENT '完整配置快照',
`config_digest` char(64) NOT NULL COMMENT '配置摘要',
`publish_status` tinyint NOT NULL DEFAULT 1 COMMENT '发布状态',
`effective_at` datetime(3) DEFAULT NULL COMMENT '计划生效时间',
`published_at` datetime(3) DEFAULT NULL COMMENT '实际发布时间',
`approval_request_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '审批单ID',
`base_version_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '基础版本ID',
`version` int unsigned NOT NULL DEFAULT 0 COMMENT '乐观锁',
`remark` varchar(500) DEFAULT NULL COMMENT '备注',
`created_by` bigint unsigned NOT NULL DEFAULT 0 COMMENT '创建者',
`updated_by` bigint unsigned NOT NULL DEFAULT 0 COMMENT '更新者',
`created_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间',
`updated_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_site_config_no` (`tenant_id`,`config_no`),
KEY `idx_site_config_current` (`tenant_id`,`config_group`,`publish_status`,`effective_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='门户_站点配置版本';
CREATE TABLE IF NOT EXISTS `hg_content` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`tenant_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '租户ID',
`content_key` varchar(64) NOT NULL COMMENT '稳定内容标识',
`content_type` varchar(32) NOT NULL COMMENT '内容类型',
`title` varchar(200) NOT NULL COMMENT '后台标题',
`published_version_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '当前发布版本ID',
`publish_status` tinyint NOT NULL DEFAULT 1 COMMENT '发布状态',
`published_at` datetime(3) DEFAULT NULL COMMENT '发布时间',
`sort` int NOT NULL DEFAULT 0 COMMENT '排序',
`version` int unsigned NOT NULL DEFAULT 0 COMMENT '乐观锁',
`remark` varchar(500) DEFAULT NULL COMMENT '备注',
`created_by` bigint unsigned NOT NULL DEFAULT 0 COMMENT '创建者',
`updated_by` bigint unsigned NOT NULL DEFAULT 0 COMMENT '更新者',
`deleted_by` bigint unsigned NOT NULL DEFAULT 0 COMMENT '删除者',
`created_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间',
`updated_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT '更新时间',
`deleted_at` datetime(3) DEFAULT NULL COMMENT '删除时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_content_key` (`tenant_id`,`content_key`),
KEY `idx_content_type_status` (`tenant_id`,`content_type`,`publish_status`,`sort`,`id`),
KEY `idx_content_deleted` (`deleted_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='门户_文本内容';
CREATE TABLE IF NOT EXISTS `hg_content_version` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`tenant_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '租户ID',
`content_id` bigint unsigned NOT NULL COMMENT '内容ID',
`version_no` int unsigned NOT NULL COMMENT '版本号',
`title` varchar(200) NOT NULL COMMENT '展示标题',
`summary` varchar(500) DEFAULT NULL COMMENT '摘要',
`body_html` longtext NOT NULL COMMENT '清洗后HTML',
`body_text` longtext COMMENT '降级文本',
`cover_url` varchar(1000) DEFAULT NULL COMMENT '封面图片URL',
`asset_ids` json DEFAULT NULL COMMENT '引用附件ID',
`publish_status` tinyint NOT NULL DEFAULT 1 COMMENT '发布状态',
`effective_at` datetime(3) DEFAULT NULL COMMENT '计划生效时间',
`approval_request_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '审批单ID',
`created_by` bigint unsigned NOT NULL DEFAULT 0 COMMENT '创建者',
`created_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_content_version` (`content_id`,`version_no`),
KEY `idx_content_version_status` (`tenant_id`,`content_id`,`publish_status`,`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='门户_文本内容版本';
CREATE TABLE IF NOT EXISTS `hg_banner` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`tenant_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '租户ID',
`name` varchar(100) NOT NULL COMMENT '后台名称',
`position` varchar(32) NOT NULL DEFAULT 'home_top' COMMENT '投放位置',
`image_attachment_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '图片附件ID',
`image_url` varchar(1000) NOT NULL COMMENT '图片URL',
`alt_text` varchar(200) NOT NULL COMMENT '替代文本',
`target_type` tinyint NOT NULL DEFAULT 1 COMMENT '跳转类型',
`target_value` varchar(500) DEFAULT NULL COMMENT '跳转值',
`start_at` datetime(3) DEFAULT NULL COMMENT '开始时间',
`end_at` datetime(3) DEFAULT NULL COMMENT '结束时间',
`publish_status` tinyint NOT NULL DEFAULT 1 COMMENT '发布状态',
`sort` int NOT NULL DEFAULT 0 COMMENT '排序',
`version` int unsigned NOT NULL DEFAULT 0 COMMENT '乐观锁',
`remark` varchar(500) DEFAULT NULL COMMENT '备注',
`created_by` bigint unsigned NOT NULL DEFAULT 0 COMMENT '创建者',
`updated_by` bigint unsigned NOT NULL DEFAULT 0 COMMENT '更新者',
`deleted_by` bigint unsigned NOT NULL DEFAULT 0 COMMENT '删除者',
`created_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间',
`updated_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT '更新时间',
`deleted_at` datetime(3) DEFAULT NULL COMMENT '删除时间',
PRIMARY KEY (`id`),
KEY `idx_banner_delivery` (`tenant_id`,`position`,`publish_status`,`start_at`,`end_at`,`sort`),
KEY `idx_banner_deleted` (`deleted_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='门户_Banner';
CREATE TABLE IF NOT EXISTS `hg_product` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`tenant_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '租户ID',
`product_no` varchar(32) NOT NULL COMMENT '商品编号',
`category_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '分类ID',
`product_type` tinyint NOT NULL DEFAULT 2 COMMENT '商品类型',
`payment_type` varchar(32) NOT NULL DEFAULT 'balance' COMMENT '支付方式',
`name` varchar(200) NOT NULL COMMENT '商品名称',
`shop_name` varchar(100) NOT NULL DEFAULT '' COMMENT '店铺名称',
`price_amount` bigint NOT NULL DEFAULT 0 COMMENT '单价(分)',
`currency` char(3) NOT NULL DEFAULT 'CNY' COMMENT '币种',
`cover_attachment_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '封面附件ID',
`cover_url` varchar(1000) NOT NULL COMMENT '封面URL',
`detail_html` longtext COMMENT '商品详情',
`is_recommended` tinyint NOT NULL DEFAULT 2 COMMENT '是否推荐',
`publish_status` tinyint NOT NULL DEFAULT 1 COMMENT '发布状态',
`start_at` datetime(3) DEFAULT NULL COMMENT '展示开始时间',
`end_at` datetime(3) DEFAULT NULL COMMENT '展示结束时间',
`sort` int NOT NULL DEFAULT 0 COMMENT '排序',
`version` int unsigned NOT NULL DEFAULT 0 COMMENT '乐观锁',
`remark` varchar(500) DEFAULT NULL COMMENT '备注',
`created_by` bigint unsigned NOT NULL DEFAULT 0 COMMENT '创建者',
`updated_by` bigint unsigned NOT NULL DEFAULT 0 COMMENT '更新者',
`deleted_by` bigint unsigned NOT NULL DEFAULT 0 COMMENT '删除者',
`created_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间',
`updated_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT '更新时间',
`deleted_at` datetime(3) DEFAULT NULL COMMENT '删除时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_product_no` (`tenant_id`,`product_no`),
KEY `idx_product_manual` (`tenant_id`,`product_type`,`publish_status`,`sort`,`id`),
KEY `idx_product_deleted` (`deleted_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='商城_商品';
-- 复用 HotGo 数据库字典:内容类型。
INSERT INTO `hg_sys_dict_type` (`name`,`type`,`remark`,`status`,`created_at`,`updated_at`)
SELECT '内容类型','content_type','门户文本内容分类',1,NOW(),NOW()
WHERE NOT EXISTS (SELECT 1 FROM `hg_sys_dict_type` WHERE `type`='content_type');
INSERT INTO `hg_sys_dict_data` (`type`,`label`,`value`,`value_type`,`list_class`,`sort`,`status`,`remark`,`created_at`,`updated_at`)
SELECT 'content_type',x.label,x.value,'string',x.list_class,x.sort,1,'门户内容类型',NOW(),NOW()
FROM (
SELECT '平台公告' label,'notice' value,'primary' list_class,10 sort UNION ALL
SELECT '平台简介','about','info',20 UNION ALL
SELECT '订单规则','rule','warning',30 UNION ALL
SELECT '常见问题','faq','success',40 UNION ALL
SELECT '使用指南','guide','default',50 UNION ALL
SELECT '利息宝规则','interest_rule','warning',60 UNION ALL
SELECT '首页滚动','home_ticker','primary',70 UNION ALL
SELECT '订单提示','order_tip','warning',80 UNION ALL
SELECT '活动内容','activity','success',90 UNION ALL
SELECT '首页弹窗','popup','error',100 UNION ALL
SELECT '公司资质','qualification','info',110
) x
WHERE NOT EXISTS (SELECT 1 FROM `hg_sys_dict_data` d WHERE d.`type`='content_type' AND d.`value`=x.value);
-- 菜单和接口权限。菜单由数据库驱动,重复执行不会生成重复数据。
SET @now = NOW();
INSERT INTO `hg_admin_menu` (`pid`,`level`,`tree`,`title`,`name`,`path`,`icon`,`type`,`redirect`,`permissions`,`permission_name`,`component`,`always_show`,`active_menu`,`is_root`,`is_frame`,`frame_src`,`keep_alive`,`hidden`,`affix`,`sort`,`remark`,`status`,`created_at`,`updated_at`)
SELECT 0,1,'','门户管理','portal','/portal','HomeOutlined',1,'','','','LAYOUT',1,'',1,0,'',0,0,0,30,'门户、文本、Banner和手工商城',1,@now,@now
WHERE NOT EXISTS (SELECT 1 FROM `hg_admin_menu` WHERE `name`='portal');
SET @portalId=(SELECT `id` FROM `hg_admin_menu` WHERE `name`='portal' LIMIT 1);
SET @homeId=(SELECT `id` FROM `hg_admin_menu` WHERE `name`='Dashboard' LIMIT 1);
-- 门户能力合并到“主页”,保留原 /portal/* 地址,仅调整菜单归属。
UPDATE `hg_admin_menu` SET `hidden`=1, `status`=2, `updated_at`=@now WHERE `name`='portal';
INSERT INTO `hg_admin_menu` (`pid`,`level`,`tree`,`title`,`name`,`path`,`icon`,`type`,`redirect`,`permissions`,`permission_name`,`component`,`always_show`,`active_menu`,`is_root`,`is_frame`,`frame_src`,`keep_alive`,`hidden`,`affix`,`sort`,`remark`,`status`,`created_at`,`updated_at`)
SELECT @homeId,2,CONCAT('tr_',@homeId,' '),'网站设置','portal_site_config','/portal/site-config','SettingOutlined',2,'','/siteConfig/current,/siteConfig/history','','/portal/site-config/index',1,'',0,0,'',1,0,0,20,'版本化站点配置',1,@now,@now
WHERE NOT EXISTS (SELECT 1 FROM `hg_admin_menu` WHERE `name`='portal_site_config');
INSERT INTO `hg_admin_menu` (`pid`,`level`,`tree`,`title`,`name`,`path`,`icon`,`type`,`redirect`,`permissions`,`permission_name`,`component`,`always_show`,`active_menu`,`is_root`,`is_frame`,`frame_src`,`keep_alive`,`hidden`,`affix`,`sort`,`remark`,`status`,`created_at`,`updated_at`)
SELECT @homeId,2,CONCAT('tr_',@homeId,' '),'文本管理','portal_content','/portal/content','FileTextOutlined',2,'','/portalContent/list,/portalContent/view','','/portal/content/index',1,'',0,0,'',1,0,0,30,'版本化文本内容',1,@now,@now
WHERE NOT EXISTS (SELECT 1 FROM `hg_admin_menu` WHERE `name`='portal_content');
INSERT INTO `hg_admin_menu` (`pid`,`level`,`tree`,`title`,`name`,`path`,`icon`,`type`,`redirect`,`permissions`,`permission_name`,`component`,`always_show`,`active_menu`,`is_root`,`is_frame`,`frame_src`,`keep_alive`,`hidden`,`affix`,`sort`,`remark`,`status`,`created_at`,`updated_at`)
SELECT @homeId,2,CONCAT('tr_',@homeId,' '),'Banner 设置','portal_banner','/portal/banner','PictureOutlined',2,'','/banner/list,/banner/view','','/portal/banner/index',1,'',0,0,'',1,0,0,40,'首页Banner',1,@now,@now
WHERE NOT EXISTS (SELECT 1 FROM `hg_admin_menu` WHERE `name`='portal_banner');
INSERT INTO `hg_admin_menu` (`pid`,`level`,`tree`,`title`,`name`,`path`,`icon`,`type`,`redirect`,`permissions`,`permission_name`,`component`,`always_show`,`active_menu`,`is_root`,`is_frame`,`frame_src`,`keep_alive`,`hidden`,`affix`,`sort`,`remark`,`status`,`created_at`,`updated_at`)
SELECT @homeId,2,CONCAT('tr_',@homeId,' '),'手工商城','portal_manual_product','/portal/manual-product','ShoppingOutlined',2,'','/manualProduct/list,/manualProduct/view','','/portal/manual-product/index',1,'',0,0,'',1,0,0,50,'手工商城商品',1,@now,@now
WHERE NOT EXISTS (SELECT 1 FROM `hg_admin_menu` WHERE `name`='portal_manual_product');
UPDATE `hg_admin_menu`
SET `pid`=@homeId, `level`=2, `tree`=CONCAT('tr_',@homeId,' '),
`path`=CASE `name`
WHEN 'portal_site_config' THEN '/portal/site-config'
WHEN 'portal_content' THEN '/portal/content'
WHEN 'portal_banner' THEN '/portal/banner'
WHEN 'portal_manual_product' THEN '/portal/manual-product'
END,
`sort`=CASE `name`
WHEN 'portal_site_config' THEN 20 WHEN 'portal_content' THEN 30
WHEN 'portal_banner' THEN 40 WHEN 'portal_manual_product' THEN 50
END,
`updated_at`=@now
WHERE `name` IN ('portal_site_config','portal_content','portal_banner','portal_manual_product');
SET @siteMenu=(SELECT `id` FROM `hg_admin_menu` WHERE `name`='portal_site_config' LIMIT 1);
SET @contentMenu=(SELECT `id` FROM `hg_admin_menu` WHERE `name`='portal_content' LIMIT 1);
SET @bannerMenu=(SELECT `id` FROM `hg_admin_menu` WHERE `name`='portal_banner' LIMIT 1);
SET @productMenu=(SELECT `id` FROM `hg_admin_menu` WHERE `name`='portal_manual_product' LIMIT 1);
UPDATE `hg_admin_menu`
SET `tree`=CONCAT('tr_',@homeId,' tr_',`pid`,' '), `updated_at`=@now
WHERE `pid` IN (@siteMenu,@contentMenu,@bannerMenu,@productMenu) AND `level`=3;
INSERT INTO `hg_admin_menu` (`pid`,`level`,`tree`,`title`,`name`,`path`,`icon`,`type`,`redirect`,`permissions`,`permission_name`,`component`,`always_show`,`active_menu`,`is_root`,`is_frame`,`frame_src`,`keep_alive`,`hidden`,`affix`,`sort`,`remark`,`status`,`created_at`,`updated_at`)
SELECT @siteMenu,3,CONCAT('tr_',@homeId,' tr_',@siteMenu,' '),x.title,x.name,'','',3,'',x.permissions,'','',1,'',0,0,'',0,1,0,x.sort,'网站设置操作权限',1,@now,@now FROM (
SELECT '保存配置草稿' title,'portal_site_save' name,'/siteConfig/save' permissions,10 sort UNION ALL SELECT '提交配置审批','portal_site_submit','/siteConfig/submit',20 UNION ALL SELECT '发布配置','portal_site_publish','/siteConfig/publish',30 UNION ALL SELECT '回滚配置','portal_site_rollback','/siteConfig/rollback',40
) x WHERE NOT EXISTS (SELECT 1 FROM `hg_admin_menu` m WHERE m.`name`=x.name);
INSERT INTO `hg_admin_menu` (`pid`,`level`,`tree`,`title`,`name`,`path`,`icon`,`type`,`redirect`,`permissions`,`permission_name`,`component`,`always_show`,`active_menu`,`is_root`,`is_frame`,`frame_src`,`keep_alive`,`hidden`,`affix`,`sort`,`remark`,`status`,`created_at`,`updated_at`)
SELECT @contentMenu,3,CONCAT('tr_',@homeId,' tr_',@contentMenu,' '),x.title,x.name,'','',3,'',x.permissions,'','',1,'',0,0,'',0,1,0,x.sort,'文本管理操作权限',1,@now,@now FROM (
SELECT '编辑文本' title,'portal_content_edit' name,'/portalContent/edit' permissions,10 sort UNION ALL SELECT '发布文本','portal_content_publish','/portalContent/publish',20 UNION ALL SELECT '下线文本','portal_content_offline','/portalContent/offline',30 UNION ALL SELECT '删除文本','portal_content_delete','/portalContent/delete',40
) x WHERE NOT EXISTS (SELECT 1 FROM `hg_admin_menu` m WHERE m.`name`=x.name);
INSERT INTO `hg_admin_menu` (`pid`,`level`,`tree`,`title`,`name`,`path`,`icon`,`type`,`redirect`,`permissions`,`permission_name`,`component`,`always_show`,`active_menu`,`is_root`,`is_frame`,`frame_src`,`keep_alive`,`hidden`,`affix`,`sort`,`remark`,`status`,`created_at`,`updated_at`)
SELECT @bannerMenu,3,CONCAT('tr_',@homeId,' tr_',@bannerMenu,' '),x.title,x.name,'','',3,'',x.permissions,'','',1,'',0,0,'',0,1,0,x.sort,'Banner操作权限',1,@now,@now FROM (
SELECT '编辑 Banner' title,'portal_banner_edit' name,'/banner/edit' permissions,10 sort UNION ALL SELECT '发布下线 Banner','portal_banner_status','/banner/status',20 UNION ALL SELECT '删除 Banner','portal_banner_delete','/banner/delete',30
) x WHERE NOT EXISTS (SELECT 1 FROM `hg_admin_menu` m WHERE m.`name`=x.name);
INSERT INTO `hg_admin_menu` (`pid`,`level`,`tree`,`title`,`name`,`path`,`icon`,`type`,`redirect`,`permissions`,`permission_name`,`component`,`always_show`,`active_menu`,`is_root`,`is_frame`,`frame_src`,`keep_alive`,`hidden`,`affix`,`sort`,`remark`,`status`,`created_at`,`updated_at`)
SELECT @productMenu,3,CONCAT('tr_',@homeId,' tr_',@productMenu,' '),x.title,x.name,'','',3,'',x.permissions,'','',1,'',0,0,'',0,1,0,x.sort,'手工商城操作权限',1,@now,@now FROM (
SELECT '编辑商品' title,'portal_product_edit' name,'/manualProduct/edit' permissions,10 sort UNION ALL SELECT '上下架商品','portal_product_status','/manualProduct/status',20 UNION ALL SELECT '删除商品','portal_product_delete','/manualProduct/delete',30
) x WHERE NOT EXISTS (SELECT 1 FROM `hg_admin_menu` m WHERE m.`name`=x.name);
INSERT IGNORE INTO `hg_admin_role_menu` (`role_id`,`menu_id`)
SELECT r.id,m.id FROM `hg_admin_role` r JOIN `hg_admin_menu` m ON m.name IN ('Dashboard','dashboard_console','portal_site_config','portal_content','portal_banner','portal_manual_product','portal_site_save','portal_site_submit','portal_site_publish','portal_site_rollback','portal_content_edit','portal_content_publish','portal_content_offline','portal_content_delete','portal_banner_edit','portal_banner_status','portal_banner_delete','portal_product_edit','portal_product_status','portal_product_delete') WHERE r.`key` IN ('manage','business');
@@ -0,0 +1,281 @@
-- 第六章:会员、敏感资料、团队、钱包调账与会员通知。
-- MySQL 8.0+;金额统一使用分,敏感字段仅保存密文、检索哈希和脱敏值。
CREATE TABLE IF NOT EXISTS `hg_app_member` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`tenant_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '租户ID',
`member_no` varchar(32) NOT NULL COMMENT '会员编号',
`username` varchar(64) NOT NULL COMMENT '用户名',
`mobile_cipher` text NOT NULL COMMENT '手机号密文(AES-GCM)',
`mobile_hash` char(64) NOT NULL COMMENT '手机号检索哈希(HMAC-SHA256)',
`mobile_mask` varchar(32) NOT NULL COMMENT '手机号脱敏值',
`password_hash` varchar(100) NOT NULL COMMENT '登录密码哈希(bcrypt)',
`trade_password_hash` varchar(100) NOT NULL DEFAULT '' COMMENT '交易密码哈希',
`level_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '会员等级ID',
`parent_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '上级会员ID',
`level` int NOT NULL DEFAULT 1 COMMENT '团队层级',
`tree` varchar(512) NOT NULL DEFAULT '' COMMENT '关系树',
`invite_code` varchar(32) NOT NULL COMMENT '邀请码',
`member_status` tinyint NOT NULL DEFAULT 1 COMMENT '会员状态',
`risk_status` tinyint NOT NULL DEFAULT 1 COMMENT '风控状态',
`auto_dispatch` tinyint NOT NULL DEFAULT 2 COMMENT '自动派单',
`credit_score` int NOT NULL DEFAULT 100 COMMENT '信用分',
`is_test_account` tinyint NOT NULL DEFAULT 2 COMMENT '测试账号',
`last_login_at` datetime(3) DEFAULT NULL COMMENT '最后登录时间',
`last_login_ip_cipher` text COMMENT '最后登录IP密文',
`last_login_ip_mask` varchar(64) NOT NULL DEFAULT '' COMMENT '最后登录IP脱敏值',
`last_login_region` varchar(128) NOT NULL DEFAULT '' COMMENT '最后登录地区',
`created_by` bigint unsigned NOT NULL DEFAULT 0 COMMENT '创建者',
`updated_by` bigint unsigned NOT NULL DEFAULT 0 COMMENT '更新者',
`deleted_by` bigint unsigned NOT NULL DEFAULT 0 COMMENT '删除者',
`created_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间',
`updated_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT '更新时间',
`deleted_at` datetime(3) DEFAULT NULL COMMENT '注销时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_app_member_no` (`tenant_id`,`member_no`),
UNIQUE KEY `uk_app_member_username` (`tenant_id`,`username`),
UNIQUE KEY `uk_app_member_mobile_hash` (`tenant_id`,`mobile_hash`),
UNIQUE KEY `uk_app_member_invite_code` (`tenant_id`,`invite_code`),
KEY `idx_app_member_team` (`tenant_id`,`parent_id`,`level`,`created_at`),
KEY `idx_app_member_status` (`tenant_id`,`member_status`,`auto_dispatch`,`created_at`),
KEY `idx_app_member_deleted` (`deleted_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='会员_会员主档';
CREATE TABLE IF NOT EXISTS `hg_app_member_profile` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`tenant_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '租户ID',
`member_id` bigint unsigned NOT NULL COMMENT '会员ID',
`real_name_cipher` text COMMENT '真实姓名密文',
`real_name_mask` varchar(64) NOT NULL DEFAULT '' COMMENT '真实姓名脱敏值',
`id_no_cipher` text COMMENT '证件号密文',
`id_no_hash` char(64) NOT NULL DEFAULT '' COMMENT '证件号检索哈希',
`id_no_mask` varchar(64) NOT NULL DEFAULT '' COMMENT '证件号脱敏值',
`avatar_attachment_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '头像附件ID',
`kyc_status` tinyint NOT NULL DEFAULT 1 COMMENT '实名状态',
`kyc_verified_at` datetime(3) DEFAULT NULL COMMENT '实名时间',
`created_by` bigint unsigned NOT NULL DEFAULT 0 COMMENT '创建者',
`updated_by` bigint unsigned NOT NULL DEFAULT 0 COMMENT '更新者',
`created_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间',
`updated_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_member_profile_member` (`tenant_id`,`member_id`),
KEY `idx_member_profile_id_hash` (`tenant_id`,`id_no_hash`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='会员_扩展资料';
CREATE TABLE IF NOT EXISTS `hg_app_member_address` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`tenant_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '租户ID',
`member_id` bigint unsigned NOT NULL COMMENT '会员ID',
`receiver_cipher` text NOT NULL COMMENT '收货人密文',
`receiver_mask` varchar(64) NOT NULL COMMENT '收货人脱敏值',
`mobile_cipher` text NOT NULL COMMENT '手机号密文',
`mobile_mask` varchar(32) NOT NULL COMMENT '手机号脱敏值',
`province` varchar(64) NOT NULL DEFAULT '' COMMENT '省',
`city` varchar(64) NOT NULL DEFAULT '' COMMENT '市',
`district` varchar(64) NOT NULL DEFAULT '' COMMENT '区县',
`address_cipher` text NOT NULL COMMENT '详细地址密文',
`address_mask` varchar(255) NOT NULL COMMENT '详细地址脱敏值',
`is_default` tinyint NOT NULL DEFAULT 2 COMMENT '默认地址',
`created_by` bigint unsigned NOT NULL DEFAULT 0 COMMENT '创建者',
`updated_by` bigint unsigned NOT NULL DEFAULT 0 COMMENT '更新者',
`deleted_by` bigint unsigned NOT NULL DEFAULT 0 COMMENT '删除者',
`created_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间',
`updated_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT '更新时间',
`deleted_at` datetime(3) DEFAULT NULL COMMENT '删除时间',
PRIMARY KEY (`id`),
KEY `idx_member_address_member` (`tenant_id`,`member_id`,`is_default`,`id`),
KEY `idx_member_address_deleted` (`deleted_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='会员_收货地址';
CREATE TABLE IF NOT EXISTS `hg_app_member_payment_account` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`tenant_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '租户ID',
`member_id` bigint unsigned NOT NULL COMMENT '会员ID',
`account_type` tinyint NOT NULL COMMENT '账户类型',
`bank_code` varchar(32) NOT NULL DEFAULT '' COMMENT '银行编码',
`bank_name` varchar(100) NOT NULL DEFAULT '' COMMENT '银行名称',
`holder_cipher` text NOT NULL COMMENT '持有人密文',
`holder_mask` varchar(64) NOT NULL COMMENT '持有人脱敏值',
`mobile_cipher` text COMMENT '预留手机号密文',
`mobile_mask` varchar(32) NOT NULL DEFAULT '' COMMENT '预留手机号脱敏值',
`account_no_cipher` text NOT NULL COMMENT '账号密文',
`account_no_hash` char(64) NOT NULL COMMENT '账号检索哈希',
`account_no_mask` varchar(80) NOT NULL COMMENT '账号脱敏值',
`qr_attachment_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '收款码附件ID',
`verify_status` tinyint NOT NULL DEFAULT 1 COMMENT '核验状态',
`is_default` tinyint NOT NULL DEFAULT 2 COMMENT '默认账户',
`created_by` bigint unsigned NOT NULL DEFAULT 0 COMMENT '创建者',
`updated_by` bigint unsigned NOT NULL DEFAULT 0 COMMENT '更新者',
`deleted_by` bigint unsigned NOT NULL DEFAULT 0 COMMENT '删除者',
`created_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间',
`updated_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT '更新时间',
`deleted_at` datetime(3) DEFAULT NULL COMMENT '删除时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_member_payment_account` (`tenant_id`,`member_id`,`account_type`,`account_no_hash`),
KEY `idx_member_payment_member` (`tenant_id`,`member_id`,`is_default`,`id`),
KEY `idx_member_payment_deleted` (`deleted_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='会员_收款账户';
CREATE TABLE IF NOT EXISTS `hg_app_member_status_log` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`tenant_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '租户ID',
`member_id` bigint unsigned NOT NULL COMMENT '会员ID',
`from_status` tinyint NOT NULL COMMENT '原状态',
`to_status` tinyint NOT NULL COMMENT '目标状态',
`reason_code` varchar(64) NOT NULL COMMENT '原因编码',
`reason_text` varchar(500) NOT NULL COMMENT '原因说明',
`effective_at` datetime(3) NOT NULL COMMENT '生效时间',
`expire_at` datetime(3) DEFAULT NULL COMMENT '失效时间',
`approval_request_id` bigint unsigned NOT NULL COMMENT '审批单ID',
`operator_id` bigint unsigned NOT NULL COMMENT '执行人',
`created_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间',
PRIMARY KEY (`id`),
KEY `idx_member_status_log` (`tenant_id`,`member_id`,`id`),
UNIQUE KEY `uk_member_status_approval` (`tenant_id`,`approval_request_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='会员_状态变更日志';
CREATE TABLE IF NOT EXISTS `hg_wallet_account` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`tenant_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '租户ID',
`member_id` bigint unsigned NOT NULL COMMENT '会员ID',
`currency` char(3) NOT NULL DEFAULT 'CNY' COMMENT '币种',
`available_amount` bigint NOT NULL DEFAULT 0 COMMENT '可用金额(分)',
`frozen_amount` bigint NOT NULL DEFAULT 0 COMMENT '冻结金额(分)',
`total_income` bigint NOT NULL DEFAULT 0 COMMENT '累计收入(分)',
`total_expense` bigint NOT NULL DEFAULT 0 COMMENT '累计支出(分)',
`account_status` tinyint NOT NULL DEFAULT 1 COMMENT '账户状态',
`version` int unsigned NOT NULL DEFAULT 0 COMMENT '乐观锁',
`created_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间',
`updated_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_wallet_member_currency` (`tenant_id`,`member_id`,`currency`),
CONSTRAINT `chk_wallet_available_nonnegative` CHECK (`available_amount` >= 0),
CONSTRAINT `chk_wallet_frozen_nonnegative` CHECK (`frozen_amount` >= 0)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='钱包_会员账户';
CREATE TABLE IF NOT EXISTS `hg_wallet_ledger` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`tenant_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '租户ID',
`ledger_no` varchar(40) NOT NULL COMMENT '账变流水号',
`account_id` bigint unsigned NOT NULL COMMENT '钱包账户ID',
`member_id` bigint unsigned NOT NULL COMMENT '会员ID',
`biz_type` varchar(32) NOT NULL COMMENT '业务类型',
`biz_no` varchar(64) NOT NULL COMMENT '业务单号',
`entry_type` varchar(32) NOT NULL COMMENT '账变类型',
`direction` tinyint NOT NULL COMMENT '方向 1收入 2支出',
`amount` bigint NOT NULL COMMENT '发生金额(分)',
`before_amount` bigint NOT NULL COMMENT '变更前余额(分)',
`after_amount` bigint NOT NULL COMMENT '变更后余额(分)',
`currency` char(3) NOT NULL DEFAULT 'CNY' COMMENT '币种',
`reversal_of` bigint unsigned NOT NULL DEFAULT 0 COMMENT '冲正原流水ID',
`idempotency_key` varchar(80) NOT NULL COMMENT '幂等键',
`remark` varchar(500) NOT NULL DEFAULT '' COMMENT '说明',
`operator_id` bigint unsigned NOT NULL COMMENT '操作人',
`occurred_at` datetime(3) NOT NULL COMMENT '发生时间',
`created_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_wallet_ledger_no` (`tenant_id`,`ledger_no`),
UNIQUE KEY `uk_wallet_ledger_idempotency` (`tenant_id`,`account_id`,`idempotency_key`),
KEY `idx_wallet_ledger_member` (`tenant_id`,`member_id`,`occurred_at`,`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='钱包_不可变账变流水';
CREATE TABLE IF NOT EXISTS `hg_wallet_adjustment_request` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`tenant_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '租户ID',
`request_no` varchar(40) NOT NULL COMMENT '申请单号',
`member_id` bigint unsigned NOT NULL COMMENT '会员ID',
`account_id` bigint unsigned NOT NULL COMMENT '钱包账户ID',
`adjust_type` tinyint NOT NULL COMMENT '调整类型',
`direction` tinyint NOT NULL COMMENT '方向 1收入 2支出',
`amount` bigint NOT NULL COMMENT '金额(分)',
`reason_code` varchar(64) NOT NULL COMMENT '原因编码',
`reason_text` varchar(500) NOT NULL COMMENT '原因说明',
`evidence_json` json DEFAULT NULL COMMENT '凭证附件',
`idempotency_key` varchar(80) NOT NULL COMMENT '幂等键',
`request_status` tinyint NOT NULL DEFAULT 1 COMMENT '状态 1待审批 2已通过 3已拒绝 4已执行',
`approval_request_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '审批单ID',
`ledger_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '账变流水ID',
`created_by` bigint unsigned NOT NULL DEFAULT 0 COMMENT '创建者',
`updated_by` bigint unsigned NOT NULL DEFAULT 0 COMMENT '更新者',
`created_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间',
`updated_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_wallet_adjustment_no` (`tenant_id`,`request_no`),
UNIQUE KEY `uk_wallet_adjustment_idempotency` (`tenant_id`,`idempotency_key`),
KEY `idx_wallet_adjustment_member` (`tenant_id`,`member_id`,`request_status`,`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='钱包_调账申请';
CREATE TABLE IF NOT EXISTS `hg_app_member_notice` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`tenant_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '租户ID',
`member_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '会员ID,0为全体',
`title` varchar(120) NOT NULL COMMENT '标题',
`content` varchar(500) NOT NULL COMMENT '内容',
`source_type` tinyint NOT NULL DEFAULT 1 COMMENT '来源 1真实通知 2运营模拟',
`start_at` datetime(3) NOT NULL COMMENT '开始时间',
`end_at` datetime(3) NOT NULL COMMENT '结束时间',
`notice_status` tinyint NOT NULL DEFAULT 1 COMMENT '状态 1有效 2撤回',
`created_by` bigint unsigned NOT NULL DEFAULT 0 COMMENT '创建者',
`updated_by` bigint unsigned NOT NULL DEFAULT 0 COMMENT '更新者',
`created_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间',
`updated_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT '更新时间',
PRIMARY KEY (`id`),
KEY `idx_member_notice_delivery` (`tenant_id`,`member_id`,`notice_status`,`start_at`,`end_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='会员_通知与运营弹幕';
-- 复用 HotGo 原有数据库字典。
INSERT INTO `hg_sys_dict_type` (`name`,`type`,`remark`,`status`,`created_at`,`updated_at`)
SELECT x.name,x.type,x.remark,1,NOW(),NOW() FROM (
SELECT '会员禁用原因' name,'member_disable_reason' type,'会员状态变更原因' remark UNION ALL
SELECT '钱包调账原因','wallet_adjust_reason','资金调账原因'
) x WHERE NOT EXISTS (SELECT 1 FROM `hg_sys_dict_type` d WHERE d.`type`=x.type);
INSERT INTO `hg_sys_dict_data` (`type`,`label`,`value`,`value_type`,`list_class`,`sort`,`status`,`remark`,`created_at`,`updated_at`)
SELECT x.type,x.label,x.value,'string',x.list_class,x.sort,1,x.remark,NOW(),NOW() FROM (
SELECT 'member_disable_reason' type,'风控处置' label,'risk_control' value,'error' list_class,10 sort,'会员禁用原因' remark UNION ALL
SELECT 'member_disable_reason','用户申请','user_request','warning',20,'会员禁用原因' UNION ALL
SELECT 'member_disable_reason','违规行为','violation','error',30,'会员禁用原因' UNION ALL
SELECT 'wallet_adjust_reason','活动奖励','campaign_reward','success',10,'资金调账原因' UNION ALL
SELECT 'wallet_adjust_reason','人工补账','manual_supplement','primary',20,'资金调账原因' UNION ALL
SELECT 'wallet_adjust_reason','差错扣回','error_deduction','error',30,'资金调账原因' UNION ALL
SELECT 'wallet_adjust_reason','冲正处理','reversal','warning',40,'资金调账原因'
) x WHERE NOT EXISTS (SELECT 1 FROM `hg_sys_dict_data` d WHERE d.`type`=x.type AND d.`value`=x.value);
-- 会员管理菜单与接口权限。
SET @now=NOW();
INSERT INTO `hg_admin_menu` (`pid`,`level`,`tree`,`title`,`name`,`path`,`icon`,`type`,`redirect`,`permissions`,`permission_name`,`component`,`always_show`,`active_menu`,`is_root`,`is_frame`,`frame_src`,`keep_alive`,`hidden`,`affix`,`sort`,`remark`,`status`,`created_at`,`updated_at`)
SELECT 0,1,'','会员管理','app_member','/app-member','UserOutlined',1,'','','','LAYOUT',1,'',1,0,'',0,0,0,40,'会员、团队、收款账户与钱包治理',1,@now,@now
WHERE NOT EXISTS (SELECT 1 FROM `hg_admin_menu` WHERE `name`='app_member');
SET @memberRoot=(SELECT `id` FROM `hg_admin_menu` WHERE `name`='app_member' LIMIT 1);
INSERT INTO `hg_admin_menu` (`pid`,`level`,`tree`,`title`,`name`,`path`,`icon`,`type`,`redirect`,`permissions`,`permission_name`,`component`,`always_show`,`active_menu`,`is_root`,`is_frame`,`frame_src`,`keep_alive`,`hidden`,`affix`,`sort`,`remark`,`status`,`created_at`,`updated_at`)
SELECT @memberRoot,2,CONCAT('tr_',@memberRoot,' '),x.title,x.name,x.path,x.icon,2,'',x.permissions,'',x.component,1,'',0,0,'',1,0,0,x.sort,x.remark,1,@now,@now FROM (
SELECT '会员列表' title,'app_member_list' name,'list' path,'TeamOutlined' icon,'/appMember/list,/appMember/view' permissions,'/app-member/list/index' component,10 sort,'会员主档与关联资料' remark UNION ALL
SELECT '资金调账' ,'app_member_wallet','wallet','WalletOutlined','/appMember/walletList','/app-member/wallet/index',20,'审批驱动的会员钱包调账' UNION ALL
SELECT '会员通知' ,'app_member_notice','notice','NotificationOutlined','/appMember/noticeList','/app-member/notice/index',30,'真实通知与运营模拟明确标识'
) x WHERE NOT EXISTS (SELECT 1 FROM `hg_admin_menu` m WHERE m.`name`=x.name);
SET @memberMenu=(SELECT `id` FROM `hg_admin_menu` WHERE `name`='app_member_list' LIMIT 1);
SET @walletMenu=(SELECT `id` FROM `hg_admin_menu` WHERE `name`='app_member_wallet' LIMIT 1);
SET @noticeMenu=(SELECT `id` FROM `hg_admin_menu` WHERE `name`='app_member_notice' LIMIT 1);
INSERT INTO `hg_admin_menu` (`pid`,`level`,`tree`,`title`,`name`,`path`,`icon`,`type`,`redirect`,`permissions`,`permission_name`,`component`,`always_show`,`active_menu`,`is_root`,`is_frame`,`frame_src`,`keep_alive`,`hidden`,`affix`,`sort`,`remark`,`status`,`created_at`,`updated_at`)
SELECT x.pid,3,x.tree,x.title,x.name,'','',3,'',x.permissions,'','',1,'',0,0,'',0,1,0,x.sort,'会员管理操作权限',1,@now,@now FROM (
SELECT @memberMenu pid,CONCAT('tr_',@memberRoot,' tr_',@memberMenu,' ') tree,'新增编辑会员' title,'app_member_edit' name,'/appMember/edit' permissions,10 sort UNION ALL
SELECT @memberMenu,CONCAT('tr_',@memberRoot,' tr_',@memberMenu,' '),'注销会员','app_member_delete','/appMember/delete',20 UNION ALL
SELECT @memberMenu,CONCAT('tr_',@memberRoot,' tr_',@memberMenu,' '),'自动派单开关','app_member_dispatch','/appMember/autoDispatch',30 UNION ALL
SELECT @memberMenu,CONCAT('tr_',@memberRoot,' tr_',@memberMenu,' '),'收款账户管理','app_member_payment','/appMember/paymentList,/appMember/paymentEdit,/appMember/paymentDelete',40 UNION ALL
SELECT @memberMenu,CONCAT('tr_',@memberRoot,' tr_',@memberMenu,' '),'地址管理','app_member_address','/appMember/addressList,/appMember/addressEdit,/appMember/addressDelete',50 UNION ALL
SELECT @memberMenu,CONCAT('tr_',@memberRoot,' tr_',@memberMenu,' '),'查看敏感信息','app_member_sensitive','/appMember/sensitive',60 UNION ALL
SELECT @memberMenu,CONCAT('tr_',@memberRoot,' tr_',@memberMenu,' '),'团队查询','app_member_team','/appMember/team',70 UNION ALL
SELECT @memberMenu,CONCAT('tr_',@memberRoot,' tr_',@memberMenu,' '),'禁用申请','app_member_status_request','/appMember/statusRequest',80 UNION ALL
SELECT @memberMenu,CONCAT('tr_',@memberRoot,' tr_',@memberMenu,' '),'执行会员状态','app_member_status_execute','/appMember/statusExecute',90 UNION ALL
SELECT @walletMenu,CONCAT('tr_',@memberRoot,' tr_',@walletMenu,' '),'发起资金调账','app_member_wallet_request','/appMember/walletRequest',10 UNION ALL
SELECT @walletMenu,CONCAT('tr_',@memberRoot,' tr_',@walletMenu,' '),'执行资金调账','app_member_wallet_execute','/appMember/walletExecute',20 UNION ALL
SELECT @noticeMenu,CONCAT('tr_',@memberRoot,' tr_',@noticeMenu,' '),'创建会员通知','app_member_notice_edit','/appMember/noticeEdit',10 UNION ALL
SELECT @noticeMenu,CONCAT('tr_',@memberRoot,' tr_',@noticeMenu,' '),'撤回会员通知','app_member_notice_revoke','/appMember/noticeRevoke',20
) x WHERE NOT EXISTS (SELECT 1 FROM `hg_admin_menu` m WHERE m.`name`=x.name);
INSERT IGNORE INTO `hg_admin_role_menu` (`role_id`,`menu_id`)
SELECT r.id,m.id FROM `hg_admin_role` r JOIN `hg_admin_menu` m ON m.name IN (
'app_member','app_member_list','app_member_wallet','app_member_notice','app_member_edit','app_member_delete','app_member_dispatch','app_member_payment','app_member_address','app_member_sensitive','app_member_team','app_member_status_request','app_member_status_execute','app_member_wallet_request','app_member_wallet_execute','app_member_notice_edit','app_member_notice_revoke'
) WHERE r.`key` IN ('manage','business');
@@ -0,0 +1,119 @@
-- 第七章:会员等级与任务大厅。
-- 金额使用分,比例使用万分比;会员等级规则采用不可变版本发布。
CREATE TABLE IF NOT EXISTS `hg_app_member_level` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`tenant_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '租户ID',
`level_code` varchar(32) NOT NULL COMMENT '稳定等级编码',
`name` varchar(64) NOT NULL COMMENT '等级名称',
`icon_attachment_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '图标附件ID',
`icon_url` varchar(1000) NOT NULL DEFAULT '' COMMENT '图标URL',
`current_version_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '当前发布版本ID',
`member_count` bigint unsigned NOT NULL DEFAULT 0 COMMENT '会员数(可重建)',
`status` tinyint NOT NULL DEFAULT 1 COMMENT '状态 1正常 2停用',
`sort` int NOT NULL DEFAULT 0 COMMENT '排序',
`remark` varchar(500) NOT NULL DEFAULT '' COMMENT '备注',
`created_by` bigint unsigned NOT NULL DEFAULT 0 COMMENT '创建者',
`updated_by` bigint unsigned NOT NULL DEFAULT 0 COMMENT '更新者',
`deleted_by` bigint unsigned NOT NULL DEFAULT 0 COMMENT '删除者',
`created_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间',
`updated_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT '更新时间',
`deleted_at` datetime(3) DEFAULT NULL COMMENT '删除时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_member_level_code` (`tenant_id`,`level_code`),
UNIQUE KEY `uk_member_level_name` (`tenant_id`,`name`),
KEY `idx_member_level_status` (`tenant_id`,`status`,`sort`,`id`),
KEY `idx_member_level_deleted` (`deleted_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='会员_会员等级';
CREATE TABLE IF NOT EXISTS `hg_app_member_level_version` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`tenant_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '租户ID',
`level_id` bigint unsigned NOT NULL COMMENT '等级ID',
`version_no` int unsigned NOT NULL COMMENT '版本号',
`upgrade_amount` bigint NOT NULL DEFAULT 0 COMMENT '升级金额(分)',
`gift_amount` bigint NOT NULL DEFAULT 0 COMMENT '赠送金额(分)',
`daily_order_limit` int unsigned NOT NULL DEFAULT 0 COMMENT '每日接单次数',
`commission_rate` int unsigned NOT NULL DEFAULT 0 COMMENT '佣金万分比',
`daily_withdraw_limit` int unsigned NOT NULL DEFAULT 0 COMMENT '每日提现次数',
`rule_json` json DEFAULT NULL COMMENT '扩展规则快照',
`publish_status` tinyint NOT NULL DEFAULT 1 COMMENT '发布状态',
`effective_at` datetime(3) DEFAULT NULL COMMENT '计划生效时间',
`published_at` datetime(3) DEFAULT NULL COMMENT '发布时间',
`approval_request_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '审批单ID',
`base_version_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '基础版本ID',
`version` int unsigned NOT NULL DEFAULT 0 COMMENT '乐观锁',
`remark` varchar(500) NOT NULL DEFAULT '' COMMENT '变更说明',
`created_by` bigint unsigned NOT NULL DEFAULT 0 COMMENT '创建者',
`updated_by` bigint unsigned NOT NULL DEFAULT 0 COMMENT '更新者',
`created_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间',
`updated_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_member_level_version` (`level_id`,`version_no`),
KEY `idx_member_level_version_status` (`tenant_id`,`level_id`,`publish_status`,`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='会员_等级规则版本';
CREATE TABLE IF NOT EXISTS `hg_task_hall` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`tenant_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '租户ID',
`hall_code` varchar(32) NOT NULL COMMENT '大厅编码',
`name` varchar(100) NOT NULL COMMENT '名称',
`icon_attachment_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '图标附件ID',
`icon_url` varchar(1000) NOT NULL DEFAULT '' COMMENT '图标URL',
`summary` varchar(500) NOT NULL DEFAULT '' COMMENT '简介',
`commission_rate` int unsigned NOT NULL DEFAULT 0 COMMENT '佣金万分比',
`rate_unit` varchar(20) NOT NULL DEFAULT 'basis_point' COMMENT '比例单位',
`client_route` varchar(500) NOT NULL DEFAULT '' COMMENT 'C端跳转',
`publish_status` tinyint NOT NULL DEFAULT 1 COMMENT '发布状态',
`sort` int NOT NULL DEFAULT 0 COMMENT '排序',
`version` int unsigned NOT NULL DEFAULT 0 COMMENT '乐观锁',
`remark` varchar(500) NOT NULL DEFAULT '' COMMENT '备注',
`created_by` bigint unsigned NOT NULL DEFAULT 0 COMMENT '创建者',
`updated_by` bigint unsigned NOT NULL DEFAULT 0 COMMENT '更新者',
`deleted_by` bigint unsigned NOT NULL DEFAULT 0 COMMENT '删除者',
`created_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间',
`updated_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT '更新时间',
`deleted_at` datetime(3) DEFAULT NULL COMMENT '删除时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_task_hall_code` (`tenant_id`,`hall_code`),
UNIQUE KEY `uk_task_hall_name` (`tenant_id`,`name`),
KEY `idx_task_hall_status` (`tenant_id`,`publish_status`,`sort`,`id`),
KEY `idx_task_hall_deleted` (`deleted_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='任务_任务大厅';
CREATE TABLE IF NOT EXISTS `hg_task_hall_level` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`tenant_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '租户ID',
`hall_id` bigint unsigned NOT NULL COMMENT '任务大厅ID',
`level_id` bigint unsigned NOT NULL COMMENT '会员等级ID',
`created_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_task_hall_level` (`tenant_id`,`hall_id`,`level_id`),
KEY `idx_task_hall_level_level` (`tenant_id`,`level_id`,`hall_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='任务_大厅可用会员等级';
SET @now=NOW();
SET @memberRoot=(SELECT `id` FROM `hg_admin_menu` WHERE `name`='app_member' LIMIT 1);
INSERT INTO `hg_admin_menu` (`pid`,`level`,`tree`,`title`,`name`,`path`,`icon`,`type`,`redirect`,`permissions`,`permission_name`,`component`,`always_show`,`active_menu`,`is_root`,`is_frame`,`frame_src`,`keep_alive`,`hidden`,`affix`,`sort`,`remark`,`status`,`created_at`,`updated_at`)
SELECT @memberRoot,2,CONCAT('tr_',@memberRoot,' '),x.title,x.name,x.path,x.icon,2,'',x.permissions,'',x.component,1,'',0,0,'',1,0,0,x.sort,x.remark,1,@now,@now FROM (
SELECT '会员等级' title,'app_member_level' name,'level' path,'CrownOutlined' icon,'/memberLevel/list,/memberLevel/view,/memberLevel/history' permissions,'/app-member/level/index' component,40 sort,'版本化会员等级规则' remark UNION ALL
SELECT '任务大厅','app_task_hall','task-hall','AppstoreOutlined','/taskHall/list,/taskHall/view','/app-member/task-hall/index',50,'任务大厅及可用等级'
) x WHERE NOT EXISTS (SELECT 1 FROM `hg_admin_menu` m WHERE m.`name`=x.name);
SET @levelMenu=(SELECT `id` FROM `hg_admin_menu` WHERE `name`='app_member_level' LIMIT 1);
SET @hallMenu=(SELECT `id` FROM `hg_admin_menu` WHERE `name`='app_task_hall' LIMIT 1);
INSERT INTO `hg_admin_menu` (`pid`,`level`,`tree`,`title`,`name`,`path`,`icon`,`type`,`redirect`,`permissions`,`permission_name`,`component`,`always_show`,`active_menu`,`is_root`,`is_frame`,`frame_src`,`keep_alive`,`hidden`,`affix`,`sort`,`remark`,`status`,`created_at`,`updated_at`)
SELECT x.pid,3,x.tree,x.title,x.name,'','',3,'',x.permissions,'','',1,'',0,0,'',0,1,0,x.sort,'第七章操作权限',1,@now,@now FROM (
SELECT @levelMenu pid,CONCAT('tr_',@memberRoot,' tr_',@levelMenu,' ') tree,'保存等级草稿' title,'member_level_save' name,'/memberLevel/save' permissions,10 sort UNION ALL
SELECT @levelMenu,CONCAT('tr_',@memberRoot,' tr_',@levelMenu,' '),'提交等级审批','member_level_submit','/memberLevel/submit',20 UNION ALL
SELECT @levelMenu,CONCAT('tr_',@memberRoot,' tr_',@levelMenu,' '),'发布等级规则','member_level_publish','/memberLevel/publish',30 UNION ALL
SELECT @levelMenu,CONCAT('tr_',@memberRoot,' tr_',@levelMenu,' '),'回滚等级规则','member_level_rollback','/memberLevel/rollback',40 UNION ALL
SELECT @levelMenu,CONCAT('tr_',@memberRoot,' tr_',@levelMenu,' '),'停用等级','member_level_status','/memberLevel/status',50 UNION ALL
SELECT @levelMenu,CONCAT('tr_',@memberRoot,' tr_',@levelMenu,' '),'删除等级','member_level_delete','/memberLevel/delete',60 UNION ALL
SELECT @hallMenu,CONCAT('tr_',@memberRoot,' tr_',@hallMenu,' '),'新增编辑大厅','task_hall_edit','/taskHall/edit',10 UNION ALL
SELECT @hallMenu,CONCAT('tr_',@memberRoot,' tr_',@hallMenu,' '),'发布下线大厅','task_hall_status','/taskHall/status',20 UNION ALL
SELECT @hallMenu,CONCAT('tr_',@memberRoot,' tr_',@hallMenu,' '),'删除大厅','task_hall_delete','/taskHall/delete',30
) x WHERE NOT EXISTS (SELECT 1 FROM `hg_admin_menu` m WHERE m.`name`=x.name);
INSERT IGNORE INTO `hg_admin_role_menu` (`role_id`,`menu_id`)
SELECT r.id,m.id FROM `hg_admin_role` r JOIN `hg_admin_menu` m ON m.name IN ('app_member_level','app_task_hall','member_level_save','member_level_submit','member_level_publish','member_level_rollback','member_level_status','member_level_delete','task_hall_edit','task_hall_status','task_hall_delete') WHERE r.`key` IN ('manage','business');
@@ -0,0 +1,239 @@
-- 第八章:交易订单、充值、提现与客服管理。
-- MySQL 8.0+;金额统一使用分,资金结果通过审批与不可变台账执行。
CREATE TABLE IF NOT EXISTS `hg_trade_order` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`tenant_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '租户ID',
`order_no` varchar(40) NOT NULL COMMENT '订单号',
`member_id` bigint unsigned NOT NULL COMMENT '会员ID',
`task_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '任务ID',
`product_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '商品ID',
`product_name` varchar(200) NOT NULL DEFAULT '' COMMENT '商品名称快照',
`order_type` tinyint NOT NULL COMMENT '订单类型',
`quantity` int unsigned NOT NULL DEFAULT 1 COMMENT '数量',
`unit_price_amount` bigint NOT NULL COMMENT '单价(分)',
`total_amount` bigint NOT NULL COMMENT '订单金额(分)',
`commission_amount` bigint NOT NULL DEFAULT 0 COMMENT '佣金(分)',
`currency` char(3) NOT NULL DEFAULT 'CNY' COMMENT '币种',
`member_level_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '下单等级ID',
`rule_snapshot` json DEFAULT NULL COMMENT '规则快照',
`message` varchar(500) NOT NULL DEFAULT '' COMMENT '订单消息',
`order_status` tinyint NOT NULL DEFAULT 1 COMMENT '订单状态',
`freeze_status` tinyint NOT NULL DEFAULT 1 COMMENT '冻结状态',
`approval_request_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '人工处理审批ID',
`matched_at` datetime(3) DEFAULT NULL COMMENT '匹配时间',
`completed_at` datetime(3) DEFAULT NULL COMMENT '完成时间',
`unfrozen_at` datetime(3) DEFAULT NULL COMMENT '解冻时间',
`created_by` bigint unsigned NOT NULL DEFAULT 0 COMMENT '创建者',
`updated_by` bigint unsigned NOT NULL DEFAULT 0 COMMENT '更新者',
`created_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '下单时间',
`updated_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_trade_order_no` (`tenant_id`,`order_no`),
KEY `idx_trade_order_member_time` (`tenant_id`,`member_id`,`created_at`,`id`),
KEY `idx_trade_order_status_time` (`tenant_id`,`order_status`,`created_at`,`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='交易_业务订单';
CREATE TABLE IF NOT EXISTS `hg_payment_channel` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`tenant_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '租户ID',
`channel_code` varchar(32) NOT NULL COMMENT '渠道编码',
`name` varchar(100) NOT NULL COMMENT '渠道名称',
`channel_type` tinyint NOT NULL COMMENT '渠道类型',
`direction` tinyint NOT NULL COMMENT '支持方向',
`config_cipher` longtext COMMENT '渠道配置密文',
`min_amount` bigint NOT NULL DEFAULT 0 COMMENT '最小金额(分)',
`max_amount` bigint NOT NULL DEFAULT 0 COMMENT '最大金额(分)',
`fee_type` tinyint NOT NULL DEFAULT 1 COMMENT '手续费类型',
`fee_fixed_amount` bigint NOT NULL DEFAULT 0 COMMENT '固定手续费(分)',
`fee_rate` int unsigned NOT NULL DEFAULT 0 COMMENT '费率(万分比)',
`status` tinyint NOT NULL DEFAULT 1 COMMENT '状态',
`sort` int NOT NULL DEFAULT 0 COMMENT '排序',
`created_by` bigint unsigned NOT NULL DEFAULT 0 COMMENT '创建者',
`updated_by` bigint unsigned NOT NULL DEFAULT 0 COMMENT '更新者',
`deleted_by` bigint unsigned NOT NULL DEFAULT 0 COMMENT '删除者',
`created_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间',
`updated_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT '更新时间',
`deleted_at` datetime(3) DEFAULT NULL COMMENT '删除时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_payment_channel_code` (`tenant_id`,`channel_code`),
KEY `idx_payment_channel_status` (`tenant_id`,`status`,`sort`),
KEY `idx_payment_channel_deleted` (`deleted_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='交易_支付渠道';
CREATE TABLE IF NOT EXISTS `hg_recharge_order` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`tenant_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '租户ID',
`recharge_no` varchar(40) NOT NULL COMMENT '充值单号',
`member_id` bigint unsigned NOT NULL COMMENT '会员ID',
`channel_id` bigint unsigned NOT NULL COMMENT '支付渠道ID',
`request_amount` bigint NOT NULL COMMENT '申请金额(分)',
`paid_amount` bigint NOT NULL DEFAULT 0 COMMENT '实付金额(分)',
`currency` char(3) NOT NULL DEFAULT 'CNY' COMMENT '币种',
`external_no` varchar(128) NOT NULL DEFAULT '' COMMENT '外部支付单号',
`voucher_attachment_ids` json DEFAULT NULL COMMENT '打款凭证附件',
`recharge_type` tinyint NOT NULL DEFAULT 1 COMMENT '充值类型',
`recharge_status` tinyint NOT NULL DEFAULT 1 COMMENT '充值状态',
`remark` varchar(500) NOT NULL DEFAULT '' COMMENT '会员备注',
`review_reason_code` varchar(64) NOT NULL DEFAULT '' COMMENT '审核原因编码',
`review_reason` varchar(500) NOT NULL DEFAULT '' COMMENT '审核意见',
`approval_request_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '审批单ID',
`ledger_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '入账台账ID',
`paid_at` datetime(3) DEFAULT NULL COMMENT '支付时间',
`reviewed_at` datetime(3) DEFAULT NULL COMMENT '审核时间',
`credited_at` datetime(3) DEFAULT NULL COMMENT '入账时间',
`created_by` bigint unsigned NOT NULL DEFAULT 0 COMMENT '创建者',
`updated_by` bigint unsigned NOT NULL DEFAULT 0 COMMENT '更新者',
`created_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间',
`updated_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_recharge_no` (`tenant_id`,`recharge_no`),
KEY `idx_recharge_external` (`tenant_id`,`external_no`),
KEY `idx_recharge_member_time` (`tenant_id`,`member_id`,`created_at`,`id`),
KEY `idx_recharge_status_time` (`tenant_id`,`recharge_status`,`created_at`,`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='交易_充值订单';
CREATE TABLE IF NOT EXISTS `hg_withdrawal_order` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`tenant_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '租户ID',
`withdrawal_no` varchar(40) NOT NULL COMMENT '提现单号',
`member_id` bigint unsigned NOT NULL COMMENT '会员ID',
`payment_account_id` bigint unsigned NOT NULL COMMENT '收款账户ID',
`channel_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '付款渠道ID',
`request_amount` bigint NOT NULL COMMENT '申请金额(分)',
`fee_amount` bigint NOT NULL DEFAULT 0 COMMENT '手续费(分)',
`actual_amount` bigint NOT NULL COMMENT '实际到账(分)',
`currency` char(3) NOT NULL DEFAULT 'CNY' COMMENT '币种',
`account_snapshot_cipher` longtext NOT NULL COMMENT '收款账户加密快照',
`account_mask` varchar(128) NOT NULL COMMENT '收款账户脱敏快照',
`bank_name` varchar(100) NOT NULL DEFAULT '' COMMENT '银行名称快照',
`holder_mask` varchar(64) NOT NULL DEFAULT '' COMMENT '开户名脱敏快照',
`risk_result` json DEFAULT NULL COMMENT '风控结果摘要',
`withdrawal_status` tinyint NOT NULL DEFAULT 1 COMMENT '提现状态',
`review_reason_code` varchar(64) NOT NULL DEFAULT '' COMMENT '审核原因编码',
`review_reason` varchar(500) NOT NULL DEFAULT '' COMMENT '审核意见',
`approval_request_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '审批单ID',
`external_no` varchar(128) NOT NULL DEFAULT '' COMMENT '外部付款单号',
`freeze_ledger_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '冻结台账ID',
`final_ledger_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '完成或解冻台账ID',
`reviewed_at` datetime(3) DEFAULT NULL COMMENT '审核时间',
`processed_at` datetime(3) DEFAULT NULL COMMENT '处理时间',
`completed_at` datetime(3) DEFAULT NULL COMMENT '完成时间',
`created_by` bigint unsigned NOT NULL DEFAULT 0 COMMENT '创建者',
`updated_by` bigint unsigned NOT NULL DEFAULT 0 COMMENT '更新者',
`created_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '发起时间',
`updated_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_withdrawal_no` (`tenant_id`,`withdrawal_no`),
KEY `idx_withdrawal_external` (`tenant_id`,`external_no`),
KEY `idx_withdrawal_member_time` (`tenant_id`,`member_id`,`created_at`,`id`),
KEY `idx_withdrawal_status_time` (`tenant_id`,`withdrawal_status`,`created_at`,`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='交易_提现订单';
CREATE TABLE IF NOT EXISTS `hg_finance_review` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`tenant_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '租户ID',
`approval_request_id` bigint unsigned NOT NULL COMMENT '审批单ID',
`biz_type` varchar(32) NOT NULL COMMENT '业务类型',
`biz_id` bigint unsigned NOT NULL COMMENT '业务ID',
`review_stage` tinyint NOT NULL COMMENT '审核阶段',
`reviewer_id` bigint unsigned NOT NULL COMMENT '审核人',
`decision` tinyint NOT NULL COMMENT '审核结论',
`reason_code` varchar(64) NOT NULL COMMENT '原因编码',
`reason_text` varchar(500) NOT NULL COMMENT '审核说明',
`snapshot_json` json DEFAULT NULL COMMENT '审核快照',
`created_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_finance_review_actor` (`tenant_id`,`approval_request_id`,`review_stage`,`reviewer_id`),
KEY `idx_finance_review_biz` (`tenant_id`,`biz_type`,`biz_id`,`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='交易_财务审核记录';
CREATE TABLE IF NOT EXISTS `hg_customer_service` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`tenant_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '租户ID',
`service_code` varchar(32) NOT NULL COMMENT '客服编码',
`name` varchar(100) NOT NULL COMMENT '客服名称',
`avatar_url` varchar(1000) NOT NULL DEFAULT '' COMMENT '头像地址',
`work_time` varchar(200) NOT NULL COMMENT '工作时间说明',
`online_status` tinyint NOT NULL DEFAULT 2 COMMENT '在线状态',
`service_url` varchar(1000) NOT NULL COMMENT '客服跳转URL',
`backup_contact` varchar(500) NOT NULL DEFAULT '' COMMENT '备用联系方式',
`session_mapping` json DEFAULT NULL COMMENT '第三方会话映射',
`status` tinyint NOT NULL DEFAULT 1 COMMENT '状态',
`sort` int NOT NULL DEFAULT 0 COMMENT '排序',
`remark` varchar(500) NOT NULL DEFAULT '' COMMENT '备注',
`created_by` bigint unsigned NOT NULL DEFAULT 0 COMMENT '创建者',
`updated_by` bigint unsigned NOT NULL DEFAULT 0 COMMENT '更新者',
`deleted_by` bigint unsigned NOT NULL DEFAULT 0 COMMENT '删除者',
`created_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间',
`updated_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT '更新时间',
`deleted_at` datetime(3) DEFAULT NULL COMMENT '删除时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_customer_service_code` (`tenant_id`,`service_code`),
KEY `idx_customer_service_status` (`tenant_id`,`status`,`sort`),
KEY `idx_customer_service_deleted` (`deleted_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='交易_客服配置';
-- 本地默认渠道仅包含展示与费率边界,不保存任何生产密钥。
INSERT INTO `hg_payment_channel` (`tenant_id`,`channel_code`,`name`,`channel_type`,`direction`,`min_amount`,`max_amount`,`fee_type`,`fee_fixed_amount`,`fee_rate`,`status`,`sort`,`created_at`,`updated_at`)
SELECT 0,x.channel_code,x.name,x.channel_type,3,0,0,1,0,0,1,x.sort,NOW(3),NOW(3) FROM (
SELECT 'wechat' channel_code,'微信' name,1 channel_type,10 sort UNION ALL
SELECT 'alipay','支付宝',2,20 UNION ALL
SELECT 'bank','银行卡',3,30 UNION ALL
SELECT 'manual','人工审核',4,40
) x WHERE NOT EXISTS (SELECT 1 FROM `hg_payment_channel` c WHERE c.`tenant_id`=0 AND c.`channel_code`=x.channel_code);
-- 审核原因使用 HotGo 原有数据库字典。
INSERT INTO `hg_sys_dict_type` (`name`,`type`,`remark`,`status`,`created_at`,`updated_at`)
SELECT x.name,x.type,x.remark,1,NOW(),NOW() FROM (
SELECT '充值驳回原因' name,'recharge_reject_reason' type,'充值审核标准原因' remark UNION ALL
SELECT '提现驳回原因','withdrawal_reject_reason','提现审核标准原因' UNION ALL
SELECT '交易异常原因','trade_exception_reason','交易人工处理标准原因'
) x WHERE NOT EXISTS (SELECT 1 FROM `hg_sys_dict_type` d WHERE d.`type`=x.type);
INSERT INTO `hg_sys_dict_data` (`type`,`label`,`value`,`value_type`,`list_class`,`sort`,`status`,`remark`,`created_at`,`updated_at`)
SELECT x.type,x.label,x.value,'string',x.list_class,x.sort,1,x.remark,NOW(),NOW() FROM (
SELECT 'recharge_reject_reason' type,'凭证不清晰' label,'voucher_unclear' value,'warning' list_class,10 sort,'充值审核原因' remark UNION ALL
SELECT 'recharge_reject_reason','金额不一致','amount_mismatch','error',20,'充值审核原因' UNION ALL
SELECT 'recharge_reject_reason','重复订单','duplicate_order','error',30,'充值审核原因' UNION ALL
SELECT 'withdrawal_reject_reason','账户信息异常','account_invalid','error',10,'提现审核原因' UNION ALL
SELECT 'withdrawal_reject_reason','风控拦截','risk_rejected','error',20,'提现审核原因' UNION ALL
SELECT 'withdrawal_reject_reason','余额状态异常','balance_invalid','warning',30,'提现审核原因' UNION ALL
SELECT 'trade_exception_reason','匹配超时','match_timeout','warning',10,'交易异常原因' UNION ALL
SELECT 'trade_exception_reason','风控解冻','risk_unfreeze','primary',20,'交易异常原因' UNION ALL
SELECT 'trade_exception_reason','人工重匹配','manual_rematch','primary',30,'交易异常原因'
) x WHERE NOT EXISTS (SELECT 1 FROM `hg_sys_dict_data` d WHERE d.`type`=x.type AND d.`value`=x.value);
-- 交易管理菜单与接口权限。
SET @now=NOW();
INSERT INTO `hg_admin_menu` (`pid`,`level`,`tree`,`title`,`name`,`path`,`icon`,`type`,`redirect`,`permissions`,`permission_name`,`component`,`always_show`,`active_menu`,`is_root`,`is_frame`,`frame_src`,`keep_alive`,`hidden`,`affix`,`sort`,`remark`,`status`,`created_at`,`updated_at`)
SELECT 0,1,'','交易管理','trade_management','/trade','TransactionOutlined',1,'','','','LAYOUT',1,'',1,0,'',0,0,0,50,'订单、充值、提现与客服治理',1,@now,@now
WHERE NOT EXISTS (SELECT 1 FROM `hg_admin_menu` WHERE `name`='trade_management');
SET @tradeRoot=(SELECT `id` FROM `hg_admin_menu` WHERE `name`='trade_management' LIMIT 1);
INSERT INTO `hg_admin_menu` (`pid`,`level`,`tree`,`title`,`name`,`path`,`icon`,`type`,`redirect`,`permissions`,`permission_name`,`component`,`always_show`,`active_menu`,`is_root`,`is_frame`,`frame_src`,`keep_alive`,`hidden`,`affix`,`sort`,`remark`,`status`,`created_at`,`updated_at`)
SELECT @tradeRoot,2,CONCAT('tr_',@tradeRoot,' '),x.title,x.name,x.path,x.icon,2,'',x.permissions,'',x.component,1,'',0,0,'',1,0,0,x.sort,x.remark,1,@now,@now FROM (
SELECT '订单列表' title,'trade_order' name,'order' path,'FileTextOutlined' icon,'/tradeOrder/list,/tradeOrder/view' permissions,'/trade/order/index' component,10 sort,'交易订单查询与异常处理' remark UNION ALL
SELECT '充值管理','trade_recharge','recharge','PayCircleOutlined','/rechargeOrder/list,/rechargeOrder/summary,/rechargeOrder/view','/trade/recharge/index',20,'充值凭证与入账审核' UNION ALL
SELECT '提现管理','trade_withdrawal','withdrawal','BankOutlined','/withdrawalOrder/list,/withdrawalOrder/view','/trade/withdrawal/index',30,'提现脱敏审核与付款结果' UNION ALL
SELECT '客服管理','trade_customer_service','customer-service','CustomerServiceOutlined','/customerService/list,/customerService/view','/trade/customer-service/index',40,'客服入口与降级联系方式'
) x WHERE NOT EXISTS (SELECT 1 FROM `hg_admin_menu` m WHERE m.`name`=x.name);
SET @orderMenu=(SELECT `id` FROM `hg_admin_menu` WHERE `name`='trade_order' LIMIT 1);
SET @rechargeMenu=(SELECT `id` FROM `hg_admin_menu` WHERE `name`='trade_recharge' LIMIT 1);
SET @withdrawalMenu=(SELECT `id` FROM `hg_admin_menu` WHERE `name`='trade_withdrawal' LIMIT 1);
SET @serviceMenu=(SELECT `id` FROM `hg_admin_menu` WHERE `name`='trade_customer_service' LIMIT 1);
INSERT INTO `hg_admin_menu` (`pid`,`level`,`tree`,`title`,`name`,`path`,`icon`,`type`,`redirect`,`permissions`,`permission_name`,`component`,`always_show`,`active_menu`,`is_root`,`is_frame`,`frame_src`,`keep_alive`,`hidden`,`affix`,`sort`,`remark`,`status`,`created_at`,`updated_at`)
SELECT x.pid,3,x.tree,x.title,x.name,'','',3,'',x.permissions,'','',1,'',0,0,'',0,1,0,x.sort,'交易管理操作权限',1,@now,@now FROM (
SELECT @orderMenu pid,CONCAT('tr_',@tradeRoot,' tr_',@orderMenu,' ') tree,'提交订单处理' title,'trade_order_apply' name,'/tradeOrder/apply' permissions,10 sort UNION ALL
SELECT @orderMenu,CONCAT('tr_',@tradeRoot,' tr_',@orderMenu,' '),'执行订单处理','trade_order_execute','/tradeOrder/execute',20 UNION ALL
SELECT @rechargeMenu,CONCAT('tr_',@tradeRoot,' tr_',@rechargeMenu,' '),'提交充值审核','trade_recharge_review','/rechargeOrder/review',10 UNION ALL
SELECT @rechargeMenu,CONCAT('tr_',@tradeRoot,' tr_',@rechargeMenu,' '),'执行充值审核','trade_recharge_execute','/rechargeOrder/execute',20 UNION ALL
SELECT @withdrawalMenu,CONCAT('tr_',@tradeRoot,' tr_',@withdrawalMenu,' '),'提交提现审核','trade_withdrawal_review','/withdrawalOrder/review',10 UNION ALL
SELECT @withdrawalMenu,CONCAT('tr_',@tradeRoot,' tr_',@withdrawalMenu,' '),'执行提现审核','trade_withdrawal_execute','/withdrawalOrder/execute',20 UNION ALL
SELECT @withdrawalMenu,CONCAT('tr_',@tradeRoot,' tr_',@withdrawalMenu,' '),'登记付款结果','trade_withdrawal_complete','/withdrawalOrder/complete',30 UNION ALL
SELECT @serviceMenu,CONCAT('tr_',@tradeRoot,' tr_',@serviceMenu,' '),'新增编辑客服','trade_customer_service_edit','/customerService/edit',10 UNION ALL
SELECT @serviceMenu,CONCAT('tr_',@tradeRoot,' tr_',@serviceMenu,' '),'客服状态','trade_customer_service_status','/customerService/status',20 UNION ALL
SELECT @serviceMenu,CONCAT('tr_',@tradeRoot,' tr_',@serviceMenu,' '),'删除客服','trade_customer_service_delete','/customerService/delete',30
) x WHERE NOT EXISTS (SELECT 1 FROM `hg_admin_menu` m WHERE m.`name`=x.name);
@@ -0,0 +1,147 @@
-- 第九章:商品、任务与会员任务审核。
-- 金额统一使用分;比例统一使用万分比;佣金结算写入不可变钱包台账。
CREATE TABLE IF NOT EXISTS `hg_product_category` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`tenant_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '租户ID',
`pid` bigint unsigned NOT NULL DEFAULT 0 COMMENT '上级ID',
`level` int unsigned NOT NULL DEFAULT 1 COMMENT '树等级',
`tree` varchar(512) NOT NULL DEFAULT '' COMMENT '关系树',
`category_code` varchar(32) NOT NULL COMMENT '分类编码',
`name` varchar(100) NOT NULL COMMENT '分类名称',
`status` tinyint NOT NULL DEFAULT 1 COMMENT '状态',
`sort` int NOT NULL DEFAULT 0 COMMENT '排序',
`created_by` bigint unsigned NOT NULL DEFAULT 0 COMMENT '创建者',
`updated_by` bigint unsigned NOT NULL DEFAULT 0 COMMENT '更新者',
`deleted_by` bigint unsigned NOT NULL DEFAULT 0 COMMENT '删除者',
`created_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间',
`updated_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT '更新时间',
`deleted_at` datetime(3) DEFAULT NULL COMMENT '删除时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_product_category_code` (`tenant_id`,`category_code`),
KEY `idx_product_category_status` (`tenant_id`,`status`,`sort`,`id`),
KEY `idx_product_category_deleted` (`deleted_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='商城_商品分类';
CREATE TABLE IF NOT EXISTS `hg_task` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`tenant_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '租户ID',
`task_no` varchar(32) NOT NULL COMMENT '任务编号',
`hall_id` bigint unsigned NOT NULL COMMENT '任务大厅ID',
`title` varchar(200) NOT NULL COMMENT '标题',
`description` varchar(1000) NOT NULL DEFAULT '' COMMENT '描述',
`detail_html` longtext COMMENT '清洗后的任务详情',
`cover_attachment_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '封面附件ID',
`cover_url` varchar(1000) NOT NULL DEFAULT '' COMMENT '封面地址',
`commission_amount` bigint NOT NULL DEFAULT 0 COMMENT '固定佣金(分)',
`commission_rate` int unsigned NOT NULL DEFAULT 0 COMMENT '佣金万分比',
`daily_limit` int unsigned NOT NULL DEFAULT 0 COMMENT '每日总量',
`per_member_limit` int unsigned NOT NULL DEFAULT 1 COMMENT '单会员限制',
`start_at` datetime(3) DEFAULT NULL COMMENT '开始时间',
`end_at` datetime(3) DEFAULT NULL COMMENT '结束时间',
`publish_status` tinyint NOT NULL DEFAULT 1 COMMENT '发布状态',
`sort` int NOT NULL DEFAULT 0 COMMENT '排序',
`version` int unsigned NOT NULL DEFAULT 0 COMMENT '乐观锁',
`remark` varchar(500) NOT NULL DEFAULT '' COMMENT '备注',
`created_by` bigint unsigned NOT NULL DEFAULT 0 COMMENT '创建者',
`updated_by` bigint unsigned NOT NULL DEFAULT 0 COMMENT '更新者',
`deleted_by` bigint unsigned NOT NULL DEFAULT 0 COMMENT '删除者',
`created_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间',
`updated_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT '更新时间',
`deleted_at` datetime(3) DEFAULT NULL COMMENT '删除时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_task_no` (`tenant_id`,`task_no`),
KEY `idx_task_hall_status` (`tenant_id`,`hall_id`,`publish_status`,`sort`,`id`),
KEY `idx_task_period` (`tenant_id`,`start_at`,`end_at`),
KEY `idx_task_deleted` (`deleted_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='任务_任务定义';
CREATE TABLE IF NOT EXISTS `hg_task_level` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`tenant_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '租户ID',
`task_id` bigint unsigned NOT NULL COMMENT '任务ID',
`level_id` bigint unsigned NOT NULL COMMENT '会员等级ID',
`created_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_task_level` (`tenant_id`,`task_id`,`level_id`),
KEY `idx_task_level_level` (`tenant_id`,`level_id`,`task_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='任务_可用会员等级';
CREATE TABLE IF NOT EXISTS `hg_task_submission` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`tenant_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '租户ID',
`submission_no` varchar(32) NOT NULL COMMENT '提交编号',
`trade_order_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '交易订单ID',
`task_id` bigint unsigned NOT NULL COMMENT '任务ID',
`member_id` bigint unsigned NOT NULL COMMENT '会员ID',
`member_level_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '提交时等级ID',
`evidence_text` varchar(2000) NOT NULL DEFAULT '' COMMENT '证据说明',
`evidence_attachment_ids` json DEFAULT NULL COMMENT '证据附件',
`submission_status` tinyint NOT NULL DEFAULT 1 COMMENT '1待审 2通过 3驳回 4已结算 5已冲正',
`commission_amount` bigint NOT NULL DEFAULT 0 COMMENT '佣金快照(分)',
`success_rate` int unsigned NOT NULL DEFAULT 0 COMMENT '成功率万分比',
`reviewed_by` bigint unsigned NOT NULL DEFAULT 0 COMMENT '审核人',
`reviewed_at` datetime(3) DEFAULT NULL COMMENT '审核时间',
`review_reason_code` varchar(64) NOT NULL DEFAULT '' COMMENT '标准原因',
`review_reason` varchar(500) NOT NULL DEFAULT '' COMMENT '审核意见',
`allow_resubmit` tinyint NOT NULL DEFAULT 2 COMMENT '是否允许重提',
`ledger_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '佣金台账ID',
`settled_at` datetime(3) DEFAULT NULL COMMENT '结算时间',
`reversal_approval_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '冲正审批ID',
`created_by` bigint unsigned NOT NULL DEFAULT 0 COMMENT '创建者',
`updated_by` bigint unsigned NOT NULL DEFAULT 0 COMMENT '更新者',
`created_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间',
`updated_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_task_submission_no` (`submission_no`),
UNIQUE KEY `uk_task_submission_order` (`trade_order_id`),
KEY `idx_task_submission_member` (`tenant_id`,`member_id`,`created_at`,`id`),
KEY `idx_task_submission_status` (`tenant_id`,`submission_status`,`created_at`,`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='任务_会员任务提交';
INSERT INTO `hg_product_category` (`tenant_id`,`category_code`,`name`,`status`,`sort`)
SELECT 0,'DEFAULT','默认分类',1,10
WHERE NOT EXISTS (SELECT 1 FROM `hg_product_category` WHERE `tenant_id`=0 AND `category_code`='DEFAULT');
INSERT INTO `hg_sys_dict_type` (`name`,`type`,`remark`,`status`,`created_at`,`updated_at`)
SELECT '任务审核驳回原因','task_reject_reason','第九章会员任务审核',1,NOW(),NOW()
WHERE NOT EXISTS (SELECT 1 FROM `hg_sys_dict_type` WHERE `type`='task_reject_reason');
INSERT INTO `hg_sys_dict_data` (`type`,`label`,`value`,`value_type`,`list_class`,`sort`,`status`,`remark`,`created_at`,`updated_at`)
SELECT 'task_reject_reason',x.label,x.value,'string','error',x.sort,1,'任务审核驳回原因',NOW(),NOW()
FROM (
SELECT '证据不完整' label,'evidence_incomplete' value,10 sort UNION ALL
SELECT '证据不符合要求','evidence_invalid',20 UNION ALL
SELECT '重复提交','duplicate_submission',30 UNION ALL
SELECT '任务已失效','task_expired',40 UNION ALL
SELECT '其他','other',90
) x WHERE NOT EXISTS (SELECT 1 FROM `hg_sys_dict_data` d WHERE d.`type`='task_reject_reason' AND d.`value`=x.value);
SET @now=NOW();
INSERT INTO `hg_admin_menu` (`pid`,`level`,`tree`,`title`,`name`,`path`,`icon`,`type`,`redirect`,`permissions`,`permission_name`,`component`,`always_show`,`active_menu`,`is_root`,`is_frame`,`frame_src`,`keep_alive`,`hidden`,`affix`,`sort`,`remark`,`status`,`created_at`,`updated_at`)
SELECT 0,1,'', '商品与任务','product_task','/product-task','AppstoreOutlined',1,'/product-task/product','','','LAYOUT',1,'',1,0,'',0,0,0,45,'第九章商品任务管理',1,@now,@now
WHERE NOT EXISTS (SELECT 1 FROM `hg_admin_menu` WHERE `name`='product_task');
UPDATE `hg_admin_menu` SET `component`='LAYOUT', `keep_alive`=0 WHERE `name`='product_task';
SET @root=(SELECT `id` FROM `hg_admin_menu` WHERE `name`='product_task' LIMIT 1);
INSERT INTO `hg_admin_menu` (`pid`,`level`,`tree`,`title`,`name`,`path`,`icon`,`type`,`redirect`,`permissions`,`permission_name`,`component`,`always_show`,`active_menu`,`is_root`,`is_frame`,`frame_src`,`keep_alive`,`hidden`,`affix`,`sort`,`remark`,`status`,`created_at`,`updated_at`)
SELECT @root,2,CONCAT('tr_',@root,' '),x.title,x.name,x.path,x.icon,2,'',x.permissions,'',x.component,1,'',0,0,'',1,0,0,x.sort,x.remark,1,@now,@now FROM (
SELECT '商品列表' title,'product_list' name,'product' path,'ShoppingOutlined' icon,'/product/list,/product/view' permissions,'/product-task/product/index' component,10 sort,'商品维护' remark UNION ALL
SELECT '任务列表','task_list','task','ProfileOutlined','/task/list,/task/view','/product-task/task/index',20,'任务维护' UNION ALL
SELECT '会员任务审核','task_submission_list','submission','AuditOutlined','/taskSubmission/list,/taskSubmission/view','/product-task/submission/index',30,'会员任务提交审核'
) x WHERE NOT EXISTS (SELECT 1 FROM `hg_admin_menu` m WHERE m.`name`=x.name);
SET @productMenu=(SELECT `id` FROM `hg_admin_menu` WHERE `name`='product_list' LIMIT 1);
SET @taskMenu=(SELECT `id` FROM `hg_admin_menu` WHERE `name`='task_list' LIMIT 1);
SET @submissionMenu=(SELECT `id` FROM `hg_admin_menu` WHERE `name`='task_submission_list' LIMIT 1);
INSERT INTO `hg_admin_menu` (`pid`,`level`,`tree`,`title`,`name`,`path`,`icon`,`type`,`redirect`,`permissions`,`permission_name`,`component`,`always_show`,`active_menu`,`is_root`,`is_frame`,`frame_src`,`keep_alive`,`hidden`,`affix`,`sort`,`remark`,`status`,`created_at`,`updated_at`)
SELECT x.pid,3,x.tree,x.title,x.name,'','',3,'',x.permissions,'','',1,'',0,0,'',0,1,0,x.sort,'第九章操作权限',1,@now,@now FROM (
SELECT @productMenu pid,CONCAT('tr_',@root,' tr_',@productMenu,' ') tree,'新增编辑商品' title,'product_edit' name,'/product/edit' permissions,10 sort UNION ALL
SELECT @productMenu,CONCAT('tr_',@root,' tr_',@productMenu,' '),'商品状态','product_status','/product/status',20 UNION ALL
SELECT @productMenu,CONCAT('tr_',@root,' tr_',@productMenu,' '),'商品推荐','product_recommend','/product/recommend',30 UNION ALL
SELECT @productMenu,CONCAT('tr_',@root,' tr_',@productMenu,' '),'删除商品','product_delete','/product/delete',40 UNION ALL
SELECT @taskMenu,CONCAT('tr_',@root,' tr_',@taskMenu,' '),'新增编辑任务','task_edit','/task/edit',10 UNION ALL
SELECT @taskMenu,CONCAT('tr_',@root,' tr_',@taskMenu,' '),'任务状态','task_status','/task/status',20 UNION ALL
SELECT @taskMenu,CONCAT('tr_',@root,' tr_',@taskMenu,' '),'删除任务','task_delete','/task/delete',30 UNION ALL
SELECT @submissionMenu,CONCAT('tr_',@root,' tr_',@submissionMenu,' '),'审核任务','task_submission_review','/taskSubmission/review',10
) x WHERE NOT EXISTS (SELECT 1 FROM `hg_admin_menu` m WHERE m.`name`=x.name);
INSERT IGNORE INTO `hg_admin_role_menu` (`role_id`,`menu_id`)
SELECT r.id,m.id FROM `hg_admin_role` r JOIN `hg_admin_menu` m ON m.name IN ('product_task','product_list','task_list','task_submission_list','product_edit','product_status','product_recommend','product_delete','task_edit','task_status','task_delete','task_submission_review') WHERE r.`key` IN ('manage','business');
@@ -0,0 +1,28 @@
-- 对齐原型中的会员管理菜单:一级菜单位于主页之后,原型入口优先展示。
SET @now=NOW();
SET @memberRoot=(SELECT `id` FROM `hg_admin_menu` WHERE `name`='app_member' LIMIT 1);
UPDATE `hg_admin_menu`
SET `sort`=15, `updated_at`=@now
WHERE `id`=@memberRoot;
UPDATE `hg_admin_menu`
SET
`sort`=CASE `name`
WHEN 'app_member_list' THEN 10
WHEN 'app_member_level' THEN 20
WHEN 'app_task_hall' THEN 30
WHEN 'app_member_wallet' THEN 40
WHEN 'app_member_notice' THEN 50
ELSE `sort`
END,
`hidden`=0,
`updated_at`=@now
WHERE `pid`=@memberRoot
AND `name` IN (
'app_member_list',
'app_member_level',
'app_task_hall',
'app_member_wallet',
'app_member_notice'
);
@@ -0,0 +1,9 @@
-- 对齐原型菜单:审批和审计保留为内部能力,不在后台导航中单独展示。
SET @now = NOW();
UPDATE `hg_admin_menu`
SET `hidden` = 1,
`status` = 2,
`updated_at` = @now
WHERE `name` IN ('governance', 'governance_approval', 'governance_biz_audit')
OR `tree` LIKE CONCAT('%tr_', (SELECT `id` FROM (SELECT `id` FROM `hg_admin_menu` WHERE `name` = 'governance' LIMIT 1) AS governance_menu), ' %');
@@ -0,0 +1,12 @@
-- 原型没有独立治理菜单,移除对应菜单和角色关联;业务内部日志表继续保留。
SET @governanceId = (SELECT `id` FROM `hg_admin_menu` WHERE `name` = 'governance' LIMIT 1);
DELETE role_menu
FROM `hg_admin_role_menu` AS role_menu
INNER JOIN `hg_admin_menu` AS menu ON menu.`id` = role_menu.`menu_id`
WHERE menu.`id` = @governanceId
OR menu.`tree` LIKE CONCAT('%tr_', @governanceId, ' %');
DELETE FROM `hg_admin_menu`
WHERE `id` = @governanceId
OR `tree` LIKE CONCAT('%tr_', @governanceId, ' %');
@@ -0,0 +1,10 @@
-- 清理历史上超出直接父角色范围的菜单授权;父角色为超级管理员时不限制。
DELETE child_menu
FROM `hg_admin_role_menu` AS child_menu
INNER JOIN `hg_admin_role` AS child_role ON child_role.`id` = child_menu.`role_id`
INNER JOIN `hg_admin_role` AS parent_role ON parent_role.`id` = child_role.`pid`
LEFT JOIN `hg_admin_role_menu` AS parent_menu
ON parent_menu.`role_id` = parent_role.`id`
AND parent_menu.`menu_id` = child_menu.`menu_id`
WHERE parent_role.`key` <> 'super'
AND parent_menu.`menu_id` IS NULL;
@@ -0,0 +1,14 @@
-- 对齐会员列表操作栏:补充账变流水查询和真人/假人切换权限。
SET @now=NOW();
SET @memberRoot=(SELECT `id` FROM `hg_admin_menu` WHERE `name`='app_member' LIMIT 1);
SET @memberMenu=(SELECT `id` FROM `hg_admin_menu` WHERE `name`='app_member_list' LIMIT 1);
INSERT INTO `hg_admin_menu` (`pid`,`level`,`tree`,`title`,`name`,`path`,`icon`,`type`,`redirect`,`permissions`,`permission_name`,`component`,`always_show`,`active_menu`,`is_root`,`is_frame`,`frame_src`,`keep_alive`,`hidden`,`affix`,`sort`,`remark`,`status`,`created_at`,`updated_at`)
SELECT @memberMenu,3,CONCAT('tr_',@memberRoot,' tr_',@memberMenu,' '),x.title,x.name,'','',3,'',x.permissions,'','',1,'',0,0,'',0,1,0,x.sort,'会员列表操作权限',1,@now,@now FROM (
SELECT '查看账变流水' title,'app_member_ledger' name,'/appMember/ledgerList' permissions,75 sort UNION ALL
SELECT '切换真人假人','app_member_category','/appMember/category',76
) x WHERE NOT EXISTS (SELECT 1 FROM `hg_admin_menu` m WHERE m.`name`=x.name);
INSERT IGNORE INTO `hg_admin_role_menu` (`role_id`,`menu_id`)
SELECT r.id,m.id FROM `hg_admin_role` r JOIN `hg_admin_menu` m ON m.name IN ('app_member_ledger','app_member_category')
WHERE r.`key` IN ('manage','business');
@@ -0,0 +1,54 @@
-- 调整业务一级菜单及商品、任务菜单归属。
-- 顺序:会员管理 -> 交易管理 -> 商品管理 -> 任务管理。
SET @now=NOW();
SET @memberRoot=(SELECT `id` FROM `hg_admin_menu` WHERE `name`='app_member' LIMIT 1);
SET @tradeRoot=(SELECT `id` FROM `hg_admin_menu` WHERE `name`='trade_management' LIMIT 1);
SET @productRoot=(SELECT `id` FROM `hg_admin_menu` WHERE `name`='product_task' LIMIT 1);
SET @productMenu=(SELECT `id` FROM `hg_admin_menu` WHERE `name`='product_list' LIMIT 1);
SET @taskMenu=(SELECT `id` FROM `hg_admin_menu` WHERE `name`='task_list' LIMIT 1);
SET @submissionMenu=(SELECT `id` FROM `hg_admin_menu` WHERE `name`='task_submission_list' LIMIT 1);
UPDATE `hg_admin_menu` SET `sort`=15,`updated_at`=@now WHERE `id`=@memberRoot;
UPDATE `hg_admin_menu` SET `sort`=16,`updated_at`=@now WHERE `id`=@tradeRoot;
UPDATE `hg_admin_menu`
SET `title`='商品管理',`sort`=17,`redirect`='/product-task/product',`remark`='商品维护',`updated_at`=@now
WHERE `id`=@productRoot;
INSERT INTO `hg_admin_menu`
(`pid`,`level`,`tree`,`title`,`name`,`path`,`icon`,`type`,`redirect`,`permissions`,`permission_name`,`component`,`always_show`,`active_menu`,`is_root`,`is_frame`,`frame_src`,`keep_alive`,`hidden`,`affix`,`sort`,`remark`,`status`,`created_at`,`updated_at`)
SELECT 0,1,'','任务管理','task_management','/task-management','ProfileOutlined',1,'/task-management/task','','','LAYOUT',1,'',1,0,'',0,0,0,18,'任务配置与会员任务审核',1,@now,@now
WHERE NOT EXISTS (SELECT 1 FROM `hg_admin_menu` WHERE `name`='task_management');
SET @taskRoot=(SELECT `id` FROM `hg_admin_menu` WHERE `name`='task_management' LIMIT 1);
UPDATE `hg_admin_menu`
SET `title`='任务管理',`path`='/task-management',`component`='LAYOUT',`redirect`='/task-management/task',
`sort`=18,`hidden`=0,`status`=1,`updated_at`=@now
WHERE `id`=@taskRoot;
UPDATE `hg_admin_menu`
SET `pid`=@productRoot,`level`=2,`tree`=CONCAT('tr_',@productRoot,' '),`sort`=10,`hidden`=0,`updated_at`=@now
WHERE `id`=@productMenu;
UPDATE `hg_admin_menu`
SET `pid`=@taskRoot,`level`=2,`tree`=CONCAT('tr_',@taskRoot,' '),`sort`=10,`hidden`=0,`updated_at`=@now
WHERE `id`=@taskMenu;
UPDATE `hg_admin_menu`
SET `pid`=@taskRoot,`level`=2,`tree`=CONCAT('tr_',@taskRoot,' '),`sort`=20,`hidden`=0,`updated_at`=@now
WHERE `id`=@submissionMenu;
UPDATE `hg_admin_menu`
SET `level`=3,`tree`=CONCAT('tr_',@taskRoot,' tr_',@taskMenu,' '),`updated_at`=@now
WHERE `pid`=@taskMenu;
UPDATE `hg_admin_menu`
SET `level`=3,`tree`=CONCAT('tr_',@taskRoot,' tr_',@submissionMenu,' '),`updated_at`=@now
WHERE `pid`=@submissionMenu;
-- 原来拥有商品任务菜单的角色继续拥有新的任务管理一级菜单。
INSERT IGNORE INTO `hg_admin_role_menu` (`role_id`,`menu_id`)
SELECT DISTINCT rm.`role_id`,@taskRoot
FROM `hg_admin_role_menu` rm
WHERE rm.`menu_id` IN (@productRoot,@taskMenu,@submissionMenu);
@@ -0,0 +1,17 @@
-- 订单人工匹配权限,复用现有交易管理菜单。
SET @now=NOW();
SET @tradeRoot=(SELECT `id` FROM `hg_admin_menu` WHERE `name`='trade_management' LIMIT 1);
SET @orderMenu=(SELECT `id` FROM `hg_admin_menu` WHERE `name`='trade_order' LIMIT 1);
INSERT INTO `hg_admin_menu`
(`pid`,`level`,`tree`,`title`,`name`,`path`,`icon`,`type`,`redirect`,`permissions`,`permission_name`,`component`,`always_show`,`active_menu`,`is_root`,`is_frame`,`frame_src`,`keep_alive`,`hidden`,`affix`,`sort`,`remark`,`status`,`created_at`,`updated_at`)
SELECT @orderMenu,3,CONCAT('tr_',@tradeRoot,' tr_',@orderMenu,' '),'匹配订单','trade_order_match','','',3,'','/tradeOrder/match,/tradeOrder/matchProducts','','',1,'',0,0,'',0,1,0,5,'订单人工选品匹配权限',1,@now,@now
WHERE @orderMenu IS NOT NULL AND NOT EXISTS (SELECT 1 FROM `hg_admin_menu` WHERE `name`='trade_order_match');
SET @matchMenu=(SELECT `id` FROM `hg_admin_menu` WHERE `name`='trade_order_match' LIMIT 1);
-- 原来拥有订单列表的角色自动继承匹配订单权限。
INSERT IGNORE INTO `hg_admin_role_menu` (`role_id`,`menu_id`)
SELECT DISTINCT rm.`role_id`,@matchMenu
FROM `hg_admin_role_menu` rm
WHERE rm.`menu_id`=@orderMenu AND @matchMenu IS NOT NULL;
@@ -0,0 +1,9 @@
-- HotGo 默认将个人中心设为隐藏路由,只能从右上角头像进入。
-- 本项目需要在「系统应用」下直接展示该菜单,因此取消隐藏;个人设置仍作为其子菜单。
UPDATE `hg_admin_menu`
SET `hidden` = 0,
`always_show` = 1,
`updated_at` = NOW()
WHERE `name` = 'home'
AND `title` = '个人中心'
AND `pid` > 0;
@@ -0,0 +1,22 @@
-- 会员管理按原型仅保留会员列表、会员等级和任务大厅。
-- 资金调账、会员通知的业务代码、数据表及按钮权限继续保留,供会员列表操作栏使用。
UPDATE `hg_admin_menu`
SET `hidden` = 1,
`status` = 2,
`updated_at` = NOW()
WHERE `name` IN (
'app_member_wallet',
'app_member_notice'
);
-- 按钮权限本身不生成菜单入口,保持启用,避免会员列表中的账变等操作被一并移除。
UPDATE `hg_admin_menu`
SET `hidden` = 1,
`status` = 1,
`updated_at` = NOW()
WHERE `name` IN (
'app_member_wallet_request',
'app_member_wallet_execute',
'app_member_notice_edit',
'app_member_notice_revoke'
);
@@ -0,0 +1,19 @@
-- 保留一条可用于验收“匹配订单”操作的演示订单。
-- 仅调整固定演示单号,不影响真实业务订单。
UPDATE `hg_trade_order`
SET
`product_id` = 0,
`product_name` = '',
`order_type` = 3,
`quantity` = 1,
`unit_price_amount` = 0,
`total_amount` = 0,
`commission_amount` = 0,
`message` = '等待后台匹配商品',
`order_status` = 1,
`freeze_status` = 1,
`approval_request_id` = 0,
`matched_at` = NULL,
`completed_at` = NULL,
`unfrozen_at` = NULL
WHERE `order_no` = 'DEMO-ORD-01';
@@ -0,0 +1,37 @@
-- 为 HotGo 原生后台的常用二级菜单补充图标。
-- 图标名称来自前端 @vicons/antd,由动态路由统一渲染。
UPDATE `hg_admin_menu`
SET `icon` = CASE `name`
WHEN 'user' THEN 'UserOutlined'
WHEN 'org_dept' THEN 'ApartmentOutlined'
WHEN 'org_post' THEN 'IdcardOutlined'
WHEN 'permission_menu' THEN 'MenuOutlined'
WHEN 'permission_role' THEN 'SafetyCertificateOutlined'
WHEN 'Logs' THEN 'FileTextOutlined'
WHEN 'asset' THEN 'AccountBookOutlined'
WHEN 'apply_provinces' THEN 'EnvironmentOutlined'
WHEN 'apply_attachment' THEN 'PaperClipOutlined'
WHEN 'apply_notice' THEN 'NotificationOutlined'
WHEN 'system_config' THEN 'SettingOutlined'
WHEN 'system_dict' THEN 'BookOutlined'
WHEN 'system_cron' THEN 'ScheduleOutlined'
WHEN 'system_blacklist' THEN 'StopOutlined'
ELSE `icon`
END,
`updated_at` = NOW()
WHERE `name` IN (
'user',
'org_dept',
'org_post',
'permission_menu',
'permission_role',
'Logs',
'asset',
'apply_provinces',
'apply_attachment',
'apply_notice',
'system_config',
'system_dict',
'system_cron',
'system_blacklist'
);
@@ -0,0 +1,34 @@
-- 商品编辑页依赖统一附件上传接口。
-- 已拥有商品编辑权限的角色,必须同时获得 /upload/file,否则新增和更换商品图片会被鉴权拦截。
INSERT IGNORE INTO `hg_admin_role_menu` (`role_id`, `menu_id`)
SELECT DISTINCT product_role.`role_id`, upload_menu.`id`
FROM `hg_admin_role_menu` AS product_role
INNER JOIN `hg_admin_menu` AS product_menu
ON product_menu.`id` = product_role.`menu_id`
INNER JOIN `hg_admin_menu` AS upload_menu
ON upload_menu.`permissions` = '/upload/file'
WHERE product_menu.`permissions` = '/product/edit'
AND product_menu.`status` = 1
AND upload_menu.`status` = 1;
-- HotGo 的 Casbin 策略持久化在独立表中,同步补齐已有角色的运行时策略。
INSERT INTO `hg_admin_role_casbin` (`p_type`, `v0`, `v1`, `v2`, `v3`, `v4`, `v5`)
SELECT 'p', role_row.`key`, '/upload/file', 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD', '', '', ''
FROM `hg_admin_role` AS role_row
WHERE role_row.`status` = 1
AND EXISTS (
SELECT 1
FROM `hg_admin_role_menu` AS role_menu
INNER JOIN `hg_admin_menu` AS menu_row ON menu_row.`id` = role_menu.`menu_id`
WHERE role_menu.`role_id` = role_row.`id`
AND menu_row.`permissions` = '/product/edit'
AND menu_row.`status` = 1
)
AND NOT EXISTS (
SELECT 1
FROM `hg_admin_role_casbin` AS policy
WHERE policy.`p_type` = 'p'
AND policy.`v0` = role_row.`key`
AND policy.`v1` = '/upload/file'
AND policy.`v2` = 'GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD'
);
@@ -0,0 +1,518 @@
-- Olons Admin 业务演示数据
-- 适用:MySQL 8.0+,本地开发环境。
-- 特征:所有业务编号使用 DEMO 前缀;脚本可重复执行,不覆盖用户已有数据。
SET NAMES utf8mb4;
SET @tenant_id = 0;
SET @admin_id = COALESCE((SELECT id FROM hg_admin_member ORDER BY id LIMIT 1), 1);
SET @reviewer_id = COALESCE((SELECT id FROM hg_admin_member WHERE id <> @admin_id ORDER BY id LIMIT 1), @admin_id);
SET @now = NOW(3);
-- --------------------------------------------------------------------------
-- 1. 基础治理:审批、审批动作、敏感查看、审计、幂等、Outbox、看板汇总
-- --------------------------------------------------------------------------
INSERT INTO hg_approval_request
(`tenant_id`,`approval_no`,`approval_type`,`target_type`,`target_id`,`action`,`title`,`payload_json`,`diff_json`,`risk_level`,`required_approvals`,`approval_status`,`applicant_id`,`submitted_at`,`decided_at`,`executed_at`,`expire_at`,`version`,`remark`,`created_by`,`updated_by`,`created_at`,`updated_at`)
SELECT @tenant_id, CONCAT('DEMO-AP-', LPAD(x.status,2,'0')), 'demo_flow', 'demo_target', x.status,
'demo_action', CONCAT('演示审批状态-',x.status), JSON_OBJECT('demo',TRUE,'status',x.status),
JSON_OBJECT('status',JSON_OBJECT('before',1,'after',x.status)), x.risk_level, 2, x.status,
@admin_id,
IF(x.status=1,NULL,DATE_SUB(@now,INTERVAL x.status HOUR)),
IF(x.status IN (4,5,6,7,8),DATE_SUB(@now,INTERVAL 20 MINUTE),NULL),
IF(x.status IN (7,8),DATE_SUB(@now,INTERVAL 10 MINUTE),NULL),
DATE_ADD(@now,INTERVAL 7 DAY), x.status-1, CONCAT('本地演示:审批状态 ',x.status),
@admin_id,@admin_id,DATE_SUB(@now,INTERVAL x.status DAY),@now
FROM (
SELECT 1 status,1 risk_level UNION ALL SELECT 2,2 UNION ALL SELECT 3,3 UNION ALL SELECT 4,4
UNION ALL SELECT 5,1 UNION ALL SELECT 6,2 UNION ALL SELECT 7,3 UNION ALL SELECT 8,4
) x
WHERE NOT EXISTS (SELECT 1 FROM hg_approval_request a WHERE a.approval_no=CONCAT('DEMO-AP-',LPAD(x.status,2,'0')));
INSERT INTO hg_approval_action
(`tenant_id`,`approval_request_id`,`step_no`,`actor_id`,`action`,`reason_code`,`comment`,`snapshot_json`,`actor_ip_cipher`,`mfa_verified`,`created_at`)
SELECT @tenant_id,a.id,x.action,@reviewer_id,x.action,CONCAT('demo_action_',x.action),
CONCAT('本地演示审批动作 ',x.action),JSON_OBJECT('approvalNo',a.approval_no,'action',x.action),
'DEMO_IP_CIPHER',MOD(x.action,2),DATE_SUB(@now,INTERVAL (7-x.action) HOUR)
FROM (
SELECT 1 action UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6
) x
JOIN hg_approval_request a ON a.approval_no=CONCAT('DEMO-AP-',LPAD(x.action+1,2,'0'))
WHERE NOT EXISTS (
SELECT 1 FROM hg_approval_action aa
WHERE aa.approval_request_id=a.id AND aa.step_no=x.action AND aa.actor_id=@reviewer_id
);
INSERT INTO hg_sensitive_access_log
(`tenant_id`,`access_no`,`actor_id`,`target_type`,`target_id`,`field_set`,`purpose_code`,`purpose_text`,`authorization_no`,`mfa_verified`,`result`,`trace_id`,`created_at`)
SELECT @tenant_id,CONCAT('DEMO-SA-',x.result),@admin_id,'app_member',x.result,
JSON_ARRAY('mobile','realName','idNo'),CONCAT('demo_purpose_',x.result),
IF(x.result=1,'客服核验会员身份','无授权查看被拒绝'),CONCAT('DEMO-AUTH-',x.result),x.result-1,x.result,
CONCAT('demo-trace-sensitive-',x.result),DATE_SUB(@now,INTERVAL x.result HOUR)
FROM (SELECT 1 result UNION ALL SELECT 2) x
WHERE NOT EXISTS (SELECT 1 FROM hg_sensitive_access_log l WHERE l.access_no=CONCAT('DEMO-SA-',x.result));
INSERT INTO hg_biz_audit_log
(`tenant_id`,`audit_no`,`actor_type`,`actor_id`,`module`,`action`,`target_type`,`target_id`,`before_digest`,`after_digest`,`change_json`,`reason`,`approval_no`,`trace_id`,`prev_hash`,`row_hash`,`created_at`)
SELECT @tenant_id,CONCAT('DEMO-AU-',x.seq),1,@admin_id,x.module,x.action_name,x.target_type,x.seq,
SHA2(CONCAT('before-',x.seq),256),SHA2(CONCAT('after-',x.seq),256),
JSON_OBJECT('demo',TRUE,'sequence',x.seq),'本地演示审计数据',CONCAT('DEMO-AP-',LPAD(x.seq+1,2,'0')),
CONCAT('demo-trace-audit-',x.seq),IF(x.seq=1,'',SHA2(CONCAT('audit-',x.seq-1),256)),
SHA2(CONCAT('audit-',x.seq),256),DATE_SUB(@now,INTERVAL x.seq HOUR)
FROM (
SELECT 1 seq,'member' module,'member.edit' action_name,'app_member' target_type
UNION ALL SELECT 2,'wallet','wallet.adjust','wallet_account'
UNION ALL SELECT 3,'content','content.publish','content'
) x
WHERE NOT EXISTS (SELECT 1 FROM hg_biz_audit_log l WHERE l.audit_no=CONCAT('DEMO-AU-',x.seq));
INSERT INTO hg_idempotency_record
(`tenant_id`,`scope`,`idempotency_key`,`request_digest`,`resource_type`,`resource_id`,`process_status`,`response_code`,`response_digest`,`expire_at`,`created_at`,`updated_at`)
SELECT @tenant_id,CONCAT('demo_scope_',x.status),CONCAT('DEMO-IDEMPOTENCY-',x.status),
SHA2(CONCAT('request-',x.status),256),'demo_resource',x.status,x.status,
IF(x.status=1,NULL,IF(x.status=2,0,500)),IF(x.status=1,NULL,SHA2(CONCAT('response-',x.status),256)),
DATE_ADD(@now,INTERVAL 1 DAY),DATE_SUB(@now,INTERVAL x.status HOUR),@now
FROM (SELECT 1 status UNION ALL SELECT 2 UNION ALL SELECT 3) x
WHERE NOT EXISTS (
SELECT 1 FROM hg_idempotency_record i
WHERE i.tenant_id=@tenant_id AND i.scope=CONCAT('demo_scope_',x.status) AND i.idempotency_key=CONCAT('DEMO-IDEMPOTENCY-',x.status)
);
INSERT INTO hg_outbox_event
(`tenant_id`,`event_no`,`aggregate_type`,`aggregate_id`,`event_type`,`payload_json`,`publish_status`,`retry_count`,`next_retry_at`,`last_error`,`created_at`,`published_at`)
SELECT @tenant_id,CONCAT('DEMO-EV-',x.status),'demo_aggregate',x.status,CONCAT('demo.event.',x.status),
JSON_OBJECT('demo',TRUE,'status',x.status),x.status,IF(x.status=3,3,0),
IF(x.status=3,DATE_ADD(@now,INTERVAL 10 MINUTE),NULL),IF(x.status=3,'演示:等待重试',NULL),
DATE_SUB(@now,INTERVAL x.status HOUR),IF(x.status=2,DATE_SUB(@now,INTERVAL 1 HOUR),NULL)
FROM (SELECT 1 status UNION ALL SELECT 2 UNION ALL SELECT 3) x
WHERE NOT EXISTS (SELECT 1 FROM hg_outbox_event e WHERE e.event_no=CONCAT('DEMO-EV-',x.status));
INSERT INTO hg_dashboard_daily_stat
(`tenant_id`,`stat_date`,`dimension_type`,`dimension_value`,`metric_code`,`metric_count`,`metric_amount`,`calculated_at`,`created_at`,`updated_at`)
SELECT @tenant_id,CURDATE(),x.dimension_type,x.dimension_value,x.metric_code,x.metric_count,x.metric_amount,@now,@now,@now
FROM (
SELECT 'all' dimension_type,'all' dimension_value,'member_new' metric_code,28 metric_count,0 metric_amount
UNION ALL SELECT 'all','all','trade_order',156,1286500
UNION ALL SELECT 'channel','wechat','recharge_success',43,586000
UNION ALL SELECT 'channel','bank','withdrawal_success',18,236000
UNION ALL SELECT 'task','all','task_settled',67,33500
) x
WHERE NOT EXISTS (
SELECT 1 FROM hg_dashboard_daily_stat s
WHERE s.tenant_id=@tenant_id AND s.stat_date=CURDATE() AND s.dimension_type=x.dimension_type
AND s.dimension_value=x.dimension_value AND s.metric_code=x.metric_code
);
-- --------------------------------------------------------------------------
-- 2. 门户:站点配置、文本及版本、Banner、商品与分类
-- --------------------------------------------------------------------------
INSERT INTO hg_site_config_version
(`tenant_id`,`config_no`,`config_group`,`schema_version`,`config_json`,`config_digest`,`publish_status`,`effective_at`,`published_at`,`approval_request_id`,`base_version_id`,`version`,`remark`,`created_by`,`updated_by`,`created_at`,`updated_at`)
SELECT @tenant_id,CONCAT('DEMO-CFG-',LPAD(x.status,2,'0')),'demo_site','1.0',
JSON_OBJECT('siteName',CONCAT('演示站点-',x.status),'customerService','400-800-0000','status',x.status),
SHA2(CONCAT('demo-config-',x.status),256),x.status,DATE_ADD(@now,INTERVAL x.status DAY),
IF(x.status=3,DATE_SUB(@now,INTERVAL 1 DAY),NULL),
COALESCE((SELECT id FROM hg_approval_request WHERE approval_no=CONCAT('DEMO-AP-',LPAD(LEAST(x.status+1,8),2,'0'))),0),
0,x.status-1,CONCAT('本地演示配置状态 ',x.status),@admin_id,@admin_id,
DATE_SUB(@now,INTERVAL x.status DAY),@now
FROM (SELECT 1 status UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5) x
WHERE NOT EXISTS (SELECT 1 FROM hg_site_config_version v WHERE v.config_no=CONCAT('DEMO-CFG-',LPAD(x.status,2,'0')));
-- 门户文本不使用演示占位数据,正式初始化见 20261008_portal_content_initial.sql。
INSERT INTO hg_banner
(`tenant_id`,`name`,`position`,`image_attachment_id`,`image_url`,`alt_text`,`target_type`,`target_value`,`start_at`,`end_at`,`publish_status`,`sort`,`version`,`remark`,`created_by`,`updated_by`,`created_at`,`updated_at`)
SELECT @tenant_id,CONCAT('DEMO Banner-',x.status),IF(MOD(x.status,2)=1,'home_top','home_popup'),0,
CONCAT('https://picsum.photos/seed/banner-',x.status,'/1200/360'),CONCAT('演示 Banner 状态 ',x.status),
1+MOD(x.status-1,3),IF(MOD(x.status,3)=0,'https://example.com',CONCAT('/demo/banner/',x.status)),
DATE_SUB(@now,INTERVAL 2 DAY),DATE_ADD(@now,INTERVAL 30 DAY),x.status,x.status*10,x.status-1,
'本地演示数据',@admin_id,@admin_id,DATE_SUB(@now,INTERVAL x.status DAY),@now
FROM (SELECT 1 status UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5) x
WHERE NOT EXISTS (SELECT 1 FROM hg_banner b WHERE b.name=CONCAT('DEMO Banner-',x.status));
INSERT INTO hg_product_category
(`tenant_id`,`pid`,`level`,`tree`,`category_code`,`name`,`status`,`sort`,`created_by`,`updated_by`,`created_at`,`updated_at`)
SELECT @tenant_id,0,1,'',x.code,x.name,x.status,x.sort,@admin_id,@admin_id,@now,@now
FROM (
SELECT 'DEMO_DAILY' code,'演示日用百货' name,1 status,20 sort
UNION ALL SELECT 'DEMO_DIGITAL','演示数码家电',1,30
UNION ALL SELECT 'DEMO_DISABLED','演示停用分类',2,99
) x
WHERE NOT EXISTS (SELECT 1 FROM hg_product_category c WHERE c.tenant_id=@tenant_id AND c.category_code=x.code);
SET @demo_category_id = (SELECT id FROM hg_product_category WHERE tenant_id=@tenant_id AND category_code='DEMO_DAILY' LIMIT 1);
INSERT INTO hg_product
(`tenant_id`,`product_no`,`category_id`,`product_type`,`payment_type`,`name`,`shop_name`,`price_amount`,`currency`,`cover_attachment_id`,`cover_url`,`detail_html`,`is_recommended`,`publish_status`,`start_at`,`end_at`,`sort`,`version`,`remark`,`created_by`,`updated_by`,`created_at`,`updated_at`)
SELECT @tenant_id,CONCAT('DEMO-P-',LPAD(x.status,2,'0')),@demo_category_id,IF(MOD(x.status,2)=0,1,2),'balance',
CONCAT(x.label,'演示商品'),'Olons 演示店',9900+x.status*1000,'CNY',0,
CONCAT('https://picsum.photos/seed/product-',x.status,'/640/480'),
CONCAT('<h3>',x.label,'演示商品</h3><p>用于后台状态展示。</p>'),IF(MOD(x.status,2)=1,1,2),x.status,
DATE_SUB(@now,INTERVAL 3 DAY),DATE_ADD(@now,INTERVAL 30 DAY),x.status*10,x.status-1,'本地演示数据',
@admin_id,@admin_id,DATE_SUB(@now,INTERVAL x.status DAY),@now
FROM (
SELECT 1 status,'草稿' label UNION ALL SELECT 2,'待审' UNION ALL SELECT 3,'已发布'
UNION ALL SELECT 4,'已下线' UNION ALL SELECT 5,'已归档'
) x
WHERE NOT EXISTS (SELECT 1 FROM hg_product p WHERE p.tenant_id=@tenant_id AND p.product_no=CONCAT('DEMO-P-',LPAD(x.status,2,'0')));
-- --------------------------------------------------------------------------
-- 3. 会员、等级、隐私资料、钱包、通知和任务大厅
-- --------------------------------------------------------------------------
INSERT INTO hg_app_member_level
(`tenant_id`,`level_code`,`name`,`icon_attachment_id`,`icon_url`,`current_version_id`,`member_count`,`status`,`sort`,`remark`,`created_by`,`updated_by`,`created_at`,`updated_at`)
SELECT @tenant_id,x.code,x.name,0,CONCAT('https://picsum.photos/seed/level-',x.sort,'/128/128'),0,x.member_count,x.status,x.sort,
'本地演示等级',@admin_id,@admin_id,@now,@now
FROM (
SELECT 'DEMO_VIP2' code,'白银VIP' name,26 member_count,1 status,20 sort
UNION ALL SELECT 'DEMO_VIP3','黄金VIP',12,1,30
UNION ALL SELECT 'DEMO_VIP_DISABLED','停用等级',0,2,99
) x
WHERE NOT EXISTS (SELECT 1 FROM hg_app_member_level l WHERE l.tenant_id=@tenant_id AND l.level_code=x.code);
SET @level_normal_id = COALESCE((SELECT id FROM hg_app_member_level WHERE tenant_id=@tenant_id AND level_code='VIP1' LIMIT 1),(SELECT id FROM hg_app_member_level WHERE tenant_id=@tenant_id ORDER BY id LIMIT 1));
SET @level_silver_id = (SELECT id FROM hg_app_member_level WHERE tenant_id=@tenant_id AND level_code='DEMO_VIP2' LIMIT 1);
SET @level_gold_id = (SELECT id FROM hg_app_member_level WHERE tenant_id=@tenant_id AND level_code='DEMO_VIP3' LIMIT 1);
INSERT INTO hg_app_member_level_version
(`tenant_id`,`level_id`,`version_no`,`upgrade_amount`,`gift_amount`,`daily_order_limit`,`commission_rate`,`daily_withdraw_limit`,`rule_json`,`publish_status`,`effective_at`,`published_at`,`approval_request_id`,`base_version_id`,`version`,`remark`,`created_by`,`updated_by`,`created_at`,`updated_at`)
SELECT @tenant_id,@level_silver_id,100+x.status,x.status*100000,x.status*1000,5+x.status,100+x.status*25,1+x.status,
JSON_OBJECT('demo',TRUE,'status',x.status,'dailyOrderLimit',5+x.status),x.status,
DATE_ADD(@now,INTERVAL x.status DAY),IF(x.status=3,DATE_SUB(@now,INTERVAL 1 DAY),NULL),
COALESCE((SELECT id FROM hg_approval_request WHERE approval_no=CONCAT('DEMO-AP-',LPAD(LEAST(x.status+1,8),2,'0'))),0),
0,x.status-1,CONCAT('演示等级版本状态 ',x.status),@admin_id,@admin_id,
DATE_SUB(@now,INTERVAL x.status DAY),@now
FROM (SELECT 1 status UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5) x
WHERE NOT EXISTS (
SELECT 1 FROM hg_app_member_level_version v WHERE v.level_id=@level_silver_id AND v.version_no=100+x.status
);
UPDATE hg_app_member_level l
JOIN hg_app_member_level_version v ON v.level_id=l.id AND v.publish_status=3 AND v.version_no=103
SET l.current_version_id=v.id
WHERE l.id=@level_silver_id AND l.current_version_id=0;
SET @demo_password_hash = COALESCE((SELECT password_hash FROM hg_app_member ORDER BY id LIMIT 1),'$2a$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2uheWG/igi.');
INSERT INTO hg_app_member
(`tenant_id`,`member_no`,`username`,`mobile_cipher`,`mobile_hash`,`mobile_mask`,`password_hash`,`trade_password_hash`,`level_id`,`parent_id`,`level`,`tree`,`invite_code`,`member_status`,`risk_status`,`auto_dispatch`,`credit_score`,`is_test_account`,`last_login_at`,`last_login_ip_cipher`,`last_login_ip_mask`,`last_login_region`,`created_by`,`updated_by`,`deleted_by`,`created_at`,`updated_at`,`deleted_at`)
SELECT @tenant_id,CONCAT('DEMO-MB-',LPAD(x.seq,2,'0')),CONCAT('demo_user_',LPAD(x.seq,2,'0')),
CONCAT('DEMO_MOBILE_CIPHER_',x.seq),SHA2(CONCAT('1380000100',x.seq),256),CONCAT('138****10',LPAD(x.seq,2,'0')),
@demo_password_hash,'',x.level_id,0,1,'',CONCAT('DM',LPAD(x.seq,6,'0')),x.member_status,x.risk_status,
IF(MOD(x.seq,2)=1,1,2),100-x.seq*5,1,DATE_SUB(@now,INTERVAL x.seq HOUR),'DEMO_IP_CIPHER','127.0.*.*','中国 上海',
@admin_id,@admin_id,IF(x.member_status=3,@admin_id,0),DATE_SUB(@now,INTERVAL x.seq*3 DAY),@now,
IF(x.member_status=3,DATE_SUB(@now,INTERVAL 1 DAY),NULL)
FROM (
SELECT 1 seq,@level_normal_id level_id,1 member_status,1 risk_status
UNION ALL SELECT 2,@level_silver_id,1,2
UNION ALL SELECT 3,@level_gold_id,2,3
UNION ALL SELECT 4,@level_normal_id,3,1
) x
WHERE NOT EXISTS (SELECT 1 FROM hg_app_member m WHERE m.tenant_id=@tenant_id AND m.member_no=CONCAT('DEMO-MB-',LPAD(x.seq,2,'0')));
SET @member_1 = (SELECT id FROM hg_app_member WHERE tenant_id=@tenant_id AND member_no='DEMO-MB-01' LIMIT 1);
SET @member_2 = (SELECT id FROM hg_app_member WHERE tenant_id=@tenant_id AND member_no='DEMO-MB-02' LIMIT 1);
SET @member_3 = (SELECT id FROM hg_app_member WHERE tenant_id=@tenant_id AND member_no='DEMO-MB-03' LIMIT 1);
SET @member_4 = (SELECT id FROM hg_app_member WHERE tenant_id=@tenant_id AND member_no='DEMO-MB-04' LIMIT 1);
INSERT INTO hg_app_member_profile
(`tenant_id`,`member_id`,`real_name_cipher`,`real_name_mask`,`id_no_cipher`,`id_no_hash`,`id_no_mask`,`avatar_attachment_id`,`kyc_status`,`kyc_verified_at`,`created_by`,`updated_by`,`created_at`,`updated_at`)
SELECT @tenant_id,x.member_id,CONCAT('DEMO_NAME_CIPHER_',x.seq),CONCAT('演示',x.seq,'*'),
CONCAT('DEMO_ID_CIPHER_',x.seq),SHA2(CONCAT('3101011990010100',x.seq),256),CONCAT('310101********00',x.seq),0,
x.kyc_status,IF(x.kyc_status=2,DATE_SUB(@now,INTERVAL x.seq DAY),NULL),@admin_id,@admin_id,@now,@now
FROM (
SELECT 1 seq,@member_1 member_id,1 kyc_status UNION ALL SELECT 2,@member_2,2 UNION ALL SELECT 3,@member_3,3 UNION ALL SELECT 4,@member_4,2
) x
WHERE NOT EXISTS (SELECT 1 FROM hg_app_member_profile p WHERE p.member_id=x.member_id);
INSERT INTO hg_app_member_address
(`tenant_id`,`member_id`,`receiver_cipher`,`receiver_mask`,`mobile_cipher`,`mobile_mask`,`province`,`city`,`district`,`address_cipher`,`address_mask`,`is_default`,`created_by`,`updated_by`,`created_at`,`updated_at`)
SELECT @tenant_id,x.member_id,CONCAT('DEMO_RECEIVER_CIPHER_',x.seq),CONCAT('演示',x.seq,'*'),
CONCAT('DEMO_ADDRESS_MOBILE_',x.seq),CONCAT('138****20',LPAD(x.seq,2,'0')),'上海市','上海市',IF(x.seq=1,'浦东新区','徐汇区'),
CONCAT('DEMO_ADDRESS_CIPHER_',x.seq),CONCAT('演示路 ',x.seq,'** 号'),x.is_default,@admin_id,@admin_id,@now,@now
FROM (SELECT 1 seq,@member_1 member_id,1 is_default UNION ALL SELECT 2,@member_2,2 UNION ALL SELECT 3,@member_3,1) x
WHERE NOT EXISTS (
SELECT 1 FROM hg_app_member_address a WHERE a.member_id=x.member_id AND a.address_mask=CONCAT('演示路 ',x.seq,'** 号')
);
INSERT INTO hg_app_member_payment_account
(`tenant_id`,`member_id`,`account_type`,`bank_code`,`bank_name`,`holder_cipher`,`holder_mask`,`mobile_cipher`,`mobile_mask`,`account_no_cipher`,`account_no_hash`,`account_no_mask`,`qr_attachment_id`,`verify_status`,`is_default`,`created_by`,`updated_by`,`created_at`,`updated_at`)
SELECT @tenant_id,x.member_id,x.account_type,CONCAT('BANK',x.account_type),x.bank_name,
CONCAT('DEMO_HOLDER_CIPHER_',x.account_type),CONCAT('演示',x.account_type,'*'),CONCAT('DEMO_PAY_MOBILE_',x.account_type),
CONCAT('138****30',LPAD(x.account_type,2,'0')),CONCAT('DEMO_ACCOUNT_CIPHER_',x.account_type),
SHA2(CONCAT('demo-account-',x.account_type),256),CONCAT('**** **** **** ',LPAD(1000+x.account_type,4,'0')),0,
IF(x.account_type IN (1,3,5),2,1),IF(x.account_type=1,1,2),@admin_id,@admin_id,@now,@now
FROM (
SELECT 1 account_type,@member_1 member_id,'演示银行' bank_name UNION ALL
SELECT 2,@member_2,'数字钱包' UNION ALL SELECT 3,@member_3,'云闪付' UNION ALL
SELECT 4,@member_1,'支付宝' UNION ALL SELECT 5,@member_2,'微信'
) x
WHERE NOT EXISTS (
SELECT 1 FROM hg_app_member_payment_account a WHERE a.tenant_id=@tenant_id AND a.account_no_hash=SHA2(CONCAT('demo-account-',x.account_type),256)
);
SET @payment_account_id = (SELECT id FROM hg_app_member_payment_account WHERE tenant_id=@tenant_id AND account_no_hash=SHA2('demo-account-1',256) LIMIT 1);
INSERT INTO hg_app_member_status_log
(`tenant_id`,`member_id`,`from_status`,`to_status`,`reason_code`,`reason_text`,`effective_at`,`expire_at`,`approval_request_id`,`operator_id`,`created_at`)
SELECT @tenant_id,x.member_id,x.from_status,x.to_status,CONCAT('demo_status_',x.seq),x.reason_text,
DATE_SUB(@now,INTERVAL x.seq DAY),IF(x.to_status=2,DATE_ADD(@now,INTERVAL 30 DAY),NULL),
(SELECT id FROM hg_approval_request WHERE approval_no=CONCAT('DEMO-AP-',LPAD(x.seq+3,2,'0')) LIMIT 1),@reviewer_id,@now
FROM (
SELECT 1 seq,@member_3 member_id,1 from_status,2 to_status,'风控审核后禁用' reason_text
UNION ALL SELECT 2,@member_2,2,1,'复核后恢复正常'
UNION ALL SELECT 3,@member_4,1,3,'用户申请注销'
) x
WHERE NOT EXISTS (
SELECT 1 FROM hg_app_member_status_log l WHERE l.member_id=x.member_id AND l.reason_code=CONCAT('demo_status_',x.seq)
);
INSERT INTO hg_wallet_account
(`tenant_id`,`member_id`,`currency`,`available_amount`,`frozen_amount`,`total_income`,`total_expense`,`account_status`,`version`,`created_at`,`updated_at`)
SELECT @tenant_id,x.member_id,'CNY',x.available_amount,x.frozen_amount,x.total_income,x.total_expense,x.account_status,x.seq,@now,@now
FROM (
SELECT 1 seq,@member_1 member_id,880000 available_amount,20000 frozen_amount,1200000 total_income,300000 total_expense,1 account_status
UNION ALL SELECT 2,@member_2,356000,44000,700000,300000,1
UNION ALL SELECT 3,@member_3,0,0,120000,120000,2
) x
WHERE NOT EXISTS (SELECT 1 FROM hg_wallet_account a WHERE a.tenant_id=@tenant_id AND a.member_id=x.member_id AND a.currency='CNY');
SET @wallet_1 = (SELECT id FROM hg_wallet_account WHERE tenant_id=@tenant_id AND member_id=@member_1 AND currency='CNY' LIMIT 1);
SET @wallet_2 = (SELECT id FROM hg_wallet_account WHERE tenant_id=@tenant_id AND member_id=@member_2 AND currency='CNY' LIMIT 1);
INSERT INTO hg_wallet_ledger
(`tenant_id`,`ledger_no`,`account_id`,`member_id`,`biz_type`,`biz_no`,`entry_type`,`direction`,`amount`,`before_amount`,`after_amount`,`currency`,`reversal_of`,`idempotency_key`,`remark`,`operator_id`,`occurred_at`,`created_at`)
SELECT @tenant_id,CONCAT('DEMO-LG-',LPAD(x.seq,2,'0')),x.account_id,x.member_id,x.biz_type,CONCAT('DEMO-BIZ-',LPAD(x.seq,2,'0')),
x.entry_type,x.direction,x.amount,x.before_amount,x.after_amount,'CNY',0,CONCAT('DEMO-LEDGER-IDEMP-',x.seq),x.remark,@admin_id,
DATE_SUB(@now,INTERVAL x.seq HOUR),DATE_SUB(@now,INTERVAL x.seq HOUR)
FROM (
SELECT 1 seq,@wallet_1 account_id,@member_1 member_id,'recharge' biz_type,'recharge_credit' entry_type,1 direction,100000 amount,500000 before_amount,600000 after_amount,'充值入账' remark
UNION ALL SELECT 2,@wallet_1,@member_1,'withdrawal','withdrawal_debit',2,50000,600000,550000,'提现扣款'
UNION ALL SELECT 3,@wallet_2,@member_2,'task','task_commission',1,3000,300000,303000,'任务佣金'
UNION ALL SELECT 4,@wallet_2,@member_2,'adjustment','manual_deduct',2,2000,303000,301000,'人工扣回'
) x
WHERE NOT EXISTS (SELECT 1 FROM hg_wallet_ledger l WHERE l.tenant_id=@tenant_id AND l.ledger_no=CONCAT('DEMO-LG-',LPAD(x.seq,2,'0')));
SET @ledger_recharge = (SELECT id FROM hg_wallet_ledger WHERE ledger_no='DEMO-LG-01' LIMIT 1);
SET @ledger_withdraw = (SELECT id FROM hg_wallet_ledger WHERE ledger_no='DEMO-LG-02' LIMIT 1);
SET @ledger_task = (SELECT id FROM hg_wallet_ledger WHERE ledger_no='DEMO-LG-03' LIMIT 1);
INSERT INTO hg_wallet_ledger
(`tenant_id`,`ledger_no`,`account_id`,`member_id`,`biz_type`,`biz_no`,`entry_type`,`direction`,`amount`,`before_amount`,`after_amount`,`currency`,`reversal_of`,`idempotency_key`,`remark`,`operator_id`,`occurred_at`,`created_at`)
SELECT @tenant_id,'DEMO-LG-05',@wallet_2,@member_2,'task','DEMO-BIZ-03','task_commission_reversal',2,3000,301000,298000,'CNY',@ledger_task,
'DEMO-LEDGER-IDEMP-5','任务佣金冲正演示',@admin_id,@now,@now
WHERE NOT EXISTS (SELECT 1 FROM hg_wallet_ledger WHERE ledger_no='DEMO-LG-05');
INSERT INTO hg_wallet_adjustment_request
(`tenant_id`,`request_no`,`member_id`,`account_id`,`adjust_type`,`direction`,`amount`,`reason_code`,`reason_text`,`evidence_json`,`idempotency_key`,`request_status`,`approval_request_id`,`ledger_id`,`created_by`,`updated_by`,`created_at`,`updated_at`)
SELECT @tenant_id,CONCAT('DEMO-WA-',LPAD(x.status,2,'0')),x.member_id,x.account_id,x.adjust_type,x.direction,1000*x.status,
CONCAT('demo_adjust_',x.status),CONCAT('演示资金调账状态 ',x.status),JSON_ARRAY(),CONCAT('DEMO-WA-IDEMP-',x.status),x.status,
COALESCE((SELECT id FROM hg_approval_request WHERE approval_no=CONCAT('DEMO-AP-',LPAD(x.status+1,2,'0'))),0),
IF(x.status=4,COALESCE((SELECT id FROM hg_wallet_ledger WHERE ledger_no='DEMO-LG-04'),0),0),@admin_id,@admin_id,
DATE_SUB(@now,INTERVAL x.status DAY),@now
FROM (
SELECT 1 status,@member_1 member_id,@wallet_1 account_id,1 adjust_type,1 direction
UNION ALL SELECT 2,@member_2,@wallet_2,2,1
UNION ALL SELECT 3,@member_1,@wallet_1,3,2
UNION ALL SELECT 4,@member_2,@wallet_2,4,2
) x
WHERE NOT EXISTS (SELECT 1 FROM hg_wallet_adjustment_request r WHERE r.request_no=CONCAT('DEMO-WA-',LPAD(x.status,2,'0')));
INSERT INTO hg_app_member_notice
(`tenant_id`,`member_id`,`title`,`content`,`source_type`,`start_at`,`end_at`,`notice_status`,`created_by`,`updated_by`,`created_at`,`updated_at`)
SELECT @tenant_id,x.member_id,CONCAT('DEMO 通知-',x.seq),x.content,x.source_type,DATE_SUB(@now,INTERVAL 1 DAY),
DATE_ADD(@now,INTERVAL 30 DAY),x.notice_status,@admin_id,@admin_id,@now,@now
FROM (
SELECT 1 seq,0 member_id,'系统维护通知(真实)' content,1 source_type,1 notice_status
UNION ALL SELECT 2,@member_1,'运营活动效果模拟',2,1
UNION ALL SELECT 3,@member_2,'已撤回的真实通知',1,2
UNION ALL SELECT 4,0,'已撤回的运营模拟',2,2
) x
WHERE NOT EXISTS (SELECT 1 FROM hg_app_member_notice n WHERE n.title=CONCAT('DEMO 通知-',x.seq));
INSERT INTO hg_task_hall
(`tenant_id`,`hall_code`,`name`,`icon_attachment_id`,`icon_url`,`summary`,`commission_rate`,`rate_unit`,`client_route`,`publish_status`,`sort`,`version`,`remark`,`created_by`,`updated_by`,`created_at`,`updated_at`)
SELECT @tenant_id,CONCAT('DEMO_HALL_',x.status),CONCAT(x.label,'任务大厅'),0,
CONCAT('https://picsum.photos/seed/hall-',x.status,'/256/256'),CONCAT('用于展示',x.label,'状态'),100+x.status*20,
'basis_point',CONCAT('/task-hall/demo-',x.status),x.status,x.status*10,x.status-1,'本地演示数据',@admin_id,@admin_id,
DATE_SUB(@now,INTERVAL x.status DAY),@now
FROM (
SELECT 1 status,'草稿' label UNION ALL SELECT 2,'待审' UNION ALL SELECT 3,'已发布'
UNION ALL SELECT 4,'已下线' UNION ALL SELECT 5,'已归档'
) x
WHERE NOT EXISTS (SELECT 1 FROM hg_task_hall h WHERE h.tenant_id=@tenant_id AND h.hall_code=CONCAT('DEMO_HALL_',x.status));
INSERT INTO hg_task_hall_level (`tenant_id`,`hall_id`,`level_id`,`created_at`)
SELECT @tenant_id,h.id,l.id,@now
FROM hg_task_hall h
JOIN hg_app_member_level l ON l.level_code IN ('VIP1','DEMO_VIP2','DEMO_VIP3') AND l.tenant_id=@tenant_id
WHERE h.hall_code LIKE 'DEMO_HALL_%' AND h.tenant_id=@tenant_id
AND NOT EXISTS (SELECT 1 FROM hg_task_hall_level hl WHERE hl.tenant_id=@tenant_id AND hl.hall_id=h.id AND hl.level_id=l.id);
-- --------------------------------------------------------------------------
-- 4. 商品任务、交易订单、充值、提现、财务复核和客服
-- --------------------------------------------------------------------------
SET @demo_hall_id = (SELECT id FROM hg_task_hall WHERE tenant_id=@tenant_id AND hall_code='DEMO_HALL_3' LIMIT 1);
INSERT INTO hg_task
(`tenant_id`,`task_no`,`hall_id`,`title`,`description`,`detail_html`,`cover_attachment_id`,`cover_url`,`commission_amount`,`commission_rate`,`daily_limit`,`per_member_limit`,`start_at`,`end_at`,`publish_status`,`sort`,`version`,`remark`,`created_by`,`updated_by`,`created_at`,`updated_at`)
SELECT @tenant_id,CONCAT('DEMO-TK-',LPAD(x.status,2,'0')),@demo_hall_id,CONCAT(x.label,'演示任务'),
CONCAT('这是',x.label,'状态的任务数据'),CONCAT('<h3>',x.label,'任务</h3><p>请按要求提交演示凭证。</p>'),0,
CONCAT('https://picsum.photos/seed/task-',x.status,'/640/360'),500+x.status*100,50*x.status,100,1,
DATE_SUB(@now,INTERVAL 3 DAY),DATE_ADD(@now,INTERVAL 30 DAY),x.status,x.status*10,x.status-1,
'本地演示数据',@admin_id,@admin_id,DATE_SUB(@now,INTERVAL x.status DAY),@now
FROM (
SELECT 1 status,'草稿' label UNION ALL SELECT 2,'待审' UNION ALL SELECT 3,'已发布'
UNION ALL SELECT 4,'已下线' UNION ALL SELECT 5,'已归档'
) x
WHERE NOT EXISTS (SELECT 1 FROM hg_task t WHERE t.tenant_id=@tenant_id AND t.task_no=CONCAT('DEMO-TK-',LPAD(x.status,2,'0')));
INSERT INTO hg_task_level (`tenant_id`,`task_id`,`level_id`,`created_at`)
SELECT @tenant_id,t.id,l.id,@now
FROM hg_task t
JOIN hg_app_member_level l ON l.level_code IN ('VIP1','DEMO_VIP2','DEMO_VIP3') AND l.tenant_id=@tenant_id
WHERE t.task_no LIKE 'DEMO-TK-%' AND t.tenant_id=@tenant_id
AND NOT EXISTS (SELECT 1 FROM hg_task_level tl WHERE tl.tenant_id=@tenant_id AND tl.task_id=t.id AND tl.level_id=l.id);
SET @task_published_id = (SELECT id FROM hg_task WHERE tenant_id=@tenant_id AND task_no='DEMO-TK-03' LIMIT 1);
SET @product_published_id = (SELECT id FROM hg_product WHERE tenant_id=@tenant_id AND product_no='DEMO-P-03' LIMIT 1);
INSERT INTO hg_trade_order
(`tenant_id`,`order_no`,`member_id`,`task_id`,`product_id`,`product_name`,`order_type`,`quantity`,`unit_price_amount`,`total_amount`,`commission_amount`,`currency`,`member_level_id`,`rule_snapshot`,`message`,`order_status`,`freeze_status`,`approval_request_id`,`matched_at`,`completed_at`,`unfrozen_at`,`created_by`,`updated_by`,`created_at`,`updated_at`)
SELECT @tenant_id,CONCAT('DEMO-ORD-',LPAD(x.status,2,'0')),x.member_id,
IF(x.order_type=2,@task_published_id,0),IF(x.order_type<>2,@product_published_id,0),CONCAT(x.label,'演示订单'),x.order_type,
1,10000+x.status*100,10000+x.status*100,500+x.status*10,'CNY',x.level_id,
JSON_OBJECT('demo',TRUE,'orderStatus',x.status,'commissionRate',200),CONCAT('演示订单状态:',x.label),x.status,
1+MOD(x.status-1,3),IF(x.status IN (6,7,8),(SELECT id FROM hg_approval_request WHERE approval_no='DEMO-AP-04' LIMIT 1),0),
IF(x.status>=2,DATE_SUB(@now,INTERVAL x.status HOUR),NULL),IF(x.status=4,DATE_SUB(@now,INTERVAL 1 HOUR),NULL),
IF(x.status=2,DATE_SUB(@now,INTERVAL 30 MINUTE),NULL),@admin_id,@admin_id,DATE_SUB(@now,INTERVAL x.status DAY),@now
FROM (
SELECT 1 status,@member_1 member_id,@level_normal_id level_id,1 order_type,'匹配中' label
UNION ALL SELECT 2,@member_2,@level_silver_id,2,'待处理'
UNION ALL SELECT 3,@member_1,@level_normal_id,3,'处理中'
UNION ALL SELECT 4,@member_2,@level_silver_id,1,'已完成'
UNION ALL SELECT 5,@member_1,@level_normal_id,2,'已超时'
UNION ALL SELECT 6,@member_2,@level_silver_id,1,'已冻结'
UNION ALL SELECT 7,@member_1,@level_normal_id,3,'已取消'
UNION ALL SELECT 8,@member_2,@level_silver_id,2,'失败'
) x
WHERE NOT EXISTS (SELECT 1 FROM hg_trade_order o WHERE o.tenant_id=@tenant_id AND o.order_no=CONCAT('DEMO-ORD-',LPAD(x.status,2,'0')));
-- 任务审核需要独立订单,避免 trade_order_id 唯一索引冲突。
INSERT INTO hg_trade_order
(`tenant_id`,`order_no`,`member_id`,`task_id`,`product_id`,`product_name`,`order_type`,`quantity`,`unit_price_amount`,`total_amount`,`commission_amount`,`currency`,`member_level_id`,`rule_snapshot`,`message`,`order_status`,`freeze_status`,`created_by`,`updated_by`,`created_at`,`updated_at`)
SELECT @tenant_id,CONCAT('DEMO-TS-ORD-',x.status),x.member_id,@task_published_id,0,'任务审核关联订单',2,1,0,0,500+x.status*100,
'CNY',x.level_id,JSON_OBJECT('demo',TRUE,'submissionStatus',x.status),'任务审核关联订单',4,1,@admin_id,@admin_id,
DATE_SUB(@now,INTERVAL x.status DAY),@now
FROM (
SELECT 1 status,@member_1 member_id,@level_normal_id level_id UNION ALL SELECT 2,@member_2,@level_silver_id
UNION ALL SELECT 3,@member_1,@level_normal_id UNION ALL SELECT 4,@member_2,@level_silver_id
UNION ALL SELECT 5,@member_1,@level_normal_id
) x
WHERE NOT EXISTS (SELECT 1 FROM hg_trade_order o WHERE o.tenant_id=@tenant_id AND o.order_no=CONCAT('DEMO-TS-ORD-',x.status));
INSERT INTO hg_task_submission
(`tenant_id`,`submission_no`,`trade_order_id`,`task_id`,`member_id`,`member_level_id`,`evidence_text`,`evidence_attachment_ids`,`submission_status`,`commission_amount`,`success_rate`,`reviewed_by`,`reviewed_at`,`review_reason_code`,`review_reason`,`allow_resubmit`,`ledger_id`,`settled_at`,`reversal_approval_id`,`created_by`,`updated_by`,`created_at`,`updated_at`)
SELECT @tenant_id,CONCAT('DEMO-TS-',LPAD(x.status,2,'0')),o.id,@task_published_id,x.member_id,x.level_id,
CONCAT('演示任务凭证,审核状态:',x.label),JSON_ARRAY(CONCAT('https://picsum.photos/seed/evidence-',x.status,'/800/600')),
x.status,500+x.status*100,7000+x.status*300,IF(x.status=1,0,@reviewer_id),IF(x.status=1,NULL,DATE_SUB(@now,INTERVAL 1 HOUR)),
IF(x.status=3,'evidence_invalid',''),IF(x.status=3,'凭证不符合要求',IF(x.status>1,'演示审核意见','')),
IF(x.status=3,1,2),IF(x.status IN (4,5),@ledger_task,0),IF(x.status IN (4,5),DATE_SUB(@now,INTERVAL 2 HOUR),NULL),
IF(x.status=5,(SELECT id FROM hg_approval_request WHERE approval_no='DEMO-AP-07' LIMIT 1),0),@admin_id,@admin_id,
DATE_SUB(@now,INTERVAL x.status DAY),@now
FROM (
SELECT 1 status,@member_1 member_id,@level_normal_id level_id,'待审核' label UNION ALL
SELECT 2,@member_2,@level_silver_id,'已通过' UNION ALL SELECT 3,@member_1,@level_normal_id,'已驳回' UNION ALL
SELECT 4,@member_2,@level_silver_id,'已结算' UNION ALL SELECT 5,@member_1,@level_normal_id,'已冲正'
) x
JOIN hg_trade_order o ON o.order_no=CONCAT('DEMO-TS-ORD-',x.status) AND o.tenant_id=@tenant_id
WHERE NOT EXISTS (SELECT 1 FROM hg_task_submission s WHERE s.submission_no=CONCAT('DEMO-TS-',LPAD(x.status,2,'0')));
INSERT INTO hg_payment_channel
(`tenant_id`,`channel_code`,`name`,`channel_type`,`direction`,`config_cipher`,`min_amount`,`max_amount`,`fee_type`,`fee_fixed_amount`,`fee_rate`,`status`,`sort`,`created_by`,`updated_by`,`created_at`,`updated_at`)
SELECT @tenant_id,'demo_disabled','演示停用通道',1,3,'DEMO_CONFIG_CIPHER',100,1000000,1,0,30,2,99,@admin_id,@admin_id,@now,@now
WHERE NOT EXISTS (SELECT 1 FROM hg_payment_channel c WHERE c.tenant_id=@tenant_id AND c.channel_code='demo_disabled');
SET @payment_channel_id = COALESCE((SELECT id FROM hg_payment_channel WHERE tenant_id=@tenant_id AND channel_code='wechat' LIMIT 1),(SELECT id FROM hg_payment_channel WHERE tenant_id=@tenant_id ORDER BY id LIMIT 1));
INSERT INTO hg_recharge_order
(`tenant_id`,`recharge_no`,`member_id`,`channel_id`,`request_amount`,`paid_amount`,`currency`,`external_no`,`voucher_attachment_ids`,`recharge_type`,`recharge_status`,`remark`,`review_reason_code`,`review_reason`,`approval_request_id`,`ledger_id`,`paid_at`,`reviewed_at`,`credited_at`,`created_by`,`updated_by`,`created_at`,`updated_at`)
SELECT @tenant_id,CONCAT('DEMO-RC-',LPAD(x.status,2,'0')),x.member_id,@payment_channel_id,10000*x.status,
IF(x.status=3,10000*x.status,0),'CNY',IF(x.status=3,CONCAT('EXT-DEMO-RC-',x.status),''),JSON_ARRAY(),
IF(MOD(x.status,2)=1,1,2),x.status,CONCAT('演示充值状态:',x.label),IF(x.status=4,'risk_rejected',''),
IF(x.status=4,'演示风控驳回',''),IF(x.status IN (2,3,4),(SELECT id FROM hg_approval_request WHERE approval_no=CONCAT('DEMO-AP-',LPAD(x.status+2,2,'0')) LIMIT 1),0),
IF(x.status=3,@ledger_recharge,0),IF(x.status IN (2,3),DATE_SUB(@now,INTERVAL 3 HOUR),NULL),
IF(x.status IN (3,4),DATE_SUB(@now,INTERVAL 2 HOUR),NULL),IF(x.status=3,DATE_SUB(@now,INTERVAL 1 HOUR),NULL),
@admin_id,@admin_id,DATE_SUB(@now,INTERVAL x.status DAY),@now
FROM (
SELECT 1 status,@member_1 member_id,'用户未支付' label UNION ALL SELECT 2,@member_2,'手动审核'
UNION ALL SELECT 3,@member_1,'已入账' UNION ALL SELECT 4,@member_2,'手动驳回'
UNION ALL SELECT 5,@member_1,'已过期' UNION ALL SELECT 6,@member_2,'已取消'
) x
WHERE NOT EXISTS (SELECT 1 FROM hg_recharge_order r WHERE r.tenant_id=@tenant_id AND r.recharge_no=CONCAT('DEMO-RC-',LPAD(x.status,2,'0')));
INSERT INTO hg_withdrawal_order
(`tenant_id`,`withdrawal_no`,`member_id`,`payment_account_id`,`channel_id`,`request_amount`,`fee_amount`,`actual_amount`,`currency`,`account_snapshot_cipher`,`account_mask`,`bank_name`,`holder_mask`,`risk_result`,`withdrawal_status`,`review_reason_code`,`review_reason`,`approval_request_id`,`external_no`,`freeze_ledger_id`,`final_ledger_id`,`reviewed_at`,`processed_at`,`completed_at`,`created_by`,`updated_by`,`created_at`,`updated_at`)
SELECT @tenant_id,CONCAT('DEMO-WD-',LPAD(x.status,2,'0')),x.member_id,@payment_account_id,@payment_channel_id,
20000+x.status*1000,100,19900+x.status*1000,'CNY','DEMO_ACCOUNT_SNAPSHOT','**** **** **** 1001','演示银行','演示*',
JSON_OBJECT('riskLevel',IF(x.status=6,'high','low'),'demo',TRUE),x.status,
IF(x.status=6,'risk_rejected',''),IF(x.status=6,'演示风控驳回',''),
IF(x.status IN (2,3,4,5,6),(SELECT id FROM hg_approval_request WHERE approval_no=CONCAT('DEMO-AP-',LPAD(LEAST(x.status+1,8),2,'0')) LIMIT 1),0),
IF(x.status IN (4,5),CONCAT('EXT-DEMO-WD-',x.status),''),IF(x.status>=2,@ledger_withdraw,0),IF(x.status IN (4,5,6),@ledger_withdraw,0),
IF(x.status>=2,DATE_SUB(@now,INTERVAL 3 HOUR),NULL),IF(x.status>=3,DATE_SUB(@now,INTERVAL 2 HOUR),NULL),
IF(x.status IN (4,5,6,7),DATE_SUB(@now,INTERVAL 1 HOUR),NULL),@admin_id,@admin_id,DATE_SUB(@now,INTERVAL x.status DAY),@now
FROM (
SELECT 1 status,@member_1 member_id,'待初审' label UNION ALL SELECT 2,@member_2,'复核中'
UNION ALL SELECT 3,@member_1,'付款中' UNION ALL SELECT 4,@member_2,'已到账'
UNION ALL SELECT 5,@member_1,'付款失败' UNION ALL SELECT 6,@member_2,'已驳回'
UNION ALL SELECT 7,@member_1,'已取消'
) x
WHERE NOT EXISTS (SELECT 1 FROM hg_withdrawal_order w WHERE w.tenant_id=@tenant_id AND w.withdrawal_no=CONCAT('DEMO-WD-',LPAD(x.status,2,'0')));
INSERT INTO hg_finance_review
(`tenant_id`,`approval_request_id`,`biz_type`,`biz_id`,`review_stage`,`reviewer_id`,`decision`,`reason_code`,`reason_text`,`snapshot_json`,`created_at`)
SELECT @tenant_id,a.id,x.biz_type,x.biz_id,x.stage,@reviewer_id,x.decision,CONCAT('demo_finance_',x.seq),
IF(x.decision=1,'演示审核通过','演示审核驳回'),JSON_OBJECT('demo',TRUE,'decision',x.decision),DATE_SUB(@now,INTERVAL x.seq HOUR)
FROM (
SELECT 1 seq,'recharge' biz_type,(SELECT id FROM hg_recharge_order WHERE recharge_no='DEMO-RC-03' LIMIT 1) biz_id,1 stage,1 decision,'DEMO-AP-04' approval_no
UNION ALL SELECT 2,'recharge',(SELECT id FROM hg_recharge_order WHERE recharge_no='DEMO-RC-04' LIMIT 1),2,2,'DEMO-AP-05'
UNION ALL SELECT 3,'withdrawal',(SELECT id FROM hg_withdrawal_order WHERE withdrawal_no='DEMO-WD-04' LIMIT 1),1,1,'DEMO-AP-07'
UNION ALL SELECT 4,'withdrawal',(SELECT id FROM hg_withdrawal_order WHERE withdrawal_no='DEMO-WD-06' LIMIT 1),2,2,'DEMO-AP-06'
) x
JOIN hg_approval_request a ON a.approval_no=x.approval_no
WHERE NOT EXISTS (
SELECT 1 FROM hg_finance_review f WHERE f.approval_request_id=a.id AND f.review_stage=x.stage AND f.reviewer_id=@reviewer_id
);
INSERT INTO hg_customer_service
(`tenant_id`,`service_code`,`name`,`avatar_url`,`work_time`,`online_status`,`service_url`,`backup_contact`,`session_mapping`,`status`,`sort`,`remark`,`created_by`,`updated_by`,`created_at`,`updated_at`)
SELECT @tenant_id,CONCAT('DEMO_CS_',x.seq),CONCAT('演示客服-',x.seq),CONCAT('https://picsum.photos/seed/cs-',x.seq,'/128/128'),
IF(x.seq=1,'周一至周日 09:00-22:00','工作日 09:00-18:00'),x.online_status,CONCAT('https://example.com/customer-service/',x.seq),
CONCAT('400-800-000',x.seq),JSON_OBJECT('channel','demo','seat',x.seq),x.status,x.seq*10,'本地演示客服',
@admin_id,@admin_id,@now,@now
FROM (
SELECT 1 seq,1 online_status,1 status UNION ALL SELECT 2,2,1 UNION ALL SELECT 3,1,2 UNION ALL SELECT 4,2,2
) x
WHERE NOT EXISTS (SELECT 1 FROM hg_customer_service c WHERE c.tenant_id=@tenant_id AND c.service_code=CONCAT('DEMO_CS_',x.seq));
-- 修正统计字段,保持演示列表与关联数据一致。
UPDATE hg_app_member_level l
SET l.member_count=(SELECT COUNT(*) FROM hg_app_member m WHERE m.level_id=l.id AND m.deleted_at IS NULL)
WHERE l.tenant_id=@tenant_id AND l.level_code IN ('VIP1','DEMO_VIP2','DEMO_VIP3','DEMO_VIP_DISABLED');
-- 输出导入后的表行数,便于核对。
SELECT table_name, table_rows
FROM information_schema.tables
WHERE table_schema=DATABASE()
AND table_name IN (
'hg_approval_request','hg_approval_action','hg_sensitive_access_log','hg_biz_audit_log','hg_idempotency_record','hg_outbox_event','hg_dashboard_daily_stat',
'hg_site_config_version','hg_content','hg_content_version','hg_banner','hg_product','hg_product_category',
'hg_app_member','hg_app_member_profile','hg_app_member_address','hg_app_member_payment_account','hg_app_member_status_log',
'hg_wallet_account','hg_wallet_ledger','hg_wallet_adjustment_request','hg_app_member_notice','hg_app_member_level','hg_app_member_level_version',
'hg_task_hall','hg_task_hall_level','hg_task','hg_task_level','hg_task_submission','hg_trade_order','hg_payment_channel',
'hg_recharge_order','hg_withdrawal_order','hg_finance_review','hg_customer_service'
)
ORDER BY table_name;
@@ -0,0 +1,128 @@
-- Olons Admin 商城看板演示数据
-- 适用:MySQL 8.0+ 本地开发环境。
-- 范围:仅写入 hg_dashboard_daily_stat,生成最近 61 天数据。
-- 特征:可重复执行;相同租户、日期、维度和指标会更新为本脚本的演示值。
SET NAMES utf8mb4;
SET @tenant_id = 0;
-- 数据库容器使用 UTC;看板按 Asia/Shanghai 解析 DATETIME,因此写入本地当前时间。
SET @calculated_at = DATE_ADD(UTC_TIMESTAMP(3), INTERVAL 8 HOUR);
-- 全局指标:数量型、金额型以及期末快照。
INSERT INTO hg_dashboard_daily_stat
(`tenant_id`,`stat_date`,`dimension_type`,`dimension_value`,`metric_code`,`metric_count`,`metric_amount`,`calculated_at`,`created_at`,`updated_at`)
SELECT
@tenant_id,
DATE_SUB(CURDATE(), INTERVAL days.day_offset DAY),
'global',
'all',
metrics.metric_code,
CASE metrics.metric_code
WHEN 'member_total' THEN 5068 - days.day_offset * 4 - MOD(days.day_offset, 3)
WHEN 'member_new' THEN 28 + MOD(days.day_offset * 7, 25)
WHEN 'recharge_member' THEN 192 + MOD(days.day_offset * 11, 76)
WHEN 'product_total' THEN 368 - FLOOR(days.day_offset / 7)
WHEN 'trade_order' THEN 813 + MOD(days.day_offset * 37, 240)
ELSE 0
END,
CASE metrics.metric_code
WHEN 'trade_order' THEN 128650000 + MOD(days.day_offset * 1379000, 42000000)
WHEN 'recharge_success' THEN 58600000 + MOD(days.day_offset * 731000, 17000000)
WHEN 'recharge_pending' THEN 4600000 + MOD(days.day_offset * 139000, 1800000)
WHEN 'withdrawal_success' THEN 23600000 + MOD(days.day_offset * 511000, 8000000)
WHEN 'withdrawal_pending' THEN 2350000 + MOD(days.day_offset * 97000, 1200000)
WHEN 'commission' THEN 8640000 + MOD(days.day_offset * 173000, 3200000)
WHEN 'referral_commission' THEN 18000000 + MOD(days.day_offset * 241000, 6200000)
WHEN 'interest_transfer' THEN 33000000 + MOD(days.day_offset * 359000, 9600000)
WHEN 'wallet_available' THEN 895643025 - days.day_offset * 125000 + MOD(days.day_offset * 17003, 90000)
WHEN 'wallet_frozen' THEN 154680000 + MOD(days.day_offset * 223000, 3600000)
ELSE 0
END,
@calculated_at,
@calculated_at,
@calculated_at
FROM (
SELECT ones.n + tens.n * 10 AS day_offset
FROM (
SELECT 0 n UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4
UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9
) ones
CROSS JOIN (
SELECT 0 n UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3
UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6
) tens
WHERE ones.n + tens.n * 10 <= 60
) days
CROSS JOIN (
SELECT 'member_total' metric_code UNION ALL
SELECT 'member_new' UNION ALL
SELECT 'recharge_member' UNION ALL
SELECT 'product_total' UNION ALL
SELECT 'trade_order' UNION ALL
SELECT 'recharge_success' UNION ALL
SELECT 'recharge_pending' UNION ALL
SELECT 'withdrawal_success' UNION ALL
SELECT 'withdrawal_pending' UNION ALL
SELECT 'commission' UNION ALL
SELECT 'referral_commission' UNION ALL
SELECT 'interest_transfer' UNION ALL
SELECT 'wallet_available' UNION ALL
SELECT 'wallet_frozen'
) metrics
WHERE TRUE
ON DUPLICATE KEY UPDATE
`metric_count` = VALUES(`metric_count`),
`metric_amount` = VALUES(`metric_amount`),
`calculated_at` = VALUES(`calculated_at`),
`updated_at` = VALUES(`updated_at`);
-- 渠道指标:今日基准值合计与全局充值、提现金额保持一致。
INSERT INTO hg_dashboard_daily_stat
(`tenant_id`,`stat_date`,`dimension_type`,`dimension_value`,`metric_code`,`metric_count`,`metric_amount`,`calculated_at`,`created_at`,`updated_at`)
SELECT
@tenant_id,
DATE_SUB(CURDATE(), INTERVAL days.day_offset DAY),
'channel',
channels.channel,
channels.metric_code,
channels.base_count + MOD(days.day_offset * channels.count_step, channels.count_range),
channels.base_amount + MOD(days.day_offset * channels.amount_step, channels.amount_range),
@calculated_at,
@calculated_at,
@calculated_at
FROM (
SELECT ones.n + tens.n * 10 AS day_offset
FROM (
SELECT 0 n UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4
UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9
) ones
CROSS JOIN (
SELECT 0 n UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3
UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6
) tens
WHERE ones.n + tens.n * 10 <= 60
) days
CROSS JOIN (
SELECT 'wechat' channel, 'recharge_success' metric_code, 236 base_count, 28800000 base_amount, 13 count_step, 58 count_range, 373000 amount_step, 6800000 amount_range
UNION ALL SELECT 'wechat', 'withdrawal_success', 31, 4600000, 5, 17, 127000, 1700000
UNION ALL SELECT 'alipay', 'recharge_success', 169, 19800000, 11, 46, 281000, 5200000
UNION ALL SELECT 'alipay', 'withdrawal_success', 42, 7200000, 7, 23, 163000, 2100000
UNION ALL SELECT 'bank', 'recharge_success', 87, 10000000, 7, 31, 199000, 3600000
UNION ALL SELECT 'bank', 'withdrawal_success', 78, 11800000, 9, 34, 221000, 3200000
) channels
WHERE TRUE
ON DUPLICATE KEY UPDATE
`metric_count` = VALUES(`metric_count`),
`metric_amount` = VALUES(`metric_amount`),
`calculated_at` = VALUES(`calculated_at`),
`updated_at` = VALUES(`updated_at`);
SELECT
COUNT(*) AS dashboard_rows,
MIN(stat_date) AS start_date,
MAX(stat_date) AS end_date,
MAX(calculated_at) AS calculated_at
FROM hg_dashboard_daily_stat
WHERE tenant_id = @tenant_id
AND dimension_type IN ('global', 'channel')
AND stat_date BETWEEN DATE_SUB(CURDATE(), INTERVAL 60 DAY) AND CURDATE();
@@ -0,0 +1,205 @@
-- Olons Admin 门户文本正式初始化
-- 来源:admin.olons.top「文本管理」,同步日期:2026-10-08。
-- 适用:MySQL 8.0+ 本地开发环境。
-- 行为:替换 tenant_id=0 的全部门户文本及版本,仅保留下列 12 条正式内容。
-- 注意:文本管理不保存图片,来源正文中的 img 标签已移除。
SET NAMES utf8mb4;
SET @tenant_id = 0;
SET @admin_id = COALESCE((SELECT id FROM hg_admin_member ORDER BY id LIMIT 1), 1);
SET @now = DATE_ADD(UTC_TIMESTAMP(3), INTERVAL 8 HOUR);
DROP TEMPORARY TABLE IF EXISTS tmp_portal_content_seed;
CREATE TEMPORARY TABLE tmp_portal_content_seed (
content_key varchar(64) NOT NULL,
content_type varchar(32) NOT NULL,
title varchar(200) NOT NULL,
summary varchar(500) NOT NULL,
body_html longtext NOT NULL,
sort int NOT NULL,
PRIMARY KEY (content_key)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
INSERT INTO tmp_portal_content_seed
(`content_key`,`content_type`,`title`,`summary`,`body_html`,`sort`)
VALUES
(
'platform_announcement',
'notice',
'平台公告',
'平台充值时间及安全提醒',
'<p>尊敬的会员,您好!关于微信转卡/支付宝转卡,异地转账出现风控问题。由于支付宝,微信属于三方支付软件,公信部为防止洗黑钱,有此类问题均属于正常现象,请您不用担心,建议您使用手机银行进行充值,简单快捷,祝您生活愉快!</p><p><br></p><p><span style="color: rgb(225, 60, 57);">特别通知!!!</span></p><p><span style="color: rgb(225, 60, 57);">平台充值时间,早上9:00—21:00。期间任何联系您充值的人都是冒充平台客服,为避免资金损失,请在9:00—21:00进行充值。</span></p>',
10
),
(
'platform_introduction',
'about',
'平台简介',
'平台服务协议、使用规则与常见问题说明',
'<p>本协议阐述适用于您使用本平台所提供的各种工具和服务(下称“服务”)的条款和条件。</p><h3>一、接受条款</h3><p>通过网站或 APP 进入即表示您同意与平台订立本协议,并受本协议条款约束。平台可依法调整服务条款;修订内容公布后生效。如您不同意相关变更,应停止使用服务。</p><h3>二、谁可使用本平台</h3><p>服务仅供能够根据相关法律订立具有法律约束力合约的个人或公司使用。使用者应年满十八周岁。平台有权依法拒绝或中止向不符合条件的用户提供服务。</p><h3>三、费用说明</h3><p>平台不会以押金、保证金等名义私下联系用户索取费用。涉及充值、提现等操作时,请认准平台官方入口与在线客服。</p><h3>四、用户资料</h3><p>用户应保证注册、交易及使用服务过程中提交的数据、文本和其他资料真实、准确、完整,并对所提交资料承担相应责任。用户不得提交侵犯他人合法权益或违反法律法规的内容。</p><h3>五、注册义务</h3><p>用户应按要求提供真实、准确、完整且反映当前情况的信息,并及时维护更新。若资料不真实、不准确或不完整,平台有权暂停或终止相关服务。</p><h3>六、账号、密码和保密</h3><p>用户应妥善保管账号和密码,并对账号下发生的活动负责。如发现账号被未经授权使用,应立即通知平台,并在每次使用结束后正确退出。</p><h3>七、信息发布规则</h3><p>用户提供的信息不得包含欺诈、侵权、违法、淫秽、恶意程序、骚扰、虚假身份或其他不适合发布的内容,不得利用服务收集他人信息或发送垃圾信息。</p><h3>八、禁止事项</h3><p>用户不得通过平台发布、购买或销售可能使平台违反法律法规的物品或服务,也不得发布平台认为不适合展示或交易的内容。</p><h3>九、隐私保护</h3><p>平台将按照隐私规则处理用户提供的信息。用户主动公开的信息可能被其他用户获取和使用,请谨慎披露个人资料。</p><h3>十、服务终止</h3><p>对于违反协议、长期未登录或存在安全风险的账号,平台可依法暂停或终止部分或全部服务,并对相关信息采取必要措施。</p><h3>十一、责任说明</h3><p>服务按现状提供。因网络、系统维护、不可抗力或第三方服务造成的中断,平台将在合理范围内及时处理。用户通过服务获取信息或进行操作时,应自行判断并承担相应风险。</p><h3>十二、订单规则</h3><p>不同订单类型适用人群及结算规则可能不同。用户接取任务前应阅读订单说明,并在规定时间内完成。团队任务需团队成员按要求共同完成。</p><h3>十三、常见问题</h3><p><strong>1. 关于充值:</strong>请在“我的—我的钱包”中发起充值,核对转账信息,并按页面要求提交到账凭证。如遇问题请联系在线客服。</p><p><strong>2. 关于提现:</strong>请先绑定本人有效的提现账户,再在钱包页面提交申请。实际到账时间以支付渠道和平台审核结果为准。</p><p><strong>3. 关于任务:</strong>请完善真实资料和收货地址,按会员等级、任务规则及系统提示完成订单。</p><p><strong>4. 关于订单冻结:</strong>未按要求完成的订单可能进入冻结状态,具体处理方式以订单页面和客服说明为准。</p><p><strong>5. 关于代理:</strong>邀请关系及返佣比例以平台当前规则为准,可在代理页面或联系在线客服查询。</p><h3>十四、法律适用</h3><p>用户使用服务时应遵守中华人民共和国大陆地区相关法律法规。本协议部分条款无效的,不影响其他条款的效力。</p><h3>十五、不可抗力</h3><p>因自然灾害、战争、政府行为、通信设施故障或其他平台合理控制范围以外的原因导致延迟或无法履约的,平台将在法律允许范围内处理。</p>',
20
),
(
'task_order_rules',
'rule',
'抢单规则',
'充值赠送、会员等级及抢单佣金规则',
'<p>充值赠送金:</p><p><span style="color: rgb(255, 77, 79);">充值500赠送20元。</span></p><p><span style="color: rgb(255, 77, 79);">单次充值1888元以上,平台赠送永久白银会员,佣金比例0.02,每天代购20单,额外奖励88元。</span></p><p><span style="color: rgb(255, 77, 79);">单次充值10000元以上,平台赠送永久黄金会员,佣金比例0.022,每天代购30单,额外奖励188元。</span></p><p><span style="color: rgb(255, 77, 79);">单次充值30000元以上,平台赠送永久铂金会员,佣金比例0.03,每天代购40单,额外奖励388元。</span></p><p><span style="color: rgb(255, 77, 79);">单次充值50000元以上,平台赠送永久钻石会员,佣金比例0.035,每天代购50单,额外奖励588元。</span></p><p><span style="color: rgb(255, 77, 79);">单次充值88888元以上,平台赠送永久星耀会员,每天代购50单,额外奖励1888元。</span></p><p><span style="color: rgb(255, 77, 79);">单次充值188888元以上,平台赠送永久至尊会员,每天代购1000单,额外奖励2888元。</span></p>',
30
),
(
'agent_cooperation',
'about',
'代理合作',
'平台代理合作与三级返佣说明',
'<h3>平台代理模式</h3><p>平台用户可以通过推荐新人成为平台代理,并获得额外的动态奖励。直推一级用户奖励为一级用户每天所得佣金的16%,二级用户奖励为二级用户每天所得佣金的8%,三级用户奖励为三级用户每天所得佣金的4%。</p>',
40
),
(
'frequently_asked_questions',
'faq',
'常见问题',
'充值、提现、任务、订单冻结及代理常见问题',
'<p>温馨提示:同一个人银行卡信息请勿重复注册抢单,经发现将会冻结账号。平台禁止一卡绑定多账户,请勿使用个人多账号。</p><h3>1. 关于充值</h3><p>充值请在“我的—我的钱包”界面操作。填写转账人姓名和转账金额,按平台提供的账户完成汇款后,提交转账到账凭证。充值前请仔细核对账户信息,每次充值请以页面或客服提供的最新信息为准。</p><h3>2. 关于提现</h3><p>提现前请绑定本人有效的提现信息,在平台工作时间内通过“我的—我的钱包”提交提现申请。实际到账时间以支付渠道及审核结果为准。</p><h3>3. 关于领取</h3><p>请在 APP 内完善真实资料和收货地址,并绑定本人有效的银行卡。充值到账后可按会员等级及系统提示参与任务。</p><h3>4. 关于订单冻结</h3><p>系统会根据账户情况匹配订单。订单未按要求完成时可能被冻结,具体解冻和处理规则以订单页面及客服说明为准。</p><h3>5. 关于代理</h3><p>平台用户推荐新人后可获得相应等级的动态奖励,具体比例以平台当前代理规则为准。</p><h3>6. 关于运营时间</h3><p>平台运营时间为每天9:00—21:00,用户可在运营时间内参与任务。订单应在规定时间内完成,如遇问题请及时联系在线客服。</p>',
50
),
(
'beginner_guide',
'guide',
'新手指南',
'新用户使用指引',
'<p>详情请咨询在线客服。充值、提现及平台使用问题均可通过在线客服获取帮助,客服24小时在线。</p>',
60
),
(
'interest_treasure_rules',
'interest_rule',
'利息宝规则',
'利息宝转入、收益与转出规则',
'<p>利息宝用于管理符合条件的账户余额。转入金额、收益计算、可转出时间及限额,以利息宝页面实时展示的规则为准。</p><p>操作前请仔细核对金额;如遇收益或转出问题,请联系在线客服处理。</p>',
70
),
(
'home_ticker_content',
'home_ticker',
'首页滚动内容',
'首页滚动公告文案',
'<p>平台充值福利大放送</p>',
80
),
(
'task_order_notes',
'order_tip',
'抢单备注',
'抢单时间、资金与信用分注意事项',
'<p>1. 平台运营时间为每天上午9:00至晚上21:00。</p><p>2. 每次充值前请通过官方入口核对最新账户信息,如有疑问请联系在线客服。</p><p>3. 领取匹配订单后,请以系统显示“排队成功”为准。</p><p>4. 匹配订单时间会根据会员等级有所不同,正常会员通常为0至20分钟。</p><p>5. 会员账户需满足页面展示的最低启动资金要求后方可参与。</p><p>6. 订单需要在规定时间内完成,请勿超时。</p><p>7. 提现需满足平台当前信用分要求,请妥善维护账户信用。</p><p>8. 信用分下降时请联系在线客服了解恢复规则。</p>',
90
),
(
'recharge_campaign',
'activity',
'充值活动',
'充值赠送与会员奖励活动说明',
'<p><span style="color: rgb(255, 0, 0);">充值赠送金:</span></p><p><span style="color: rgb(255, 0, 0);">充值500元赠送20元。</span></p><p><span style="color: rgb(255, 0, 0);">单次充值3000元以上,赠送会员7天并额外奖励58元。</span></p><p><span style="color: rgb(255, 0, 0);">单次充值5000元以上,赠送白银会员7天并额外奖励88元。</span></p><p><span style="color: rgb(255, 0, 0);">单次充值10000元以上,赠送黄金会员7天并额外奖励188元。</span></p><p><span style="color: rgb(255, 0, 0);">单次充值30000元以上,赠送铂金会员7天并额外奖励388元。</span></p><p><span style="color: rgb(255, 0, 0);">单次充值50000元以上,赠送钻石会员7天并额外奖励588元。</span></p><p><span style="color: rgb(255, 0, 0);">单次充值88888元以上,赠送星耀会员7天并额外奖励1888元。</span></p><p>活动期间的充值时间、任务时间、会员激活条件和奖励到账规则,以活动页面及平台最新公告为准。</p>',
100
),
(
'home_popup_content',
'popup',
'首页弹窗内容',
'首页特别公告及充值安全提醒',
'<h2><span style="color: rgb(225, 60, 57);">特别公告通知</span></h2><p>最新推出线下购买充值卡福利。线下购买指定充值卡券后,可在平台按流程兑换;符合活动条件的用户可获得相应奖励。</p><p>指定商家包括:<span style="color: rgb(225, 60, 57);">大润发、永辉、沃尔玛、中国石化、天虹商场、麦德龙、盒马鲜生、世纪华联、华润万家等。</span></p><p><span style="color: rgb(225, 60, 57);">特别通知:平台充值时间为早上8:00至20:00。期间如有人通过非官方渠道联系您充值,请提高警惕,避免资金损失。</span></p>',
110
),
(
'company_qualification',
'qualification',
'公司资质',
'平台业务模式及合作品牌介绍',
'<h3><span style="color: rgb(231, 76, 60);">多实惠,多乐趣</span></h3><p>平台商品大数据中心每天会将需要提高曝光度的优质商家产品发布到平台商城,提供给平台用户进行代购抢单。平台商城货源以主流电商平台商品为主,为商家和用户带来更多优惠与便利。</p><h3><span style="color: rgb(231, 76, 60);">新国潮,新消费</span></h3><p>通过创新的交互体验,将娱乐与商品交易融合,优化传统电商的消费者触达和交互形式,降低营销与交易成本。平台通过产品创新、数据分析和资源支持,与中小企业共同成长,为用户提供更多品质、实惠的国货选择。</p><h3><span style="color: rgb(231, 76, 60);">合作品牌</span></h3><p>平台将持续引入符合业务要求的合作品牌和优质商家,具体合作信息以平台公示为准。</p>',
120
);
START TRANSACTION;
-- 先删除当前租户的全部旧版本和文本,避免演示数据或废弃标识残留。
DELETE v
FROM hg_content_version v
JOIN hg_content c ON c.id = v.content_id
WHERE c.tenant_id = @tenant_id;
DELETE FROM hg_content WHERE tenant_id = @tenant_id;
COMMIT;
-- 初始化环境中重置编号,避免删除演示数据后从旧 ID 继续递增。
ALTER TABLE hg_content_version AUTO_INCREMENT = 1;
ALTER TABLE hg_content AUTO_INCREMENT = 1;
START TRANSACTION;
INSERT INTO hg_content
(`tenant_id`,`content_key`,`content_type`,`title`,`published_version_id`,`publish_status`,`published_at`,`sort`,`version`,`remark`,`created_by`,`updated_by`,`created_at`,`updated_at`)
SELECT
@tenant_id,
seed.content_key,
seed.content_type,
seed.title,
0,
3,
@now,
seed.sort,
0,
'原后台文本正式初始化',
@admin_id,
@admin_id,
@now,
@now
FROM tmp_portal_content_seed seed
ORDER BY seed.sort;
INSERT INTO hg_content_version
(`tenant_id`,`content_id`,`version_no`,`title`,`summary`,`body_html`,`body_text`,`cover_url`,`asset_ids`,`publish_status`,`effective_at`,`approval_request_id`,`created_by`,`created_at`)
SELECT
@tenant_id,
content.id,
1,
seed.title,
seed.summary,
seed.body_html,
TRIM(REPLACE(REGEXP_REPLACE(seed.body_html, '<[^>]+>', ' '), '&nbsp;', ' ')),
'',
JSON_ARRAY(),
3,
@now,
0,
@admin_id,
@now
FROM tmp_portal_content_seed seed
JOIN hg_content content
ON content.tenant_id = @tenant_id
AND content.content_key = seed.content_key;
UPDATE hg_content c
JOIN hg_content_version v
ON v.content_id = c.id
AND v.version_no = 1
SET c.published_version_id = v.id
WHERE c.tenant_id = @tenant_id;
COMMIT;
DROP TEMPORARY TABLE IF EXISTS tmp_portal_content_seed;
SELECT
c.id,
c.content_key,
c.content_type,
c.title,
c.publish_status,
v.version_no,
CHAR_LENGTH(v.body_text) AS body_text_length
FROM hg_content c
JOIN hg_content_version v ON v.id = c.published_version_id
WHERE c.tenant_id = @tenant_id
ORDER BY c.sort, c.id;
@@ -0,0 +1,66 @@
-- 会员等级初始化数据
-- 来源:admin.olons.top 会员等级列表(2026-10-09)
-- 金额统一转换为分;佣金比例统一转换为万分比。
-- 脚本可重复执行,并兼容早期本地演示等级编码。
SET NAMES utf8mb4;
SET @tenant_id = 0;
SET @admin_id = COALESCE((SELECT id FROM hg_admin_member ORDER BY id LIMIT 1), 1);
SET @now = NOW(3);
START TRANSACTION;
-- 复用已有演示等级,避免会员、任务等关联关系失效。
UPDATE hg_app_member_level SET level_code='VIP2',name='白银会员' WHERE tenant_id=@tenant_id AND level_code='DEMO_VIP2';
UPDATE hg_app_member_level SET level_code='VIP3',name='黄金会员' WHERE tenant_id=@tenant_id AND level_code='DEMO_VIP3';
UPDATE hg_app_member_level SET level_code='VIP4',name='铂金会员' WHERE tenant_id=@tenant_id AND level_code='DEMO_VIP_DISABLED';
INSERT INTO hg_app_member_level
(`tenant_id`,`level_code`,`name`,`icon_attachment_id`,`icon_url`,`current_version_id`,`member_count`,`status`,`sort`,`remark`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`)
SELECT @tenant_id,x.level_code,x.name,0,'',0,0,1,x.sort,'原管理系统会员等级初始化',@admin_id,@admin_id,@now,@now,NULL
FROM (
SELECT 'VIP1' level_code,'普通会员' name,10 sort
UNION ALL SELECT 'VIP2','白银会员',20
UNION ALL SELECT 'VIP3','黄金会员',30
UNION ALL SELECT 'VIP4','铂金会员',40
UNION ALL SELECT 'VIP5','钻石会员',50
UNION ALL SELECT 'VIP6','星耀会员',60
UNION ALL SELECT 'VIP7','至尊会员',70
) x
ON DUPLICATE KEY UPDATE
`name`=VALUES(`name`),`icon_attachment_id`=0,`icon_url`='',`status`=1,`sort`=VALUES(`sort`),
`remark`=VALUES(`remark`),`updated_by`=@admin_id,`updated_at`=@now,`deleted_at`=NULL,`deleted_by`=0;
INSERT INTO hg_app_member_level_version
(`tenant_id`,`level_id`,`version_no`,`upgrade_amount`,`gift_amount`,`daily_order_limit`,`commission_rate`,`daily_withdraw_limit`,`rule_json`,`publish_status`,`effective_at`,`published_at`,`approval_request_id`,`base_version_id`,`version`,`remark`,`created_by`,`updated_by`,`created_at`,`updated_at`)
SELECT @tenant_id,l.id,1,x.upgrade_amount,x.gift_amount,x.daily_order_limit,x.commission_rate,x.daily_withdraw_limit,
JSON_OBJECT('source','admin.olons.top','initialized',TRUE),3,NULL,@now,0,0,0,'原管理系统会员等级初始化',@admin_id,@admin_id,@now,@now
FROM hg_app_member_level l
JOIN (
SELECT 'VIP1' level_code,50000 upgrade_amount,2000 gift_amount,10 daily_order_limit,180 commission_rate,4 daily_withdraw_limit
UNION ALL SELECT 'VIP2',188800,8800,20,200,5
UNION ALL SELECT 'VIP3',1000000,18800,30,220,10
UNION ALL SELECT 'VIP4',3000000,38800,40,300,15
UNION ALL SELECT 'VIP5',5000000,58800,50,350,20
UNION ALL SELECT 'VIP6',8888800,188800,80,400,100
UNION ALL SELECT 'VIP7',18888800,288800,1000,500,100
) x ON x.level_code=l.level_code
WHERE l.tenant_id=@tenant_id
ON DUPLICATE KEY UPDATE
`upgrade_amount`=VALUES(`upgrade_amount`),`gift_amount`=VALUES(`gift_amount`),
`daily_order_limit`=VALUES(`daily_order_limit`),`commission_rate`=VALUES(`commission_rate`),
`daily_withdraw_limit`=VALUES(`daily_withdraw_limit`),`rule_json`=VALUES(`rule_json`),
`publish_status`=3,`effective_at`=NULL,`published_at`=@now,`approval_request_id`=0,
`remark`=VALUES(`remark`),`updated_by`=@admin_id,`updated_at`=@now;
UPDATE hg_app_member_level l
JOIN hg_app_member_level_version v ON v.level_id=l.id AND v.version_no=1
SET l.current_version_id=v.id,l.updated_by=@admin_id,l.updated_at=@now
WHERE l.tenant_id=@tenant_id AND l.level_code IN ('VIP1','VIP2','VIP3','VIP4','VIP5','VIP6','VIP7');
UPDATE hg_app_member_level l
SET l.member_count=(SELECT COUNT(*) FROM hg_app_member m WHERE m.level_id=l.id AND m.deleted_at IS NULL)
WHERE l.tenant_id=@tenant_id AND l.level_code IN ('VIP1','VIP2','VIP3','VIP4','VIP5','VIP6','VIP7');
COMMIT;
File diff suppressed because one or more lines are too long
+656
View File
@@ -0,0 +1,656 @@
CREATE TABLE `hg_addon_hgexample_table` ( -- 插件_案例_表格
`id` INTEGER NOT NULL , -- ID
`category_id` INTEGER NOT NULL , -- 分类ID
`flag` TEXT DEFAULT NULL , -- 标签
`title` TEXT NOT NULL , -- 标题
`description` TEXT NOT NULL , -- 描述
`content` TEXT DEFAULT NULL , -- 内容
`image` TEXT DEFAULT NULL , -- 单图
`images` TEXT DEFAULT NULL , -- 多图
`attachfile` TEXT DEFAULT NULL , -- 附件
`attachfiles` TEXT DEFAULT NULL , -- 多附件
`map` TEXT DEFAULT NULL , -- 动态键值对
`star` decimal(5,1) DEFAULT 0.0 , -- 推荐星
`price` decimal(10,2) NOT NULL DEFAULT 0.00 , -- 价格
`views` INTEGER DEFAULT NULL , -- 浏览次数
`activity_at` date DEFAULT NULL , -- 活动时间
`start_at` datetime DEFAULT NULL , -- 开启时间
`end_at` datetime DEFAULT NULL , -- 结束时间
`switch` INTEGER DEFAULT NULL , -- 开关
`sort` INTEGER DEFAULT NULL , -- 排序
`avatar` TEXT DEFAULT '' , -- 头像
`sex` INTEGER DEFAULT NULL , -- 性别
`qq` TEXT DEFAULT '' , -- QQ
`email` TEXT DEFAULT '' , -- 邮箱
`mobile` TEXT DEFAULT '' , -- 手机号码
`hobby` TEXT DEFAULT NULL , -- 爱好
`channel` INTEGER DEFAULT 1 , -- 渠道
`city_id` INTEGER DEFAULT 0 , -- 所在城市
`pid` INTEGER NOT NULL , -- 上级ID
`level` INTEGER DEFAULT 1 , -- 树等级
`tree` TEXT DEFAULT NULL , -- 关系树
`remark` TEXT DEFAULT NULL , -- 备注
`status` INTEGER DEFAULT 1 , -- 状态
`created_by` INTEGER DEFAULT 0 , -- 创建者
`updated_by` INTEGER DEFAULT 0 , -- 更新者
`created_at` datetime DEFAULT NULL , -- 创建时间
`updated_at` datetime DEFAULT NULL , -- 修改时间
`deleted_at` datetime DEFAULT NULL , -- 删除时间
PRIMARY KEY (`id`)
);
CREATE TABLE `hg_addon_hgexample_tenant_order` ( -- 多租户_充值订单
`id` INTEGER NOT NULL , -- ID
`tenant_id` INTEGER DEFAULT NULL, -- 租户ID
`merchant_id` INTEGER NOT NULL, -- 商户ID
`user_id` INTEGER NOT NULL, -- 用户ID
`product_name` TEXT DEFAULT NULL, -- 购买产品
`order_sn` TEXT DEFAULT NULL, -- 订单号
`money` decimal(10,2) NOT NULL, -- 充值金额
`remark` TEXT DEFAULT NULL, -- 备注
`status` INTEGER DEFAULT 1, -- 订单状态
`created_at` datetime DEFAULT NULL, -- 创建时间
`updated_at` datetime DEFAULT NULL, -- 修改时间
PRIMARY KEY (`id`)
);
CREATE TABLE `hg_admin_cash` ( -- 管理员_提现记录表
`id` INTEGER NOT NULL , -- ID
`member_id` INTEGER NOT NULL , -- 管理员ID
`money` decimal(10,2) NOT NULL , -- 提现金额
`fee` decimal(10,2) NOT NULL , -- 手续费
`last_money` decimal(10,2) NOT NULL , -- 最终到账金额
`ip` TEXT NOT NULL , -- 申请人IP
`status` INTEGER NOT NULL , -- 状态
`msg` TEXT NOT NULL , -- 处理结果
`handle_at` datetime DEFAULT NULL , -- 处理时间
`created_at` datetime NOT NULL , -- 申请时间
PRIMARY KEY (`id`)
);
CREATE TABLE `hg_admin_credits_log` ( -- 管理员_资产变动表
`id` INTEGER NOT NULL PRIMARY KEY, -- 变动ID
`member_id` INTEGER DEFAULT 0, -- 管理员ID
`app_id` TEXT DEFAULT NULL, -- 应用id
`addons_name` TEXT NOT NULL DEFAULT '', -- 插件名称
`credit_type` TEXT NOT NULL DEFAULT '', -- 变动类型
`credit_group` TEXT DEFAULT NULL, -- 变动组别
`before_num` decimal(10,2) DEFAULT 0.00, -- 变动前
`num` decimal(10,2) DEFAULT 0.00, -- 变动数据
`after_num` decimal(10,2) DEFAULT 0.00, -- 变动后
`remark` TEXT DEFAULT NULL, -- 备注
`ip` TEXT DEFAULT NULL, -- 操作人IP
`map_id` INTEGER DEFAULT 0, -- 关联ID
`status` INTEGER DEFAULT 1, -- 状态
`created_at` datetime DEFAULT NULL, -- 创建时间
`updated_at` datetime DEFAULT NULL -- 修改时间
);
CREATE TABLE `hg_admin_dept` ( -- 管理员_部门
`id` INTEGER NOT NULL PRIMARY KEY, -- 部门ID
`pid` INTEGER DEFAULT 0, -- 父部门ID
`name` TEXT DEFAULT NULL, -- 部门名称
`code` TEXT DEFAULT NULL, -- 部门编码
`type` TEXT DEFAULT NULL, -- 部门类型
`leader` TEXT DEFAULT NULL, -- 负责人
`phone` TEXT DEFAULT NULL, -- 联系电话
`email` TEXT DEFAULT NULL, -- 邮箱
`level` INTEGER NOT NULL, -- 关系树等级
`tree` TEXT DEFAULT NULL, -- 关系树
`sort` INTEGER DEFAULT 0, -- 排序
`status` INTEGER DEFAULT 1, -- 部门状态
`created_at` datetime DEFAULT NULL, -- 创建时间
`updated_at` datetime DEFAULT NULL -- 更新时间
);
CREATE TABLE `hg_admin_member` ( -- 管理员_用户表
`id` INTEGER NOT NULL PRIMARY KEY, -- 管理员ID
`dept_id` INTEGER DEFAULT 0, -- 部门ID
`role_id` INTEGER DEFAULT 10, -- 角色ID
`real_name` TEXT DEFAULT '', -- 真实姓名
`username` TEXT NOT NULL DEFAULT '', -- 帐号
`password_hash` char(32) NOT NULL DEFAULT '', -- 密码
`salt` char(16) NOT NULL, -- 密码盐
`password_reset_token` TEXT DEFAULT '', -- 密码重置令牌
`integral` decimal(10,2) DEFAULT 0.00, -- 积分
`balance` decimal(10,2) DEFAULT 0.00, -- 余额
`avatar` char(150) DEFAULT '', -- 头像
`sex` INTEGER DEFAULT 1, -- 性别
`qq` TEXT DEFAULT '', -- qq
`email` TEXT DEFAULT '', -- 邮箱
`mobile` TEXT DEFAULT '', -- 手机号码
`birthday` date DEFAULT NULL, -- 生日
`city_id` INTEGER DEFAULT 0, -- 城市编码
`address` TEXT DEFAULT '', -- 联系地址
`pid` INTEGER NOT NULL, -- 上级管理员ID
`level` INTEGER DEFAULT 1, -- 关系树等级
`tree` TEXT NOT NULL, -- 关系树
`invite_code` TEXT DEFAULT NULL, -- 邀请码
`cash` TEXT DEFAULT NULL, -- 提现配置
`last_active_at` datetime DEFAULT NULL, -- 最后活跃时间
`remark` TEXT DEFAULT NULL, -- 备注
`status` INTEGER DEFAULT 1, -- 状态
`created_at` datetime DEFAULT NULL, -- 创建时间
`updated_at` datetime DEFAULT NULL -- 修改时间
);
CREATE TABLE `hg_admin_member_post` ( -- 管理员_用户岗位关联
`member_id` INTEGER NOT NULL, -- 管理员ID
`post_id` INTEGER NOT NULL, -- 岗位ID
PRIMARY KEY (`member_id`, `post_id`)
);
CREATE TABLE `hg_admin_member_role` ( -- 管理员_用户角色关联
`member_id` INTEGER NOT NULL, -- 管理员ID
`role_id` INTEGER NOT NULL, -- 角色ID
PRIMARY KEY (`member_id`, `role_id`)
);
CREATE TABLE `hg_admin_menu` ( -- 管理员_菜单权限
`id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, -- 菜单ID
`pid` INTEGER DEFAULT 0, -- 父菜单ID
`level` INTEGER NOT NULL DEFAULT 1, -- 关系树等级
`tree` TEXT NOT NULL, -- 关系树
`title` TEXT NOT NULL, -- 菜单名称
`name` TEXT NOT NULL, -- 名称编码
`path` TEXT DEFAULT NULL, -- 路由地址
`icon` TEXT DEFAULT NULL, -- 菜单图标
`type` INTEGER NOT NULL DEFAULT 1, -- 菜单类型(1目录 2菜单 3按钮)
`redirect` TEXT DEFAULT NULL, -- 重定向地址
`permissions` TEXT DEFAULT NULL, -- 菜单包含权限集合
`permission_name` TEXT DEFAULT NULL, -- 权限名称
`component` TEXT NOT NULL, -- 组件路径
`always_show` INTEGER DEFAULT 0, -- 取消自动计算根路由模式
`active_menu` TEXT DEFAULT NULL, -- 高亮菜单编码
`is_root` INTEGER DEFAULT 0, -- 是否跟路由
`is_frame` INTEGER DEFAULT 1, -- 是否内嵌
`frame_src` TEXT DEFAULT NULL, -- 内联外部地址
`keep_alive` INTEGER DEFAULT 0, -- 缓存该路由
`hidden` INTEGER DEFAULT 0, -- 是否隐藏
`affix` INTEGER DEFAULT 0, -- 是否固定
`sort` INTEGER DEFAULT 0, -- 排序
`remark` TEXT DEFAULT NULL, -- 备注
`status` INTEGER DEFAULT 1, -- 菜单状态
`updated_at` datetime DEFAULT NULL, -- 更新时间
`created_at` datetime DEFAULT NULL -- 创建时间
);
CREATE TABLE `hg_admin_notice` ( -- 管理员_通知公告
`id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, -- 公告ID
`title` TEXT NOT NULL, -- 公告标题
`type` INTEGER NOT NULL, -- 公告类型
`tag` INTEGER DEFAULT NULL, -- 标签
`content` TEXT NOT NULL, -- 公告内容
`receiver` TEXT DEFAULT NULL, -- 接收者
`remark` TEXT DEFAULT NULL, -- 备注
`sort` INTEGER NOT NULL DEFAULT 0, -- 排序
`status` INTEGER DEFAULT 1, -- 公告状态
`created_by` INTEGER DEFAULT NULL, -- 发送人
`updated_by` INTEGER DEFAULT 0, -- 修改人
`created_at` datetime DEFAULT NULL, -- 创建时间
`updated_at` datetime DEFAULT NULL, -- 更新时间
`deleted_at` datetime DEFAULT NULL -- 删除时间
);
CREATE TABLE `hg_admin_notice_read` ( -- 管理员_公告已读记录
`id` INTEGER NOT NULL , -- 记录ID
`notice_id` INTEGER NOT NULL, -- 公告ID
`member_id` INTEGER NOT NULL, -- 会员ID
`clicks` INTEGER DEFAULT 1, -- 已读次数
`updated_at` datetime DEFAULT NULL, -- 更新时间
`created_at` datetime DEFAULT NULL, -- 阅读时间
PRIMARY KEY (`id`)
);
CREATE TABLE `hg_admin_oauth` ( -- 管理员_第三方登录
`id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, -- 主键
`member_id` INTEGER DEFAULT 0, -- 用户ID
`unionid` TEXT DEFAULT '', -- 唯一ID
`oauth_client` TEXT DEFAULT NULL, -- 授权组别
`oauth_openid` TEXT DEFAULT NULL, -- 授权开放ID
`sex` INTEGER DEFAULT 1, -- 性别
`nickname` TEXT DEFAULT NULL, -- 昵称
`head_portrait` TEXT DEFAULT NULL, -- 头像
`birthday` date DEFAULT NULL, -- 生日
`country` TEXT DEFAULT '', -- 国家
`province` TEXT DEFAULT '', -- 省
`city` TEXT DEFAULT '', -- 市
`status` INTEGER DEFAULT 1, -- 状态
`created_at` datetime DEFAULT NULL, -- 创建时间
`updated_at` datetime DEFAULT NULL -- 修改时间
);
CREATE TABLE `hg_admin_order` ( -- 管理员_充值订单
`id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, -- 主键
`member_id` INTEGER DEFAULT 0, -- 管理员id
`order_type` TEXT NOT NULL, -- 订单类型
`product_id` INTEGER DEFAULT NULL, -- 产品id
`order_sn` TEXT DEFAULT '', -- 关联订单号
`money` decimal(10,2) NOT NULL, -- 充值金额
`remark` TEXT DEFAULT NULL, -- 备注
`refund_reason` TEXT DEFAULT NULL, -- 退款原因
`reject_refund_reason` TEXT DEFAULT NULL, -- 拒绝退款原因
`status` INTEGER DEFAULT 1, -- 状态
`created_at` datetime DEFAULT NULL, -- 创建时间
`updated_at` datetime DEFAULT NULL -- 修改时间
);
CREATE TABLE `hg_admin_post` ( -- 管理员_岗位
`id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, -- 岗位ID
`code` TEXT NOT NULL, -- 岗位编码
`name` TEXT NOT NULL, -- 岗位名称
`remark` TEXT DEFAULT NULL, -- 备注
`sort` INTEGER NOT NULL, -- 排序
`status` INTEGER NOT NULL, -- 状态
`created_at` datetime DEFAULT NULL, -- 创建时间
`updated_at` datetime DEFAULT NULL -- 更新时间
);
CREATE TABLE `hg_admin_role` ( -- 管理员_角色信息
`id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, -- 角色ID
`name` TEXT NOT NULL, -- 角色名称
`key` TEXT NOT NULL, -- 角色权限字符串
`data_scope` INTEGER DEFAULT 1, -- 数据范围
`custom_dept` TEXT DEFAULT NULL, -- 自定义部门权限
`pid` INTEGER DEFAULT 0, -- 上级角色ID
`level` INTEGER NOT NULL DEFAULT 1, -- 关系树等级
`tree` TEXT DEFAULT NULL, -- 关系树
`remark` TEXT DEFAULT NULL, -- 备注
`sort` INTEGER NOT NULL DEFAULT 0, -- 排序
`status` INTEGER NOT NULL DEFAULT 1, -- 角色状态
`created_at` datetime DEFAULT NULL, -- 创建时间
`updated_at` datetime DEFAULT NULL -- 更新时间
);
CREATE TABLE `hg_admin_role_casbin` (
`id` INTEGER NOT NULL ,
`p_type` TEXT DEFAULT NULL,
`v0` TEXT DEFAULT NULL,
`v1` TEXT DEFAULT NULL,
`v2` TEXT DEFAULT NULL,
`v3` TEXT DEFAULT NULL,
`v4` TEXT DEFAULT NULL,
`v5` TEXT DEFAULT NULL,
PRIMARY KEY (`id`)
);
CREATE TABLE `hg_admin_role_menu` ( -- 管理员_角色菜单关联
`role_id` INTEGER NOT NULL, -- 角色ID
`menu_id` INTEGER NOT NULL, -- 菜单ID
PRIMARY KEY (`role_id`, `menu_id`)
);
CREATE TABLE `hg_pay_log` ( -- 支付_支付日志
`id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, -- 主键
`member_id` INTEGER DEFAULT 0, -- 会员ID
`app_id` TEXT DEFAULT NULL, -- 应用ID
`addons_name` TEXT DEFAULT '', -- 插件名称
`order_sn` TEXT DEFAULT '', -- 关联订单号
`order_group` TEXT DEFAULT '', -- 组别[默认统一支付类型]
`openid` TEXT DEFAULT '', -- openid
`mch_id` TEXT DEFAULT '', -- 商户支付账户
`subject` TEXT DEFAULT NULL, -- 订单标题
`detail` TEXT DEFAULT NULL, -- 支付商品详情
`auth_code` TEXT DEFAULT '', -- 刷卡码
`out_trade_no` TEXT DEFAULT '', -- 商户订单号
`transaction_id` TEXT DEFAULT NULL, -- 交易号
`pay_type` TEXT NOT NULL, -- 支付类型
`pay_amount` decimal(10,2) NOT NULL DEFAULT 0.00, -- 支付金额
`actual_amount` decimal(10,2) DEFAULT NULL, -- 实付金额
`pay_status` INTEGER DEFAULT 0, -- 支付状态
`pay_at` datetime DEFAULT NULL, -- 支付时间
`trade_type` TEXT DEFAULT '', -- 交易类型
`refund_sn` TEXT DEFAULT NULL, -- 退款单号
`is_refund` INTEGER DEFAULT 0, -- 是否退款
`custom` text DEFAULT NULL, -- 自定义参数
`create_ip` TEXT DEFAULT NULL, -- 创建者IP
`pay_ip` TEXT DEFAULT NULL, -- 支付者IP
`notify_url` TEXT DEFAULT NULL, -- 支付通知回调地址
`return_url` TEXT DEFAULT NULL, -- 买家付款成功跳转地址
`trace_ids` TEXT DEFAULT NULL, -- 链路ID集合
`status` INTEGER DEFAULT 1, -- 状态
`created_at` datetime DEFAULT NULL, -- 创建时间
`updated_at` datetime DEFAULT NULL -- 修改时间
);
CREATE TABLE `hg_pay_refund` ( -- 支付_退款记录
`id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, -- 主键ID
`member_id` INTEGER DEFAULT 0, -- 会员ID
`app_id` TEXT DEFAULT NULL, -- 应用ID
`order_sn` TEXT DEFAULT NULL, -- 业务订单号
`refund_trade_no` TEXT DEFAULT NULL, -- 退款交易号
`refund_money` decimal(10,2) DEFAULT NULL, -- 退款金额
`refund_way` INTEGER DEFAULT 1, -- 退款方式
`ip` TEXT DEFAULT NULL, -- 申请者IP
`reason` TEXT DEFAULT NULL, -- 申请退款原因
`remark` TEXT DEFAULT NULL, -- 退款备注
`status` INTEGER DEFAULT 1, -- 退款状态
`created_at` datetime DEFAULT NULL, -- 申请时间
`updated_at` datetime DEFAULT NULL -- 更新时间
);
CREATE TABLE `hg_sys_addons_config` ( -- 系统_插件配置
`id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, -- 配置ID
`addon_name` TEXT NOT NULL, -- 插件名称
`group` TEXT NOT NULL, -- 分组
`name` TEXT DEFAULT '', -- 参数名称
`type` TEXT NOT NULL, -- 键值类型:string,int,uint,bool,datetime,date
`key` TEXT DEFAULT '', -- 参数键名
`value` TEXT DEFAULT '', -- 参数键值
`default_value` TEXT NOT NULL, -- 默认值
`sort` INTEGER NOT NULL DEFAULT 0, -- 排序
`tip` TEXT DEFAULT NULL, -- 变量描述
`is_default` INTEGER DEFAULT 0, -- 是否为系统默认
`status` INTEGER DEFAULT 1, -- 状态
`created_at` datetime DEFAULT NULL, -- 创建时间
`updated_at` datetime DEFAULT NULL -- 更新时间
);
CREATE TABLE `hg_sys_addons_install` ( -- 系统_插件安装记录
`id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, -- 主键
`name` TEXT NOT NULL, -- 插件名称
`version` TEXT NOT NULL DEFAULT '', -- 版本号
`status` INTEGER DEFAULT 1, -- 状态
`created_at` datetime DEFAULT NULL, -- 创建时间
`updated_at` datetime DEFAULT NULL -- 更新时间
);
CREATE TABLE `hg_sys_attachment` ( -- 系统_附件管理
`id` INTEGER NOT NULL PRIMARY KEY , -- 文件ID
`app_id` TEXT NOT NULL, -- 应用ID
`member_id` INTEGER DEFAULT 0, -- 管理员ID
`cate_id` INTEGER DEFAULT 0, -- 上传分类
`drive` TEXT DEFAULT NULL, -- 上传驱动
`name` TEXT DEFAULT NULL, -- 文件原始名
`kind` TEXT DEFAULT NULL, -- 上传类型
`mime_type` TEXT NOT NULL DEFAULT '', -- 扩展类型
`naive_type` TEXT NOT NULL, -- NaiveUI类型
`path` TEXT DEFAULT NULL, -- 本地路径
`file_url` TEXT DEFAULT NULL, -- url
`size` INTEGER DEFAULT 0, -- 文件大小
`ext` TEXT DEFAULT NULL, -- 扩展名
`md5` TEXT DEFAULT NULL, -- md5校验码
`status` INTEGER NOT NULL DEFAULT 1, -- 状态
`created_at` datetime DEFAULT NULL, -- 创建时间
`updated_at` datetime DEFAULT NULL -- 修改时间
);
CREATE TABLE `hg_sys_blacklist` ( -- 系统_访问黑名单
`id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, -- 黑名单ID
`ip` TEXT DEFAULT '', -- IP地址
`remark` TEXT DEFAULT NULL, -- 备注
`status` INTEGER DEFAULT 1, -- 状态
`created_at` datetime DEFAULT NULL, -- 创建时间
`updated_at` datetime DEFAULT NULL -- 更新时间
);
CREATE TABLE `hg_sys_config` ( -- 系统_配置
`id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, -- 配置ID
`group` TEXT NOT NULL, -- 配置分组
`name` TEXT DEFAULT '', -- 参数名称
`type` TEXT NOT NULL, -- 键值类型:string,int,uint,bool,datetime,date
`key` TEXT DEFAULT '', -- 参数键名
`value` TEXT DEFAULT NULL, -- 参数键值
`default_value` TEXT NOT NULL, -- 默认值
`sort` INTEGER NOT NULL DEFAULT 0, -- 排序
`tip` TEXT DEFAULT NULL, -- 变量描述
`is_default` INTEGER DEFAULT 0, -- 是否为系统默认
`status` INTEGER DEFAULT 1, -- 状态
`created_at` datetime DEFAULT NULL, -- 创建时间
`updated_at` datetime DEFAULT NULL -- 更新时间
);
CREATE TABLE `hg_sys_cron` ( -- 系统_定时任务
`id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, -- 任务ID
`group_id` INTEGER NOT NULL, -- 分组ID
`title` TEXT NOT NULL, -- 任务标题
`name` TEXT DEFAULT NULL, -- 任务方法
`params` TEXT DEFAULT NULL, -- 函数参数
`pattern` TEXT NOT NULL, -- 表达式
`policy` INTEGER NOT NULL DEFAULT 1, -- 策略
`count` INTEGER NOT NULL DEFAULT 0, -- 执行次数
`sort` INTEGER DEFAULT 0, -- 排序
`remark` TEXT DEFAULT NULL, -- 备注
`status` INTEGER DEFAULT 1, -- 任务状态
`created_at` datetime DEFAULT NULL, -- 创建时间
`updated_at` datetime DEFAULT NULL -- 更新时间
);
CREATE TABLE `hg_sys_cron_group` ( -- 系统_定时任务分组
`id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, -- 任务分组ID
`pid` INTEGER NOT NULL, -- 父类任务分组ID
`name` TEXT DEFAULT '', -- 分组名称
`is_default` INTEGER DEFAULT 0, -- 是否默认
`sort` INTEGER DEFAULT 0, -- 排序
`remark` TEXT DEFAULT NULL, -- 备注
`status` INTEGER DEFAULT 1, -- 分组状态
`created_at` datetime DEFAULT NULL, -- 创建时间
`updated_at` datetime DEFAULT NULL -- 更新时间
);
CREATE TABLE `hg_sys_dict_data` ( -- 系统_字典数据
`id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, -- 字典数据ID
`label` TEXT DEFAULT NULL, -- 字典标签
`value` TEXT DEFAULT NULL, -- 字典键值
`value_type` TEXT NOT NULL DEFAULT 'string', -- 键值数据类型:string,int,uint,bool,datetime,date
`type` TEXT DEFAULT NULL, -- 字典类型
`list_class` TEXT DEFAULT NULL, -- 表格回显样式
`is_default` INTEGER DEFAULT 2, -- 是否为系统默认
`sort` INTEGER DEFAULT 0, -- 字典排序
`remark` TEXT DEFAULT NULL, -- 备注
`status` INTEGER DEFAULT 1, -- 状态
`created_at` datetime DEFAULT NULL, -- 创建时间
`updated_at` datetime DEFAULT NULL -- 更新时间
);
CREATE TABLE `hg_sys_dict_type` ( -- 系统_字典类型
`id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, -- 字典类型ID
`pid` INTEGER NOT NULL, -- 父类字典类型ID
`name` TEXT DEFAULT '', -- 字典类型名称
`type` TEXT DEFAULT '', -- 字典类型
`sort` INTEGER DEFAULT 0, -- 排序
`remark` TEXT DEFAULT NULL, -- 备注
`status` INTEGER DEFAULT 1, -- 字典类型状态
`created_at` datetime DEFAULT NULL, -- 创建时间
`updated_at` datetime DEFAULT NULL -- 更新时间
);
CREATE TABLE `hg_sys_ems_log` ( -- 系统_邮件发送记录
`id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, -- 主键
`event` TEXT NOT NULL, -- 事件
`email` TEXT NOT NULL, -- 邮箱地址,多个用;隔开
`code` TEXT DEFAULT '', -- 验证码
`times` INTEGER NOT NULL, -- 验证次数
`content` TEXT DEFAULT NULL, -- 邮件内容
`ip` TEXT DEFAULT NULL, -- ip地址
`status` INTEGER DEFAULT 1, -- 状态(1未验证,2已验证)
`created_at` datetime DEFAULT NULL, -- 创建时间
`updated_at` datetime DEFAULT NULL -- 更新时间
);
CREATE TABLE `hg_sys_gen_codes` ( -- 系统_代码生成记录
`id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, -- 生成ID
`gen_type` INTEGER UNSIGNED NOT NULL, -- 生成类型
`gen_template` INTEGER DEFAULT 0, -- 生成模板
`var_name` TEXT NOT NULL, -- 实体命名
`options` TEXT DEFAULT NULL, -- 配置选项
`db_name` TEXT DEFAULT NULL, -- 数据库名称
`table_name` TEXT NOT NULL, -- 主表名称
`table_comment` TEXT DEFAULT NULL, -- 主表注释
`dao_name` TEXT DEFAULT NULL, -- 主表dao模型
`master_columns` TEXT DEFAULT NULL, -- 主表字段
`addon_name` TEXT DEFAULT NULL, -- 插件名称
`status` INTEGER DEFAULT 1, -- 生成状态
`created_at` datetime DEFAULT NULL, -- 创建时间
`updated_at` datetime DEFAULT NULL -- 更新时间
);
CREATE TABLE `hg_sys_gen_curd_demo` ( -- 系统_生成curd演示
`id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, -- ID
`category_id` INTEGER DEFAULT 0, -- 分类ID
`title` TEXT NOT NULL, -- 标题
`description` TEXT DEFAULT '', -- 描述
`content` text DEFAULT NULL, -- 内容
`image` TEXT DEFAULT NULL, -- 单图
`attachfile` TEXT DEFAULT NULL, -- 附件
`city_id` INTEGER DEFAULT 0, -- 所在城市
`switch` INTEGER DEFAULT 1, -- 显示开关
`sort` INTEGER DEFAULT NULL, -- 排序
`status` INTEGER DEFAULT 1, -- 状态
`created_by` INTEGER DEFAULT 0, -- 创建者
`updated_by` INTEGER DEFAULT 0, -- 更新者
`created_at` datetime DEFAULT NULL, -- 创建时间
`updated_at` datetime DEFAULT NULL, -- 修改时间
`deleted_at` datetime DEFAULT NULL -- 删除时间
);
CREATE TABLE `hg_sys_gen_tree_demo` ( -- 系统_生成树演示
`id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, -- ID
`pid` INTEGER DEFAULT NULL, -- 上级ID
`level` INTEGER DEFAULT 1, -- 关系树级别
`tree` TEXT DEFAULT NULL, -- 关系树
`category_id` INTEGER DEFAULT 0, -- 分类ID
`title` TEXT NOT NULL, -- 标题
`description` TEXT DEFAULT NULL, -- 描述
`sort` INTEGER DEFAULT NULL, -- 排序
`status` INTEGER DEFAULT 1, -- 状态
`created_by` INTEGER DEFAULT 0, -- 创建者
`updated_by` INTEGER DEFAULT 0, -- 更新者
`created_at` datetime DEFAULT NULL, -- 创建时间
`updated_at` datetime DEFAULT NULL, -- 修改时间
`deleted_at` datetime DEFAULT NULL -- 删除时间
);
CREATE TABLE `hg_sys_log` ( -- 系统_全局日志
`id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, -- 日志ID
`req_id` TEXT DEFAULT NULL, -- 对外ID
`app_id` TEXT DEFAULT '', -- 应用ID
`merchant_id` INTEGER DEFAULT 0, -- 商户ID
`member_id` INTEGER DEFAULT 0, -- 用户ID
`method` TEXT DEFAULT NULL, -- 提交类型
`module` TEXT DEFAULT NULL, -- 访问模块
`url` TEXT DEFAULT NULL, -- 提交url
`get_data` TEXT, -- get数据
`post_data` TEXT, -- post数据
`header_data` TEXT, -- header数据
`ip` TEXT DEFAULT NULL, -- IP地址
`province_id` INTEGER NOT NULL DEFAULT 0, -- 省编码
`city_id` INTEGER NOT NULL DEFAULT 0, -- 市编码
`error_code` INTEGER DEFAULT 0, -- 报错code
`error_msg` TEXT DEFAULT NULL, -- 对外错误提示
`error_data` TEXT, -- 报错日志
`user_agent` TEXT DEFAULT NULL, -- UA信息
`take_up_time` INTEGER DEFAULT 0, -- 请求耗时
`timestamp` INTEGER DEFAULT 0, -- 响应时间
`status` INTEGER NOT NULL DEFAULT 1, -- 状态
`created_at` datetime DEFAULT NULL, -- 创建时间
`updated_at` datetime DEFAULT NULL -- 修改时间
);
CREATE TABLE IF NOT EXISTS "hg_sys_login_log" ( -- 系统_登录日志
`id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, -- 日志ID
`req_id` TEXT DEFAULT NULL, -- 请求ID
`member_id` INTEGER DEFAULT 0, -- 用户ID
`username` TEXT DEFAULT NULL, -- 用户名
`response` TEXT, -- 响应数据
`login_at` datetime DEFAULT NULL, -- 登录时间
`login_ip` TEXT DEFAULT NULL, -- 登录IP
`province_id` INTEGER DEFAULT NULL, -- 省编码
`city_id` INTEGER DEFAULT NULL, -- 市编码
`user_agent` TEXT DEFAULT NULL, -- UA信息
`err_msg` TEXT DEFAULT NULL, -- 错误提示
`status` INTEGER NOT NULL DEFAULT 1, -- 状态
`created_at` datetime DEFAULT NULL, -- 创建时间
`updated_at` datetime DEFAULT NULL -- 修改时间
);
CREATE TABLE `hg_sys_serve_license` ( -- 系统_服务许可证
`id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, -- 许可ID
`group` TEXT NOT NULL, -- 分组
`name` TEXT NOT NULL, -- 许可名称
`appid` TEXT NOT NULL, -- 应用ID
`secret_key` TEXT DEFAULT NULL, -- 应用秘钥
`remote_addr` TEXT DEFAULT NULL, -- 最后连接地址
`online_limit` INTEGER DEFAULT 1, -- 在线限制
`login_times` INTEGER DEFAULT NULL, -- 登录次数
`last_login_at` datetime DEFAULT NULL, -- 最后登录时间
`last_active_at` datetime DEFAULT NULL, -- 最后心跳
`routes` TEXT, -- 路由表,空使用默认分组路由
`allowed_ips` TEXT DEFAULT NULL, -- IP白名单
`end_at` datetime NOT NULL, -- 授权有效期
`remark` TEXT DEFAULT NULL, -- 备注
`status` INTEGER DEFAULT 1, -- 状态
`created_at` datetime DEFAULT NULL, -- 创建时间
`updated_at` datetime DEFAULT NULL -- 修改时间
);
CREATE TABLE `hg_sys_serve_log` ( -- 系统_服务日志
`id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, -- 日志ID
`trace_id` TEXT DEFAULT NULL, -- 链路ID
`level_format` TEXT DEFAULT NULL, -- 日志级别
`content` text DEFAULT NULL, -- 日志内容
`stack` TEXT, -- 打印堆栈
`line` TEXT NOT NULL, -- 调用行
`trigger_ns` INTEGER DEFAULT NULL, -- 触发时间(ns)
`status` INTEGER NOT NULL DEFAULT 1, -- 状态
`created_at` datetime DEFAULT NULL, -- 创建时间
`updated_at` datetime DEFAULT NULL -- 修改时间
);
CREATE TABLE `hg_sys_sms_log` ( -- 系统_短信发送记录
`id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, -- 主键
`event` TEXT NOT NULL, -- 事件
`mobile` TEXT NOT NULL DEFAULT '', -- 手机号
`code` TEXT DEFAULT '', -- 验证码或短信内容
`times` INTEGER NOT NULL, -- 验证次数
`ip` TEXT DEFAULT NULL, -- ip地址
`status` INTEGER DEFAULT 1, -- 状态(1未验证,2已验证)
`created_at` datetime DEFAULT NULL, -- 创建时间
`updated_at` datetime DEFAULT NULL -- 更新时间
);
CREATE TABLE `hg_test_category` ( -- 测试分类
`id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, -- 分类ID
`name` TEXT NOT NULL, -- 分类名称
`short_name` TEXT DEFAULT NULL, -- 简称
`description` TEXT DEFAULT NULL, -- 描述
`sort` INTEGER NOT NULL, -- 排序
`remark` TEXT DEFAULT NULL, -- 备注
`status` INTEGER DEFAULT 1, -- 状态
`created_at` datetime DEFAULT NULL, -- 创建时间
`updated_at` datetime DEFAULT NULL, -- 修改时间
`deleted_at` datetime DEFAULT NULL -- 删除时间
);
CREATE TABLE `hg_sys_provinces` ( -- 系统_省市区编码
`id` INTEGER NOT NULL PRIMARY KEY, -- 省市区ID
`title` TEXT NOT NULL DEFAULT '', -- 栏目名称
`pinyin` TEXT DEFAULT '', -- 拼音
`lng` TEXT DEFAULT '', -- 经度
`lat` TEXT DEFAULT '', -- 纬度
`pid` INTEGER NOT NULL DEFAULT 0, -- 父栏目
`level` INTEGER NOT NULL DEFAULT 1, -- 关系树等级
`tree` TEXT NOT NULL, -- 关系
`sort` INTEGER DEFAULT 0, -- 排序
`status` INTEGER NOT NULL DEFAULT 1, -- 状态
`created_at` datetime DEFAULT NULL, -- 创建时间
`updated_at` datetime DEFAULT NULL -- 更新时间
);
CREATE TABLE `hg_gen_curd_test` ( -- 测试_代码生成
`id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, -- ID
"name" VARCHAR(50), -- 姓名
"email" VARCHAR(255), -- 邮箱
"address" TEXT, -- 地址
"salt" VARCHAR(50), -- 密码盐
"password" VARCHAR(50), -- 密码
"mark" VARCHAR(255), -- 备注
"permission" TEXT, -- 权限
"created_user_id" INTEGER, -- 创建人
"created_at" DATETIME, -- 创建时间
"updated_at" DATETIME, -- 更新时间
"deleted_at" DATETIME -- 删除时间
);
CREATE INDEX `hg_addon_hgexample_tenant_order_order_sn` ON `hg_addon_hgexample_tenant_order` (`order_sn`);
CREATE INDEX `hg_addon_hgexample_tenant_order_member_id` ON `hg_addon_hgexample_tenant_order` (`user_id`);
CREATE INDEX `hg_addon_hgexample_tenant_order_merchant_id` ON `hg_addon_hgexample_tenant_order` (`merchant_id`);
CREATE INDEX `hg_addon_hgexample_tenant_order_agent_id` ON `hg_addon_hgexample_tenant_order` (`tenant_id`);
CREATE INDEX `hg_admin_cash_admin_id` ON `hg_admin_cash` (`member_id`);
CREATE INDEX `hg_admin_credits_log_member_id` ON `hg_admin_credits_log` (`member_id`);
CREATE INDEX `hg_admin_dept_pid` ON `hg_admin_dept` (`pid`);
CREATE UNIQUE INDEX `hg_admin_member_invite_code` ON `hg_admin_member` (`invite_code`);
CREATE INDEX `hg_admin_member_dept_id` ON `hg_admin_member` (`dept_id`);
CREATE INDEX `hg_admin_member_pid` ON `hg_admin_member` (`pid`);
CREATE UNIQUE INDEX `hg_admin_menu_name` ON `hg_admin_menu` (`name`);
CREATE INDEX `hg_admin_menu_pid` ON `hg_admin_menu` (`pid`);
CREATE INDEX `hg_admin_menu_status` ON `hg_admin_menu` (`status`);
CREATE INDEX `hg_admin_menu_type` ON `hg_admin_menu` (`type`);
CREATE INDEX `hg_admin_oauth_oauth_client` ON `hg_admin_oauth` (`oauth_client`);
CREATE INDEX `hg_admin_oauth_member_id` ON `hg_admin_oauth` (`member_id`);
CREATE INDEX `hg_admin_order_order_sn` ON `hg_admin_order` (`order_sn`);
CREATE INDEX `hg_admin_order_member_id` ON `hg_admin_order` (`member_id`);
CREATE UNIQUE INDEX `hg_pay_log_order_sn` ON `hg_pay_log` (`order_sn`);
CREATE INDEX `hg_pay_log_member_id` ON `hg_pay_log` (`member_id`);
CREATE INDEX `hg_pay_refund_order_sn` ON `hg_pay_refund` (`order_sn`);
CREATE UNIQUE INDEX `hg_sys_addons_config_addon_name_2` ON `hg_sys_addons_config` (`addon_name`);
CREATE INDEX `hg_addons_config_addon_name` ON `hg_sys_addons_config` (`addon_name`);
CREATE UNIQUE INDEX `hg_sys_addons_install_name` ON `hg_sys_addons_install` (`name`);
CREATE INDEX `hg_sys_attachment_md5` ON `hg_sys_attachment` (`md5`);
CREATE UNIQUE INDEX `hg_sys_blacklist_name` ON `hg_sys_blacklist` (`ip`);
CREATE INDEX `hg_sys_config_group` ON `hg_sys_config` (`group`);
CREATE INDEX `hg_sys_config_key` ON `hg_sys_config` (`key`);
CREATE INDEX `hg_sys_dict_data_dict_data_idx` ON `hg_sys_dict_data` (`type`);
CREATE UNIQUE INDEX `hg_sys_dict_type_dict_type` ON `hg_sys_dict_type` (`type`);
CREATE INDEX `hg_sys_ems_log_email` ON `hg_sys_ems_log` (`email`);
CREATE INDEX `hg_sys_log_error_code` ON `hg_sys_log` (`error_code`);
CREATE INDEX `hg_sys_log_req_id` ON `hg_sys_log` (`req_id`);
CREATE INDEX `hg_sys_log_member_id` ON `hg_sys_log` (`member_id`);
CREATE INDEX `hg_sys_login_log_member_id` ON `hg_sys_login_log` (`member_id`);
CREATE INDEX `hg_sys_login_log_req_id` ON `hg_sys_login_log` (`req_id`);
CREATE INDEX `hg_sys_provinces_pid` ON `hg_sys_provinces` (`pid`);
CREATE UNIQUE INDEX `hg_sys_serve_license_appid` ON `hg_sys_serve_license` (`appid`);
CREATE INDEX `hg_sys_serve_log_member_id` ON `hg_sys_serve_log` (`level_format`);
CREATE INDEX `hg_sys_serve_log_traceid` ON `hg_sys_serve_log` (`trace_id`);
CREATE INDEX `hg_sys_sms_log_mobile` ON `hg_sys_sms_log` (`mobile`);