Преглед изворни кода

😘1、调整公众号消息发送 2、调整上次base64 3、增加创建机构名称字段记录 4、其他优化

zuohuaijun пре 2 година
родитељ
комит
2d0f833f9f

+ 0 - 1
Admin.NET/Admin.NET.Core/SeedData/SysMenuSeedData.cs

@@ -138,7 +138,6 @@ public class SysMenuSeedData : ISqlSugarEntitySeedData<SysMenu>
             new SysMenu{ Id=1310000000395, Pid=1310000000391, Title="删除", Permission="sysFile:delete", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 },
             new SysMenu{ Id=1310000000396, Pid=1310000000391, Title="编辑", Permission="sysFile:update", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2023-10-27 00:00:00"), OrderNo=100 },
 
-
             new SysMenu{ Id=1310000000401, Pid=1310000000301, Title="打印模板", Path="/platform/print", Name="sysPrint", Component="/system/print/index", Icon="ele-Printer", Type=MenuTypeEnum.Menu, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=190 },
             new SysMenu{ Id=1310000000402, Pid=1310000000401, Title="查询", Permission="sysPrint:page", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 },
             new SysMenu{ Id=1310000000403, Pid=1310000000401, Title="编辑", Permission="sysPrint:update", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 },

+ 16 - 18
Admin.NET/Admin.NET.Core/Service/File/SysFileService.cs

@@ -76,17 +76,24 @@ public class SysFileService : IDynamicApiController, ITransient
         };
     }
 
-    [NonAction]
-    public async Task<FileOutput> UploadFileFromBase64(string strBase64, string fileName, string contentType, string? path)
+    /// <summary>
+    /// 上传文件Base64
+    /// </summary>
+    /// <param name="strBase64"></param>
+    /// <param name="fileName"></param>
+    /// <param name="contentType"></param>
+    /// <param name="path"></param>
+    /// <returns></returns>
+    private async Task<FileOutput> UploadFileFromBase64(string strBase64, string fileName, string contentType, string? path)
     {
         byte[] fileData = Convert.FromBase64String(strBase64);
-        MemoryStream ms = new MemoryStream();
+        var ms = new MemoryStream();
         ms.Write(fileData);
         ms.Seek(0, SeekOrigin.Begin);
         if (string.IsNullOrEmpty(fileName))
-            fileName = "1.jpg";
+            fileName = $"{YitIdHelper.NextId()}.jpg";
         if (string.IsNullOrEmpty(contentType))
-            contentType = contentType;
+            contentType = "image/jpg";
         IFormFile formFile = new FormFile(ms, 0, fileData.Length, "file", fileName)
         {
             Headers = new HeaderDictionary(),
@@ -175,27 +182,18 @@ public class SysFileService : IDynamicApiController, ITransient
     }
 
     /// <summary>
-    /// 更新上传文件信息
+    /// 更新文件
     /// </summary>
     /// <param name="input"></param>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "Update"), HttpPost]
-    [DisplayName("更新上传文件的信息")]
-    public async Task UpdateSysFile(FileInput input)
+    [DisplayName("更新文件")]
+    public async Task UpdateFile(FileInput input)
     {
         var isExist = await _sysFileRep.IsAnyAsync(u => u.Id == input.Id);
         if (!isExist) throw Oops.Oh(ErrorCodeEnum.D8000);
 
-        // await _sysFileRep.UpdateAsync(input.Adapt<SysFile>());
-
-        await _sysFileRep
-            .AsUpdateable()
-            .SetColumns(x => new SysFile()
-            {
-                FileName = input.FileName
-            })
-            .Where(x => x.Id == input.Id)
-            .ExecuteCommandAsync();
+        await _sysFileRep.UpdateAsync(u => new SysFile() { FileName = input.FileName }, u => u.Id == input.Id);
     }
 
     /// <summary>

+ 5 - 5
Admin.NET/Admin.NET.Core/Service/Wechat/Dto/WechatInput.cs

@@ -77,11 +77,11 @@ public class MessageTemplateSendInput
     [Required(ErrorMessage = "接收者的OpenId不能为空")]
     public string ToUserOpenId { get; set; }
 
-    ///// <summary>
-    ///// 模板数据,格式形如 { "key1": { "value": any }, "key2": { "value": any } }
-    ///// </summary>
-    //[Required(ErrorMessage = "模板数据不能为空")]
-    //public Dictionary<string, object> Data { get; set; }
+    /// <summary>
+    /// 模板数据,格式形如 { "key1": { "value": any }, "key2": { "value": any } }
+    /// </summary>
+    [Required(ErrorMessage = "模板数据不能为空")]
+    public Dictionary<string, CgibinMessageSubscribeSendRequest.Types.DataItem> Data { get; set; }
 
     /// <summary>
     /// 模板跳转链接

+ 8 - 1
Admin.NET/Admin.NET.Core/Service/Wechat/SysWechatService.cs

@@ -152,6 +152,13 @@ public class SysWechatService : IDynamicApiController, ITransient
     [DisplayName("发送模板消息")]
     public async Task<dynamic> SendTemplateMessage(MessageTemplateSendInput input)
     {
+        var dataInfo = input.Data.ToDictionary(k => k.Key, k => k.Value);
+        var messageData = new Dictionary<string, CgibinMessageTemplateSendRequest.Types.DataItem>();
+        foreach (var item in dataInfo)
+        {
+            messageData.Add(item.Key, new CgibinMessageTemplateSendRequest.Types.DataItem() { Value = "" + item.Value.Value.ToString() + "" });
+        }
+
         var accessToken = await GetCgibinToken();
         var reqMessage = new CgibinMessageTemplateSendRequest()
         {
@@ -164,7 +171,7 @@ public class SysWechatService : IDynamicApiController, ITransient
                 AppId = _wechatApiHttpClientFactory._wechatOptions.WechatAppId,
                 PagePath = input.MiniProgramPagePath,
             },
-            // Data = input.Data.ToDictionary(k => k.Key, k => (CgibinMessageTemplateSendRequest.Types.DataItem)k.Value)
+            Data = messageData
         };
         var resMessage = await _wechatApiClient.ExecuteCgibinMessageTemplateSendAsync(reqMessage);
         return resMessage;

+ 6 - 0
Admin.NET/Admin.NET.Core/SqlSugar/SqlSugarSetup.cs

@@ -199,6 +199,12 @@ public static class SqlSugarSetup
                         if (createOrgId == 0 || createOrgId == null)
                             entityInfo.SetValue(App.User.FindFirst(ClaimConst.OrgId)?.Value);
                     }
+                    else if (entityInfo.PropertyName == "CreateOrgName")
+                    {
+                        var createOrgName = ((dynamic)entityInfo.EntityValue).CreateOrgName;
+                        if (string.IsNullOrEmpty(createOrgName))
+                            entityInfo.SetValue(App.User.FindFirst(ClaimConst.OrgName)?.Value);
+                    }
                 }
             }
             if (entityInfo.OperationType == DataFilterType.UpdateByObject)

+ 135 - 137
Admin.NET/Admin.NET.Core/Util/CommonUtil.cs

@@ -1,140 +1,138 @@
-// 麻省理工学院许可证
-//
-// 版权所有 (c) 2021-2023 zuohuaijun,大名科技(天津)有限公司  联系电话/微信:18020030720  QQ:515096995
-//
-// 特此免费授予获得本软件的任何人以处理本软件的权利,但须遵守以下条件:在所有副本或重要部分的软件中必须包括上述版权声明和本许可声明。
-//
-// 软件按“原样”提供,不提供任何形式的明示或暗示的保证,包括但不限于对适销性、适用性和非侵权的保证。
-// 在任何情况下,作者或版权持有人均不对任何索赔、损害或其他责任负责,无论是因合同、侵权或其他方式引起的,与软件或其使用或其他交易有关。
-
-using System.Xml;
-using System.Xml.Linq;
-using System.Xml.Serialization;
-
-namespace Admin.NET.Core;
-
-/// <summary>
-/// 通用工具类
-/// </summary>
-public static class CommonUtil
-{
-    /// <summary>
-    /// 生成百分数
-    /// </summary>
-    /// <param name="PassCount"></param>
-    /// <param name="allCount"></param>
-    /// <returns></returns>
-    public static string ExecPercent(decimal PassCount, decimal allCount)
-    {
-        string res = "";
-        if (allCount > 0)
-        {
-            var value = (double)Math.Round(PassCount / allCount * 100, 1);
-            if (value < 0)
-                res = Math.Round(value + 5 / Math.Pow(10, 0 + 1), 0, MidpointRounding.AwayFromZero).ToString();
-            else
-                res = Math.Round(value, 0, MidpointRounding.AwayFromZero).ToString();
-        }
-        if (res == "") res = "0";
-        return res + "%";
-    }
-
-    /// <summary>
-    /// 获取服务地址
-    /// </summary>
-    /// <returns></returns>
-    public static string GetLocalhost()
-    {
+// 麻省理工学院许可证
+//
+// 版权所有 (c) 2021-2023 zuohuaijun,大名科技(天津)有限公司  联系电话/微信:18020030720  QQ:515096995
+//
+// 特此免费授予获得本软件的任何人以处理本软件的权利,但须遵守以下条件:在所有副本或重要部分的软件中必须包括上述版权声明和本许可声明。
+//
+// 软件按“原样”提供,不提供任何形式的明示或暗示的保证,包括但不限于对适销性、适用性和非侵权的保证。
+// 在任何情况下,作者或版权持有人均不对任何索赔、损害或其他责任负责,无论是因合同、侵权或其他方式引起的,与软件或其使用或其他交易有关。
+
+using System.Xml;
+using System.Xml.Linq;
+using System.Xml.Serialization;
+
+namespace Admin.NET.Core;
+
+/// <summary>
+/// 通用工具类
+/// </summary>
+public static class CommonUtil
+{
+    /// <summary>
+    /// 生成百分数
+    /// </summary>
+    /// <param name="PassCount"></param>
+    /// <param name="allCount"></param>
+    /// <returns></returns>
+    public static string ExecPercent(decimal PassCount, decimal allCount)
+    {
+        string res = "";
+        if (allCount > 0)
+        {
+            var value = (double)Math.Round(PassCount / allCount * 100, 1);
+            if (value < 0)
+                res = Math.Round(value + 5 / Math.Pow(10, 0 + 1), 0, MidpointRounding.AwayFromZero).ToString();
+            else
+                res = Math.Round(value, 0, MidpointRounding.AwayFromZero).ToString();
+        }
+        if (res == "") res = "0";
+        return res + "%";
+    }
+
+    /// <summary>
+    /// 获取服务地址
+    /// </summary>
+    /// <returns></returns>
+    public static string GetLocalhost()
+    {
         string result = $"{App.HttpContext.Request.Scheme}://{App.HttpContext.Request.Host.Value}";
-        // 客户端调用如果使用了代理,上面的方式就获取不了真正的本机地址了
-        /* 一般代码的头都是:
-         * X-Original-Host=原始请求
-         * X-Forwarded-Server=从哪里转发过来
-         * */
-        if (App.HttpContext.Request.Headers.ContainsKey("X-Original-Host")) 
+        // 代理模式:获取真正的本机地址
+        // X-Original-Host=原始请求
+        // X-Forwarded-Server=从哪里转发过来
+        if (App.HttpContext.Request.Headers.ContainsKey("X-Original-Host"))
             result = $"{App.HttpContext.Request.Scheme}://{App.HttpContext.Request.Headers["X-Original-Host"]}";
-        return result;
-    }
-
-    /// <summary>
-    /// 对象序列化XML
-    /// </summary>
-    /// <typeparam name="T"></typeparam>
-    /// <param name="obj"></param>
-    /// <returns></returns>
-    public static string SerializeObjectToXml<T>(T obj)
-    {
-        if (obj == null) return string.Empty;
-
-        var xs = new XmlSerializer(obj.GetType());
-        var stream = new MemoryStream();
-        var setting = new XmlWriterSettings
-        {
-            Encoding = new UTF8Encoding(false), // 不包含BOM
-            Indent = true // 设置格式化缩进
-        };
-        using (var writer = XmlWriter.Create(stream, setting))
-        {
-            var ns = new XmlSerializerNamespaces();
-            ns.Add("", ""); // 去除默认命名空间
-            xs.Serialize(writer, obj, ns);
-        }
-        return Encoding.UTF8.GetString(stream.ToArray());
-    }
-
-    /// <summary>
-    /// 字符串转XML格式
-    /// </summary>
-    /// <param name="xmlStr"></param>
-    /// <returns></returns>
-    public static XElement SerializeStringToXml(string xmlStr)
-    {
-        try
-        {
-            return XElement.Parse(xmlStr);
-        }
-        catch
-        {
-            return null;
-        }
-    }
-
-    /// <summary>
-    /// 导出模板Excel
-    /// </summary>
-    /// <param name="fileName"></param>
-    /// <param name="fileDto"></param>
-    /// <returns></returns>
-    public static async Task<IActionResult> ExportExcelTemplate(string fileName, dynamic fileDto)
-    {
-        fileName = $"{fileName}_{DateTime.Now.ToString("yyyyMMddHHmmss")}.xlsx";
-
-        IImporter importer = new ExcelImporter();
-        MethodInfo generateTemplateMethod = importer.GetType().GetMethod("GenerateTemplate");
-        MethodInfo closedGenerateTemplateMethod = generateTemplateMethod.MakeGenericMethod(fileDto.GetType());
-        var res = await (Task<dynamic>)closedGenerateTemplateMethod.Invoke(importer, new object[] { Path.Combine(App.WebHostEnvironment.WebRootPath, fileName) });
-
-        return new FileStreamResult(new FileStream(res.FileName, FileMode.Open), "application/octet-stream") { FileDownloadName = fileName };
-    }
-
-    /// <summary>
-    /// 导入数据Excel
-    /// </summary>
-    /// <param name="file"></param>
-    /// <param name="dataDto"></param>
-    /// <returns></returns>
-    public static async Task<dynamic> ImportExcelData([Required] IFormFile file, dynamic dataDto)
-    {
-        var newFile = await App.GetRequiredService<SysFileService>().UploadFile(file, "");
-        var filePath = Path.Combine(App.WebHostEnvironment.WebRootPath, newFile.FilePath, newFile.Name);
-
-        IImporter importer = new ExcelImporter();
-        MethodInfo importMethod = importer.GetType().GetMethod("Import");
-        MethodInfo closedImportMethod = importMethod.MakeGenericMethod(dataDto.GetType());
-        var res = await (Task<dynamic>)closedImportMethod.Invoke(importer, new object[] { filePath });
-        if (res == null || res.Exception != null)
-            throw Oops.Oh("导入异常:" + res.Exception);
-
-        return res.Data;
-    }
+        return result;
+    }
+
+    /// <summary>
+    /// 对象序列化XML
+    /// </summary>
+    /// <typeparam name="T"></typeparam>
+    /// <param name="obj"></param>
+    /// <returns></returns>
+    public static string SerializeObjectToXml<T>(T obj)
+    {
+        if (obj == null) return string.Empty;
+
+        var xs = new XmlSerializer(obj.GetType());
+        var stream = new MemoryStream();
+        var setting = new XmlWriterSettings
+        {
+            Encoding = new UTF8Encoding(false), // 不包含BOM
+            Indent = true // 设置格式化缩进
+        };
+        using (var writer = XmlWriter.Create(stream, setting))
+        {
+            var ns = new XmlSerializerNamespaces();
+            ns.Add("", ""); // 去除默认命名空间
+            xs.Serialize(writer, obj, ns);
+        }
+        return Encoding.UTF8.GetString(stream.ToArray());
+    }
+
+    /// <summary>
+    /// 字符串转XML格式
+    /// </summary>
+    /// <param name="xmlStr"></param>
+    /// <returns></returns>
+    public static XElement SerializeStringToXml(string xmlStr)
+    {
+        try
+        {
+            return XElement.Parse(xmlStr);
+        }
+        catch
+        {
+            return null;
+        }
+    }
+
+    /// <summary>
+    /// 导出模板Excel
+    /// </summary>
+    /// <param name="fileName"></param>
+    /// <param name="fileDto"></param>
+    /// <returns></returns>
+    public static async Task<IActionResult> ExportExcelTemplate(string fileName, dynamic fileDto)
+    {
+        fileName = $"{fileName}_{DateTime.Now.ToString("yyyyMMddHHmmss")}.xlsx";
+
+        IImporter importer = new ExcelImporter();
+        MethodInfo generateTemplateMethod = importer.GetType().GetMethod("GenerateTemplate");
+        MethodInfo closedGenerateTemplateMethod = generateTemplateMethod.MakeGenericMethod(fileDto.GetType());
+        var res = await (Task<dynamic>)closedGenerateTemplateMethod.Invoke(importer, new object[] { Path.Combine(App.WebHostEnvironment.WebRootPath, fileName) });
+
+        return new FileStreamResult(new FileStream(res.FileName, FileMode.Open), "application/octet-stream") { FileDownloadName = fileName };
+    }
+
+    /// <summary>
+    /// 导入数据Excel
+    /// </summary>
+    /// <param name="file"></param>
+    /// <param name="dataDto"></param>
+    /// <returns></returns>
+    public static async Task<dynamic> ImportExcelData([Required] IFormFile file, dynamic dataDto)
+    {
+        var newFile = await App.GetRequiredService<SysFileService>().UploadFile(file, "");
+        var filePath = Path.Combine(App.WebHostEnvironment.WebRootPath, newFile.FilePath, newFile.Name);
+
+        IImporter importer = new ExcelImporter();
+        MethodInfo importMethod = importer.GetType().GetMethod("Import");
+        MethodInfo closedImportMethod = importMethod.MakeGenericMethod(dataDto.GetType());
+        var res = await (Task<dynamic>)closedImportMethod.Invoke(importer, new object[] { filePath });
+        if (res == null || res.Exception != null)
+            throw Oops.Oh("导入异常:" + res.Exception);
+
+        return res.Data;
+    }
 }

+ 4 - 4
Web/src/api-services/apis/sys-file-api.ts

@@ -176,7 +176,7 @@ export const SysFileApiAxiosParamCreator = function (configuration?: Configurati
         },
         /**
          * 
-         * @summary 更新上传文件信息
+         * @summary 更新文件
          * @param {FileInput} [body] 
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
@@ -537,7 +537,7 @@ export const SysFileApiFp = function(configuration?: Configuration) {
         },
         /**
          * 
-         * @summary 更新上传文件信息
+         * @summary 更新文件
          * @param {FileInput} [body] 
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
@@ -661,7 +661,7 @@ export const SysFileApiFactory = function (configuration?: Configuration, basePa
         },
         /**
          * 
-         * @summary 更新上传文件信息
+         * @summary 更新文件
          * @param {FileInput} [body] 
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
@@ -765,7 +765,7 @@ export class SysFileApi extends BaseAPI {
     }
     /**
      * 
-     * @summary 更新上传文件信息
+     * @summary 更新文件
      * @param {FileInput} [body] 
      * @param {*} [options] Override http request option.
      * @throws {RequiredError}

+ 7 - 0
Web/src/api-services/models/message-template-send-input.ts

@@ -11,6 +11,7 @@
  * https://github.com/swagger-api/swagger-codegen.git
  * Do not edit the class manually.
  */
+import { DataItem } from './data-item';
 /**
  * 获取消息模板列表
  * @export
@@ -29,6 +30,12 @@ export interface MessageTemplateSendInput {
      * @memberof MessageTemplateSendInput
      */
     toUserOpenId: string;
+    /**
+     * 模板数据,格式形如 { \"key1\": { \"value\": any }, \"key2\": { \"value\": any } }
+     * @type {{ [key: string]: DataItem; }}
+     * @memberof MessageTemplateSendInput
+     */
+    data: { [key: string]: DataItem; };
     /**
      * 模板跳转链接
      * @type {string}

+ 10 - 8
Web/src/views/system/file/component/editSysfile.vue

@@ -68,14 +68,16 @@ const submit = () => {
 	ruleFormRef.value.validate(async (valid: boolean) => {
 		if (!valid) return;
 		if (state.ruleForm.id != undefined && state.ruleForm.id > 0) {
-			await getAPI(SysFileApi).apiSysFileUpdatePost(state.ruleForm).then(rsp=>{
-				if(rsp.data.code == 200){
-					ElMessage.success('修改文件信息成功!');
-				}else{
-					Elmessage.error('修改文件信息失败:' + rsp.data.message)
-				}
-			});
-		} 
+			await getAPI(SysFileApi)
+				.apiSysFileUpdatePost(state.ruleForm)
+				.then((rsp) => {
+					if (rsp.data.code == 200) {
+						ElMessage.success('修改文件信息成功!');
+					} else {
+						Elmessage.error('修改文件信息失败:' + rsp.data.message);
+					}
+				});
+		}
 		closeDialog();
 	});
 };