Jelajahi Sumber

更新1.1.2版本

xiaoxue 5 tahun lalu
induk
melakukan
10be233f73

+ 2 - 2
Admin.Core.Common/Admin.Core.Common.csproj

@@ -17,9 +17,9 @@
     <PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="3.1.3" />
     <PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="3.1.3" />
     <PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="3.1.3" />
-    <PackageReference Include="Microsoft.IdentityModel.Tokens" Version="6.5.0" />
+    <PackageReference Include="Microsoft.IdentityModel.Tokens" Version="6.5.1" />
     <PackageReference Include="System.Drawing.Common" Version="4.7.0" />
-    <PackageReference Include="System.IdentityModel.Tokens.Jwt" Version="6.5.0" />
+    <PackageReference Include="System.IdentityModel.Tokens.Jwt" Version="6.5.1" />
     <PackageReference Include="UAParser" Version="3.1.44" />
   </ItemGroup>
 

+ 7 - 7
Admin.Core.Common/Files/FileInfo.cs

@@ -24,6 +24,11 @@
         /// </summary>
         public string UploadPath { get; set; }
 
+        /// <summary>
+        /// 请求路径
+        /// </summary>
+        public string RequestPath { get; set; }
+
         /// <summary>
         /// 相对路径
         /// </summary>
@@ -50,9 +55,9 @@
         public string Extension { get; set; }
 
         /// <summary>
-        /// 请求路径
+        /// 文件目录
         /// </summary>
-        public string RequestPath { get; set; }
+        public string FileDirectory => System.IO.Path.Combine(UploadPath, RelativePath).ToPath();
 
         /// <summary>
         /// 文件请求路径
@@ -64,11 +69,6 @@
         /// </summary>
         public string FileRelativePath => System.IO.Path.Combine(RelativePath, SaveName).ToPath();
 
-        /// <summary>
-        /// 文件目录
-        /// </summary>
-        public string FileDirectory => System.IO.Path.Combine(UploadPath, RelativePath).ToPath();
-
         /// <summary>
         /// 文件路径
         /// </summary>

+ 0 - 85
Admin.Core.Common/Helpers/Snowfake.cs

@@ -1,85 +0,0 @@
-using System;
-
-namespace Admin.Core.Common.Helpers
-{
-    public class Snowfake
-    {
-        public static Snowfake Default { get; } = new Snowfake(0);
-
-        //机器ID
-        private static long workerId;
-        private static long twepoch = 687888001020L; //唯一时间,这是一个避免重复的随机量,自行设定不要大于当前时间戳
-        private static long sequence = 0L;
-        private static int workerIdBits = 4; //机器码字节数。4个字节用来保存机器码(定义为Long类型会出现,最大偏移64位,所以左移64位没有意义)
-        public static long maxWorkerId = -1L ^ -1L << workerIdBits; //最大机器ID
-        private static int sequenceBits = 10; //计数器字节数,10个字节用来保存计数码
-        private static int workerIdShift = sequenceBits; //机器码数据左移位数,就是后面计数器占用的位数
-        private static int timestampLeftShift = sequenceBits + workerIdBits; //时间戳左移动位数就是机器码和计数器总字节数
-        public static long sequenceMask = -1L ^ -1L << sequenceBits; //一微秒内可以产生计数,如果达到该值则等到下一微妙在进行生成
-        private long lastTimestamp = -1L;
-
-        /// <summary>
-        /// 机器码
-        /// </summary>
-        /// <param name="workerId"></param>
-        public Snowfake(long workerId)
-        {
-            if (workerId > maxWorkerId || workerId < 0)
-                throw new Exception(string.Format("worker Id can't be greater than {0} or less than 0 ", workerId));
-            Snowfake.workerId = workerId;
-        }
-
-        public long nextId()
-        {
-            lock (this)
-            {
-                long timestamp = timeGen();
-                if (lastTimestamp == timestamp)
-                { //同一微妙中生成ID
-                    sequence = (sequence + 1) & sequenceMask; //用&运算计算该微秒内产生的计数是否已经到达上限
-                    if (sequence == 0)
-                    {
-                        //一微妙内产生的ID计数已达上限,等待下一微妙
-                        timestamp = tillNextMillis(lastTimestamp);
-                    }
-                }
-                else
-                { //不同微秒生成ID
-                    sequence = 0; //计数清0
-                }
-                if (timestamp < lastTimestamp)
-                { //如果当前时间戳比上一次生成ID时时间戳还小,抛出异常,因为不能保证现在生成的ID之前没有生成过
-                    throw new Exception(string.Format("Clock moved backwards.  Refusing to generate id for {0} milliseconds",
-                        lastTimestamp - timestamp));
-                }
-                lastTimestamp = timestamp; //把当前时间戳保存为最后生成ID的时间戳
-                long nextId = (timestamp - twepoch << timestampLeftShift) | workerId << workerIdShift | sequence;
-                return nextId;
-            }
-        }
-
-        /// <summary>
-        /// 获取下一微秒时间戳
-        /// </summary>
-        /// <param name="lastTimestamp"></param>
-        /// <returns></returns>
-        private long tillNextMillis(long lastTimestamp)
-        {
-            long timestamp = timeGen();
-            while (timestamp <= lastTimestamp)
-            {
-                timestamp = timeGen();
-            }
-            return timestamp;
-        }
-
-        /// <summary>
-        /// 生成当前时间戳
-        /// </summary>
-        /// <returns></returns>
-        private long timeGen()
-        {
-            return (long)(DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalMilliseconds;
-        }
-    }
-}

+ 143 - 0
Admin.Core.Common/Helpers/Snowflake.cs

@@ -0,0 +1,143 @@
+using System;
+
+namespace Admin.Core.Common.Helpers
+{
+    public class Snowflake
+    {
+        //基准时间
+        private static long StartStmp = 1288834974657L;
+        //private const long START_STMP = 1480166465631L;
+        /*每一部分占用的位数*/
+        //机器标识位数
+        const int MachineIdBits = 5;
+        //数据标志位数
+        const int DatacenterIdBits = 5;
+        //序列号识位数
+        const int SequenceBits = 12;
+
+        /* 每一部分的最大值*/
+        //机器ID最大值
+        const long MaxMachineNum = -1L ^ (-1L << MachineIdBits);
+        //数据标志ID最大值
+        const long MaxDatacenterNum = -1L ^ (-1L << DatacenterIdBits);
+        //序列号ID最大值
+        private const long MaxSequenceNum = -1L ^ (-1L << SequenceBits);
+
+        /*每一部分向左的位移*/
+        //机器ID偏左移12位
+        private const int MachineShift = SequenceBits;
+        //数据ID偏左移17位
+        private const int DatacenterIdShift = SequenceBits + MachineIdBits;
+        //时间毫秒左移22位
+        public const int TimestampLeftShift = SequenceBits + MachineIdBits + DatacenterIdBits;
+
+
+        private long _sequence = 0L;//序列号
+        private long _lastTimestamp = -1L;//上一次时间戳
+        public long MachineId { get; protected set; }//机器标识
+        public long DatacenterId { get; protected set; }//数据中心
+        //public long Sequence = 0L;//序列号
+        //{
+        //    get { return _sequence; }
+        //    internal set { _sequence = value; }
+        //}
+
+        private readonly DateTime Jan1st1970 = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
+        private readonly object _lock = new Object();
+        public Snowflake(long machineId, long datacenterId)
+        {
+            // 如果超出范围就抛出异常
+            if (machineId > MaxMachineNum || machineId < 0)
+            {
+                throw new ArgumentException(string.Format("machineId 必须大于0,MaxMachineNum: {0}", MaxMachineNum));
+            }
+
+            if (datacenterId > MaxDatacenterNum || datacenterId < 0)
+            {
+                throw new ArgumentException(string.Format("datacenterId必须大于0,且不能大于MaxDatacenterNum: {0}", MaxDatacenterNum));
+            }
+
+            //先检验再赋值
+            MachineId = machineId;
+            DatacenterId = datacenterId;
+            //_sequence = sequence;
+        }
+
+        //public static Init(long machineId, long datacenterId)
+        //{
+
+        //}
+        public long NextId()
+        {
+            lock (_lock)
+            {
+                var timestamp = TimeGen();
+                if (timestamp < _lastTimestamp)
+                {
+                    throw new Exception(string.Format("时间戳必须大于上一次生成ID的时间戳.  拒绝为{0}毫秒生成id", _lastTimestamp - timestamp));
+                }
+
+                //如果上次生成时间和当前时间相同,在同一毫秒内
+                if (_lastTimestamp == timestamp)
+                {
+                    //sequence自增,和sequenceMask相与一下,去掉高位
+                    _sequence = (_sequence + 1) & MaxSequenceNum;
+                    //判断是否溢出,也就是每毫秒内超过1024,当为1024时,与sequenceMask相与,sequence就等于0
+                    if (_sequence == 0L)
+                    {
+                        //等待到下一毫秒
+                        timestamp = TilNextMillis(_lastTimestamp);
+                    }
+                }
+                else
+                {
+                    //如果和上次生成时间不同,重置sequence,就是下一毫秒开始,sequence计数重新从0开始累加,
+                    //为了保证尾数随机性更大一些,最后一位可以设置一个随机数
+                    _sequence = 0L;//new Random().Next(10);
+                }
+
+                _lastTimestamp = timestamp;
+                return ((timestamp - StartStmp) << TimestampLeftShift) | (DatacenterId << DatacenterIdShift) | (MachineId << MachineShift) | _sequence;
+            }
+        }
+
+        // 防止产生的时间比之前的时间还要小(由于NTP回拨等问题),保持增量的趋势.
+        protected virtual long TilNextMillis(long lastTimestamp)
+        {
+            var timestamp = TimeGen();
+            while (timestamp <= lastTimestamp)
+            {
+                timestamp = TimeGen();
+            }
+            return timestamp;
+        }
+
+        // 获取当前的时间戳
+        protected virtual long TimeGen()
+        {
+            //return TimeExtensions.CurrentTimeMillis();
+            return (long)(DateTime.UtcNow - Jan1st1970).TotalMilliseconds;
+        }
+    }
+
+    public class IdWorkerHelper
+    {
+        private static Snowflake _idWorker= null;
+        private IdWorkerHelper()
+        {
+
+        }
+
+        static IdWorkerHelper()
+        {
+            _idWorker = new Snowflake(1, 1);
+        }
+
+        public static long GenId64()
+        {
+            return _idWorker.NextId();
+
+        }
+    }
+
+}

+ 1 - 1
Admin.Core.Common/Helpers/UploadHelper.cs

@@ -61,7 +61,7 @@ namespace Admin.Core.Common.Helpers
                 Directory.CreateDirectory(fileInfo.FileDirectory);
             }
 
-            fileInfo.SaveName = $"{new Snowfake(0).nextId()}.{fileInfo.Extension}";
+            fileInfo.SaveName = $"{IdWorkerHelper.GenId64()}.{fileInfo.Extension}";
 
             await SaveAsync(file, fileInfo.FilePath, cancellationToken);
 

+ 11 - 0
Admin.Core.Services/Admin/Document/DocumentService.cs

@@ -155,6 +155,17 @@ namespace Admin.Core.Service.Admin.Document
             return ResponseOutput.Result(result);
         }
 
+        public async Task<IResponseOutput> DeleteImageAsync(long documentId, string url)
+        {
+            var result = false;
+            if (documentId > 0 && url.NotNull())
+            {
+                result = (await _documentImageRepository.DeleteAsync(m => m.DocumentId == documentId && m.Url == url)) > 0;
+            }
+
+            return ResponseOutput.Result(result);
+        }
+
         public async Task<IResponseOutput> SoftDeleteAsync(long id)
         {
             var result = await _documentRepository.SoftDeleteAsync(id);

+ 2 - 0
Admin.Core.Services/Admin/Document/IDocumentService.cs

@@ -36,6 +36,8 @@ namespace Admin.Core.Service.Admin.Document
 
         Task<IResponseOutput> DeleteAsync(long id);
 
+        Task<IResponseOutput> DeleteImageAsync(long documentId, string url);
+
         Task<IResponseOutput> SoftDeleteAsync(long id);
 
     }

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

@@ -34,7 +34,7 @@
     <PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="3.1.3" />
     <PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="3.1.3" />
     <PackageReference Include="Microsoft.Extensions.PlatformAbstractions" Version="1.1.0" />
-    <PackageReference Include="Swashbuckle.AspNetCore" Version="5.3.3" />
+    <PackageReference Include="Swashbuckle.AspNetCore" Version="5.4.1" />
 
     <PackageReference Include="NLog.Web.AspNetCore" Version="4.9.2" />
     <PackageReference Include="NLog" Version="4.7.0" />

+ 8 - 0
Admin.Core/Admin.Core.xml

@@ -308,6 +308,14 @@
             <param name="id"></param>
             <returns></returns>
         </member>
+        <member name="M:Admin.Core.Controllers.Admin.DocumentController.DeleteImage(System.Int64,System.String)">
+            <summary>
+            删除图片
+            </summary>
+            <param name="documentId"></param>
+            <param name="url"></param>
+            <returns></returns>
+        </member>
         <member name="M:Admin.Core.Controllers.Admin.DocumentController.UploadImage(Admin.Core.Service.Admin.Document.Input.DocumentUploadImageInput)">
             <summary>
             上传文档图片

+ 18 - 3
Admin.Core/Controllers/Admin/DocumentController.cs

@@ -163,6 +163,18 @@ namespace Admin.Core.Controllers.Admin
             return await _documentServices.SoftDeleteAsync(id);
         }
 
+        /// <summary>
+        /// 删除图片
+        /// </summary>
+        /// <param name="documentId"></param>
+        /// <param name="url"></param>
+        /// <returns></returns>
+        [HttpDelete]
+        public async Task<IResponseOutput> DeleteImage(long documentId, string url)
+        {
+            return await _documentServices.DeleteImageAsync(documentId, url);
+        }
+
         /// <summary>
         /// 上传文档图片
         /// </summary>
@@ -176,13 +188,16 @@ namespace Admin.Core.Controllers.Admin
             if (res.Success)
             {
                 //保存文档图片
-                var r = await _documentServices.AddImageAsync(new DocumentAddImageInput
+                var r = await _documentServices.AddImageAsync(
+                new DocumentAddImageInput
                 {
                     DocumentId = input.Id,
                     Url = res.Data.FileRequestPath
                 });
-                if(r.Success)
-                return ResponseOutput.Ok(res.Data.FileRequestPath);
+                if (r.Success)
+                {
+                    return ResponseOutput.Ok(res.Data.FileRequestPath);
+                }
             }
 
             return ResponseOutput.NotOk("上传失败!");

+ 0 - 1
Admin.Core/Db/Data.cs

@@ -14,6 +14,5 @@ namespace Admin.Core.Db
         public RoleEntity[] Roles { get; set; }
         public UserRoleEntity[] UserRoles { get; set; }
         public RolePermissionEntity[] RolePermissions { get; set; }
-        public DocumentEntity[] Documents { get; set; }
     }
 }

File diff ditekan karena terlalu besar
+ 0 - 0
Admin.Core/Db/Data/data.json


+ 0 - 1
Admin.Core/Db/DbHelper.cs

@@ -202,7 +202,6 @@ namespace Admin.Core.Db
                 using (var uow = db.CreateUnitOfWork())
                 using (var tran = uow.GetOrBeginTransaction())
                 {
-                    await InitDtData(db, data.Documents, tran, dbConfig);
                     await InitDtData(db, data.Dictionaries, tran, dbConfig);
                     await InitDtData(db, data.Apis, tran, dbConfig);
                     await InitDtData(db, data.Views, tran, dbConfig);

+ 5 - 3
Admin.Core/Startup.cs

@@ -51,6 +51,7 @@ namespace Admin.Core
 
         public void ConfigureServices(IServiceCollection services)
         {
+            //应用配置
             services.AddSingleton(_appConfig);
 
             //上传配置
@@ -243,12 +244,13 @@ namespace Admin.Core
                 .InstancePerDependency();
                 #endregion
 
-                //单例注入
+                #region SingleInstance
                 var assemblyCore = Assembly.Load("Admin.Core");
                 var assemblyCommon = Assembly.Load("Admin.Core.Common");
-                builder.RegisterAssemblyTypes(assemblyCore,assemblyCommon)
+                builder.RegisterAssemblyTypes(assemblyCore, assemblyCommon)
                 .Where(t => t.GetCustomAttribute<SingleInstanceAttribute>() != null)
-                .SingleInstance();
+                .SingleInstance(); 
+                #endregion
             }
             catch (Exception ex)
             {

+ 1 - 0
Admin.Core/configs/appconfig.json

@@ -15,6 +15,7 @@
   },
   //验证码
   "varifyCode": {
+    // 字体
     "font": [ "Times New Roman", "Verdana", "Arial", "Gungsuh", "Impact" ]
   }
 }

+ 2 - 2
Admin.Core/configs/uploadconfig.json

@@ -28,8 +28,8 @@
     "dateTimeFormat": "",
     //{文档编号}
     "format": "{Id}",
-    //图片大小不超过 10M = 10 * 1024 * 1024
-    "maxSize": 10485760,
+    //图片大小不超过 10M = 1 * 1024 * 1024
+    "maxSize": 1048576,
     //最大允许上传张数,-1不限制
     "limit": -1,
     //图片格式

Beberapa file tidak ditampilkan karena terlalu banyak file yang berubah dalam diff ini