refactor(system): 移动端应用配置从 payment 迁至 platform/system

- 删除 payment.app.mobile 实体链路与 MobileAppAdminController
- 迁入 platform.system:MobileAppTypeEnum/MobilePlatformEnum + entity/dao/service/controller
- API: /admin/mobile-app → /platform/config/mobile-app,权限码 system:config:mobile_app
- 菜单 40504/40505 父级改系统配置(304),路径改 /system/config/mobile-app(update-datas + iam_perm_menu baseline)
This commit is contained in:
DaxPay Dev
2026-07-10 17:58:21 +08:00
parent a1f8979edb
commit 17fb60161d
12 changed files with 62 additions and 34 deletions

View File

@@ -158,8 +158,8 @@ INSERT INTO "public"."iam_perm_menu" VALUES (308, 3, 'system:notify', 'admin', '
INSERT INTO "public"."iam_perm_menu" VALUES (603, 6, 'payment:refund', 'admin', 'RefundOrderList', '退款订单', 'Refund Orders', 'menu.trade.refundOrder', 'lucide:rotate-ccw', 'f', 'f', '/payment/order/RefundOrderList', '/trade/refund-order', NULL, 3, 'f', 't', 'f', 1, 1, 0, 'f', 'menu', NULL, NULL, NULL, NULL, NULL, NULL, '2026-07-03 16:00:00+00', '2026-07-03 16:00:00+00');
INSERT INTO "public"."iam_perm_menu" VALUES (4040115, 40401, 'channel:douyin:app', 'admin', 'DouyinMchAppManage', '抖音应用', 'Douyin App', 'menu.payment.merchant.channelMerchant.douyinApp', NULL, 't', 'f', '/payment/channel/douyin/manage/app/DouyinMchAppManage', '/payment/merchant/channel-merchant/douyin-app-manage', NULL, 13, 'f', 't', 'f', 1, 1, 0, 'f', 'subpage', NULL, NULL, NULL, NULL, NULL, NULL, '2026-06-15 16:00:00+00', '2026-06-15 16:00:00+00');
INSERT INTO "public"."iam_perm_menu" VALUES (40501, 40105, 'payment:config:product_detail', 'admin', 'ProductDetailDispatch', '产品配置详情', 'Product Config Detail', 'menu.payment.config.detail', NULL, 't', 'f', '/payment/config/product/detail/ProductDetailDispatch', '/payment/product-detail', NULL, 2, 'f', 't', 'f', 1, 1, 0, 'f', 'subpage', NULL, NULL, NULL, NULL, NULL, NULL, '2026-06-14 00:00:00+00', '2026-06-27 13:01:24.321883+00');
INSERT INTO "public"."iam_perm_menu" VALUES (40504, 405, 'payment:config:mobile_app', 'admin', 'MobileAppConfig', '移动端应用管理', 'Mobile App Management', 'menu.payment.config.mobileApp', 'lucide:smartphone', 'f', 'f', '/payment/config/mobileApp/MobileAppConfig', '/payment/config/mobile-app', NULL, 5, 'f', 't', 'f', 1, 1, 0, 'f', 'menu', NULL, NULL, NULL, NULL, NULL, NULL, '2026-07-05 00:00:00+00', '2026-07-05 00:00:00+00');
INSERT INTO "public"."iam_perm_menu" VALUES (40505, 40504, 'payment:config:mobile_app_detail', 'admin', 'MobileAppDetail', '移动端应用详情', 'Mobile App Detail', 'menu.payment.config.mobileAppDetail', NULL, 't', 'f', '/payment/config/mobileApp/detail/MobileAppDetail', '/payment/config/mobile-app/detail/:appType', NULL, 1, 'f', 't', 'f', 1, 1, 0, 'f', 'subpage', NULL, NULL, NULL, NULL, NULL, NULL, '2026-07-05 00:00:00+00', '2026-07-05 00:00:00+00');
INSERT INTO "public"."iam_perm_menu" VALUES (40504, 304, 'system:config:mobile_app', 'admin', 'MobileAppConfig', '移动端应用管理', 'Mobile App Management', 'menu.system.config.mobileApp', 'lucide:smartphone', 'f', 'f', '/system/config/mobileApp/MobileAppConfig', '/system/config/mobile-app', NULL, 6, 'f', 't', 'f', 1, 1, 0, 'f', 'menu', NULL, NULL, NULL, NULL, NULL, NULL, '2026-07-05 00:00:00+00', '2026-07-05 00:00:00+00');
INSERT INTO "public"."iam_perm_menu" VALUES (40505, 40504, 'system:config:mobile_app_detail', 'admin', 'MobileAppDetail', '移动端应用详情', 'Mobile App Detail', 'menu.system.config.mobileAppDetail', NULL, 't', 'f', '/system/config/mobileApp/detail/MobileAppDetail', '/system/config/mobile-app/detail/:appType', NULL, 1, 'f', 't', 'f', 1, 1, 0, 'f', 'subpage', NULL, NULL, NULL, NULL, NULL, NULL, '2026-07-05 00:00:00+00', '2026-07-05 00:00:00+00');
INSERT INTO "public"."iam_perm_menu" VALUES (40506, 40105, 'payment:lakala:isv', 'admin', 'LakalaManage', '拉卡拉服务商配置', 'Lakala ISV Configuration', 'menu.payment.lakala.config', NULL, 't', 'f', '/payment/channel/lakala/manage/LakalaManage', '/payment/config/product/lakala-manage', NULL, 5, 'f', 't', 'f', 1, 1, 0, 'f', 'subpage', NULL, NULL, NULL, NULL, NULL, NULL, '2026-07-05 00:00:00+00', '2026-07-05 00:00:00+00');
-- ----------------------------

View File

@@ -0,0 +1,26 @@
-- 升级数据脚本(按顺序执行)
-- 说明: 已部署环境增量更新,执行前请确认版本与备份
-- ----------------------------
-- 2026-07-10 移动端应用配置菜单从 payment 迁到 system 配置
-- 后端包: payment.app.mobile → platform.system.mobile
-- API: /admin/mobile-app → /platform/config/mobile-app
-- 前端: payment/config/mobileApp → system/config/mobileApp
-- ----------------------------
UPDATE "public"."iam_perm_menu"
SET "pid" = 304,
"menu_code" = 'system:config:mobile_app',
"i18n_key" = 'menu.system.config.mobileApp',
"component" = '/system/config/mobileApp/MobileAppConfig',
"path" = '/system/config/mobile-app',
"sort_no" = 6,
"last_modified_time" = CURRENT_TIMESTAMP
WHERE "id" = 40504;
UPDATE "public"."iam_perm_menu"
SET "menu_code" = 'system:config:mobile_app_detail',
"i18n_key" = 'menu.system.config.mobileAppDetail',
"component" = '/system/config/mobileApp/detail/MobileAppDetail',
"path" = '/system/config/mobile-app/detail/:appType',
"last_modified_time" = CURRENT_TIMESTAMP
WHERE "id" = 40505;

View File

@@ -1,11 +1,11 @@
package cn.daxpay.open.payment.web.admin.controller.app.mobile;
package cn.daxpay.open.platform.system.controller.config.mobile;
import cn.daxpay.open.payment.app.mobile.param.MobileAppParam;
import cn.daxpay.open.payment.app.mobile.result.MobileAppResult;
import cn.daxpay.open.payment.app.mobile.service.MobileAppService;
import cn.daxpay.open.platform.core.annotation.PermCode;
import cn.daxpay.open.platform.core.rest.Res;
import cn.daxpay.open.platform.core.rest.result.Result;
import cn.daxpay.open.platform.system.param.mobile.MobileAppParam;
import cn.daxpay.open.platform.system.result.mobile.MobileAppResult;
import cn.daxpay.open.platform.system.service.mobile.MobileAppService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.constraints.NotBlank;
@@ -20,13 +20,13 @@ import java.util.List;
///
/// 平台级移动端应用(商户端/管理端/收银台小程序)的密钥通知用户绑定配置管理
/// 按端类型(appType)+移动平台(platform)维度, 每组合一条配置记录
@PermCode(menuCode = "payment:config:mobile_app")
@PermCode(menuCode = "system:config:mobile_app")
@Validated
@Tag(name = "移动端应用配置管理")
@RestController
@RequestMapping("/admin/mobile-app")
@RequestMapping("/platform/config/mobile-app")
@RequiredArgsConstructor
public class MobileAppAdminController {
public class MobileAppController {
private final MobileAppService mobileAppService;

View File

@@ -1,8 +1,8 @@
package cn.daxpay.open.payment.app.mobile.convert;
package cn.daxpay.open.platform.system.convert.mobile;
import cn.daxpay.open.payment.app.mobile.entity.MobileApp;
import cn.daxpay.open.payment.app.mobile.param.MobileAppParam;
import cn.daxpay.open.payment.app.mobile.result.MobileAppResult;
import cn.daxpay.open.platform.system.entity.mobile.MobileApp;
import cn.daxpay.open.platform.system.param.mobile.MobileAppParam;
import cn.daxpay.open.platform.system.result.mobile.MobileAppResult;
import org.mapstruct.BeanMapping;
import org.mapstruct.Mapper;
import org.mapstruct.MappingTarget;

View File

@@ -1,7 +1,7 @@
package cn.daxpay.open.payment.app.mobile.dao;
package cn.daxpay.open.platform.system.dao.mobile;
import cn.daxpay.open.payment.app.mobile.entity.MobileApp;
import cn.daxpay.open.platform.common.mybatisplus.impl.BaseManager;
import cn.daxpay.open.platform.system.entity.mobile.MobileApp;
import org.springframework.stereotype.Repository;
/// # 移动端应用配置管理器

View File

@@ -1,6 +1,6 @@
package cn.daxpay.open.payment.app.mobile.dao;
package cn.daxpay.open.platform.system.dao.mobile;
import cn.daxpay.open.payment.app.mobile.entity.MobileApp;
import cn.daxpay.open.platform.system.entity.mobile.MobileApp;
import com.github.yulichang.base.MPJBaseMapper;
import org.apache.ibatis.annotations.Mapper;

View File

@@ -1,10 +1,10 @@
package cn.daxpay.open.payment.app.mobile.entity;
package cn.daxpay.open.platform.system.entity.mobile;
import cn.daxpay.open.payment.app.mobile.convert.MobileAppConvert;
import cn.daxpay.open.payment.app.mobile.result.MobileAppResult;
import cn.daxpay.open.platform.common.mybatisplus.base.MpBaseEntity;
import cn.daxpay.open.platform.common.mybatisplus.function.ToResult;
import cn.daxpay.open.platform.common.mybatisplus.handler.encrypt.DataEncryptTypeHandler;
import cn.daxpay.open.platform.system.convert.mobile.MobileAppConvert;
import cn.daxpay.open.platform.system.result.mobile.MobileAppResult;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
@@ -22,11 +22,11 @@ import lombok.experimental.Accessors;
public class MobileApp extends MpBaseEntity implements ToResult<MobileAppResult> {
/// 端类型
/// @see cn.daxpay.open.payment.app.mobile.enums.MobileAppTypeEnum
/// @see cn.daxpay.open.platform.system.enums.MobileAppTypeEnum
private String appType;
/// 移动平台
/// @see cn.daxpay.open.payment.app.mobile.enums.MobilePlatformEnum
/// @see cn.daxpay.open.platform.system.enums.MobilePlatformEnum
private String platform;
/// 应用名称(展示用)

View File

@@ -1,4 +1,4 @@
package cn.daxpay.open.payment.app.mobile.enums;
package cn.daxpay.open.platform.system.enums;
import cn.daxpay.open.platform.core.exception.DataNotExistException;
import cn.daxpay.open.platform.core.i18n.I18nSupport;

View File

@@ -1,4 +1,4 @@
package cn.daxpay.open.payment.app.mobile.enums;
package cn.daxpay.open.platform.system.enums;
import cn.daxpay.open.platform.core.exception.DataNotExistException;
import cn.daxpay.open.platform.core.i18n.I18nSupport;

View File

@@ -1,4 +1,4 @@
package cn.daxpay.open.payment.app.mobile.param;
package cn.daxpay.open.platform.system.param.mobile;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;

View File

@@ -1,4 +1,4 @@
package cn.daxpay.open.payment.app.mobile.result;
package cn.daxpay.open.platform.system.result.mobile;
import cn.daxpay.open.platform.core.result.BaseResult;
import io.swagger.v3.oas.annotations.media.Schema;

View File

@@ -1,12 +1,12 @@
package cn.daxpay.open.payment.app.mobile.service;
package cn.daxpay.open.platform.system.service.mobile;
import cn.daxpay.open.payment.app.mobile.convert.MobileAppConvert;
import cn.daxpay.open.payment.app.mobile.dao.MobileAppManager;
import cn.daxpay.open.payment.app.mobile.entity.MobileApp;
import cn.daxpay.open.payment.app.mobile.param.MobileAppParam;
import cn.daxpay.open.payment.app.mobile.result.MobileAppResult;
import cn.daxpay.open.platform.common.json.util.JacksonUtil;
import cn.daxpay.open.platform.core.exception.DataNotExistException;
import cn.daxpay.open.platform.system.convert.mobile.MobileAppConvert;
import cn.daxpay.open.platform.system.dao.mobile.MobileAppManager;
import cn.daxpay.open.platform.system.entity.mobile.MobileApp;
import cn.daxpay.open.platform.system.param.mobile.MobileAppParam;
import cn.daxpay.open.platform.system.result.mobile.MobileAppResult;
import cn.hutool.core.util.DesensitizedUtil;
import cn.hutool.core.util.StrUtil;
import lombok.RequiredArgsConstructor;
@@ -24,7 +24,7 @@ import java.util.Set;
///
/// 平台级配置, 按端类型(appType)+移动平台(platform)维度管理
/// app_config/notify_config [cn.daxpay.open.platform.common.mybatisplus.handler.encrypt.DataEncryptTypeHandler] 加密入库;
/// 返回前端时对 app_config 内敏感键(appSecret/privateKey/clientSecret)脱敏;
/// 返回前端时对 app_config 内敏感键(appSecret/privateKey/alipayPublicKey/证书等)脱敏;
/// 保存时敏感键为空则保留库中原值(配合前端 diffForm)
@Slf4j
@Service
@@ -32,8 +32,10 @@ import java.util.Set;
public class MobileAppService {
/// app_config 中需要脱敏/保护的敏感键
/// 含支付宝小程序公钥字段与证书模式三本证书
private static final Set<String> SENSITIVE_KEYS = Set.of(
"appSecret", "privateKey", "alipayPublicKey", "clientSecret");
"appSecret", "privateKey", "alipayPublicKey", "clientSecret",
"appCert", "alipayCert", "alipayRootCert");
private final MobileAppManager manager;