diff --git a/src/CellularManagement.Domain/Entities/RolePermission.cs b/src/CellularManagement.Domain/Entities/RolePermission.cs index 2d9709e..4587951 100644 --- a/src/CellularManagement.Domain/Entities/RolePermission.cs +++ b/src/CellularManagement.Domain/Entities/RolePermission.cs @@ -15,7 +15,7 @@ public class RolePermission /// /// 权限ID /// - public int PermissionId { get; private set; } + public string PermissionId { get; private set; } /// /// 创建时间 @@ -37,7 +37,7 @@ public class RolePermission /// /// 创建角色权限关联 /// - public static RolePermission Create(string roleId, int permissionId) + public static RolePermission Create(string roleId, string permissionId) { return new RolePermission { diff --git a/src/CellularManagement.Domain/Repositories/IPermissionRepository.cs b/src/CellularManagement.Domain/Repositories/IPermissionRepository.cs index 1a7f82d..390f895 100644 --- a/src/CellularManagement.Domain/Repositories/IPermissionRepository.cs +++ b/src/CellularManagement.Domain/Repositories/IPermissionRepository.cs @@ -19,7 +19,7 @@ public interface IPermissionCommandRepository : ICommandRepository /// /// 删除角色权限 /// - Task DeleteRolePermissionAsync(string roleId, int permissionId, CancellationToken cancellationToken = default); + Task DeleteRolePermissionAsync(string roleId, string permissionId, CancellationToken cancellationToken = default); } /// diff --git a/src/CellularManagement.Infrastructure/Migrations/20250429070845_InitialCreate.Designer.cs b/src/CellularManagement.Infrastructure/Migrations/20250429070845_InitialCreate.Designer.cs deleted file mode 100644 index fad5a22..0000000 --- a/src/CellularManagement.Infrastructure/Migrations/20250429070845_InitialCreate.Designer.cs +++ /dev/null @@ -1,203 +0,0 @@ -// -using System; -using CellularManagement.Infrastructure.Context; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; - -#nullable disable - -namespace CellularManagement.Infrastructure.Migrations -{ - [DbContext(typeof(AppDbContext))] - [Migration("20250429070845_InitialCreate")] - partial class InitialCreate - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("ProductVersion", "8.0.0") - .HasAnnotation("Relational:MaxIdentifierLength", 63); - - NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); - - modelBuilder.Entity("CellularManagement.Domain.Entities.AppRole", b => - { - b.Property("Id") - .HasColumnType("text") - .HasComment("角色ID,主键"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .HasColumnType("text") - .HasComment("并发控制戳"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(256) - .HasColumnType("character varying(256)") - .HasComment("角色名称"); - - b.Property("NormalizedName") - .IsRequired() - .HasMaxLength(256) - .HasColumnType("character varying(256)") - .HasComment("标准化角色名称(大写)"); - - b.HasKey("Id"); - - b.HasIndex("Name") - .IsUnique() - .HasDatabaseName("IX_Roles_Name"); - - b.HasIndex("NormalizedName") - .IsUnique() - .HasDatabaseName("RoleNameIndex"); - - b.ToTable("Roles", null, t => - { - t.HasComment("角色表"); - }); - }); - - modelBuilder.Entity("CellularManagement.Domain.Entities.AppUser", b => - { - b.Property("Id") - .HasColumnType("text") - .HasComment("用户ID,主键"); - - b.Property("AccessFailedCount") - .HasColumnType("integer") - .HasComment("登录失败次数"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .HasColumnType("text") - .HasComment("并发控制戳"); - - b.Property("Email") - .IsRequired() - .HasMaxLength(256) - .HasColumnType("character varying(256)") - .HasComment("电子邮箱"); - - b.Property("EmailConfirmed") - .HasColumnType("boolean") - .HasComment("邮箱是否已验证"); - - b.Property("LockoutEnabled") - .HasColumnType("boolean") - .HasComment("是否启用账户锁定"); - - b.Property("LockoutEnd") - .HasColumnType("timestamp with time zone") - .HasComment("账户锁定结束时间"); - - b.Property("NormalizedEmail") - .HasMaxLength(256) - .HasColumnType("character varying(256)") - .HasComment("标准化电子邮箱(大写)"); - - b.Property("NormalizedUserName") - .HasMaxLength(256) - .HasColumnType("character varying(256)") - .HasComment("标准化用户名(大写)"); - - b.Property("PasswordHash") - .HasColumnType("text") - .HasComment("密码哈希值"); - - b.Property("PhoneNumber") - .IsRequired() - .HasColumnType("text") - .HasComment("电话号码"); - - b.Property("PhoneNumberConfirmed") - .HasColumnType("boolean") - .HasComment("电话号码是否已验证"); - - b.Property("SecurityStamp") - .HasColumnType("text") - .HasComment("安全戳,用于并发控制"); - - b.Property("TwoFactorEnabled") - .HasColumnType("boolean") - .HasComment("是否启用双因素认证"); - - b.Property("UserName") - .IsRequired() - .HasMaxLength(256) - .HasColumnType("character varying(256)") - .HasComment("用户名"); - - b.HasKey("Id"); - - b.HasIndex("Email") - .IsUnique() - .HasDatabaseName("IX_Users_Email"); - - b.HasIndex("NormalizedEmail") - .HasDatabaseName("EmailIndex"); - - b.HasIndex("NormalizedUserName") - .IsUnique() - .HasDatabaseName("UserNameIndex"); - - b.HasIndex("PhoneNumber") - .IsUnique() - .HasDatabaseName("IX_Users_PhoneNumber"); - - b.HasIndex("UserName") - .IsUnique() - .HasDatabaseName("IX_Users_UserName"); - - b.ToTable("Users", null, t => - { - t.HasComment("用户表"); - }); - }); - - modelBuilder.Entity("CellularManagement.Domain.Entities.UserRole", b => - { - b.Property("UserId") - .HasColumnType("text"); - - b.Property("RoleId") - .HasColumnType("text"); - - b.HasKey("UserId", "RoleId"); - - b.HasIndex("RoleId"); - - b.ToTable("UserRoles", null, t => - { - t.HasComment("用户角色关系表"); - }); - }); - - modelBuilder.Entity("CellularManagement.Domain.Entities.UserRole", b => - { - b.HasOne("CellularManagement.Domain.Entities.AppRole", "Role") - .WithMany() - .HasForeignKey("RoleId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("CellularManagement.Domain.Entities.AppUser", "User") - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Role"); - - b.Navigation("User"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/src/CellularManagement.Infrastructure/Migrations/20250429071554_AddRoleDescription.cs b/src/CellularManagement.Infrastructure/Migrations/20250429071554_AddRoleDescription.cs deleted file mode 100644 index 00fa508..0000000 --- a/src/CellularManagement.Infrastructure/Migrations/20250429071554_AddRoleDescription.cs +++ /dev/null @@ -1,30 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace CellularManagement.Infrastructure.Migrations -{ - /// - public partial class AddRoleDescription : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.AddColumn( - name: "Description", - table: "Roles", - type: "character varying(500)", - maxLength: 500, - nullable: true, - comment: "角色描述"); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropColumn( - name: "Description", - table: "Roles"); - } - } -} diff --git a/src/CellularManagement.Infrastructure/Migrations/20250429071554_AddRoleDescription.Designer.cs b/src/CellularManagement.Infrastructure/Migrations/20250509092443_InitialCreate.Designer.cs similarity index 76% rename from src/CellularManagement.Infrastructure/Migrations/20250429071554_AddRoleDescription.Designer.cs rename to src/CellularManagement.Infrastructure/Migrations/20250509092443_InitialCreate.Designer.cs index 0505e06..c4fb17d 100644 --- a/src/CellularManagement.Infrastructure/Migrations/20250429071554_AddRoleDescription.Designer.cs +++ b/src/CellularManagement.Infrastructure/Migrations/20250509092443_InitialCreate.Designer.cs @@ -12,8 +12,8 @@ using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; namespace CellularManagement.Infrastructure.Migrations { [DbContext(typeof(AppDbContext))] - [Migration("20250429071554_AddRoleDescription")] - partial class AddRoleDescription + [Migration("20250509092443_InitialCreate")] + partial class InitialCreate { /// protected override void BuildTargetModel(ModelBuilder modelBuilder) @@ -166,6 +166,46 @@ namespace CellularManagement.Infrastructure.Migrations }); }); + modelBuilder.Entity("CellularManagement.Domain.Entities.Permission", b => + { + b.Property("Id") + .HasColumnType("text"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Description") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("character varying(50)"); + + b.HasKey("Id"); + + b.ToTable("Permissions", (string)null); + }); + + modelBuilder.Entity("CellularManagement.Domain.Entities.RolePermission", b => + { + b.Property("RoleId") + .HasColumnType("text"); + + b.Property("PermissionId") + .HasColumnType("text"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.HasKey("RoleId", "PermissionId"); + + b.HasIndex("PermissionId"); + + b.ToTable("RolePermissions", (string)null); + }); + modelBuilder.Entity("CellularManagement.Domain.Entities.UserRole", b => { b.Property("UserId") @@ -184,6 +224,25 @@ namespace CellularManagement.Infrastructure.Migrations }); }); + modelBuilder.Entity("CellularManagement.Domain.Entities.RolePermission", b => + { + b.HasOne("CellularManagement.Domain.Entities.Permission", "Permission") + .WithMany("RolePermissions") + .HasForeignKey("PermissionId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("CellularManagement.Domain.Entities.AppRole", "Role") + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Permission"); + + b.Navigation("Role"); + }); + modelBuilder.Entity("CellularManagement.Domain.Entities.UserRole", b => { b.HasOne("CellularManagement.Domain.Entities.AppRole", "Role") @@ -202,6 +261,11 @@ namespace CellularManagement.Infrastructure.Migrations b.Navigation("User"); }); + + modelBuilder.Entity("CellularManagement.Domain.Entities.Permission", b => + { + b.Navigation("RolePermissions"); + }); #pragma warning restore 612, 618 } } diff --git a/src/CellularManagement.Infrastructure/Migrations/20250429070845_InitialCreate.cs b/src/CellularManagement.Infrastructure/Migrations/20250509092443_InitialCreate.cs similarity index 72% rename from src/CellularManagement.Infrastructure/Migrations/20250429070845_InitialCreate.cs rename to src/CellularManagement.Infrastructure/Migrations/20250509092443_InitialCreate.cs index 5674b75..a21d715 100644 --- a/src/CellularManagement.Infrastructure/Migrations/20250429070845_InitialCreate.cs +++ b/src/CellularManagement.Infrastructure/Migrations/20250509092443_InitialCreate.cs @@ -11,11 +11,26 @@ namespace CellularManagement.Infrastructure.Migrations /// protected override void Up(MigrationBuilder migrationBuilder) { + migrationBuilder.CreateTable( + name: "Permissions", + columns: table => new + { + Id = table.Column(type: "text", nullable: false), + Name = table.Column(type: "character varying(50)", maxLength: 50, nullable: false), + Description = table.Column(type: "character varying(200)", maxLength: 200, nullable: true), + CreatedAt = table.Column(type: "timestamp with time zone", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Permissions", x => x.Id); + }); + migrationBuilder.CreateTable( name: "Roles", columns: table => new { Id = table.Column(type: "text", nullable: false, comment: "角色ID,主键"), + Description = table.Column(type: "character varying(500)", maxLength: 500, nullable: true, comment: "角色描述"), Name = table.Column(type: "character varying(256)", maxLength: 256, nullable: false, comment: "角色名称"), NormalizedName = table.Column(type: "character varying(256)", maxLength: 256, nullable: false, comment: "标准化角色名称(大写)"), ConcurrencyStamp = table.Column(type: "text", nullable: true, comment: "并发控制戳") @@ -52,6 +67,31 @@ namespace CellularManagement.Infrastructure.Migrations }, comment: "用户表"); + migrationBuilder.CreateTable( + name: "RolePermissions", + columns: table => new + { + RoleId = table.Column(type: "text", nullable: false), + PermissionId = table.Column(type: "text", nullable: false), + CreatedAt = table.Column(type: "timestamp with time zone", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_RolePermissions", x => new { x.RoleId, x.PermissionId }); + table.ForeignKey( + name: "FK_RolePermissions_Permissions_PermissionId", + column: x => x.PermissionId, + principalTable: "Permissions", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_RolePermissions_Roles_RoleId", + column: x => x.RoleId, + principalTable: "Roles", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + migrationBuilder.CreateTable( name: "UserRoles", columns: table => new @@ -77,6 +117,11 @@ namespace CellularManagement.Infrastructure.Migrations }, comment: "用户角色关系表"); + migrationBuilder.CreateIndex( + name: "IX_RolePermissions_PermissionId", + table: "RolePermissions", + column: "PermissionId"); + migrationBuilder.CreateIndex( name: "IX_Roles_Name", table: "Roles", @@ -127,9 +172,15 @@ namespace CellularManagement.Infrastructure.Migrations /// protected override void Down(MigrationBuilder migrationBuilder) { + migrationBuilder.DropTable( + name: "RolePermissions"); + migrationBuilder.DropTable( name: "UserRoles"); + migrationBuilder.DropTable( + name: "Permissions"); + migrationBuilder.DropTable( name: "Roles"); diff --git a/src/CellularManagement.Infrastructure/Migrations/AppDbContextModelSnapshot.cs b/src/CellularManagement.Infrastructure/Migrations/AppDbContextModelSnapshot.cs index 210c20a..92aeb80 100644 --- a/src/CellularManagement.Infrastructure/Migrations/AppDbContextModelSnapshot.cs +++ b/src/CellularManagement.Infrastructure/Migrations/AppDbContextModelSnapshot.cs @@ -163,6 +163,46 @@ namespace CellularManagement.Infrastructure.Migrations }); }); + modelBuilder.Entity("CellularManagement.Domain.Entities.Permission", b => + { + b.Property("Id") + .HasColumnType("text"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Description") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("character varying(50)"); + + b.HasKey("Id"); + + b.ToTable("Permissions", (string)null); + }); + + modelBuilder.Entity("CellularManagement.Domain.Entities.RolePermission", b => + { + b.Property("RoleId") + .HasColumnType("text"); + + b.Property("PermissionId") + .HasColumnType("text"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.HasKey("RoleId", "PermissionId"); + + b.HasIndex("PermissionId"); + + b.ToTable("RolePermissions", (string)null); + }); + modelBuilder.Entity("CellularManagement.Domain.Entities.UserRole", b => { b.Property("UserId") @@ -181,6 +221,25 @@ namespace CellularManagement.Infrastructure.Migrations }); }); + modelBuilder.Entity("CellularManagement.Domain.Entities.RolePermission", b => + { + b.HasOne("CellularManagement.Domain.Entities.Permission", "Permission") + .WithMany("RolePermissions") + .HasForeignKey("PermissionId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("CellularManagement.Domain.Entities.AppRole", "Role") + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Permission"); + + b.Navigation("Role"); + }); + modelBuilder.Entity("CellularManagement.Domain.Entities.UserRole", b => { b.HasOne("CellularManagement.Domain.Entities.AppRole", "Role") @@ -199,6 +258,11 @@ namespace CellularManagement.Infrastructure.Migrations b.Navigation("User"); }); + + modelBuilder.Entity("CellularManagement.Domain.Entities.Permission", b => + { + b.Navigation("RolePermissions"); + }); #pragma warning restore 612, 618 } } diff --git a/src/CellularManagement.Infrastructure/Repositories/PermissionRepository.cs b/src/CellularManagement.Infrastructure/Repositories/PermissionRepository.cs index 6e12901..a399943 100644 --- a/src/CellularManagement.Infrastructure/Repositories/PermissionRepository.cs +++ b/src/CellularManagement.Infrastructure/Repositories/PermissionRepository.cs @@ -156,7 +156,7 @@ public class PermissionRepository : /// /// 删除角色权限 /// - public async Task DeleteRolePermissionAsync(string roleId, int permissionId, CancellationToken cancellationToken = default) + public async Task DeleteRolePermissionAsync(string roleId, string permissionId, CancellationToken cancellationToken = default) { var rolePermission = await _context.RolePermissions .FirstOrDefaultAsync(rp => rp.RoleId == roleId && rp.PermissionId == permissionId, cancellationToken);