فهرست منبع

😎1、修复头像上传问题 2、代码整理

zuohuaijun 1 سال پیش
والد
کامیت
7d7be0e769

+ 1 - 1
Admin.NET/Admin.NET.Core/Admin.NET.Core.csproj

@@ -37,7 +37,7 @@
     <PackageReference Include="SqlSugarCore" Version="5.1.4.160" />
     <PackageReference Include="SSH.NET" Version="2024.1.0" />
     <PackageReference Include="System.Linq.Dynamic.Core" Version="1.4.3" />
-    <PackageReference Include="TencentCloudSDK.Sms" Version="3.0.1040" />
+    <PackageReference Include="TencentCloudSDK.Sms" Version="3.0.1041" />
     <PackageReference Include="UAParser" Version="3.1.47" />
     <PackageReference Include="Yitter.IdGenerator" Version="1.0.14" />
   </ItemGroup>

+ 0 - 1
Admin.NET/Admin.NET.Core/Cache/CacheSetup.cs

@@ -5,7 +5,6 @@
 // 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
 
 using Microsoft.Extensions.DependencyInjection.Extensions;
-using NewLife.Caching;
 using NewLife.Caching.Services;
 
 namespace Admin.NET.Core;

+ 2 - 2
Admin.NET/Admin.NET.Core/Enum/ErrorCodeEnum.cs

@@ -656,9 +656,9 @@ public enum ErrorCodeEnum
     db1002,
 
     /// <summary>
-    /// 实体文件不存在或匹配不到如果是刚刚生成的实体,请重启服务后再试
+    /// 实体文件不存在或匹配不到如果是刚刚生成的实体,请重启服务后再试
     /// </summary>
-    [ErrorCodeItemMetadata("实体文件不存在或匹配不到如果是刚刚生成的实体,请重启服务后再试")]
+    [ErrorCodeItemMetadata("实体文件不存在或匹配不到如果是刚刚生成的实体,请重启服务后再试")]
     db1003,
 
     /// <summary>

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

@@ -5,7 +5,6 @@
 // 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
 
 using Aliyun.OSS.Util;
-using Furion.VirtualFileServer;
 using OnceMi.AspNetCore.OSS;
 
 namespace Admin.NET.Core.Service;
@@ -112,8 +111,7 @@ public class SysFileService : IDynamicApiController, ITransient
     [DisplayName("根据文件Id或Url下载")]
     public async Task<IActionResult> DownloadFile(FileInput input)
     {
-        var _sysFileRepNew = _sysFileRep.CopyNew(); // DownloadFile函数有可能在多线程下使用,所以这里要创建一个新连接
-        var file = input.Id > 0 ? await GetFile(input) : await _sysFileRepNew.GetFirstAsync(u => u.Url == input.Url);
+        var file = input.Id > 0 ? await GetFile(input) : await _sysFileRep.CopyNew().GetFirstAsync(u => u.Url == input.Url);
         var fileName = HttpUtility.UrlEncode(file.FileName, Encoding.GetEncoding("UTF-8"));
 
         if (_OSSProviderOptions.IsEnable)
@@ -182,7 +180,6 @@ public class SysFileService : IDynamicApiController, ITransient
     [DisplayName("下载指定文件Base64格式")]
     public async Task<string> DownloadFileBase64([FromBody] string url)
     {
-        var _sysFileRepNew = _sysFileRep.CopyNew();// DownloadFileBase64函数有可能在多线程下使用,所以这里要创建一个新连接
         if (_OSSProviderOptions.IsEnable)
         {
             using var httpClient = new HttpClient();
@@ -200,7 +197,7 @@ public class SysFileService : IDynamicApiController, ITransient
         }
         else if (App.Configuration["SSHProvider:IsEnable"].ToBoolean())
         {
-            var sysFile = await _sysFileRepNew.GetFirstAsync(u => u.Url == url) ?? throw Oops.Oh($"文件不存在");
+            var sysFile = await _sysFileRep.CopyNew().GetFirstAsync(u => u.Url == url) ?? throw Oops.Oh($"文件不存在");
             using (SSHHelper helper = new SSHHelper(App.Configuration["SSHProvider:Host"],
                App.Configuration["SSHProvider:Port"].ToInt(), App.Configuration["SSHProvider:Username"], App.Configuration["SSHProvider:Password"]))
             {
@@ -209,7 +206,7 @@ public class SysFileService : IDynamicApiController, ITransient
         }
         else
         {
-            var sysFile = await _sysFileRepNew.GetFirstAsync(u => u.Url == url) ?? throw Oops.Oh($"文件不存在");
+            var sysFile = await _sysFileRep.CopyNew().GetFirstAsync(u => u.Url == url) ?? throw Oops.Oh($"文件不存在");
             var filePath = Path.Combine(App.WebHostEnvironment.WebRootPath, sysFile.FilePath);
             if (!Directory.Exists(filePath))
                 Directory.CreateDirectory(filePath);
@@ -283,7 +280,7 @@ public class SysFileService : IDynamicApiController, ITransient
     /// <returns></returns>
     private async Task<SysFile> GetFile([FromQuery] FileInput input)
     {
-        var file = await _sysFileRep.GetFirstAsync(u => u.Id == input.Id);
+        var file = await _sysFileRep.CopyNew().GetFirstAsync(u => u.Id == input.Id);
         return file ?? throw Oops.Oh(ErrorCodeEnum.D8000);
     }
 
@@ -326,6 +323,8 @@ public class SysFileService : IDynamicApiController, ITransient
 
         // 获取文件后缀
         var suffix = Path.GetExtension(file.FileName).ToLower(); // 后缀
+        if (string.IsNullOrWhiteSpace(suffix))
+            suffix = string.Concat(".", file.ContentType.AsSpan(file.ContentType.LastIndexOf('/') + 1));
         if (!string.IsNullOrWhiteSpace(suffix))
         {
             //var contentTypeProvider = FS.GetFileExtensionContentTypeProvider();
@@ -334,11 +333,6 @@ public class SysFileService : IDynamicApiController, ITransient
             if (suffix == ".jpeg" || suffix == ".jpe")
                 suffix = ".jpg";
         }
-        
-        // 获取后缀名失败 并且 上传文件为 blob
-        if (suffix == "" && file.FileName == "blob")
-            suffix = "." + file.ContentType.Substring(file.ContentType.LastIndexOf('/') + 1); // file.ContentType.Split('/')[1]
-
         if (string.IsNullOrWhiteSpace(suffix))
             throw Oops.Oh(ErrorCodeEnum.D8003);
 
@@ -488,11 +482,11 @@ public class SysFileService : IDynamicApiController, ITransient
         if (ids == null || ids.Count == 0)
             return 0;
         return await _sysFileRep.AsUpdateable()
-              .SetColumns(m => m.RelationName == relationName)
-              .SetColumns(m => m.RelationId == relationId)
-              .SetColumns(m => m.BelongId == belongId)
-             .Where(m => ids.Contains(m.Id))
-             .ExecuteCommandAsync();
+            .SetColumns(m => m.RelationName == relationName)
+            .SetColumns(m => m.RelationId == relationId)
+            .SetColumns(m => m.BelongId == belongId)
+            .Where(m => ids.Contains(m.Id))
+            .ExecuteCommandAsync();
     }
 
     /// <summary>
@@ -504,11 +498,11 @@ public class SysFileService : IDynamicApiController, ITransient
     public async Task<List<FileOutput>> GetRelationFiles([FromQuery] RelationQueryInput input)
     {
         return await _sysFileRep.AsQueryable()
-           .Where(m => !m.IsDelete)
-           .WhereIF(input.RelationId.HasValue && input.RelationId > 0, m => m.RelationId == input.RelationId)
-           .WhereIF(input.BelongId.HasValue && input.BelongId > 0, m => m.BelongId == input.BelongId.Value)
-           .WhereIF(!string.IsNullOrWhiteSpace(input.RelationName), m => m.RelationName == input.RelationName)
-           .WhereIF(!string.IsNullOrWhiteSpace(input.FileTypes), m => input.GetFileTypeBS().Contains(m.FileType))
+            .Where(m => !m.IsDelete)
+            .WhereIF(input.RelationId.HasValue && input.RelationId > 0, m => m.RelationId == input.RelationId)
+            .WhereIF(input.BelongId.HasValue && input.BelongId > 0, m => m.BelongId == input.BelongId.Value)
+            .WhereIF(!string.IsNullOrWhiteSpace(input.RelationName), m => m.RelationName == input.RelationName)
+            .WhereIF(!string.IsNullOrWhiteSpace(input.FileTypes), m => input.GetFileTypeBS().Contains(m.FileType))
             .Select(m => new FileOutput
             {
                 Id = m.Id,

+ 0 - 1
Admin.NET/Admin.NET.Core/Service/Message/SysSmsService.cs

@@ -8,7 +8,6 @@ using AlibabaCloud.SDK.Dysmsapi20170525.Models;
 using TencentCloud.Common;
 using TencentCloud.Common.Profile;
 using TencentCloud.Sms.V20190711;
-using static SKIT.FlurlHttpClient.Wechat.Api.Models.ComponentTCBBatchCreateContainerServiceVersionRequest.Types;
 
 namespace Admin.NET.Core.Service;
 

+ 28 - 0
Web/src/utils/authFunction.ts

@@ -1,5 +1,6 @@
 import { useUserInfo } from '/@/stores/userInfo';
 import { judgementSameArr } from '/@/utils/arrayOperation';
+import { resolveDirective, withDirectives } from 'vue';
 
 /**
  * 单个权限验证
@@ -36,3 +37,30 @@ export function authAll(value: Array<string>): boolean {
 	const stores = useUserInfo();
 	return judgementSameArr(value, stores.userInfos.authBtnList);
 }
+/**
+ * 单个权限验证,是否满足,返回VNode
+ * @param VNode 元素
+ * @param value 权限值
+ * @returns VNode
+ */
+export function hAuth<T extends VNode>(el: T, value: string): T {
+	return withDirectives(el, [[resolveDirective('auth'), value]]);
+}
+/**
+ * 多个权限验证,判断是否满足一个,返回VNode
+ * @param VNode 元素
+ * @param value 权限值
+ * @returns VNode
+ */
+export function hAuths<T extends VNode>(el: T, value: Array<string>): T {
+	return withDirectives(el, [[resolveDirective('auths'), value]]);
+}
+/**
+ * 多个权限验证,判断是否全部满足,返回VNode
+ * @param VNode 元素
+ * @param value 权限值
+ * @returns VNode
+ */
+export function hAuthAll<T extends VNode>(el: T, value: Array<string>): T {
+	return withDirectives(el, [[resolveDirective('auth-all'), value]]);
+}

+ 2 - 1
Web/src/utils/base64Conver.ts

@@ -79,6 +79,7 @@ export function base64ToFile(dataURL: string, fileName: string, mimeType = null)
  * @param mimeType {String} 文件类型
  * @return {File}
  */
-export function blobToFile(blob: Blob, fileName: string, mimeType: any) {
+export function blobToFile(blob: Blob, fileName: string, mimeType?: string) {
+	if (mimeType == null) mimeType = blob.type;
 	return new File([blob], fileName, { type: mimeType });
 }

+ 1 - 2
Web/src/utils/formatTime.ts

@@ -39,8 +39,7 @@ export function formatDate(date: Date, format: string): string {
 		'3': '三',
 		'4': '四',
 	};
-	if (/(W+)/.test(format))
-		format = format.replace(RegExp.$1, RegExp.$1.length > 1 ? (RegExp.$1.length > 2 ? '星期' + week[we] : '周' + week[we]) : week[we]);
+	if (/(W+)/.test(format)) format = format.replace(RegExp.$1, RegExp.$1.length > 1 ? (RegExp.$1.length > 2 ? '星期' + week[we] : '周' + week[we]) : week[we]);
 	if (/(Q+)/.test(format)) format = format.replace(RegExp.$1, RegExp.$1.length == 4 ? '第' + quarter[qut] + '季度' : quarter[qut]);
 	if (/(Z+)/.test(format)) format = format.replace(RegExp.$1, RegExp.$1.length == 3 ? '第' + z + '周' : z + '');
 	for (let k in opt) {

+ 17 - 0
Web/src/utils/json-utils.ts

@@ -0,0 +1,17 @@
+/**
+ * 尝试将字符串转对象
+ * @param value 要转的字符串
+ * @returns {Object|String}
+ */
+export const StringToObj = (value: any): any => {
+	if (value && typeof value == 'string') {
+		try {
+			const obj = JSON.parse(value);
+			if (typeof obj == 'object') {
+				return obj;
+			} else return value;
+		} catch (e) {
+			return value;
+		}
+	} else return value;
+};

+ 2 - 0
Web/src/utils/storage.ts

@@ -59,6 +59,8 @@ export const Session = {
 	// 移除全部临时缓存
 	clear() {
 		Cookies.remove('token');
+		Cookies.remove('userInfo');
+		Cookies.remove('constList');
 		window.sessionStorage.clear();
 	},
 };