Expand publishing and virtual product workflows

This commit is contained in:
王鹏
2026-09-30 11:00:01 +08:00
parent 4ed8743934
commit b904dcf52e
54 changed files with 2185 additions and 108 deletions

View File

@@ -0,0 +1,140 @@
-- 将旧版 tt_code.code_technology 中的混合技术栈拆分到前端、后端和数据库字段。
--
-- 安全性:
-- 1. 只填充 NULL 或空字符串,不覆盖已经维护的新字段;
-- 2. 保留 code_technology 原值,便于核对和回退;
-- 3. 可重复执行,第二次执行不会再次修改已经填充的数据。
START TRANSACTION;
UPDATE `tt_code`
SET
`frontend_technology` = CASE
WHEN NULLIF(TRIM(`frontend_technology`), '') IS NOT NULL
THEN `frontend_technology`
WHEN LOWER(`code_technology`) LIKE '%vue3%'
THEN CONCAT(
'Vue 3',
IF(LOWER(`code_technology`) LIKE '%elementui%', ' + Element UI', ''),
IF(LOWER(`code_technology`) LIKE '%nodejs14%', ' + Node.js 14',
IF(LOWER(`code_technology`) LIKE '%nodejs%', ' + Node.js', '')),
IF(`code_technology` LIKE '%微信小程序%', ' + 微信小程序', ''),
IF(`code_technology` LIKE '%原生小程序%', ' + 原生小程序', '')
)
WHEN LOWER(`code_technology`) LIKE '%vue2%'
THEN CONCAT(
'Vue 2',
IF(LOWER(`code_technology`) LIKE '%elementui%', ' + Element UI', ''),
IF(LOWER(`code_technology`) LIKE '%nodejs14%', ' + Node.js 14',
IF(LOWER(`code_technology`) LIKE '%nodejs%', ' + Node.js', '')),
IF(`code_technology` LIKE '%微信小程序%', ' + 微信小程序', ''),
IF(`code_technology` LIKE '%原生小程序%', ' + 原生小程序', '')
)
WHEN LOWER(`code_technology`) LIKE '%vue%'
THEN CONCAT(
'Vue',
IF(LOWER(`code_technology`) LIKE '%elementui%', ' + Element UI', ''),
IF(LOWER(`code_technology`) LIKE '%nodejs14%', ' + Node.js 14',
IF(LOWER(`code_technology`) LIKE '%nodejs%', ' + Node.js', ''))
)
WHEN LOWER(`code_technology`) LIKE '%thymeleaf%'
THEN CONCAT(
'Thymeleaf',
IF(LOWER(`code_technology`) LIKE '%bootstrap%', ' + Bootstrap', ''),
IF(LOWER(`code_technology`) LIKE '%jquery%', ' + jQuery', '')
)
WHEN LOWER(`code_technology`) LIKE '%jsp%'
THEN CONCAT(
'JSP',
IF(LOWER(`code_technology`) LIKE '%jstl%', ' + JSTL', ''),
IF(LOWER(`code_technology`) LIKE '%bootstrap%', ' + Bootstrap', ''),
IF(LOWER(`code_technology`) LIKE '%layui%', ' + Layui', '')
)
WHEN LOWER(`code_technology`) LIKE '%html%'
THEN 'HTML'
WHEN LOWER(`code_technology`) LIKE '%bootstrap%'
THEN CONCAT(
'Bootstrap',
IF(LOWER(`code_technology`) LIKE '%highcharts%', ' + Highcharts', '')
)
ELSE '未单独记录'
END,
`backend_technology` = CASE
WHEN NULLIF(TRIM(`backend_technology`), '') IS NOT NULL
THEN `backend_technology`
WHEN LOWER(`code_technology`) LIKE '%php%'
THEN 'PHP'
WHEN LOWER(`code_technology`) LIKE '%servlet%'
THEN CONCAT(
'Java 8 + Servlet',
IF(LOWER(`code_technology`) LIKE '%jdbc%', ' + JDBC', '')
)
WHEN LOWER(`code_technology`) LIKE '%springboot2%'
THEN CONCAT(
'Java 8 + Spring Boot 2',
IF(LOWER(`code_technology`) LIKE '%mybatis-plus%'
OR LOWER(`code_technology`) LIKE '%mybatisplus%', ' + MyBatis-Plus',
IF(LOWER(`code_technology`) LIKE '%mybatis%', ' + MyBatis', ''))
)
WHEN LOWER(`code_technology`) LIKE '%springboot%'
THEN CONCAT(
'Java 8 + Spring Boot',
IF(LOWER(`code_technology`) LIKE '%mybatis-plus%'
OR LOWER(`code_technology`) LIKE '%mybatisplus%', ' + MyBatis-Plus',
IF(LOWER(`code_technology`) LIKE '%mybatis%', ' + MyBatis', ''))
)
WHEN LOWER(`code_technology`) LIKE '%springmvc%'
OR LOWER(`code_technology`) LIKE '%springmmvc%'
OR LOWER(`code_technology`) LIKE '%ssm%'
THEN CONCAT(
'Java 8 + Spring + Spring MVC',
IF(LOWER(`code_technology`) LIKE '%mybatis-plus%'
OR LOWER(`code_technology`) LIKE '%mybatisplus%', ' + MyBatis-Plus',
IF(LOWER(`code_technology`) LIKE '%mybatis%'
OR LOWER(`code_technology`) LIKE '%mabtis%', ' + MyBatis', ''))
)
ELSE '未单独记录'
END,
`database_technology` = CASE
WHEN NULLIF(TRIM(`database_technology`), '') IS NOT NULL
THEN `database_technology`
WHEN LOWER(`code_environment`) LIKE '%mysql8.0%'
OR LOWER(`code_environment`) LIKE '%mysql 8.0%'
OR LOWER(`code_environment`) LIKE '%mysql8%'
OR LOWER(`code_environment`) LIKE '%mysql 8%'
THEN CONCAT(
'MySQL 8.0',
IF(LOWER(`code_environment`) LIKE '%redis%', ' + Redis', '')
)
WHEN LOWER(`code_environment`) LIKE '%mysql5.7%'
OR LOWER(`code_environment`) LIKE '%mysql 5.7%'
THEN CONCAT(
'MySQL 5.7',
IF(LOWER(`code_environment`) LIKE '%redis%', ' + Redis', '')
)
WHEN LOWER(`code_environment`) LIKE '%mysql%'
OR LOWER(`code_technology`) LIKE '%mysql%'
THEN CONCAT(
'MySQL',
IF(LOWER(`code_environment`) LIKE '%redis%', ' + Redis', '')
)
ELSE '未单独记录'
END
WHERE NULLIF(TRIM(`code_technology`), '') IS NOT NULL
AND (
NULLIF(TRIM(`frontend_technology`), '') IS NULL
OR NULLIF(TRIM(`backend_technology`), '') IS NULL
OR NULLIF(TRIM(`database_technology`), '') IS NULL
);
SELECT ROW_COUNT() AS `backfilled_rows`;
COMMIT;
-- 执行结果检查:三个 blank_* 都应为 0。
SELECT
COUNT(*) AS `total`,
SUM(NULLIF(TRIM(`frontend_technology`), '') IS NULL) AS `frontend_blank`,
SUM(NULLIF(TRIM(`backend_technology`), '') IS NULL) AS `backend_blank`,
SUM(NULLIF(TRIM(`database_technology`), '') IS NULL) AS `database_blank`
FROM `tt_code`;

View File

@@ -1,5 +1,6 @@
-- 源码信息新增前端、后端、数据库技术字段。
-- 执行前请先备份数据库。适用于当前项目的 MySQL 数据库。
-- 新增字段后,可执行 source_code_technology_backfill.sql 补齐旧数据。
ALTER TABLE `tt_code`
ADD COLUMN `frontend_technology` VARCHAR(255) NULL COMMENT '前端' AFTER `code_technology`,

View File

@@ -60,8 +60,8 @@ CREATE TABLE app_resource_entitlement (
-- 执行迁移后:
-- 1. 在微信公众平台创建各价格档位的道具并发布;
-- 2. 在若依后台编辑付费资源,填写“价格(分)”和对应的 productId;
-- 3. 同一价格填写同一个 productId,后台会自动维护 app_virtual_product 映射。
-- 2. 执行 sql/virtual_product_menu.sql,重新登录后在“虚拟道具管理”中维护相同的 productId 和价格;
-- 3. 在若依后台编辑付费资源,规格只需填写“价格(分)”,系统按价格自动匹配已启用道具。
-- 当前小程序已发布的微信虚拟道具价格映射。
-- product_id 必须与微信后台保持完全一致(包括 resourse 的现有拼写)。

View File

@@ -0,0 +1,69 @@
-- 虚拟道具管理菜单(可重复执行)
-- 默认与“虚拟支付订单”或“支付订单”同级;均未找到时作为一级菜单显示。
SET @virtual_product_parent_id := COALESCE(
(SELECT parent_id FROM sys_menu WHERE perms = 'app:virtualOrder:list' LIMIT 1),
(SELECT parent_id FROM sys_menu WHERE perms = 'app:order:list' LIMIT 1),
0
);
SET @virtual_product_order_num := COALESCE(
(SELECT MAX(order_num) + 1 FROM sys_menu WHERE parent_id = @virtual_product_parent_id),
1
);
INSERT INTO sys_menu
(menu_name, parent_id, order_num, path, component, query, is_frame, is_cache,
menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
SELECT
'虚拟道具管理', @virtual_product_parent_id, @virtual_product_order_num,
'virtualProduct', 'app/virtualProduct/index', '', 1, 0,
'C', '0', '0', 'app:virtualProduct:list', 'shopping', 'admin', NOW(), '', NULL,
'微信虚拟支付价格档位与道具映射管理'
WHERE NOT EXISTS (
SELECT 1 FROM sys_menu WHERE perms = 'app:virtualProduct:list'
);
SET @virtual_product_menu_id := (
SELECT menu_id FROM sys_menu WHERE perms = 'app:virtualProduct:list' LIMIT 1
);
INSERT INTO sys_menu
(menu_name, parent_id, order_num, path, component, query, is_frame, is_cache,
menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
SELECT '虚拟道具查询', @virtual_product_menu_id, 1, '', '', '', 1, 0,
'F', '0', '0', 'app:virtualProduct:query', '#', 'admin', NOW(), '', NULL, ''
WHERE @virtual_product_menu_id IS NOT NULL
AND NOT EXISTS (SELECT 1 FROM sys_menu WHERE perms = 'app:virtualProduct:query');
INSERT INTO sys_menu
(menu_name, parent_id, order_num, path, component, query, is_frame, is_cache,
menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
SELECT '虚拟道具新增', @virtual_product_menu_id, 2, '', '', '', 1, 0,
'F', '0', '0', 'app:virtualProduct:add', '#', 'admin', NOW(), '', NULL, ''
WHERE @virtual_product_menu_id IS NOT NULL
AND NOT EXISTS (SELECT 1 FROM sys_menu WHERE perms = 'app:virtualProduct:add');
INSERT INTO sys_menu
(menu_name, parent_id, order_num, path, component, query, is_frame, is_cache,
menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
SELECT '虚拟道具修改', @virtual_product_menu_id, 3, '', '', '', 1, 0,
'F', '0', '0', 'app:virtualProduct:edit', '#', 'admin', NOW(), '', NULL, ''
WHERE @virtual_product_menu_id IS NOT NULL
AND NOT EXISTS (SELECT 1 FROM sys_menu WHERE perms = 'app:virtualProduct:edit');
INSERT INTO sys_menu
(menu_name, parent_id, order_num, path, component, query, is_frame, is_cache,
menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
SELECT '虚拟道具删除', @virtual_product_menu_id, 4, '', '', '', 1, 0,
'F', '0', '0', 'app:virtualProduct:remove', '#', 'admin', NOW(), '', NULL, ''
WHERE @virtual_product_menu_id IS NOT NULL
AND NOT EXISTS (SELECT 1 FROM sys_menu WHERE perms = 'app:virtualProduct:remove');
INSERT INTO sys_menu
(menu_name, parent_id, order_num, path, component, query, is_frame, is_cache,
menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
SELECT '虚拟道具导出', @virtual_product_menu_id, 5, '', '', '', 1, 0,
'F', '0', '0', 'app:virtualProduct:export', '#', 'admin', NOW(), '', NULL, ''
WHERE @virtual_product_menu_id IS NOT NULL
AND NOT EXISTS (SELECT 1 FROM sys_menu WHERE perms = 'app:virtualProduct:export');