diff --git a/server/MiAssessment/src/MiAssessment.Admin/Controllers/ConfigController.cs b/server/MiAssessment/src/MiAssessment.Admin/Controllers/ConfigController.cs index 534247d..8fc08ad 100644 --- a/server/MiAssessment/src/MiAssessment.Admin/Controllers/ConfigController.cs +++ b/server/MiAssessment/src/MiAssessment.Admin/Controllers/ConfigController.cs @@ -27,6 +27,8 @@ public class ConfigController : ControllerBase private static class ConfigKeys { public const string Upload = "uploads"; + public const string Miniprogram = "miniprogram_setting"; + public const string WeixinPay = "weixinpay_setting"; } public ConfigController(IAdminConfigService configService, ILogger logger) @@ -169,4 +171,117 @@ public class ConfigController : ControllerBase return Task.FromResult(ApiResponse.Error(AdminErrorCodes.InternalError, $"连接测试失败: {ex.Message}")); } } + + #region 小程序配置 + + /// + /// 获取小程序配置 + /// + /// 小程序配置 + [HttpGet("miniprogram/get")] + public async Task> GetMiniprogramConfig() + { + try + { + var config = await _configService.GetConfigAsync(ConfigKeys.Miniprogram); + return ApiResponse.Success(config ?? new MiniprogramSetting()); + } + catch (Exception ex) + { + _logger.LogError(ex, "获取小程序配置失败"); + return ApiResponse.Error(AdminErrorCodes.InternalError, "获取小程序配置失败"); + } + } + + /// + /// 更新小程序配置 + /// + /// 小程序配置 + /// 更新结果 + [HttpPost("miniprogram/update")] + [OperationLog("配置管理", "更新小程序配置")] + public async Task> UpdateMiniprogramConfig([FromBody] MiniprogramSetting request) + { + // 验证至少有一个小程序配置 + if (request.Miniprograms == null || request.Miniprograms.Count == 0) + { + return ApiResponse.Error(AdminErrorCodes.InvalidParameter, "至少需要配置一个小程序"); + } + + // 验证每个小程序的必填字段 + foreach (var mp in request.Miniprograms) + { + if (string.IsNullOrWhiteSpace(mp.AppId)) + return ApiResponse.Error(AdminErrorCodes.InvalidParameter, "小程序AppId不能为空"); + if (string.IsNullOrWhiteSpace(mp.AppSecret)) + return ApiResponse.Error(AdminErrorCodes.InvalidParameter, "小程序AppSecret不能为空"); + } + + try + { + var result = await _configService.UpdateConfigAsync(ConfigKeys.Miniprogram, request); + return ApiResponse.Success(result, "小程序配置更新成功"); + } + catch (Exception ex) + { + _logger.LogError(ex, "更新小程序配置失败"); + return ApiResponse.Error(AdminErrorCodes.InternalError, "更新小程序配置失败"); + } + } + + #endregion + + #region 微信支付配置 + + /// + /// 获取微信支付配置 + /// + /// 微信支付配置 + [HttpGet("weixinpay/get")] + public async Task> GetWeixinPayConfig() + { + try + { + var config = await _configService.GetConfigAsync(ConfigKeys.WeixinPay); + return ApiResponse.Success(config ?? new WeixinPaySetting()); + } + catch (Exception ex) + { + _logger.LogError(ex, "获取微信支付配置失败"); + return ApiResponse.Error(AdminErrorCodes.InternalError, "获取微信支付配置失败"); + } + } + + /// + /// 更新微信支付配置 + /// + /// 微信支付配置 + /// 更新结果 + [HttpPost("weixinpay/update")] + [OperationLog("配置管理", "更新微信支付配置")] + public async Task> UpdateWeixinPayConfig([FromBody] WeixinPaySetting request) + { + // 验证商户配置 + if (request.Merchants != null) + { + foreach (var merchant in request.Merchants) + { + if (string.IsNullOrWhiteSpace(merchant.MchId)) + return ApiResponse.Error(AdminErrorCodes.InvalidParameter, "商户号不能为空"); + } + } + + try + { + var result = await _configService.UpdateConfigAsync(ConfigKeys.WeixinPay, request); + return ApiResponse.Success(result, "微信支付配置更新成功"); + } + catch (Exception ex) + { + _logger.LogError(ex, "更新微信支付配置失败"); + return ApiResponse.Error(AdminErrorCodes.InternalError, "更新微信支付配置失败"); + } + } + + #endregion } diff --git a/server/MiAssessment/src/MiAssessment.Admin/Models/Config/MiniprogramSetting.cs b/server/MiAssessment/src/MiAssessment.Admin/Models/Config/MiniprogramSetting.cs new file mode 100644 index 0000000..e6788c7 --- /dev/null +++ b/server/MiAssessment/src/MiAssessment.Admin/Models/Config/MiniprogramSetting.cs @@ -0,0 +1,57 @@ +using System.Text.Json.Serialization; + +namespace MiAssessment.Admin.Models.Config; + +/// +/// 小程序配置 +/// +public class MiniprogramSetting +{ + /// + /// 小程序列表 + /// + [JsonPropertyName("miniprograms")] + public List Miniprograms { get; set; } = new(); +} + +/// +/// 小程序配置项 +/// +public class MiniprogramConfig +{ + /// + /// 小程序名称 + /// + [JsonPropertyName("name")] + public string Name { get; set; } = string.Empty; + + /// + /// AppId + /// + [JsonPropertyName("appid")] + public string AppId { get; set; } = string.Empty; + + /// + /// AppSecret + /// + [JsonPropertyName("appsecret")] + public string? AppSecret { get; set; } + + /// + /// 订单前缀(必须2位) + /// + [JsonPropertyName("order_prefix")] + public string? OrderPrefix { get; set; } + + /// + /// 是否默认 0否 1是 + /// + [JsonPropertyName("is_default")] + public int IsDefault { get; set; } + + /// + /// 关联商户列表 + /// + [JsonPropertyName("merchants")] + public List? Merchants { get; set; } +} diff --git a/server/MiAssessment/src/MiAssessment.Admin/Models/Config/WeixinPaySetting.cs b/server/MiAssessment/src/MiAssessment.Admin/Models/Config/WeixinPaySetting.cs new file mode 100644 index 0000000..6adf79e --- /dev/null +++ b/server/MiAssessment/src/MiAssessment.Admin/Models/Config/WeixinPaySetting.cs @@ -0,0 +1,93 @@ +using System.Text.Json.Serialization; + +namespace MiAssessment.Admin.Models.Config; + +/// +/// 微信支付配置 +/// +public class WeixinPaySetting +{ + /// + /// 商户列表 + /// + [JsonPropertyName("merchants")] + public List Merchants { get; set; } = new(); +} + +/// +/// 微信支付商户配置 +/// +public class WeixinPayMerchant +{ + /// + /// 商户名称 + /// + [JsonPropertyName("name")] + public string Name { get; set; } = string.Empty; + + /// + /// 商户号 + /// + [JsonPropertyName("mch_id")] + public string MchId { get; set; } = string.Empty; + + /// + /// 订单前缀(必须3位) + /// + [JsonPropertyName("order_prefix")] + public string OrderPrefix { get; set; } = string.Empty; + + /// + /// 支付版本: "V2" 或 "V3",默认 "V2" + /// + [JsonPropertyName("pay_version")] + public string PayVersion { get; set; } = "V3"; + + /// + /// APIv3 密钥(32位字符串) + /// + [JsonPropertyName("api_v3_key")] + public string? ApiV3Key { get; set; } + + /// + /// 商户API证书序列号 + /// + [JsonPropertyName("cert_serial_no")] + public string? CertSerialNo { get; set; } + + /// + /// 商户私钥文件路径 + /// + [JsonPropertyName("private_key_path")] + public string? PrivateKeyPath { get; set; } + + /// + /// 微信支付公钥ID + /// + [JsonPropertyName("wechat_public_key_id")] + public string? WechatPublicKeyId { get; set; } + + /// + /// 微信支付公钥文件路径 + /// + [JsonPropertyName("wechat_public_key_path")] + public string? WechatPublicKeyPath { get; set; } + + /// + /// API密钥(V2版本使用) + /// + [JsonPropertyName("api_key")] + public string? ApiKey { get; set; } + + /// + /// 证书路径(V2版本使用) + /// + [JsonPropertyName("cert_path")] + public string? CertPath { get; set; } + + /// + /// 是否启用 + /// + [JsonPropertyName("is_enabled")] + public string? IsEnabled { get; set; } = "1"; +} diff --git a/server/MiAssessment/src/MiAssessment.Admin/admin-web/src/api/system/config.ts b/server/MiAssessment/src/MiAssessment.Admin/admin-web/src/api/system/config.ts index 4ad47a8..e6060d7 100644 --- a/server/MiAssessment/src/MiAssessment.Admin/admin-web/src/api/system/config.ts +++ b/server/MiAssessment/src/MiAssessment.Admin/admin-web/src/api/system/config.ts @@ -55,3 +55,113 @@ export function testCosConnection(data: UploadSetting): Promise> { + return request({ + url: '/admin/config/miniprogram/get', + method: 'get' + }) +} + +/** + * 更新小程序配置 + */ +export function updateMiniprogramConfig(data: MiniprogramSetting): Promise> { + return request({ + url: '/admin/config/miniprogram/update', + method: 'post', + data + }) +} + +// ==================== 微信支付配置 ==================== + +/** + * 微信支付商户配置 + */ +export interface WeixinPayMerchant { + /** 商户名称 */ + name: string + /** 商户号 */ + mch_id: string + /** 订单前缀(3位) */ + order_prefix: string + /** 支付版本 V2/V3 */ + pay_version: string + /** APIv3密钥 */ + api_v3_key?: string + /** 证书序列号 */ + cert_serial_no?: string + /** 商户私钥文件路径 */ + private_key_path?: string + /** 微信支付公钥ID */ + wechat_public_key_id?: string + /** 微信支付公钥文件路径 */ + wechat_public_key_path?: string + /** API密钥(V2) */ + api_key?: string + /** 证书路径(V2) */ + cert_path?: string + /** 是否启用 */ + is_enabled?: string +} + +/** + * 微信支付配置 + */ +export interface WeixinPaySetting { + /** 商户列表 */ + merchants: WeixinPayMerchant[] +} + +/** + * 获取微信支付配置 + */ +export function getWeixinPayConfig(): Promise> { + return request({ + url: '/admin/config/weixinpay/get', + method: 'get' + }) +} + +/** + * 更新微信支付配置 + */ +export function updateWeixinPayConfig(data: WeixinPaySetting): Promise> { + return request({ + url: '/admin/config/weixinpay/update', + method: 'post', + data + }) +} diff --git a/server/MiAssessment/src/MiAssessment.Admin/admin-web/src/views/system/config/index.vue b/server/MiAssessment/src/MiAssessment.Admin/admin-web/src/views/system/config/index.vue new file mode 100644 index 0000000..b617092 --- /dev/null +++ b/server/MiAssessment/src/MiAssessment.Admin/admin-web/src/views/system/config/index.vue @@ -0,0 +1,34 @@ + + + + + diff --git a/server/MiAssessment/src/MiAssessment.Admin/admin-web/src/views/system/config/miniprogram.vue b/server/MiAssessment/src/MiAssessment.Admin/admin-web/src/views/system/config/miniprogram.vue new file mode 100644 index 0000000..de21d92 --- /dev/null +++ b/server/MiAssessment/src/MiAssessment.Admin/admin-web/src/views/system/config/miniprogram.vue @@ -0,0 +1,302 @@ + + + + + diff --git a/server/MiAssessment/src/MiAssessment.Admin/admin-web/src/views/system/config/payment.vue b/server/MiAssessment/src/MiAssessment.Admin/admin-web/src/views/system/config/payment.vue new file mode 100644 index 0000000..2a2ad33 --- /dev/null +++ b/server/MiAssessment/src/MiAssessment.Admin/admin-web/src/views/system/config/payment.vue @@ -0,0 +1,353 @@ + + + + + diff --git a/uniapp/pages/login/index.vue b/uniapp/pages/login/index.vue index e6f8978..fcd06b4 100644 --- a/uniapp/pages/login/index.vue +++ b/uniapp/pages/login/index.vue @@ -14,7 +14,7 @@ - +