瀏覽代碼

新增用户和租户禁用接口,平台管理员和平台租户无法禁用

zhontai 2 年之前
父節點
當前提交
b9855d549e

+ 0 - 1
src/hosts/ZhonTai.Host/Program.cs

@@ -5,7 +5,6 @@ using ZhonTai;
 using ZhonTai.Admin.Core;
 using ZhonTai.Admin.Core.Configs;
 using ZhonTai.Admin.Core.Consts;
-using ZhonTai.Admin.Core.Extensions;
 using ZhonTai.Admin.Core.Startup;
 using ZhonTai.Admin.Tools.TaskScheduler;
 using ZhonTai.ApiUI;

+ 7 - 8
src/platform/ZhonTai.Admin/Core/HostApp.cs

@@ -61,11 +61,8 @@ namespace ZhonTai.Admin.Core;
 /// <summary>
 /// 宿主应用
 /// </summary>
-public partial class HostApp
+public class HostApp
 {
-    [GeneratedRegex("[\\{\\\\\\/\\}]")]
-    private static partial Regex PathRegex();
-
     readonly HostAppOptions _hostAppOptions;
 
     public HostApp()
@@ -325,7 +322,7 @@ public partial class HostApp
                 {
                     var controllerAction = apiDesc.ActionDescriptor as ControllerActionDescriptor;
                     var api = controllerAction.AttributeRouteInfo.Template;
-                    api = PathRegex().Replace(api, "-") + "-" + apiDesc.HttpMethod.ToLower();
+                    api = Regex.Replace(api, @"[\{\\\/\}]", "-") + "-" + apiDesc.HttpMethod.ToLower();
                     return api.Replace("--", "-");
                 });
 
@@ -558,9 +555,11 @@ public partial class HostApp
         var cacheConfig = ConfigHelper.Get<CacheConfig>("cacheconfig", env.EnvironmentName);
         if (cacheConfig.Type == CacheType.Redis)
         {
-            var redis = new RedisClient(cacheConfig.Redis.ConnectionString);
-            redis.Serialize = JsonConvert.SerializeObject;
-            redis.Deserialize = JsonConvert.DeserializeObject;
+            var redis = new RedisClient(cacheConfig.Redis.ConnectionString)
+            {
+                Serialize = JsonConvert.SerializeObject,
+                Deserialize = JsonConvert.DeserializeObject
+            };
             services.AddSingleton(redis);
             services.AddSingleton<ICacheTool, RedisCacheTool>();
         }

+ 7 - 2
src/platform/ZhonTai.Admin/Domain/User/UserEntity.cs

@@ -91,8 +91,8 @@ public partial class UserEntity : EntityTenant
     /// <summary>
     /// 用户状态
     /// </summary>
-    [Column(MapType = typeof(int))]
-    public UserStatus Status { get; set; }
+    [Column(MapType = typeof(int?))]
+    public UserStatus? Status { get; set; }
 
     /// <summary>
     /// 用户类型
@@ -100,6 +100,11 @@ public partial class UserEntity : EntityTenant
     [Column(MapType = typeof(int))]
     public UserType Type { get; set; } = UserType.DefaultUser;
 
+    /// <summary>
+    /// 启用
+    /// </summary>
+    public bool Enabled { get; set; } = true;
+
     /// <summary>
     /// 角色列表
     /// </summary>

+ 0 - 10
src/platform/ZhonTai.Admin/Domain/User/UserStatus.cs

@@ -5,16 +5,6 @@
 /// </summary>
 public enum UserStatus
 {
-    /// <summary>
-    /// 正常
-    /// </summary>
-    Enabled = 0,
-
-    /// <summary>
-    /// 禁用
-    /// </summary>
-    Disabled = 1,
-
     /// <summary>
     /// 待修改密码
     /// </summary>

+ 32 - 11
src/platform/ZhonTai.Admin/Services/Auth/AuthService.cs

@@ -86,8 +86,8 @@ public class AuthService : BaseService, IAuthService, IDynamicApi
             new Claim(ClaimAttributes.Name, user.Name),
             new Claim(ClaimAttributes.UserType, user.Type.ToInt().ToString(), ClaimValueTypes.Integer32),
             new Claim(ClaimAttributes.TenantId, user.TenantId.ToString(), ClaimValueTypes.Integer64),
-            new Claim(ClaimAttributes.TenantType, user.TenantType.ToInt().ToString(), ClaimValueTypes.Integer32),
-            new Claim(ClaimAttributes.DbKey, user.DbKey??"")
+            new Claim(ClaimAttributes.TenantType, user.Tenant?.TenantType.ToInt().ToString(), ClaimValueTypes.Integer32),
+            new Claim(ClaimAttributes.DbKey, user.Tenant?.DbKey??"")
         });
 
         return token;
@@ -353,7 +353,7 @@ public class AuthService : BaseService, IAuthService, IDynamicApi
                 }
                 else
                 {
-                    throw ResultOutput.Exception("解密失败");
+                    throw ResultOutput.Exception("解密失败");
                 }
             }
 
@@ -375,14 +375,15 @@ public class AuthService : BaseService, IAuthService, IDynamicApi
                     valid = user.Password == password;
                 }
             }
-            if (!valid)
+            
+            if(!valid)
             {
                 throw ResultOutput.Exception("用户名或密码错误");
             }
 
-            if (user.Status == UserStatus.Disabled)
+            if (!user.Enabled)
             {
-                throw ResultOutput.Exception("禁止登录,请联系管理员");
+                throw ResultOutput.Exception("账号已停用,禁止登录");
             }
             #endregion
 
@@ -390,9 +391,12 @@ public class AuthService : BaseService, IAuthService, IDynamicApi
             var authLoginOutput = Mapper.Map<AuthLoginOutput>(user);
             if (_appConfig.Tenant)
             {
-                var tenant = await _tenantRepository.Select.WhereDynamic(user.TenantId).ToOneAsync(a => new { a.TenantType, a.DbKey });
-                authLoginOutput.TenantType = tenant.TenantType;
-                authLoginOutput.DbKey = tenant.DbKey;
+                var tenant = await _tenantRepository.Select.WhereDynamic(user.TenantId).ToOneAsync<AuthLoginTenantDto>();
+                if (!(tenant != null && tenant.Enabled))
+                {
+                    throw ResultOutput.Exception("企业已停用,禁止登录");
+                }
+                authLoginOutput.Tenant = tenant;
             }
             string token = GetToken(authLoginOutput);
             #endregion
@@ -457,8 +461,25 @@ public class AuthService : BaseService, IAuthService, IDynamicApi
             throw ResultOutput.Exception("验签失败");
         }
 
-        var output = await LazyGetRequiredService<IUserService>().GetLoginUserAsync(userId.ToLong());
-        string newToken = GetToken(output);
+        var user = await LazyGetRequiredService<IUserService>().GetLoginUserAsync(userId.ToLong());
+        if(!(user?.Id > 0))
+        {
+            throw ResultOutput.Exception("账号不存在");
+        }
+        if (!user.Enabled)
+        {
+            throw ResultOutput.Exception("账号已停用,禁止登录");
+        }
+
+        if (_appConfig.Tenant)
+        {
+            if (!(user.Tenant != null && user.Tenant.Enabled))
+            {
+                throw ResultOutput.Exception("企业已停用,禁止登录");
+            }
+        }
+
+        string newToken = GetToken(user);
         return new { token = newToken };
     }
 

+ 21 - 0
src/platform/ZhonTai.Admin/Services/Auth/Dto/AuthLoginOutput.cs

@@ -35,6 +35,22 @@ public class AuthLoginOutput
     /// </summary>
     public long? OrgId { get; set; }
 
+    /// <summary>
+    /// 租户信息
+    /// </summary>
+    public AuthLoginTenantDto Tenant { get; set; }
+
+    /// <summary>
+    /// 启用
+    /// </summary>
+    public bool Enabled { get; set; }
+}
+
+/// <summary>
+/// 租户信息
+/// </summary>
+public class AuthLoginTenantDto
+{
     /// <summary>
     /// 租户类型
     /// </summary>
@@ -44,4 +60,9 @@ public class AuthLoginOutput
     /// 数据库注册键
     /// </summary>
     public string DbKey { get; set; }
+
+    /// <summary>
+    /// 启用
+    /// </summary>
+    public bool Enabled { get; set; }
 }

+ 17 - 0
src/platform/ZhonTai.Admin/Services/Tenant/Dto/TenantSetEnableInput.cs

@@ -0,0 +1,17 @@
+namespace ZhonTai.Admin.Services.Tenant.Dto;
+
+/// <summary>
+/// 设置启用
+/// </summary>
+public class TenantSetEnableInput
+{
+    /// <summary>
+    /// 租户Id
+    /// </summary>
+    public long TenantId { get; set; }
+
+    /// <summary>
+    /// 是否启用
+    /// </summary>
+    public bool Enabled { get; set; }
+}

+ 28 - 2
src/platform/ZhonTai.Admin/Services/Tenant/TenantService.cs

@@ -125,7 +125,7 @@ public class TenantService : BaseService, ITenantService, IDynamicApi
             Name = input.RealName,
             Mobile = input.Phone,
             Email = input.Email,
-            Status = UserStatus.Enabled,
+            Enabled = true,
             Type = UserType.TenantAdmin,
             OrgId = org.Id
         };
@@ -195,10 +195,20 @@ public class TenantService : BaseService, ITenantService, IDynamicApi
     /// <returns></returns>
     public async Task UpdateAsync(TenantUpdateInput input)
     {
+        if (await _tenantRepository.Select.AnyAsync(a => a.Id != input.Id && a.Name == input.Name))
+        {
+            throw ResultOutput.Exception($"企业名称已存在");
+        }
+
+        if (await _tenantRepository.Select.AnyAsync(a => a.Id != input.Id && a.Code == input.Code))
+        {
+            throw ResultOutput.Exception($"企业编码已存在");
+        }
+
         var entity = await _tenantRepository.GetAsync(input.Id);
         if (!(entity?.Id > 0))
         {
-            throw ResultOutput.Exception("租户不存在!");
+            throw ResultOutput.Exception("租户不存在");
         }
 
         Mapper.Map(input, entity);
@@ -288,4 +298,20 @@ public class TenantService : BaseService, ITenantService, IDynamicApi
         //删除租户
         var result = await _tenantRepository.SoftDeleteAsync(ids);
     }
+
+    /// <summary>
+    /// 设置启用
+    /// </summary>
+    /// <param name="input"></param>
+    /// <returns></returns>
+    public async Task SetEnableAsync(TenantSetEnableInput input)
+    {
+        var entity = await _tenantRepository.GetAsync(input.TenantId);
+        if (entity.TenantType == TenantType.Platform)
+        {
+            throw ResultOutput.Exception("平台租户禁止禁用");
+        }
+        entity.Enabled = input.Enabled;
+        await _tenantRepository.UpdateAsync(entity);
+    }
 }

+ 2 - 3
src/platform/ZhonTai.Admin/Services/User/Dto/UserAddInput.cs

@@ -1,5 +1,4 @@
 using System.ComponentModel.DataAnnotations;
-using ZhonTai.Admin.Domain.User;
 
 namespace ZhonTai.Admin.Services.User.Dto;
 
@@ -15,7 +14,7 @@ public class UserAddInput: UserFormInput
     public virtual string Password { get; set; }
 
     /// <summary>
-    /// 状态
+    /// 启用
     /// </summary>
-    public UserStatus Status { get; set; } = UserStatus.Enabled;
+    public bool Enabled { get; set; } = true;
 }

+ 6 - 1
src/platform/ZhonTai.Admin/Services/User/Dto/UserGetPageOutput.cs

@@ -46,7 +46,12 @@ public class UserGetPageOutput
     /// <summary>
     /// 是否主管
     /// </summary>
-    public bool IsManager { get; set; } = false;
+    public bool IsManager { get; set; }
+
+    /// <summary>
+    /// 启用
+    /// </summary>
+    public bool Enabled { get; set; }
 
     [JsonIgnore]
     public ICollection<RoleEntity> Roles { get; set; }

+ 17 - 0
src/platform/ZhonTai.Admin/Services/User/Dto/UserSetEnableInput.cs

@@ -0,0 +1,17 @@
+namespace ZhonTai.Admin.Services.User.Dto;
+
+/// <summary>
+/// 设置启用
+/// </summary>
+public class UserSetEnableInput
+{
+    /// <summary>
+    /// 用户Id
+    /// </summary>
+    public long UserId { get; set; }
+
+    /// <summary>
+    /// 是否启用
+    /// </summary>
+    public bool Enabled { get; set; }
+}

+ 22 - 7
src/platform/ZhonTai.Admin/Services/User/UserService.cs

@@ -31,6 +31,7 @@ using ZhonTai.Admin.Domain.RoleOrg;
 using ZhonTai.Admin.Domain.UserOrg;
 using Microsoft.AspNetCore.Identity;
 using ZhonTai.Admin.Services.File;
+using ZhonTai.Admin.Core.Auth;
 
 namespace ZhonTai.Admin.Services.User;
 
@@ -143,18 +144,16 @@ public partial class UserService : BaseService, IUserService, IDynamicApi
     [NonAction]
     public async Task<AuthLoginOutput> GetLoginUserAsync(long id)
     {
-        var output = new ResultOutput<AuthLoginOutput>();
-        var entityDto = await _userRepository.Select.DisableGlobalFilter(FilterNames.Tenant)
+        var output = await _userRepository.Select.DisableGlobalFilter(FilterNames.Tenant)
             .WhereDynamic(id).ToOneAsync<AuthLoginOutput>();
 
-        if (_appConfig.Tenant && entityDto?.TenantId.Value > 0)
+        if (_appConfig.Tenant && output?.TenantId.Value > 0)
         {
             var tenant = await _tenantRepository.Select.DisableGlobalFilter(FilterNames.Tenant)
-                .WhereDynamic(entityDto.TenantId).ToOneAsync(a => new { a.TenantType, a.DbKey });
-            entityDto.TenantType = tenant.TenantType;
-            entityDto.DbKey = tenant.DbKey;
+                .WhereDynamic(output.TenantId).ToOneAsync<AuthLoginTenantDto>();
+            output.Tenant = tenant;
         }
-        return entityDto;
+        return output;
     }
 
     /// <summary>
@@ -598,6 +597,22 @@ public partial class UserService : BaseService, IUserService, IDynamicApi
         await _userOrgRepository.UpdateAsync(entity);
     }
 
+    /// <summary>
+    /// 设置启用
+    /// </summary>
+    /// <param name="input"></param>
+    /// <returns></returns>
+    public async Task SetEnableAsync(UserSetEnableInput input)
+    {
+        var entity = await _userRepository.GetAsync(input.UserId);
+        if (entity.Type == UserType.PlatformAdmin)
+        {
+            throw ResultOutput.Exception("平台管理员禁止禁用");
+        }
+        entity.Enabled = input.Enabled;
+        await _userRepository.UpdateAsync(entity);
+    }
+
     /// <summary>
     /// 彻底删除用户
     /// </summary>

+ 87 - 58
src/platform/ZhonTai.Admin/ZhonTai.Admin.xml

@@ -1734,14 +1734,6 @@
             宿主应用
             </summary>
         </member>
-        <member name="M:ZhonTai.Admin.Core.HostApp.PathRegex">
-            <remarks>
-            Pattern explanation:<br/>
-            <code>
-            ○ Match a character in the set [/\\{}].<br/>
-            </code>
-            </remarks>
-        </member>
         <member name="M:ZhonTai.Admin.Core.HostApp.Run(System.String[])">
             <summary>
             运行应用
@@ -3234,6 +3226,11 @@
             用户类型
             </summary>
         </member>
+        <member name="P:ZhonTai.Admin.Domain.User.UserEntity.Enabled">
+            <summary>
+            启用
+            </summary>
+        </member>
         <member name="P:ZhonTai.Admin.Domain.User.UserEntity.Roles">
             <summary>
             角色列表
@@ -3254,16 +3251,6 @@
             用户状态
             </summary>
         </member>
-        <member name="F:ZhonTai.Admin.Domain.User.UserStatus.Enabled">
-            <summary>
-            正常
-            </summary>
-        </member>
-        <member name="F:ZhonTai.Admin.Domain.User.UserStatus.Disabled">
-            <summary>
-            禁用
-            </summary>
-        </member>
         <member name="F:ZhonTai.Admin.Domain.User.UserStatus.WaitChangePasssword">
             <summary>
             待修改密码
@@ -3809,16 +3796,36 @@
             部门Id
             </summary>
         </member>
-        <member name="P:ZhonTai.Admin.Services.Auth.Dto.AuthLoginOutput.TenantType">
+        <member name="P:ZhonTai.Admin.Services.Auth.Dto.AuthLoginOutput.Tenant">
+            <summary>
+            租户信息
+            </summary>
+        </member>
+        <member name="P:ZhonTai.Admin.Services.Auth.Dto.AuthLoginOutput.Enabled">
+            <summary>
+            启用
+            </summary>
+        </member>
+        <member name="T:ZhonTai.Admin.Services.Auth.Dto.AuthLoginTenantDto">
+            <summary>
+            租户信息
+            </summary>
+        </member>
+        <member name="P:ZhonTai.Admin.Services.Auth.Dto.AuthLoginTenantDto.TenantType">
             <summary>
             租户类型
             </summary>
         </member>
-        <member name="P:ZhonTai.Admin.Services.Auth.Dto.AuthLoginOutput.DbKey">
+        <member name="P:ZhonTai.Admin.Services.Auth.Dto.AuthLoginTenantDto.DbKey">
             <summary>
             数据库注册键
             </summary>
         </member>
+        <member name="P:ZhonTai.Admin.Services.Auth.Dto.AuthLoginTenantDto.Enabled">
+            <summary>
+            启用
+            </summary>
+        </member>
         <member name="P:ZhonTai.Admin.Services.Auth.Dto.AuthUserMenuDto.Id">
             <summary>
             权限Id
@@ -6154,6 +6161,21 @@
             创建时间
             </summary>
         </member>
+        <member name="T:ZhonTai.Admin.Services.Tenant.Dto.TenantSetEnableInput">
+            <summary>
+            设置启用
+            </summary>
+        </member>
+        <member name="P:ZhonTai.Admin.Services.Tenant.Dto.TenantSetEnableInput.TenantId">
+            <summary>
+            租户Id
+            </summary>
+        </member>
+        <member name="P:ZhonTai.Admin.Services.Tenant.Dto.TenantSetEnableInput.Enabled">
+            <summary>
+            是否启用
+            </summary>
+        </member>
         <member name="T:ZhonTai.Admin.Services.Tenant.Dto.TenantUpdateInput">
             <summary>
             修改
@@ -6223,6 +6245,13 @@
             <param name="ids"></param>
             <returns></returns>
         </member>
+        <member name="M:ZhonTai.Admin.Services.Tenant.TenantService.SetEnableAsync(ZhonTai.Admin.Services.Tenant.Dto.TenantSetEnableInput)">
+            <summary>
+            设置启用
+            </summary>
+            <param name="input"></param>
+            <returns></returns>
+        </member>
         <member name="T:ZhonTai.Admin.Services.User.Dto.UserAddInput">
             <summary>
             添加
@@ -6233,9 +6262,9 @@
             密码
             </summary>
         </member>
-        <member name="P:ZhonTai.Admin.Services.User.Dto.UserAddInput.Status">
+        <member name="P:ZhonTai.Admin.Services.User.Dto.UserAddInput.Enabled">
             <summary>
-            状态
+            启用
             </summary>
         </member>
         <member name="T:ZhonTai.Admin.Services.User.Dto.UserAddMemberInput">
@@ -6423,6 +6452,11 @@
             是否主管
             </summary>
         </member>
+        <member name="P:ZhonTai.Admin.Services.User.Dto.UserGetPageOutput.Enabled">
+            <summary>
+            启用
+            </summary>
+        </member>
         <member name="P:ZhonTai.Admin.Services.User.Dto.UserGetPageOutput.CreatedTime">
             <summary>
             创建时间
@@ -6463,6 +6497,21 @@
             密码
             </summary>
         </member>
+        <member name="T:ZhonTai.Admin.Services.User.Dto.UserSetEnableInput">
+            <summary>
+            设置启用
+            </summary>
+        </member>
+        <member name="P:ZhonTai.Admin.Services.User.Dto.UserSetEnableInput.UserId">
+            <summary>
+            用户Id
+            </summary>
+        </member>
+        <member name="P:ZhonTai.Admin.Services.User.Dto.UserSetEnableInput.Enabled">
+            <summary>
+            是否启用
+            </summary>
+        </member>
         <member name="T:ZhonTai.Admin.Services.User.Dto.UserSetManagerInput">
             <summary>
             设置主管
@@ -6623,6 +6672,13 @@
             <param name="input"></param>
             <returns></returns>
         </member>
+        <member name="M:ZhonTai.Admin.Services.User.UserService.SetEnableAsync(ZhonTai.Admin.Services.User.Dto.UserSetEnableInput)">
+            <summary>
+            设置启用
+            </summary>
+            <param name="input"></param>
+            <returns></returns>
+        </member>
         <member name="M:ZhonTai.Admin.Services.User.UserService.DeleteAsync(System.Int64)">
             <summary>
             彻底删除用户
@@ -7223,61 +7279,34 @@
             </summary>
             <param name="app"></param>
         </member>
-        <member name="T:System.Text.RegularExpressions.Generated.PathRegex_0">
-            <summary>Custom <see cref="T:System.Text.RegularExpressions.Regex"/>-derived type for the PathRegex method.</summary>
-        </member>
-        <member name="F:System.Text.RegularExpressions.Generated.PathRegex_0.Instance">
-            <summary>Cached, thread-safe singleton instance.</summary>
-        </member>
-        <member name="M:System.Text.RegularExpressions.Generated.PathRegex_0.#ctor">
-            <summary>Initializes the instance.</summary>
-        </member>
-        <member name="T:System.Text.RegularExpressions.Generated.PathRegex_0.RunnerFactory">
-            <summary>Provides a factory for creating <see cref="T:System.Text.RegularExpressions.RegexRunner"/> instances to be used by methods on <see cref="T:System.Text.RegularExpressions.Regex"/>.</summary>
-        </member>
-        <member name="M:System.Text.RegularExpressions.Generated.PathRegex_0.RunnerFactory.CreateInstance">
-            <summary>Creates an instance of a <see cref="T:System.Text.RegularExpressions.RegexRunner"/> used by methods on <see cref="T:System.Text.RegularExpressions.Regex"/>.</summary>
-        </member>
-        <member name="T:System.Text.RegularExpressions.Generated.PathRegex_0.RunnerFactory.Runner">
-            <summary>Provides the runner that contains the custom logic implementing the specified regular expression.</summary>
-        </member>
-        <member name="M:System.Text.RegularExpressions.Generated.PathRegex_0.RunnerFactory.Runner.Scan(System.ReadOnlySpan{System.Char})">
-            <summary>Scan the <paramref name="inputSpan"/> starting from base.runtextstart for the next match.</summary>
-            <param name="inputSpan">The text being scanned by the regular expression.</param>
-        </member>
-        <member name="M:System.Text.RegularExpressions.Generated.PathRegex_0.RunnerFactory.Runner.TryFindNextPossibleStartingPosition(System.ReadOnlySpan{System.Char})">
-            <summary>Search <paramref name="inputSpan"/> starting from base.runtextpos for the next location a match could possibly start.</summary>
-            <param name="inputSpan">The text being scanned by the regular expression.</param>
-            <returns>true if a possible match was found; false if no more matches are possible.</returns>
-        </member>
-        <member name="T:System.Text.RegularExpressions.Generated.PatternRegex_1">
+        <member name="T:System.Text.RegularExpressions.Generated.PatternRegex_0">
             <summary>Custom <see cref="T:System.Text.RegularExpressions.Regex"/>-derived type for the PatternRegex method.</summary>
         </member>
-        <member name="F:System.Text.RegularExpressions.Generated.PatternRegex_1.Instance">
+        <member name="F:System.Text.RegularExpressions.Generated.PatternRegex_0.Instance">
             <summary>Cached, thread-safe singleton instance.</summary>
         </member>
-        <member name="M:System.Text.RegularExpressions.Generated.PatternRegex_1.#ctor">
+        <member name="M:System.Text.RegularExpressions.Generated.PatternRegex_0.#ctor">
             <summary>Initializes the instance.</summary>
         </member>
-        <member name="T:System.Text.RegularExpressions.Generated.PatternRegex_1.RunnerFactory">
+        <member name="T:System.Text.RegularExpressions.Generated.PatternRegex_0.RunnerFactory">
             <summary>Provides a factory for creating <see cref="T:System.Text.RegularExpressions.RegexRunner"/> instances to be used by methods on <see cref="T:System.Text.RegularExpressions.Regex"/>.</summary>
         </member>
-        <member name="M:System.Text.RegularExpressions.Generated.PatternRegex_1.RunnerFactory.CreateInstance">
+        <member name="M:System.Text.RegularExpressions.Generated.PatternRegex_0.RunnerFactory.CreateInstance">
             <summary>Creates an instance of a <see cref="T:System.Text.RegularExpressions.RegexRunner"/> used by methods on <see cref="T:System.Text.RegularExpressions.Regex"/>.</summary>
         </member>
-        <member name="T:System.Text.RegularExpressions.Generated.PatternRegex_1.RunnerFactory.Runner">
+        <member name="T:System.Text.RegularExpressions.Generated.PatternRegex_0.RunnerFactory.Runner">
             <summary>Provides the runner that contains the custom logic implementing the specified regular expression.</summary>
         </member>
-        <member name="M:System.Text.RegularExpressions.Generated.PatternRegex_1.RunnerFactory.Runner.Scan(System.ReadOnlySpan{System.Char})">
+        <member name="M:System.Text.RegularExpressions.Generated.PatternRegex_0.RunnerFactory.Runner.Scan(System.ReadOnlySpan{System.Char})">
             <summary>Scan the <paramref name="inputSpan"/> starting from base.runtextstart for the next match.</summary>
             <param name="inputSpan">The text being scanned by the regular expression.</param>
         </member>
-        <member name="M:System.Text.RegularExpressions.Generated.PatternRegex_1.RunnerFactory.Runner.TryFindNextPossibleStartingPosition(System.ReadOnlySpan{System.Char})">
+        <member name="M:System.Text.RegularExpressions.Generated.PatternRegex_0.RunnerFactory.Runner.TryFindNextPossibleStartingPosition(System.ReadOnlySpan{System.Char})">
             <summary>Search <paramref name="inputSpan"/> starting from base.runtextpos for the next location a match could possibly start.</summary>
             <param name="inputSpan">The text being scanned by the regular expression.</param>
             <returns>true if a possible match was found; false if no more matches are possible.</returns>
         </member>
-        <member name="M:System.Text.RegularExpressions.Generated.PatternRegex_1.RunnerFactory.Runner.TryMatchAtCurrentPosition(System.ReadOnlySpan{System.Char})">
+        <member name="M:System.Text.RegularExpressions.Generated.PatternRegex_0.RunnerFactory.Runner.TryMatchAtCurrentPosition(System.ReadOnlySpan{System.Char})">
             <summary>Determine whether <paramref name="inputSpan"/> at base.runtextpos is a match for the regular expression.</summary>
             <param name="inputSpan">The text being scanned by the regular expression.</param>
             <returns>true if the regular expression matches at the current position; otherwise, false.</returns>