月度归档: 2025 年 2 月

  • C# 字典Dictionary.Add(key, value) 与 Dictionary[key]=value的区别

    相同:

    二者都是根据键值(key),在字典中添加新元素(value)的方法

    不同:

    Dictionary.Add(key, value) 方法,如果 Dictionary 中已经有了这个 key ,那么在进行 Add 会在运行时报错;

    Dictionary[key]=value 方法,如果 Dictionary 中已经有了这个key ,新添加的value将替换之前的 value ,即没有时添加,有时则修改替换

    因此,在使用时更加倾向使用 Dictionary[key]=value 方法,可以减少出错,但是使用时也要注意键值是否正确对应。

  • asp.net core 解析 easyui的tree的json

    easyui的tree组件支持从JSON加载数据,在asp.net中,我们可以从数据库读取相关数据,然后转换成json格式后返回给easyui的tree组件。下面是具体过程:

    1、定义相关的节点类

    public class PermissionTreeNode
    {
        public int id { get; set; }
        public string? text { get; set; }
        public string? state { get; set; }
        public bool @checked { get; set; }
        public PermissionTreeNode[]? children { get; set; }
    }
    
    public class Permission
    {
        public int Id { get; set; }
        public string Name { get; set; } = string.Empty;
        public Role? Role { get;set; }
        public DateTime? CreatedAt { get; set; } = DateTime.Now;
        public DateTime? UpdatedAt { get; set; } = DateTime.Now;
    }
    
    public class Role 
    {
        public int Id { get; set; }
        public string Name { get; set; } = string.Empty;
        public ICollection<Permission>? Permissions { get; set; }
        public ICollection<Account>? Accounts { get; set; }
        public DateTime? CreatedAt { get; set; } = DateTime.Now;
        public DateTime? UpdatedAt { get; set; } = DateTime.Now;
    }

    2、编写生成节点的函数 ParseJson,在这个函数里面加了权限处理,只添加当前用户有权限的节点:

    public PermissionTreeNode ParseJson(PermissionTreeNode permissionTreeNode, List<Permission> rolePermissions, Role role)
    {
        if (permissionTreeNode.children != null)
        {
            foreach (var menu in permissionTreeNode.children)
            {
                if (rolePermissions.Any(x => x.Name == menu.text) || role.Name == "超级管理员")
                {
                    menu.@checked = true;
                }
    
                if (menu.children != null)
                {
                    ParseJson(menu, rolePermissions, role);
                }
            }
        }
    
        return permissionTreeNode;
    }

    3、最后,我们在初始化tree的数据的时候,调用InitPermissionTree函数生成节点数据,再通过JsonSerializer.Serialize函数转换成json格式,不要忘记在转换后的json字符串两边分别加上[],不然easyui的tree组件加载不了。

    public ContentResult InitPermissionTree(int roleId)
    {
        var rolePermissions = _appDbContext.Permissions.Where(x => x.Role != null && x.Role.Id == roleId).ToList();
    
        var role = _appDbContext.Roles.Where(x => x.Id == roleId).FirstOrDefault();
    
        var jsonFile = Path.Combine(_env.WebRootPath, $"PermissionTree.json");
        var json = System.IO.File.ReadAllText(jsonFile);
    
    
        JsonSerializerOptions options = new JsonSerializerOptions();
        options.ReferenceHandler = default;
        var permissionTreeNode = JsonSerializer.Deserialize<PermissionTreeNode>(json, options);
    
        if (permissionTreeNode != null && role != null)
        {
            permissionTreeNode = ParseJson(permissionTreeNode, rolePermissions, role);
        }
    
        var result = "[" + JsonSerializer.Serialize(permissionTreeNode) + "]";
    
        return Content(result, "application/json");
    }

    我们可以使用F12浏览器开发者工具查看接口返回的JSON,如下:

      {
        "id": 1,
        "text": "工作总结生成管理系统",
        "checked": false,
        "children": [
          {
            "id": 100,
            "text": "内容管理",
            "state": "open",
            "checked": false,
            "children": [
              {
                "id": 101,
                "text": "文章管理",
                "checked": false,
                "children": [
                  {
                    "id": 102,
                    "text": "文章生成",
                    "checked": false
                  },
                  {
                    "id": 103,
                    "text": "编辑文章",
                    "checked": false
                  },
                  {
                    "id": 104,
                    "text": "删除文章",
                    "checked": false
                  },
                  {
                    "id": 105,
                    "text": "状态设置",
                    "checked": false
                  },
                  {
                    "id": 106,
                    "text": "导出Word文档(文章管理)",
                    "checked": false
                  }
                ]
              },
              {
                "id": 200,
                "text": "素材库",
                "state": "opened",
                "checked": false,
                "children": [
                  {
                    "id": 201,
                    "text": "新增素材",
                    "checked": false
                  },
                  {
                    "id": 202,
                    "text": "编辑素材",
                    "checked": false
                  },
                  {
                    "id": 203,
                    "text": "删除素材",
                    "checked": false
                  },
                  {
                    "id": 204,
                    "text": "导入导出",
                    "checked": false
                  },
                  {
                    "id": 205,
                    "text": "素材审核",
                    "checked": false
                  }
                ]
              },
              {
                "id": 300,
                "text": "标签库",
                "state": "opened",
                "checked": false,
                "children": [
                  {
                    "id": 301,
                    "text": "创建标签",
                    "checked": false
                  },
                  {
                    "id": 302,
                    "text": "编辑标签",
                    "checked": false
                  },
                  {
                    "id": 303,
                    "text": "删除标签",
                    "checked": false
                  }
                ]
              },
    
              {
                "id": 400,
                "text": "模板库",
                "state": "opened",
                "checked": false,
                "children": [
                  {
                    "id": 401,
                    "text": "新增模板",
                    "checked": false
                  },
                  {
                    "id": 402,
                    "text": "编辑模板",
                    "checked": false
                  },
                  {
                    "id": 403,
                    "text": "删除模板",
                    "checked": false
                  }
                ]
              },
    
              {
                "id": 500,
                "text": "档案库",
                "state": "opened",
                "checked": false,
                "children": [
                  {
                    "id": 501,
                    "text": "删除档案",
                    "checked": false
                  },
                  {
                    "id": 502,
                    "text": "查看档案",
                    "checked": false
                  },
                  {
                    "id": 503,
                    "text": "导入Word文档",
                    "checked": false
                  },
                  {
                    "id": 504,
                    "text": "导出Word文档(档案库)",
                    "checked": false
                  },
                  {
                    "id": 505,
                    "text": "移到文章管理",
                    "checked": false
                  }
                ]
              }
            ]
          },
          {
            "id": 600,
            "text": "系统设置",
            "state": "open",
            "checked": false,
            "children": [
              {
                "id": 601,
                "text": "帐号管理",
                "state": "open",
                "checked": false,
                "children": [
                  {
                    "id": 602,
                    "text": "新增帐号",
                    "checked": false
                  },
                  {
                    "id": 603,
                    "text": "编辑帐号",
                    "checked": false
                  },
                  {
                    "id": 604,
                    "text": "删除帐号",
                    "checked": false
                  },
                  {
                    "id": 605,
                    "text": "重置密码",
                    "checked": false
                  }
                ]
              },
              {
                "id": 700,
                "text": "部门管理",
                "state": "open",
                "checked": false,
                "children": [
                  {
                    "id": 701,
                    "text": "新增部门",
                    "checked": false
                  },
                  {
                    "id": 702,
                    "text": "编辑部门",
                    "checked": false
                  },
                  {
                    "id": 703,
                    "text": "删除部门",
                    "checked": false
                  }
                ]
              },
              {
                "id": 800,
                "text": "角色管理",
                "state": "open",
                "checked": false,
                "children": [
                  {
                    "id": 801,
                    "text": "新增角色",
                    "checked": false
                  },
                  {
                    "id": 802,
                    "text": "编辑角色",
                    "checked": false
                  },
                  {
                    "id": 803,
                    "text": "删除角色",
                    "checked": false
                  }
                ]
              }
    
            ]
          }
        ]
      }
    

    这样,asp.net core 给 easyui 的 tree 组件动态生成数据就完成了。

  • .NET Core 读取系统环境变量

    asp.net core 的开发过程中,有时会需要读取系统的环境,可以使用下面的代码来读取:

    var env = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT", EnvironmentVariableTarget.Machine);

    注意 EnvironmentVariableTarget.Machine 只能读取“系统变量”里配置的环境变量

    注意:该方法只在windows上测试通过,linux系统没有测试,有试过的同学可以留个言。

  • IIS部署ASP.NET Core报错:HTTP Error 500.38 – Failed to locate ASP.NET Core app

    在使用IIS部署ASP.NET Core程序时,遇到报错,错误信息如下 :HTTP Error 500.38 – Failed to locate ASP.NET Core app

    经过一番搜索,在微软官方网站中找到了错误原因,网站如下:https://learn.microsoft.com/zh-cn/aspnet/core/test/troubleshoot-azure-iis?view=aspnetcore-7.0

    在这个排查页面上可以看到,这个错误是未禁用单文件发布导致的,那么,我们只要在项目文件中禁用单文件发布就行了。

    解决:在IIS部署时,禁用单文件发布。编辑xxx.csproj项目文件(xxx是你的项目名字),把PublishSingleFile这一项改为false,如果没有,直接添加下面的代码即可。

    <PublishSingleFile>false</PublishSingleFile>	

    如果使用VS的发布,要在发布选项中去掉单文件发布选项的钩:

  • Debian12安装dotnet sdk

    安装微软源:

    wget https://packages.microsoft.com/config/debian/12/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
    
    sudo dpkg -i packages-microsoft-prod.deb
    
    rm packages-microsoft-prod.deb

    安装 SDK

    sudo apt-get update && sudo apt-get install -y dotnet-sdk-9.0

    安装运行时

    sudo apt-get update &&  sudo apt-get install -y aspnetcore-runtime-9.0

    作为 ASP.NET Core 运行时的一种替代方法,你可以安装不包含 ASP.NET Core 支持的 .NET 运行时:将上一命令中的 aspnetcore-runtime-9.0 替换为 dotnet-runtime-9.0:

    sudo apt-get install -y dotnet-runtime-9.0

    使用 apt 更新 .NET

    当有新的小版本更新时,只需使用以下命令通过 apt 进行升级:

    sudo apt-get update
    sudo apt-get upgrade

    参考:https://learn.microsoft.com/zh-cn/dotnet/core/install/linux-debian?tabs=dotnet9

  • 更新EF命令行工具

    使用 dotnet tool update --global dotnet-ef 将全局工具dotnet-ef更新到最新的可用版本。

    如果在项目中本地安装了这些工具,请使用 dotnet tool update dotnet-ef

    通过将 --version 追加到命令来安装特定版本。 有关更多详细信息,请参阅 dotnet 工具文档的更新部分。

    参考:https://learn.microsoft.com/zh-cn/ef/core/cli/dotnet#update-the-tools

  • 解决 VS2022 包管理控制台找不到 add-migration 命令的问题

    在使用EF命令进行迁移时,遇到了VS2022 包管理控制台 找不到  add-migration 命令的错误。

    解决办法:

    使用everything搜索 EntityFrameworkCore.psd1,然后在程序包管理控制台中执行命令:import-module EntityFrameworkCore.psd1的全路径

    例如:

    import-module C:\Users\wujie\.nuget\packages\microsoft.entityframeworkcore.tools\7.0.0\tools\EntityFrameworkCore.psd1 -Verbose

    出现黄色警告不用管:

  • EF迁移命令

    EF的迁移命令:

    dotnet ef migrations add Init-o Data\Migrations

  • MariaDB 创建和删除数据库语句

    创建数据库:

    CREATE DATABASE `lwbj.cn`;

    加`号是因为数据库带了“.”

    通常建议使用下划线(_)代替点号(.)等特殊字符,这样更符合一般的数据库命名规则。

    查看数据库的字符集:

    SHOW CREATE DATABASE `lwbj.cn`;

    建立数据库时指定字符集:

    CREATE DATABASE `lwbj.cn` CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

    删除数据库:

    DROP DATABASE `lwbj.cn`;

  • MariaDB导入导出数据

    导出:

    mysqldump -u 用户名 -p 数据库名 > 导出文件.sql

    导入:

    mysql -u 用户名 -p 数据库名 < 导入文件.sql