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);