From 8b7abd97e7b69800789134ed8e809e19a5b5ba74 Mon Sep 17 00:00:00 2001 From: 啊鑫 <t2856754968@163.com> Date: 星期三, 17 九月 2025 00:30:27 +0800 Subject: [PATCH] 111 --- Controllers/AuthController.cs | 555 +++++++++++++++++++++++++++--------------------------- 1 files changed, 277 insertions(+), 278 deletions(-) diff --git a/Controllers/AuthController.cs b/Controllers/AuthController.cs index e9a308e..4e3c064 100644 --- a/Controllers/AuthController.cs +++ b/Controllers/AuthController.cs @@ -1,27 +1,24 @@ -using Microsoft.AspNetCore.Mvc; -using System; -using System.Collections.Generic; -using System.Net.Http; -using System.Security.Cryptography; -using Newtonsoft.Json; -using System.Text; using System.Net; -using Microsoft.AspNetCore.DataProtection; -using Microsoft.Extensions.Hosting; +using System.Security.Cryptography; +using System.Text; +using Microsoft.AspNetCore.Mvc; +using Newtonsoft.Json; -namespace NewPdaSqlServer.Controllers +namespace NewPdaSqlServer.Controllers; + +[Route("api/[controller]")] +[ApiController] +public class AuthController : ControllerBase { - [Route("api/[controller]")] - [ApiController] - public class AuthController : ControllerBase - { - // 浠ヤ笅甯搁噺寤鸿鏀惧湪appsettings.json閰嶇疆鏂囦欢涓� - private const string APPID = "303233EF-AC39-40C1-8364-AC989C6258A5"; - private const string SECRET = "30b41949-bcfb-48f8-9847-feb6e043fe72"; - // private const string SPK = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApobID/gwmD9OofMG1gEcE94NCMeTYUq1cam/7ADZmxHCVpF143GaHWhqDdY0TTVbcUElsQ71DzAG2j3itWlIJBK5fVGwCo3sPpAvUDdKMh+Uivcp7yxdy/IDRA/PS4JARuEyM4cVJLhIOU2KnSlbIkheeoDkDgfaxu9kKrWnozJLiYraVTVDz9PdRX7fQdP+Zu/xB9txAGw4kvOm9HwgrzaSRdZEhisTJ5yyoNW/dLXtWKXA0cKhKOOIFu12TOrv/It6hl1ShTUuy79Pa51M9Oc2dEfVs1tluNXPWo1uFXQbBaJxdqZEJJlK7iW2uQFIao2O4XFHYThwy2+6116LtwIDAQAB"; - private const string HOST = "http://192.168.1.149:8099"; + // 浠ヤ笅甯搁噺寤鸿鏀惧湪appsettings.json閰嶇疆鏂囦欢涓� + private const string APPID = "303233EF-AC39-40C1-8364-AC989C6258A5"; - private const string SPK = @"-----BEGIN PUBLIC KEY----- + private const string SECRET = "30b41949-bcfb-48f8-9847-feb6e043fe72"; + + // private const string SPK = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApobID/gwmD9OofMG1gEcE94NCMeTYUq1cam/7ADZmxHCVpF143GaHWhqDdY0TTVbcUElsQ71DzAG2j3itWlIJBK5fVGwCo3sPpAvUDdKMh+Uivcp7yxdy/IDRA/PS4JARuEyM4cVJLhIOU2KnSlbIkheeoDkDgfaxu9kKrWnozJLiYraVTVDz9PdRX7fQdP+Zu/xB9txAGw4kvOm9HwgrzaSRdZEhisTJ5yyoNW/dLXtWKXA0cKhKOOIFu12TOrv/It6hl1ShTUuy79Pa51M9Oc2dEfVs1tluNXPWo1uFXQbBaJxdqZEJJlK7iW2uQFIao2O4XFHYThwy2+6116LtwIDAQAB"; + private const string HOST = "http://192.168.1.149:8099"; + + private const string SPK = @"-----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApobID/gwmD9OofMG1gEc E94NCMeTYUq1cam/7ADZmxHCVpF143GaHWhqDdY0TTVbcUElsQ71DzAG2j3itWlI JBK5fVGwCo3sPpAvUDdKMh+Uivcp7yxdy/IDRA/PS4JARuEyM4cVJLhIOU2KnSlb @@ -31,135 +28,138 @@ twIDAQAB -----END PUBLIC KEY-----"; - [HttpGet("token")] - public ActionResult<string> GetToken() + [HttpGet("token")] + public ActionResult<string> GetToken() + { + var http = new HttpManager(); + var headers = new Dictionary<string, string> { - var http = new HttpManager(); + ["appid"] = APPID, + ["secret"] = RsaHelper.Encrypt(SECRET, SPK) + }; + + try + { + var response = http.PostDataSSL( + $"{HOST}/api/ec/dev/auth/applytoken", + new Dictionary<string, string>(), headers); + + if (!string.IsNullOrEmpty(response)) + { + var res = JsonConvert.DeserializeObject<dynamic>(response); + if (res.status == "true") return res.token.ToString(); + } + + return BadRequest("Failed to get token"); + } + catch (Exception ex) + { + // 寤鸿浣跨敤ILogger璁板綍鏃ュ織 + return StatusCode(500, ex.Message); + } + } + + + [HttpPost("getUserId")] + public ActionResult<string> GetUserId() + { + var http = new HttpManager(); + var tokenResult = http.GetToken(); + if (tokenResult is not null) + { + var url = new Uri($"{HOST}/api/T100/GetSecretUserId"); + return http.GetOaKqInfo(url, tokenResult, "DQ000344"); + } + + return BadRequest("鏃犳硶鑾峰彇鏈夋晥Token"); + } + + + [HttpPost("createWorkflow")] + public ActionResult<string> CreateWorkflowRequest( + [FromBody] WorkflowRequestDto request) + { + try + { + // 鍔犲瘑鐢ㄦ埛ID + var encryptedUserId = RsaHelper.Encrypt(request.UserId, SPK); + var token = GetToken().ToString(); + // 璁剧疆璇锋眰澶� var headers = new Dictionary<string, string> { + ["token"] = token, ["appid"] = APPID, - ["secret"] = RsaHelper.Encrypt(SECRET, SPK) + ["userid"] = encryptedUserId }; - try + // 鏋勫缓璇锋眰鍙傛暟 + var parameters = new Dictionary<string, string> { - var response = http.PostDataSSL($"{HOST}/api/ec/dev/auth/applytoken", - new Dictionary<string, string>(), headers); + ["mainData"] = JsonConvert.SerializeObject(request.MainData), + ["workflowId"] = "", + ["requestName"] = request.RequestName + }; - if (!string.IsNullOrEmpty(response)) - { - var res = JsonConvert.DeserializeObject<dynamic>(response); - if (res.status == "true") - { - return res.token.ToString(); - } - } - return BadRequest("Failed to get token"); - } - catch (Exception ex) - { - // 寤鸿浣跨敤ILogger璁板綍鏃ュ織 - return StatusCode(500, ex.Message); - } + // 娣诲姞鍙�夊弬鏁� + if (request.DetailData != null) + parameters.Add("detailData", + JsonConvert.SerializeObject(request.DetailData)); + + if (request.OtherParams != null) + parameters.Add("otherParams", + JsonConvert.SerializeObject(request.OtherParams)); + + // 鍙戦�佽姹� + var response = new HttpManager().PostDataSSL( + $"{HOST}/api/workflow/paService/doCreateRequest", + parameters, + headers); + + dynamic res = JsonConvert.DeserializeObject(response); + if (res.code == "SUCCESS") + return Ok(res.data.requestid.ToString()); + + return BadRequest($"鍒涘缓澶辫触锛歿res.errMsg}"); } - - - [HttpPost("getUserId")] - public ActionResult<string> GetUserId() + catch (Exception ex) { - var http = new HttpManager(); - var tokenResult = http.GetToken(); - if (tokenResult is not null) - { - Uri url = new Uri($"{HOST}/api/T100/GetSecretUserId"); - return http.GetOaKqInfo(url, tokenResult, "DQ000344"); - } - return BadRequest("鏃犳硶鑾峰彇鏈夋晥Token"); - } - - - - [HttpPost("createWorkflow")] - public ActionResult<string> CreateWorkflowRequest([FromBody] WorkflowRequestDto request) - { - try - { - // 鍔犲瘑鐢ㄦ埛ID - var encryptedUserId = RsaHelper.Encrypt(request.UserId, SPK); - var token = GetToken().ToString(); - // 璁剧疆璇锋眰澶� - var headers = new Dictionary<string, string> - { - ["token"] = token, - ["appid"] = APPID, - ["userid"] = encryptedUserId - }; - - // 鏋勫缓璇锋眰鍙傛暟 - var parameters = new Dictionary<string, string> - { - ["mainData"] = JsonConvert.SerializeObject(request.MainData), - ["workflowId"] = "", - ["requestName"] = request.RequestName - }; - - // 娣诲姞鍙�夊弬鏁� - if (request.DetailData != null) - parameters.Add("detailData", JsonConvert.SerializeObject(request.DetailData)); - - if (request.OtherParams != null) - parameters.Add("otherParams", JsonConvert.SerializeObject(request.OtherParams)); - - // 鍙戦�佽姹� - var response = new HttpManager().PostDataSSL( - $"{HOST}/api/workflow/paService/doCreateRequest", - parameters, - headers); - - dynamic res = JsonConvert.DeserializeObject(response); - if (res.code == "SUCCESS") - return Ok(res.data.requestid.ToString()); - - return BadRequest($"鍒涘缓澶辫触锛歿res.errMsg}"); - } - catch (Exception ex) - { - return StatusCode(500, $"绯荤粺寮傚父锛歿ex.Message}"); - } + return StatusCode(500, $"绯荤粺寮傚父锛歿ex.Message}"); } } +} - public static class RsaHelper +public static class RsaHelper +{ + public static string Encrypt(string plainText, string publicKeyPem) { - public static string Encrypt(string plainText, string publicKeyPem) - { - // 灏哖EM鏍煎紡鐨勫叕閽ヨ浆鎹负XML鏍煎紡 - var rsa = RSA.Create(); - rsa.ImportFromPem(publicKeyPem); // 浣跨敤.NET 5+ 鍐呯疆PEM瑙f瀽鏂规硶 + // 灏哖EM鏍煎紡鐨勫叕閽ヨ浆鎹负XML鏍煎紡 + var rsa = RSA.Create(); + rsa.ImportFromPem(publicKeyPem); // 浣跨敤.NET 5+ 鍐呯疆PEM瑙f瀽鏂规硶 - var parameters = rsa.ExportParameters(false); - string publicKeyXml = $"<RSAKeyValue><Modulus>{Convert.ToBase64String(parameters.Modulus)}</Modulus><Exponent>{Convert.ToBase64String(parameters.Exponent)}</Exponent></RSAKeyValue>"; + var parameters = rsa.ExportParameters(false); + var publicKeyXml = + $"<RSAKeyValue><Modulus>{Convert.ToBase64String(parameters.Modulus)}</Modulus><Exponent>{Convert.ToBase64String(parameters.Exponent)}</Exponent></RSAKeyValue>"; - using var rsaProvider = new RSACryptoServiceProvider(); - rsaProvider.FromXmlString(publicKeyXml); // 浣跨敤杞崲鍚庣殑XML鏍煎紡鍏挜 + using var rsaProvider = new RSACryptoServiceProvider(); + rsaProvider.FromXmlString(publicKeyXml); // 浣跨敤杞崲鍚庣殑XML鏍煎紡鍏挜 - var data = Encoding.UTF8.GetBytes(plainText); - var encrypted = rsaProvider.Encrypt(data, false); - return Convert.ToBase64String(encrypted); - } + var data = Encoding.UTF8.GetBytes(plainText); + var encrypted = rsaProvider.Encrypt(data, false); + return Convert.ToBase64String(encrypted); } +} - public class HttpManager - { - private readonly HttpClient _client = new HttpClient(); +public class HttpManager +{ + // 浠ヤ笅甯搁噺寤鸿鏀惧湪appsettings.json閰嶇疆鏂囦欢涓� + private const string APPID = "303233EF-AC39-40C1-8364-AC989C6258A5"; - // 浠ヤ笅甯搁噺寤鸿鏀惧湪appsettings.json閰嶇疆鏂囦欢涓� - private const string APPID = "303233EF-AC39-40C1-8364-AC989C6258A5"; - private const string SECRET = "30b41949-bcfb-48f8-9847-feb6e043fe72"; - // private const string SPK = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApobID/gwmD9OofMG1gEcE94NCMeTYUq1cam/7ADZmxHCVpF143GaHWhqDdY0TTVbcUElsQ71DzAG2j3itWlIJBK5fVGwCo3sPpAvUDdKMh+Uivcp7yxdy/IDRA/PS4JARuEyM4cVJLhIOU2KnSlbIkheeoDkDgfaxu9kKrWnozJLiYraVTVDz9PdRX7fQdP+Zu/xB9txAGw4kvOm9HwgrzaSRdZEhisTJ5yyoNW/dLXtWKXA0cKhKOOIFu12TOrv/It6hl1ShTUuy79Pa51M9Oc2dEfVs1tluNXPWo1uFXQbBaJxdqZEJJlK7iW2uQFIao2O4XFHYThwy2+6116LtwIDAQAB"; - private const string HOST = "http://192.168.1.149:8099"; + private const string SECRET = "30b41949-bcfb-48f8-9847-feb6e043fe72"; - private const string SPK = @"-----BEGIN PUBLIC KEY----- + // private const string SPK = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApobID/gwmD9OofMG1gEcE94NCMeTYUq1cam/7ADZmxHCVpF143GaHWhqDdY0TTVbcUElsQ71DzAG2j3itWlIJBK5fVGwCo3sPpAvUDdKMh+Uivcp7yxdy/IDRA/PS4JARuEyM4cVJLhIOU2KnSlbIkheeoDkDgfaxu9kKrWnozJLiYraVTVDz9PdRX7fQdP+Zu/xB9txAGw4kvOm9HwgrzaSRdZEhisTJ5yyoNW/dLXtWKXA0cKhKOOIFu12TOrv/It6hl1ShTUuy79Pa51M9Oc2dEfVs1tluNXPWo1uFXQbBaJxdqZEJJlK7iW2uQFIao2O4XFHYThwy2+6116LtwIDAQAB"; + private const string HOST = "http://192.168.1.149:8099"; + + private const string SPK = @"-----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApobID/gwmD9OofMG1gEc E94NCMeTYUq1cam/7ADZmxHCVpF143GaHWhqDdY0TTVbcUElsQ71DzAG2j3itWlI JBK5fVGwCo3sPpAvUDdKMh+Uivcp7yxdy/IDRA/PS4JARuEyM4cVJLhIOU2KnSlb @@ -169,160 +169,159 @@ twIDAQAB -----END PUBLIC KEY-----"; - public string PostDataSSL(string url, - Dictionary<string, string> parameters, - Dictionary<string, string> headers) - { - var request = new HttpRequestMessage(HttpMethod.Post, url); + private readonly HttpClient _client = new(); - foreach (var header in headers) - { - request.Headers.Add(header.Key, header.Value); - } - - // 濡傛灉闇�瑕佽〃鍗曞弬鏁� - if (parameters.Count > 0) - { - request.Content = new FormUrlEncodedContent(parameters); - } - - var response = _client.SendAsync(request).Result; - return response.Content.ReadAsStringAsync().Result; - } - - public string GetToken() - { - - - var http = new HttpManager(); - var headers = new Dictionary<string, string> - { - ["appid"] = APPID, - ["secret"] = RsaHelper.Encrypt(SECRET, SPK) - }; - - try - { - var response = http.PostDataSSL($"{HOST}/api/ec/dev/auth/applytoken", - new Dictionary<string, string>(), headers); - - if (!string.IsNullOrEmpty(response)) - { - var res = JsonConvert.DeserializeObject<dynamic>(response); - if (res.status == "true") - { - return res.token.ToString(); - } - } - return "token涓嶅瓨鍦紒"; - } - catch (Exception ex) - { - // 寤鸿浣跨敤ILogger璁板綍鏃ュ織 - return ex.Message; - } - } - - public string GetOaKqInfo(Uri url, string token, string userId) - { - try - { - ServicePointManager.ServerCertificateValidationCallback += (s, cert, chain, sslPolicyErrors) => true; - ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; - - var request = WebRequest.Create(url) as HttpWebRequest; - request.Method = "POST"; - request.Timeout = 20000; // 20绉掕秴鏃� - request.ContentType = "application/x-www-form-urlencoded; charset=utf-8"; // 鏄庣‘鎸囧畾缂栫爜 - - // 娣诲姞璋冭瘯澶翠俊鎭� - request.Headers.Add("appid", APPID); - request.Headers.Add("token", token); - request.Headers.Add("userId", userId); - - // 鏋勫缓甯︽椂鍖虹殑鏃ユ湡鍙傛暟 - var postData = new StringBuilder(); - var dateParam = DateTime.Now.AddDays(-1).ToString("yyyy-MM-ddTHH:mm:sszzz"); - postData.AppendFormat("KQSDATE={0}&KQEDATE={1}", - Uri.EscapeDataString(dateParam), - Uri.EscapeDataString(dateParam)); - - byte[] byteData = Encoding.UTF8.GetBytes(postData.ToString()); // 鏀圭敤UTF8缂栫爜 - - // 鏇村畬鍠勭殑璇锋眰鍐欏叆 - using (var stream = request.GetRequestStream()) - { - stream.Write(byteData, 0, byteData.Length); - } - - // 澶勭悊HTTP閿欒鐘舵�佺爜 - using (var response = request.GetResponse() as HttpWebResponse) - { - if (response.StatusCode != HttpStatusCode.OK) - { - throw new WebException($"鏈嶅姟鍣ㄨ繑鍥為敊璇姸鎬佺爜: {(int)response.StatusCode} {response.StatusDescription}"); - } - - using (var stream = response.GetResponseStream()) - using (var reader = new StreamReader(stream, Encoding.UTF8)) - { - return reader.ReadToEnd(); - } - } - } - catch (WebException ex) when (ex.Response is HttpWebResponse response) - { - // 璁板綍璇︾粏閿欒淇℃伅 - var errorStream = response.GetResponseStream(); - using (var reader = new StreamReader(errorStream)) - { - string errorDetails = reader.ReadToEnd(); - throw new Exception($"璇锋眰澶辫触 [Status: {response.StatusCode}]: {errorDetails}", ex); - } - } - catch (Exception ex) - { - throw new Exception($"璇锋眰寮傚父: {ex.Message}", ex); - } - } - } - - // 鏂板DTO绫� - public class WorkflowRequestDto + public string PostDataSSL(string url, + Dictionary<string, string> parameters, + Dictionary<string, string> headers) { - /// <summary> - /// 鐢ㄦ埛璁よ瘉浠ょ墝 - /// </summary> - public string Token { get; set; } + var request = new HttpRequestMessage(HttpMethod.Post, url); - /// <summary> - /// 鍘熷鐢ㄦ埛ID锛堝姞瀵嗗墠锛� - /// </summary> - public string UserId { get; set; } + foreach (var header in headers) + request.Headers.Add(header.Key, header.Value); - /// <summary> - /// 娴佺▼ID锛堝繀濉級 - /// </summary> - public int WorkflowId { get; set; } + // 濡傛灉闇�瑕佽〃鍗曞弬鏁� + if (parameters.Count > 0) + request.Content = new FormUrlEncodedContent(parameters); - /// <summary> - /// 娴佺▼鏍囬锛堝繀濉級 - /// </summary> - public string RequestName { get; set; } - - /// <summary> - /// 涓昏〃鏁版嵁锛堝繀濉級 - /// </summary> - public Dictionary<string, object> MainData { get; set; } - - /// <summary> - /// 鏄庣粏琛ㄦ暟鎹紙閫夊~锛� - /// </summary> - public Dictionary<string, object> DetailData { get; set; } - - /// <summary> - /// 鍏朵粬鍙傛暟锛堥�夊~锛� - /// </summary> - public Dictionary<string, object> OtherParams { get; set; } + var response = _client.SendAsync(request).Result; + return response.Content.ReadAsStringAsync().Result; } + + public string GetToken() + { + var http = new HttpManager(); + var headers = new Dictionary<string, string> + { + ["appid"] = APPID, + ["secret"] = RsaHelper.Encrypt(SECRET, SPK) + }; + + try + { + var response = http.PostDataSSL( + $"{HOST}/api/ec/dev/auth/applytoken", + new Dictionary<string, string>(), headers); + + if (!string.IsNullOrEmpty(response)) + { + var res = JsonConvert.DeserializeObject<dynamic>(response); + if (res.status == "true") return res.token.ToString(); + } + + return "token涓嶅瓨鍦紒"; + } + catch (Exception ex) + { + // 寤鸿浣跨敤ILogger璁板綍鏃ュ織 + return ex.Message; + } + } + + public string GetOaKqInfo(Uri url, string token, string userId) + { + try + { + ServicePointManager.ServerCertificateValidationCallback += + (s, cert, chain, sslPolicyErrors) => true; + ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; + + var request = WebRequest.Create(url) as HttpWebRequest; + request.Method = "POST"; + request.Timeout = 20000; // 20绉掕秴鏃� + request.ContentType = + "application/x-www-form-urlencoded; charset=utf-8"; // 鏄庣‘鎸囧畾缂栫爜 + + // 娣诲姞璋冭瘯澶翠俊鎭� + request.Headers.Add("appid", APPID); + request.Headers.Add("token", token); + request.Headers.Add("userId", userId); + + // 鏋勫缓甯︽椂鍖虹殑鏃ユ湡鍙傛暟 + var postData = new StringBuilder(); + var dateParam = DateTime.Now.AddDays(-1) + .ToString("yyyy-MM-ddTHH:mm:sszzz"); + postData.AppendFormat("KQSDATE={0}&KQEDATE={1}", + Uri.EscapeDataString(dateParam), + Uri.EscapeDataString(dateParam)); + + var byteData = + Encoding.UTF8.GetBytes(postData.ToString()); // 鏀圭敤UTF8缂栫爜 + + // 鏇村畬鍠勭殑璇锋眰鍐欏叆 + using (var stream = request.GetRequestStream()) + { + stream.Write(byteData, 0, byteData.Length); + } + + // 澶勭悊HTTP閿欒鐘舵�佺爜 + using (var response = request.GetResponse() as HttpWebResponse) + { + if (response.StatusCode != HttpStatusCode.OK) + throw new WebException( + $"鏈嶅姟鍣ㄨ繑鍥為敊璇姸鎬佺爜: {(int)response.StatusCode} {response.StatusDescription}"); + + using (var stream = response.GetResponseStream()) + using (var reader = new StreamReader(stream, Encoding.UTF8)) + { + return reader.ReadToEnd(); + } + } + } + catch (WebException ex) when (ex.Response is HttpWebResponse response) + { + // 璁板綍璇︾粏閿欒淇℃伅 + var errorStream = response.GetResponseStream(); + using (var reader = new StreamReader(errorStream)) + { + var errorDetails = reader.ReadToEnd(); + throw new Exception( + $"璇锋眰澶辫触 [Status: {response.StatusCode}]: {errorDetails}", + ex); + } + } + catch (Exception ex) + { + throw new Exception($"璇锋眰寮傚父: {ex.Message}", ex); + } + } +} + +// 鏂板DTO绫� +public class WorkflowRequestDto +{ + /// <summary> + /// 鐢ㄦ埛璁よ瘉浠ょ墝 + /// </summary> + public string Token { get; set; } + + /// <summary> + /// 鍘熷鐢ㄦ埛ID锛堝姞瀵嗗墠锛� + /// </summary> + public string UserId { get; set; } + + /// <summary> + /// 娴佺▼ID锛堝繀濉級 + /// </summary> + public int WorkflowId { get; set; } + + /// <summary> + /// 娴佺▼鏍囬锛堝繀濉級 + /// </summary> + public string RequestName { get; set; } + + /// <summary> + /// 涓昏〃鏁版嵁锛堝繀濉級 + /// </summary> + public Dictionary<string, object> MainData { get; set; } + + /// <summary> + /// 鏄庣粏琛ㄦ暟鎹紙閫夊~锛� + /// </summary> + public Dictionary<string, object> DetailData { get; set; } + + /// <summary> + /// 鍏朵粬鍙傛暟锛堥�夊~锛� + /// </summary> + public Dictionary<string, object> OtherParams { get; set; } } \ No newline at end of file -- Gitblit v1.9.3