Przeglądaj źródła

😁1、角色和职位增加权限控制 2、调整磁盘获取逻辑 3、升级依赖及其他优化

zuohuaijun 2 lat temu
rodzic
commit
8e3dcee793

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

@@ -34,9 +34,9 @@
     <PackageReference Include="NEST" Version="7.17.5" />
     <PackageReference Include="NewLife.Redis" Version="5.5.2023.803" />
     <PackageReference Include="OnceMi.AspNetCore.OSS" Version="1.1.9" />
-    <PackageReference Include="SKIT.FlurlHttpClient.Wechat.Api" Version="2.31.0" />
+    <PackageReference Include="SKIT.FlurlHttpClient.Wechat.Api" Version="2.32.0" />
     <PackageReference Include="SKIT.FlurlHttpClient.Wechat.TenpayV3" Version="2.20.0" />
-    <PackageReference Include="SqlSugarCore" Version="5.1.4.102" />
+    <PackageReference Include="SqlSugarCore" Version="5.1.4.104" />
     <PackageReference Include="System.Linq.Dynamic.Core" Version="1.3.4" />
     <PackageReference Include="UAParser" Version="3.1.47" />
     <PackageReference Include="Yitter.IdGenerator" Version="1.0.14" />

+ 12 - 0
Admin.NET/Admin.NET.Core/Enum/ErrorCodeEnum.cs

@@ -352,6 +352,18 @@ public enum ErrorCodeEnum
     [ErrorCodeItemMetadata("该职位下有用户禁止删除")]
     D6001,
 
+    /// <summary>
+    /// 无权修改本职位
+    /// </summary>
+    [ErrorCodeItemMetadata("无权修改本职位")]
+    D6002,
+
+    /// <summary>
+    /// 职位不存在
+    /// </summary>
+    [ErrorCodeItemMetadata("职位不存在")]
+    D6003,
+
     /// <summary>
     /// 通知公告状态错误
     /// </summary>

+ 7 - 6
Admin.NET/Admin.NET.Core/Extension/ConsoleLogoSetup.cs

@@ -17,12 +17,13 @@ public static class ConsoleLogoSetup
     public static void AddConsoleLogo(this IServiceCollection services)
     {
         Console.ForegroundColor = ConsoleColor.Blue;
-        Console.WriteLine(@"  ___      _           _         _   _  _____ _____
- / _ \    | |         (_)       | \ | ||  ___|_   _|
-/ /_\ \ __| |_ __ ___  _ _ __   |  \| || |__   | |
-|  _  |/ _` | '_ ` _ \| | '_ \  | . ` ||  __|  | |
-| | | | (_| | | | | | | | | | |_| |\  || |___  | |
-\_| |_/\__,_|_| |_| |_|_|_| |_(_)_| \_/\____/  \_/  ");
+        Console.WriteLine(@"
+              _           _         _   _ ______ _______ 
+     /\      | |         (_)       | \ | |  ____|__   __|
+    /  \   __| |_ __ ___  _ _ __   |  \| | |__     | |   
+   / /\ \ / _` | '_ ` _ \| | '_ \  | . ` |  __|    | |   
+  / ____ \ (_| | | | | | | | | | |_| |\  | |____   | |   
+ /_/    \_\__,_|_| |_| |_|_|_| |_(_)_| \_|______|  |_| ");
         Console.ForegroundColor = ConsoleColor.Red;
         Console.WriteLine(@"源码地址: https://gitee.com/zuohuaijun/Admin.NET");
         Console.ForegroundColor = ConsoleColor.Yellow;

+ 16 - 3
Admin.NET/Admin.NET.Core/Service/Pos/SysPosService.cs

@@ -15,12 +15,15 @@ namespace Admin.NET.Core.Service;
 [ApiDescriptionSettings(Order = 460)]
 public class SysPosService : IDynamicApiController, ITransient
 {
+    private readonly UserManager _userManager;
     private readonly SqlSugarRepository<SysPos> _sysPosRep;
     private readonly SysUserExtOrgService _sysUserExtOrgService;
 
-    public SysPosService(SqlSugarRepository<SysPos> sysPosRep,
+    public SysPosService(UserManager userManager,
+        SqlSugarRepository<SysPos> sysPosRep,
         SysUserExtOrgService sysUserExtOrgService)
     {
+        _userManager = userManager;
         _sysPosRep = sysPosRep;
         _sysUserExtOrgService = sysUserExtOrgService;
     }
@@ -64,10 +67,13 @@ public class SysPosService : IDynamicApiController, ITransient
     [DisplayName("更新职位")]
     public async Task UpdatePos(UpdatePosInput input)
     {
-        var isExist = await _sysPosRep.IsAnyAsync(u => u.Name == input.Name && u.Code == input.Code && u.Id != input.Id);
-        if (isExist)
+        var sysPos = await _sysPosRep.GetFirstAsync(u => u.Name == input.Name && u.Code == input.Code && u.Id != input.Id);
+        if (sysPos != null)
             throw Oops.Oh(ErrorCodeEnum.D6000);
 
+        if (!_userManager.SuperAdmin && sysPos.CreateUserId != _userManager.UserId)
+            throw Oops.Oh(ErrorCodeEnum.D6002);
+
         await _sysPosRep.AsUpdateable(input.Adapt<SysPos>()).IgnoreColumns(true).ExecuteCommandAsync();
     }
 
@@ -80,6 +86,13 @@ public class SysPosService : IDynamicApiController, ITransient
     [DisplayName("删除职位")]
     public async Task DeletePos(DeletePosInput input)
     {
+        var sysPos = await _sysPosRep.GetFirstAsync(u => u.Id == input.Id);
+        if (sysPos == null)
+            throw Oops.Oh(ErrorCodeEnum.D6003);
+
+        if (!_userManager.SuperAdmin && sysPos.CreateUserId != _userManager.UserId)
+            throw Oops.Oh(ErrorCodeEnum.D6002);
+
         // 该职位下是否有用户
         var hasPosEmp = await _sysPosRep.ChangeRepository<SqlSugarRepository<SysUser>>()
             .IsAnyAsync(u => u.PosId == input.Id);

+ 1 - 1
Admin.NET/Admin.NET.Core/Service/Role/SysRoleService.cs

@@ -49,7 +49,7 @@ public class SysRoleService : IDynamicApiController, ITransient
     public async Task<SqlSugarPagedList<SysRole>> Page(PageRoleInput input)
     {
         return await _sysRoleRep.AsQueryable()
-            //.WhereIF(!_userManager.SuperAdmin, u => u.CreateUserId == _userManager.UserId)
+            .WhereIF(!_userManager.SuperAdmin, u => u.CreateUserId == _userManager.UserId) // 若非超管,则只能操作自己创建的角色
             .WhereIF(!string.IsNullOrWhiteSpace(input.Name), u => u.Name.Contains(input.Name))
             .WhereIF(!string.IsNullOrWhiteSpace(input.Code), u => u.Code.Contains(input.Code))
             .OrderBy(u => u.OrderNo)

+ 66 - 18
Admin.NET/Admin.NET.Core/Util/ComputerUtil.cs

@@ -38,31 +38,28 @@ public static class ComputerUtil
 
         if (IsUnix())
         {
-            string output = ShellHelper.Bash(@"df -mT | awk '/^\/dev\/vd/ {print $1,$2,$3,$4,$5,$6}'");
-            var arr = output.Split('\n', StringSplitOptions.RemoveEmptyEntries);
-            if (arr.Length == 0) return diskInfos;
+            var output = ShellHelper.Bash(@"df -mT | awk '/^\/dev\/vd/ {print $1,$2,$3,$4,$5,$6}'");
+            var disks = output.Split('\n', StringSplitOptions.RemoveEmptyEntries);
+            if (disks.Length == 0) return diskInfos;
 
-            var rootDisk = arr[1].Split(' ', (char)StringSplitOptions.RemoveEmptyEntries);
+            var rootDisk = disks[1].Split(' ', (char)StringSplitOptions.RemoveEmptyEntries);
             if (rootDisk == null || rootDisk.Length == 0)
                 return diskInfos;
 
-            foreach (var item in arr)
+            foreach (var item in disks)
             {
-                var rootDisk = item.Split(' ', (char)StringSplitOptions.RemoveEmptyEntries);
-                if (rootDisk == null || rootDisk.Length == 0)
-                {
-                    return diskInfos;
-                }
-
+                var disk = item.Split(' ', (char)StringSplitOptions.RemoveEmptyEntries);
+                if (disk == null || disk.Length == 0)
+                    continue;
 
-                DiskInfo diskInfo = new DiskInfo()
+                var diskInfo = new DiskInfo()
                 {
-                    DiskName = rootDisk[0],
-                    TypeName = rootDisk[1],
-                    TotalSize = long.Parse(rootDisk[2]) / 1024,
-                    Used = long.Parse(rootDisk[3]) / 1024,
-                    AvailableFreeSpace = long.Parse(rootDisk[4]) / 1024,
-                    AvailablePercent = decimal.Parse(rootDisk[5].Replace("%", ""))
+                    DiskName = disk[0],
+                    TypeName = disk[1],
+                    TotalSize = long.Parse(disk[2]) / 1024,
+                    Used = long.Parse(disk[3]) / 1024,
+                    AvailableFreeSpace = long.Parse(disk[4]) / 1024,
+                    AvailablePercent = decimal.Parse(disk[5].Replace("%", ""))
                 };
                 diskInfos.Add(diskInfo);
             }
@@ -317,6 +314,57 @@ public class ShellUtil
         info.Arguments = args;
         info.RedirectStandardOutput = true;
 
+        using (var process = Process.Start(info))
+        {
+            output = process.StandardOutput.ReadToEnd();
+        }
+        return output;
+    }
+}
+
+public class ShellHelper
+{
+    /// <summary>
+    /// Linux 系统命令
+    /// </summary>
+    /// <param name="command"></param>
+    /// <returns></returns>
+    public static string Bash(string command)
+    {
+        var escapedArgs = command.Replace("\"", "\\\"");
+        var process = new Process()
+        {
+            StartInfo = new ProcessStartInfo
+            {
+                FileName = "/bin/bash",
+                Arguments = $"-c \"{escapedArgs}\"",
+                RedirectStandardOutput = true,
+                UseShellExecute = false,
+                CreateNoWindow = true,
+            }
+        };
+        process.Start();
+        string result = process.StandardOutput.ReadToEnd();
+        process.WaitForExit();
+        process.Dispose();
+        return result;
+    }
+
+    /// <summary>
+    /// Windows 系统命令
+    /// </summary>
+    /// <param name="fileName"></param>
+    /// <param name="args"></param>
+    /// <returns></returns>
+    public static string Cmd(string fileName, string args)
+    {
+        string output = string.Empty;
+
+        var info = new ProcessStartInfo();
+        info.FileName = fileName;
+        info.Arguments = args;
+        info.RedirectStandardOutput = true;
+
         using (var process = Process.Start(info))
         {
             output = process.StandardOutput.ReadToEnd();