From 288ca63de13ab24c8f135e6f50deaed9fb408635 Mon Sep 17 00:00:00 2001 From: zhangpeihang <948869991@qq.com> Date: Tue, 28 Dec 2021 16:29:12 +0800 Subject: [PATCH 01/18] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=20EFCore=20?= =?UTF-8?q?=E6=9C=8D=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Extensions/ServicesExtensions.cs | 2 + .../Services/DictService.cs | 70 ++++++++++++++-- .../Services/LoginService.cs | 16 ++++ .../Services/NavigationsService.cs | 26 ++++-- .../Services/UserService.cs | 83 +++++++++++++++++++ .../BootstrapAdmin.Web.Core/INavigation.cs | 2 +- 6 files changed, 186 insertions(+), 13 deletions(-) create mode 100644 src/blazor/admin/BootstrapAdmin.DataAccess.EFCore/Services/LoginService.cs create mode 100644 src/blazor/admin/BootstrapAdmin.DataAccess.EFCore/Services/UserService.cs diff --git a/src/blazor/admin/BootstrapAdmin.DataAccess.EFCore/Extensions/ServicesExtensions.cs b/src/blazor/admin/BootstrapAdmin.DataAccess.EFCore/Extensions/ServicesExtensions.cs index 979d84ae9..818770d50 100644 --- a/src/blazor/admin/BootstrapAdmin.DataAccess.EFCore/Extensions/ServicesExtensions.cs +++ b/src/blazor/admin/BootstrapAdmin.DataAccess.EFCore/Extensions/ServicesExtensions.cs @@ -47,6 +47,8 @@ namespace Microsoft.Extensions.DependencyInjection services.AddSingleton(); services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); return services; } } diff --git a/src/blazor/admin/BootstrapAdmin.DataAccess.EFCore/Services/DictService.cs b/src/blazor/admin/BootstrapAdmin.DataAccess.EFCore/Services/DictService.cs index da911682b..3b60a3805 100644 --- a/src/blazor/admin/BootstrapAdmin.DataAccess.EFCore/Services/DictService.cs +++ b/src/blazor/admin/BootstrapAdmin.DataAccess.EFCore/Services/DictService.cs @@ -1,39 +1,84 @@ using BootstrapAdmin.DataAccess.Models; using BootstrapAdmin.Web.Core; using BootstrapBlazor.Components; +using Longbow.Security.Cryptography; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Configuration; namespace BootstrapAdmin.DataAccess.EFCore.Services { class DictService : IDict { + private IDbContextFactory DbFactory { get; set; } + + private string AppId { get; set; } + + /// + /// + /// + /// + /// + public DictService(IDbContextFactory factory, IConfiguration configuration) + { + DbFactory = factory; + AppId = configuration.GetValue("AppId", "BA"); + } + + private List GetAll() + { + using var context = DbFactory.CreateDbContext(); + return context.Dicts.ToList(); + } + public Dictionary GetApps() { - throw new NotImplementedException(); + var dicts = GetAll(); + return dicts.Where(d => d.Category == "应用程序").Select(d => new KeyValuePair(d.Code, d.Name)).ToDictionary(i => i.Key, i => i.Value); } public Dictionary GetLogins() { - throw new NotImplementedException(); + var dicts = GetAll(); + return dicts.Where(d => d.Category == "系统首页").Select(d => new KeyValuePair(d.Code, d.Name)).ToDictionary(i => i.Key, i => i.Value); } public Dictionary GetThemes() { - throw new NotImplementedException(); + var dicts = GetAll(); + return dicts.Where(d => d.Category == "网站样式").Select(d => new KeyValuePair(d.Code, d.Name)).ToDictionary(i => i.Key, i => i.Value); } public string GetWebFooter() { - throw new NotImplementedException(); + var dicts = GetAll(); + var title = "网站页脚"; + var name = dicts.FirstOrDefault(d => d.Category == "应用程序" && d.Code == AppId)?.Name; + if (!string.IsNullOrEmpty(name)) + { + var dict = dicts.FirstOrDefault(d => d.Category == name && d.Name == "网站页脚") ?? dicts.FirstOrDefault(d => d.Category == "网站设置" && d.Name == "网站页脚"); + title = dict?.Code ?? "网站标题"; + } + return title; } public string GetWebTitle() { - throw new NotImplementedException(); + var dicts = GetAll(); + var title = "网站标题"; + var name = dicts.FirstOrDefault(d => d.Category == "应用程序" && d.Code == AppId)?.Name; + if (!string.IsNullOrEmpty(name)) + { + var dict = dicts.FirstOrDefault(d => d.Category == name && d.Name == "网站标题") ?? dicts.FirstOrDefault(d => d.Category == "网站设置" && d.Name == "网站标题"); + title = dict?.Code ?? "网站标题"; + } + return title; } public bool IsDemo() { - throw new NotImplementedException(); + var dicts = GetAll(); + var code = dicts.FirstOrDefault(d => d.Category == "网站设置" && d.Name == "演示系统" && d.Define == EnumDictDefine.System)?.Code ?? "0"; + return code == "1"; } public bool SaveDemo(bool isDemo) @@ -43,7 +88,18 @@ namespace BootstrapAdmin.DataAccess.EFCore.Services public bool AuthenticateDemo(string code) { - throw new NotImplementedException(); + var ret = false; + if (!string.IsNullOrEmpty(code)) + { + var dicts = GetAll(); + var salt = dicts.FirstOrDefault(d => d.Category == "网站设置" && d.Name == "授权盐值" && d.Define == EnumDictDefine.System)?.Code; + var authCode = dicts.FirstOrDefault(d => d.Category == "网站设置" && d.Name == "哈希结果" && d.Define == EnumDictDefine.System)?.Code; + if (!string.IsNullOrEmpty(salt)) + { + ret = LgbCryptography.ComputeHash(code, salt) == authCode; + } + } + return ret; } } } diff --git a/src/blazor/admin/BootstrapAdmin.DataAccess.EFCore/Services/LoginService.cs b/src/blazor/admin/BootstrapAdmin.DataAccess.EFCore/Services/LoginService.cs new file mode 100644 index 000000000..9d006d706 --- /dev/null +++ b/src/blazor/admin/BootstrapAdmin.DataAccess.EFCore/Services/LoginService.cs @@ -0,0 +1,16 @@ +using BootstrapAdmin.Web.Core; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace BootstrapAdmin.DataAccess.EFCore.Services; + +public class LoginService : ILogin +{ + public Task Log(string userName, bool result) + { + return Task.FromResult(true); + } +} diff --git a/src/blazor/admin/BootstrapAdmin.DataAccess.EFCore/Services/NavigationsService.cs b/src/blazor/admin/BootstrapAdmin.DataAccess.EFCore/Services/NavigationsService.cs index f34fd4253..72a6e4ac9 100644 --- a/src/blazor/admin/BootstrapAdmin.DataAccess.EFCore/Services/NavigationsService.cs +++ b/src/blazor/admin/BootstrapAdmin.DataAccess.EFCore/Services/NavigationsService.cs @@ -25,18 +25,34 @@ namespace BootstrapAdmin.DataAccess.EFCore.Services public List GetAllMenus(string userName) { using var context = DbFactory.CreateDbContext(); - //return context..Fetch($"select n.ID, n.ParentId, n.Name, n.{order}, n.Icon, n.Url, n.Category, n.Target, n.IsResource, n.Application, d.Name as CategoryName, ln.Name as ParentName from Navigations n inner join Dicts d on n.Category = d.Code and d.Category = @Category and d.Define = 0 left join Navigations ln on n.ParentId = ln.ID inner join (select nr.NavigationID from Users u inner join UserRole ur on ur.UserID = u.ID inner join NavigationRole nr on nr.RoleID = ur.RoleID where u.UserName = @UserName union select nr.NavigationID from Users u inner join UserGroup ug on u.ID = ug.UserID inner join RoleGroup rg on rg.GroupID = ug.GroupID inner join NavigationRole nr on nr.RoleID = rg.RoleID where u.UserName = @UserName union select n.ID from Navigations n where EXISTS (select UserName from Users u inner join UserRole ur on u.ID = ur.UserID inner join Roles r on ur.RoleID = r.ID where u.UserName = @UserName and r.RoleName = @RoleName)) nav on n.ID = nav.NavigationID", new { UserName = userName, Category = "菜单", RoleName = "Administrators" }); - return new List(); + + var user = context.Set().Include(s => s.Roles).ThenInclude(s => s.Navigations).AsSplitQuery().FirstOrDefault(s => s.UserName == userName); + + if (user == null) + return new List(); + return user.Roles.SelectMany(s => s.Navigations).ToList(); } - public List GetMenusByRoleId(string? roleId) + public List GetMenusByRoleId(string? roleId) { - throw new NotImplementedException(); + using var context = DbFactory.CreateDbContext(); + + return context.NavigationRole.Where(s => s.RoleId == roleId).Select(s => s.NavigationId).ToList(); } public bool SaveMenusByRoleId(string? roleId, List menuIds) { - throw new NotImplementedException(); + var dbcontext = DbFactory.CreateDbContext(); + var currentrole = dbcontext.Roles.Include(s => s.Navigations).Where(s => s.Id == roleId).FirstOrDefault(); + if (currentrole != null) + { + currentrole.Navigations = dbcontext.Navigations.Where(s => menuIds.Contains(s.Id!)).ToList(); + return dbcontext.SaveChanges() > 0; + } + else + { + return false; + } } } } diff --git a/src/blazor/admin/BootstrapAdmin.DataAccess.EFCore/Services/UserService.cs b/src/blazor/admin/BootstrapAdmin.DataAccess.EFCore/Services/UserService.cs new file mode 100644 index 000000000..79f59ba53 --- /dev/null +++ b/src/blazor/admin/BootstrapAdmin.DataAccess.EFCore/Services/UserService.cs @@ -0,0 +1,83 @@ +using BootstrapAdmin.DataAccess.Models; +using BootstrapAdmin.Web.Core; +using Longbow.Security.Cryptography; +using Microsoft.EntityFrameworkCore; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace BootstrapAdmin.DataAccess.EFCore.Services; + +public class UserService : IUser +{ + private IDbContextFactory DbFactory { get; set; } + + public UserService(IDbContextFactory factory) => DbFactory = factory; + + public List GetAll() + { + using var context = DbFactory.CreateDbContext(); + return context.Users.ToList(); + } + + public bool Authenticate(string userName, string password) + { + using var context = DbFactory.CreateDbContext(); + + var user = context.Users.Where(s => s.ApprovedTime != null).FirstOrDefault(x => x.UserName == userName); + + var isAuth = false; + if (user != null && !string.IsNullOrEmpty(user.PassSalt)) + { + isAuth = user.Password == LgbCryptography.ComputeHash(password, user.PassSalt); + } + return isAuth; + } + + public List GetApps(string userName) + { + throw new NotImplementedException(); + } + + public string? GetDisplayName(string? userName) + { + using var context = DbFactory.CreateDbContext(); + return string.IsNullOrEmpty(userName) ? "" : context.Users.FirstOrDefault(s => s.UserName == userName)?.DisplayName; + } + + public List GetRoles(string userName) + { + using var context = DbFactory.CreateDbContext(); + + var user = context.Users.Include(s => s.Roles).FirstOrDefault(s => s.UserName == userName); + + return user != null ? user?.Roles?.Select(s => s.RoleName).ToList() : new List(); + } + + public List GetUsersByGroupId(string? groupId) + { + throw new NotImplementedException(); + } + + public List GetUsersByRoleId(string? roleId) + { + throw new NotImplementedException(); + } + + public bool SaveUsersByGroupId(string? groupId, IEnumerable userIds) + { + throw new NotImplementedException(); + } + + public bool SaveUsersByRoleId(string? roleId, IEnumerable userIds) + { + throw new NotImplementedException(); + } + + public bool TryCreateUserByPhone(string phone, string appId, ICollection roles) + { + throw new NotImplementedException(); + } +} diff --git a/src/blazor/admin/BootstrapAdmin.Web.Core/INavigation.cs b/src/blazor/admin/BootstrapAdmin.Web.Core/INavigation.cs index 27b2961ba..1126d010b 100644 --- a/src/blazor/admin/BootstrapAdmin.Web.Core/INavigation.cs +++ b/src/blazor/admin/BootstrapAdmin.Web.Core/INavigation.cs @@ -18,7 +18,7 @@ namespace BootstrapAdmin.Web.Core /// /// /// - List GetMenusByRoleId(string? roleId); + List GetMenusByRoleId(string? roleId); /// /// -- Gitee From cb4d227598f48c98ab38919ce5a53836835f9d80 Mon Sep 17 00:00:00 2001 From: zhangpeihang <948869991@qq.com> Date: Tue, 28 Dec 2021 16:30:08 +0800 Subject: [PATCH 02/18] =?UTF-8?q?feat:=20=E9=85=8D=E7=BD=AEEF=E8=A1=A8?= =?UTF-8?q?=E5=85=B3=E7=B3=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BootstrapAdminContext.cs | 24 +++++++-- .../EntityConfiguration.cs | 49 +++++++++++++++++++ .../Navigation.cs | 10 ++++ .../NavigationRole.cs | 29 +++++++++++ .../BootstrapAdmin.DataAccess.Models/Role.cs | 21 ++++++++ .../BootstrapAdmin.DataAccess.Models/User.cs | 10 ++++ .../UserRole.cs | 29 +++++++++++ 7 files changed, 168 insertions(+), 4 deletions(-) create mode 100644 src/blazor/admin/BootstrapAdmin.DataAccess.EFCore/EntityConfiguration.cs create mode 100644 src/blazor/admin/BootstrapAdmin.DataAccess.Models/NavigationRole.cs create mode 100644 src/blazor/admin/BootstrapAdmin.DataAccess.Models/UserRole.cs diff --git a/src/blazor/admin/BootstrapAdmin.DataAccess.EFCore/BootstrapAdminContext.cs b/src/blazor/admin/BootstrapAdmin.DataAccess.EFCore/BootstrapAdminContext.cs index 3d27df215..c33cdb962 100644 --- a/src/blazor/admin/BootstrapAdmin.DataAccess.EFCore/BootstrapAdminContext.cs +++ b/src/blazor/admin/BootstrapAdmin.DataAccess.EFCore/BootstrapAdminContext.cs @@ -29,22 +29,38 @@ namespace BootstrapAdmin.DataAccess.EFCore [NotNull] public DbSet? Users { get; set; } + /// + /// + /// + [NotNull] + public DbSet? Roles { get; set; } + + /// + /// + /// + [NotNull] + public DbSet? UserRole { get; set; } + /// /// /// [NotNull] public DbSet? Navigations { get; set; } + /// + /// + /// + [NotNull] + public DbSet? NavigationRole { get; set; } + /// /// /// /// protected override void OnModelCreating(ModelBuilder modelBuilder) { - modelBuilder.Entity().Ignore(u => u.Period); - modelBuilder.Entity().Ignore(u => u.NewPassword); - modelBuilder.Entity().Ignore(u => u.CofirmPassword); - modelBuilder.Entity().Ignore(u => u.IsReset); + base.OnModelCreating(modelBuilder); + EntityConfiguration.Configure(modelBuilder); } } } diff --git a/src/blazor/admin/BootstrapAdmin.DataAccess.EFCore/EntityConfiguration.cs b/src/blazor/admin/BootstrapAdmin.DataAccess.EFCore/EntityConfiguration.cs new file mode 100644 index 000000000..5a642522e --- /dev/null +++ b/src/blazor/admin/BootstrapAdmin.DataAccess.EFCore/EntityConfiguration.cs @@ -0,0 +1,49 @@ +using BootstrapAdmin.DataAccess.Models; +using Microsoft.EntityFrameworkCore; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace BootstrapAdmin.DataAccess.EFCore; + +public static class EntityConfiguration +{ + /// + /// + /// + /// + public static void Configure(this ModelBuilder builder) + { + builder.Entity().ToTable("Users"); + builder.Entity().Ignore(u => u.Period); + builder.Entity().Ignore(u => u.NewPassword); + builder.Entity().Ignore(u => u.ConfirmPassword); + builder.Entity().Ignore(u => u.IsReset); + builder.Entity().HasMany(s => s.Roles).WithMany(s => s.Users).UsingEntity(s => + { + s.HasOne(s => s.User).WithMany(s => s.UserRoles).HasForeignKey(s => s.UserId); + s.HasOne(s => s.Role).WithMany(s => s.UserRoles).HasForeignKey(s => s.RoleId); + }); + + builder.Entity().Ignore(s => s.NewPassword); + builder.Entity().Ignore(s => s.Period); + builder.Entity().Ignore(s => s.IsReset); + + builder.Entity().ToTable("Roles"); + builder.Entity().HasKey(s => s.Id); + builder.Entity().Property(s => s.Id).IsRequired(); + builder.Entity().HasMany(s => s.Navigations).WithMany(s => s.Roles).UsingEntity(s => + { + s.HasOne(s => s.Navigation).WithMany(s => s.NavigationRoles).HasForeignKey(s => s.NavigationId); + s.HasOne(s => s.Role).WithMany(s => s.NavigationRoles).HasForeignKey(s => s.RoleId); + }); + + builder.Entity().ToTable("Navigations"); + builder.Entity().HasKey(s => s.Id); + builder.Entity().Ignore(s => s.HasChildren); + + builder.Entity(); + } +} diff --git a/src/blazor/admin/BootstrapAdmin.DataAccess.Models/Navigation.cs b/src/blazor/admin/BootstrapAdmin.DataAccess.Models/Navigation.cs index 4d6bc9ed9..0528f1317 100644 --- a/src/blazor/admin/BootstrapAdmin.DataAccess.Models/Navigation.cs +++ b/src/blazor/admin/BootstrapAdmin.DataAccess.Models/Navigation.cs @@ -73,5 +73,15 @@ namespace BootstrapAdmin.DataAccess.Models /// /// public bool HasChildren { get; set; } + + /// + /// + /// + public ICollection? Roles { get; set; } + + /// + /// + /// + public List? NavigationRoles { get; set; } } } diff --git a/src/blazor/admin/BootstrapAdmin.DataAccess.Models/NavigationRole.cs b/src/blazor/admin/BootstrapAdmin.DataAccess.Models/NavigationRole.cs new file mode 100644 index 000000000..2a306c15a --- /dev/null +++ b/src/blazor/admin/BootstrapAdmin.DataAccess.Models/NavigationRole.cs @@ -0,0 +1,29 @@ +namespace BootstrapAdmin.DataAccess.Models; + +public class NavigationRole +{ + /// + /// + /// + public string? Id { get; set; } + + /// + /// + /// + public string? NavigationId { get; set; } + + /// + /// + /// + public Navigation? Navigation { get; set; } + + /// + /// + /// + public string? RoleId { get; set; } + + /// + /// + /// + public Role? Role { get; set; } +} diff --git a/src/blazor/admin/BootstrapAdmin.DataAccess.Models/Role.cs b/src/blazor/admin/BootstrapAdmin.DataAccess.Models/Role.cs index 7a262c5a1..724c36e83 100644 --- a/src/blazor/admin/BootstrapAdmin.DataAccess.Models/Role.cs +++ b/src/blazor/admin/BootstrapAdmin.DataAccess.Models/Role.cs @@ -26,5 +26,26 @@ namespace BootstrapAdmin.DataAccess.Models [DisplayName("角色描述")] [NotNull] public string? Description { get; set; } + + /// + /// + /// + public ICollection? Users { get; set; } + + /// + /// + /// + public List? UserRoles { get; set; } + + + /// + /// + /// + public ICollection? Navigations { get; set; } + + /// + /// + /// + public List? NavigationRoles { get; set; } } } diff --git a/src/blazor/admin/BootstrapAdmin.DataAccess.Models/User.cs b/src/blazor/admin/BootstrapAdmin.DataAccess.Models/User.cs index 7fdfad863..8288c557c 100644 --- a/src/blazor/admin/BootstrapAdmin.DataAccess.Models/User.cs +++ b/src/blazor/admin/BootstrapAdmin.DataAccess.Models/User.cs @@ -107,6 +107,16 @@ namespace BootstrapAdmin.DataAccess.Models /// public int IsReset { get; set; } + /// + /// + /// + public ICollection? Roles { get; set; } + + /// + /// + /// + public List? UserRoles { get; set; } + /// /// 获得/设置 默认格式为 DisplayName (UserName) /// diff --git a/src/blazor/admin/BootstrapAdmin.DataAccess.Models/UserRole.cs b/src/blazor/admin/BootstrapAdmin.DataAccess.Models/UserRole.cs new file mode 100644 index 000000000..8e5ac2070 --- /dev/null +++ b/src/blazor/admin/BootstrapAdmin.DataAccess.Models/UserRole.cs @@ -0,0 +1,29 @@ +namespace BootstrapAdmin.DataAccess.Models; + +public class UserRole +{ + /// + /// + /// + public string? Id { get; set; } + + /// + /// + /// + public string? UserId { get; set; } + + /// + /// + /// + public User? User { get; set; } + + /// + /// + /// + public string? RoleId { get; set; } + + /// + /// + /// + public Role? Role { get; set; } +} -- Gitee From 821e2c8eeb225d06d2f7c95154354bb9e7475770 Mon Sep 17 00:00:00 2001 From: zhangpeihang <948869991@qq.com> Date: Tue, 28 Dec 2021 16:31:03 +0800 Subject: [PATCH 03/18] =?UTF-8?q?chore:=20=E5=8D=87=E7=BA=A7EF=E5=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BootstrapAdmin.DataAccess.EFCore.csproj | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/blazor/admin/BootstrapAdmin.DataAccess.EFCore/BootstrapAdmin.DataAccess.EFCore.csproj b/src/blazor/admin/BootstrapAdmin.DataAccess.EFCore/BootstrapAdmin.DataAccess.EFCore.csproj index 221b62904..a0e09d16f 100644 --- a/src/blazor/admin/BootstrapAdmin.DataAccess.EFCore/BootstrapAdmin.DataAccess.EFCore.csproj +++ b/src/blazor/admin/BootstrapAdmin.DataAccess.EFCore/BootstrapAdmin.DataAccess.EFCore.csproj @@ -2,7 +2,8 @@ - + + -- Gitee From ffe955ef577f46b019f6bdb86dbe97da822da5cb Mon Sep 17 00:00:00 2001 From: zhangpeihang <948869991@qq.com> Date: Tue, 28 Dec 2021 16:31:26 +0800 Subject: [PATCH 04/18] =?UTF-8?q?feat:=20=E5=BC=80=E5=90=AFEF=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E6=9C=8D=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BootstrapAdmin.Web/BootstrapAdmin.Web.csproj | 4 ++-- .../Extensions/ServicesExtensions.cs | 15 ++++++++------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/blazor/admin/BootstrapAdmin.Web/BootstrapAdmin.Web.csproj b/src/blazor/admin/BootstrapAdmin.Web/BootstrapAdmin.Web.csproj index 95dedd372..5e0efe203 100644 --- a/src/blazor/admin/BootstrapAdmin.Web/BootstrapAdmin.Web.csproj +++ b/src/blazor/admin/BootstrapAdmin.Web/BootstrapAdmin.Web.csproj @@ -7,9 +7,9 @@ - + - + diff --git a/src/blazor/admin/BootstrapAdmin.Web/Extensions/ServicesExtensions.cs b/src/blazor/admin/BootstrapAdmin.Web/Extensions/ServicesExtensions.cs index 36b2c6a01..773a69b67 100644 --- a/src/blazor/admin/BootstrapAdmin.Web/Extensions/ServicesExtensions.cs +++ b/src/blazor/admin/BootstrapAdmin.Web/Extensions/ServicesExtensions.cs @@ -1,6 +1,7 @@ using BootstrapAdmin.Web.Services; using BootstrapAdmin.Web.Services.SMS; using BootstrapAdmin.Web.Services.SMS.Tencent; +using Microsoft.EntityFrameworkCore; using System.Text; namespace Microsoft.Extensions.DependencyInjection @@ -73,15 +74,15 @@ namespace Microsoft.Extensions.DependencyInjection services.AddScoped(); // 增加 EFCore 数据服务 - //services.AddEFCoreDataAccessServices((provider, option) => - //{ - // var configuration = provider.GetRequiredService(); - // var connString = configuration.GetConnectionString("bb"); - // option.UseSqlite(connString); - //}); + services.AddEFCoreDataAccessServices((provider, option) => + { + var configuration = provider.GetRequiredService(); + var connString = configuration.GetConnectionString("bb"); + option.UseSqlite(connString); + }); // 增加 PetaPoco 数据服务 - services.AddPetaPocoDataAccessServices(); + //services.AddPetaPocoDataAccessServices(); return services; } -- Gitee From eebf4e0c44761edb0942bb0a3ae4a4503707142f Mon Sep 17 00:00:00 2001 From: zhangpeihang <948869991@qq.com> Date: Wed, 29 Dec 2021 10:27:47 +0800 Subject: [PATCH 05/18] =?UTF-8?q?feat:=20=E5=AE=8C=E5=96=84EF=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E6=9C=8D=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BootstrapAdminContext.cs | 18 ++++ .../EntityConfiguration.cs | 10 +++ .../Extensions/ServicesExtensions.cs | 2 + .../Services/GroupService.cs | 68 ++++++++++++++ .../Services/NavigationsService.cs | 2 +- .../Services/RoleService.cs | 90 +++++++++++++++++++ .../Services/UserService.cs | 66 ++++++++++++-- .../BootstrapAdmin.DataAccess.Models/Group.cs | 20 +++++ .../BootstrapAdmin.DataAccess.Models/Role.cs | 10 +++ .../RoleGroup.cs | 20 +++++ .../BootstrapAdmin.DataAccess.Models/User.cs | 10 +++ .../UserGroup.cs | 35 ++++++++ .../admin/BootstrapAdmin.Web.Core/IRole.cs | 12 +-- 13 files changed, 351 insertions(+), 12 deletions(-) create mode 100644 src/blazor/admin/BootstrapAdmin.DataAccess.EFCore/Services/GroupService.cs create mode 100644 src/blazor/admin/BootstrapAdmin.DataAccess.EFCore/Services/RoleService.cs create mode 100644 src/blazor/admin/BootstrapAdmin.DataAccess.Models/RoleGroup.cs create mode 100644 src/blazor/admin/BootstrapAdmin.DataAccess.Models/UserGroup.cs diff --git a/src/blazor/admin/BootstrapAdmin.DataAccess.EFCore/BootstrapAdminContext.cs b/src/blazor/admin/BootstrapAdmin.DataAccess.EFCore/BootstrapAdminContext.cs index c33cdb962..71268bedf 100644 --- a/src/blazor/admin/BootstrapAdmin.DataAccess.EFCore/BootstrapAdminContext.cs +++ b/src/blazor/admin/BootstrapAdmin.DataAccess.EFCore/BootstrapAdminContext.cs @@ -53,6 +53,24 @@ namespace BootstrapAdmin.DataAccess.EFCore [NotNull] public DbSet? NavigationRole { get; set; } + /// + /// + /// + [NotNull] + public DbSet? Groups { get; set; } + + /// + /// + /// + [NotNull] + public DbSet? UserGroup { get; set; } + + /// + /// + /// + [NotNull] + public DbSet? RoleGroup { get; set; } + /// /// /// diff --git a/src/blazor/admin/BootstrapAdmin.DataAccess.EFCore/EntityConfiguration.cs b/src/blazor/admin/BootstrapAdmin.DataAccess.EFCore/EntityConfiguration.cs index 5a642522e..55563e4ee 100644 --- a/src/blazor/admin/BootstrapAdmin.DataAccess.EFCore/EntityConfiguration.cs +++ b/src/blazor/admin/BootstrapAdmin.DataAccess.EFCore/EntityConfiguration.cs @@ -26,6 +26,11 @@ public static class EntityConfiguration s.HasOne(s => s.User).WithMany(s => s.UserRoles).HasForeignKey(s => s.UserId); s.HasOne(s => s.Role).WithMany(s => s.UserRoles).HasForeignKey(s => s.RoleId); }); + builder.Entity().HasMany(s => s.Groups).WithMany(s => s.Users).UsingEntity(s => + { + s.HasOne(s => s.User).WithMany(s => s.UserGroup).HasForeignKey(s => s.UserId); + s.HasOne(s => s.Group).WithMany(s => s.UserGroup).HasForeignKey(s => s.GroupId); + }); builder.Entity().Ignore(s => s.NewPassword); builder.Entity().Ignore(s => s.Period); @@ -39,6 +44,11 @@ public static class EntityConfiguration s.HasOne(s => s.Navigation).WithMany(s => s.NavigationRoles).HasForeignKey(s => s.NavigationId); s.HasOne(s => s.Role).WithMany(s => s.NavigationRoles).HasForeignKey(s => s.RoleId); }); + builder.Entity().HasMany(s => s.Groups).WithMany(s => s.Roles).UsingEntity(s => + { + s.HasOne(s => s.Group).WithMany(s => s.RoleGroup).HasForeignKey(s => s.GroupId); + s.HasOne(s => s.Role).WithMany(s => s.RoleGroup).HasForeignKey(s => s.RoleId); + }); builder.Entity().ToTable("Navigations"); builder.Entity().HasKey(s => s.Id); diff --git a/src/blazor/admin/BootstrapAdmin.DataAccess.EFCore/Extensions/ServicesExtensions.cs b/src/blazor/admin/BootstrapAdmin.DataAccess.EFCore/Extensions/ServicesExtensions.cs index 818770d50..66a204e16 100644 --- a/src/blazor/admin/BootstrapAdmin.DataAccess.EFCore/Extensions/ServicesExtensions.cs +++ b/src/blazor/admin/BootstrapAdmin.DataAccess.EFCore/Extensions/ServicesExtensions.cs @@ -48,6 +48,8 @@ namespace Microsoft.Extensions.DependencyInjection services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); services.AddSingleton(); return services; } diff --git a/src/blazor/admin/BootstrapAdmin.DataAccess.EFCore/Services/GroupService.cs b/src/blazor/admin/BootstrapAdmin.DataAccess.EFCore/Services/GroupService.cs new file mode 100644 index 000000000..e20561d42 --- /dev/null +++ b/src/blazor/admin/BootstrapAdmin.DataAccess.EFCore/Services/GroupService.cs @@ -0,0 +1,68 @@ +using BootstrapAdmin.DataAccess.Models; +using BootstrapAdmin.Web.Core; +using Microsoft.EntityFrameworkCore; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace BootstrapAdmin.DataAccess.EFCore.Services; + +public class GroupService : IGroup +{ + private IDbContextFactory DbFactory; + + public GroupService(IDbContextFactory dbFactory) => DbFactory = dbFactory; + + public List GetAll() + { + using var dbcontext = DbFactory.CreateDbContext(); + + return dbcontext.Groups.ToList(); + } + + public List GetGroupsByRoleId(string? roleId) + { + using var dbcontext = DbFactory.CreateDbContext(); + + return dbcontext.RoleGroup.Where(s => s.RoleId == roleId).Select(s => s.GroupId).ToList(); + } + + public List GetGroupsByUserId(string? userId) + { + using var dbcontext = DbFactory.CreateDbContext(); + + return dbcontext.UserGroup.Where(s => s.UserId == userId).Select(s => s.GroupId).ToList(); + } + + public bool SaveGroupsByRoleId(string? roleId, IEnumerable groupIds) + { + using var dbcontext = DbFactory.CreateDbContext(); + var role = dbcontext.Roles.Include(s => s.Groups).Where(s => s.Id == roleId).FirstOrDefault(); + if (role != null) + { + role.Groups = dbcontext.Groups.Where(s => groupIds.Contains(s.Id)).ToList(); + return dbcontext.SaveChanges() > 0; + } + else + { + return false; + } + } + + public bool SaveGroupsByUserId(string? userId, IEnumerable groupIds) + { + using var dbcontext = DbFactory.CreateDbContext(); + var user = dbcontext.Users.Include(s => s.Groups).Where(s => s.Id == userId).FirstOrDefault(); + if (user != null) + { + user.Groups = dbcontext.Groups.Where(s => groupIds.Contains(s.Id)).ToList(); + return dbcontext.SaveChanges() > 0; + } + else + { + return false; + } + } +} diff --git a/src/blazor/admin/BootstrapAdmin.DataAccess.EFCore/Services/NavigationsService.cs b/src/blazor/admin/BootstrapAdmin.DataAccess.EFCore/Services/NavigationsService.cs index 72a6e4ac9..d6ce8b6ed 100644 --- a/src/blazor/admin/BootstrapAdmin.DataAccess.EFCore/Services/NavigationsService.cs +++ b/src/blazor/admin/BootstrapAdmin.DataAccess.EFCore/Services/NavigationsService.cs @@ -42,7 +42,7 @@ namespace BootstrapAdmin.DataAccess.EFCore.Services public bool SaveMenusByRoleId(string? roleId, List menuIds) { - var dbcontext = DbFactory.CreateDbContext(); + using var dbcontext = DbFactory.CreateDbContext(); var currentrole = dbcontext.Roles.Include(s => s.Navigations).Where(s => s.Id == roleId).FirstOrDefault(); if (currentrole != null) { diff --git a/src/blazor/admin/BootstrapAdmin.DataAccess.EFCore/Services/RoleService.cs b/src/blazor/admin/BootstrapAdmin.DataAccess.EFCore/Services/RoleService.cs new file mode 100644 index 000000000..f05d88140 --- /dev/null +++ b/src/blazor/admin/BootstrapAdmin.DataAccess.EFCore/Services/RoleService.cs @@ -0,0 +1,90 @@ +using BootstrapAdmin.DataAccess.Models; +using BootstrapAdmin.Web.Core; +using Microsoft.EntityFrameworkCore; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace BootstrapAdmin.DataAccess.EFCore.Services; + +public class RoleService : IRole +{ + private IDbContextFactory DbFactory; + + public RoleService(IDbContextFactory dbFactory) => DbFactory = dbFactory; + + public List GetAll() + { + using var dbcontext = DbFactory.CreateDbContext(); + + return dbcontext.Roles.ToList(); + } + + public List GetRolesByGroupId(string? groupId) + { + using var dbcontext = DbFactory.CreateDbContext(); + + return dbcontext.RoleGroup.Where(s => s.GroupId == groupId).Select(s => s.RoleId).ToList(); + } + + public List GetRolesByMenuId(string? menuId) + { + using var dbcontext = DbFactory.CreateDbContext(); + + return dbcontext.NavigationRole.Where(s => s.NavigationId == menuId).Select(s => s.RoleId).ToList(); + } + + public List GetRolesByUserId(string? userId) + { + using var dbcontext = DbFactory.CreateDbContext(); + + return dbcontext.UserRole.Where(s => s.UserId == userId).Select(s => s.RoleId).ToList(); + } + + public bool SaveRolesByGroupId(string? groupId, IEnumerable roleIds) + { + using var dbcontext = DbFactory.CreateDbContext(); + var group = dbcontext.Groups.Include(s => s.Roles).Where(s => s.Id == groupId).FirstOrDefault(); + if (group != null) + { + group.Roles = dbcontext.Roles.Where(s => roleIds.Contains(s.Id)).ToList(); + return dbcontext.SaveChanges() > 0; + } + else + { + return false; + } + } + + public bool SaveRolesByMenuId(string? menuId, IEnumerable roleIds) + { + using var dbcontext = DbFactory.CreateDbContext(); + var menu = dbcontext.Navigations.Include(s => s.Roles).Where(s => s.Id == menuId).FirstOrDefault(); + if (menu != null) + { + menu.Roles = dbcontext.Roles.Where(s => roleIds.Contains(s.Id)).ToList(); + return dbcontext.SaveChanges() > 0; + } + else + { + return false; + } + } + + public bool SaveRolesByUserId(string? userId, IEnumerable roleIds) + { + using var dbcontext = DbFactory.CreateDbContext(); + var user = dbcontext.Users.Include(s => s.Roles).Where(s => s.Id == userId).FirstOrDefault(); + if (user != null) + { + user.Roles = dbcontext.Roles.Where(s => roleIds.Contains(s.Id)).ToList(); + return dbcontext.SaveChanges() > 0; + } + else + { + return false; + } + } +} diff --git a/src/blazor/admin/BootstrapAdmin.DataAccess.EFCore/Services/UserService.cs b/src/blazor/admin/BootstrapAdmin.DataAccess.EFCore/Services/UserService.cs index 79f59ba53..6da872ab8 100644 --- a/src/blazor/admin/BootstrapAdmin.DataAccess.EFCore/Services/UserService.cs +++ b/src/blazor/admin/BootstrapAdmin.DataAccess.EFCore/Services/UserService.cs @@ -58,26 +58,82 @@ public class UserService : IUser public List GetUsersByGroupId(string? groupId) { - throw new NotImplementedException(); + using var context = DbFactory.CreateDbContext(); + + return context.UserGroup.Where(s => s.GroupId == groupId).Select(s => s.UserId).ToList(); } public List GetUsersByRoleId(string? roleId) { - throw new NotImplementedException(); + using var context = DbFactory.CreateDbContext(); + + return context.UserRole.Where(s => s.RoleId == roleId).Select(s => s.UserId).ToList(); } public bool SaveUsersByGroupId(string? groupId, IEnumerable userIds) { - throw new NotImplementedException(); + using var dbcontext = DbFactory.CreateDbContext(); + var group = dbcontext.Groups.Include(s => s.Users).Where(s => s.Id == groupId).FirstOrDefault(); + if (group != null) + { + group.Users = dbcontext.Users.Where(s => userIds.Contains(s.Id)).ToList(); + return dbcontext.SaveChanges() > 0; + } + else + { + return false; + } } public bool SaveUsersByRoleId(string? roleId, IEnumerable userIds) { - throw new NotImplementedException(); + using var dbcontext = DbFactory.CreateDbContext(); + var currentrole = dbcontext.Roles.Include(s => s.Users).Where(s => s.Id == roleId).FirstOrDefault(); + if (currentrole != null) + { + currentrole.Users = dbcontext.Users.Where(s => userIds.Contains(s.Id)).ToList(); + return dbcontext.SaveChanges() > 0; + } + else + { + return false; + } } public bool TryCreateUserByPhone(string phone, string appId, ICollection roles) { - throw new NotImplementedException(); + var ret = false; + using var dbcontext = DbFactory.CreateDbContext(); + try + { + var user = GetAll().FirstOrDefault(user => user.UserName == phone); + if (user == null) + { + dbcontext.Database.BeginTransaction(); + user = new User() + { + ApprovedBy = "Mobile", + ApprovedTime = DateTime.Now, + DisplayName = "手机用户", + UserName = phone, + Icon = "default.jpg", + Description = "手机用户", + App = appId + }; + dbcontext.Add(user); + + // Authorization + var roleIds = dbcontext.Roles.Where(s => roles.Contains(s.RoleName)).Select(s => s.Id).ToList(); + dbcontext.AddRange(roleIds.Select(g => new { RoleID = g, UserID = user.Id })); + ret = dbcontext.SaveChanges() > 0; + } + ret = true; + } + catch (Exception) + { + + throw; + } + return ret; } } diff --git a/src/blazor/admin/BootstrapAdmin.DataAccess.Models/Group.cs b/src/blazor/admin/BootstrapAdmin.DataAccess.Models/Group.cs index b425f2184..3b1d10d57 100644 --- a/src/blazor/admin/BootstrapAdmin.DataAccess.Models/Group.cs +++ b/src/blazor/admin/BootstrapAdmin.DataAccess.Models/Group.cs @@ -32,6 +32,26 @@ namespace BootstrapAdmin.DataAccess.Models [Display(Name = "群组描述")] public string? Description { get; set; } + /// + /// + /// + public ICollection? Users { get; set; } + + /// + /// + /// + public ICollection? UserGroup { get; set; } + + /// + /// + /// + public ICollection? Roles { get; set; } + + /// + /// + /// + public List? RoleGroup { get; set; } + public override string ToString() => $"{GroupName} ({GroupCode})"; } } diff --git a/src/blazor/admin/BootstrapAdmin.DataAccess.Models/Role.cs b/src/blazor/admin/BootstrapAdmin.DataAccess.Models/Role.cs index 724c36e83..ccd566e7f 100644 --- a/src/blazor/admin/BootstrapAdmin.DataAccess.Models/Role.cs +++ b/src/blazor/admin/BootstrapAdmin.DataAccess.Models/Role.cs @@ -47,5 +47,15 @@ namespace BootstrapAdmin.DataAccess.Models /// /// public List? NavigationRoles { get; set; } + + /// + /// + /// + public ICollection? Groups { get; set; } + + /// + /// + /// + public List? RoleGroup { get; set; } } } diff --git a/src/blazor/admin/BootstrapAdmin.DataAccess.Models/RoleGroup.cs b/src/blazor/admin/BootstrapAdmin.DataAccess.Models/RoleGroup.cs new file mode 100644 index 000000000..4bf58b04e --- /dev/null +++ b/src/blazor/admin/BootstrapAdmin.DataAccess.Models/RoleGroup.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace BootstrapAdmin.DataAccess.Models; + +public class RoleGroup +{ + public string? Id { get; set; } + + public string? RoleId { get; set; } + + public Role? Role { get; set; } + + public string? GroupId { get; set; } + + public Group? Group { get; set; } +} diff --git a/src/blazor/admin/BootstrapAdmin.DataAccess.Models/User.cs b/src/blazor/admin/BootstrapAdmin.DataAccess.Models/User.cs index 8288c557c..3f95ed8f6 100644 --- a/src/blazor/admin/BootstrapAdmin.DataAccess.Models/User.cs +++ b/src/blazor/admin/BootstrapAdmin.DataAccess.Models/User.cs @@ -117,6 +117,16 @@ namespace BootstrapAdmin.DataAccess.Models /// public List? UserRoles { get; set; } + /// + /// + /// + public ICollection? Groups { get; set; } + + /// + /// + /// + public ICollection? UserGroup { get; set; } + /// /// 获得/设置 默认格式为 DisplayName (UserName) /// diff --git a/src/blazor/admin/BootstrapAdmin.DataAccess.Models/UserGroup.cs b/src/blazor/admin/BootstrapAdmin.DataAccess.Models/UserGroup.cs new file mode 100644 index 000000000..c1dcf576f --- /dev/null +++ b/src/blazor/admin/BootstrapAdmin.DataAccess.Models/UserGroup.cs @@ -0,0 +1,35 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace BootstrapAdmin.DataAccess.Models; + +public class UserGroup +{ + /// + /// + /// + public string? Id { get; set; } + + /// + /// + /// + public string? UserId { get; set; } + + /// + /// + /// + public User? User { get; set; } + + /// + /// + /// + public string? GroupId { get; set; } + + /// + /// + /// + public Group? Group { get; set; } +} diff --git a/src/blazor/admin/BootstrapAdmin.Web.Core/IRole.cs b/src/blazor/admin/BootstrapAdmin.Web.Core/IRole.cs index ad402b38d..fef82be50 100644 --- a/src/blazor/admin/BootstrapAdmin.Web.Core/IRole.cs +++ b/src/blazor/admin/BootstrapAdmin.Web.Core/IRole.cs @@ -16,9 +16,9 @@ public interface IRole /// /// /// - /// + /// /// - List GetRolesByGroupId(string? userId); + List GetRolesByGroupId(string? groupId); /// /// @@ -31,17 +31,17 @@ public interface IRole /// /// /// - /// + /// /// - List GetRolesByUserId(string? groupId); + List GetRolesByUserId(string? userId); /// /// /// - /// + /// /// /// - bool SaveRolesByUserId(string? groupId, IEnumerable roleIds); + bool SaveRolesByUserId(string? userId, IEnumerable roleIds); /// /// -- Gitee From 6b7bd33754ca4def5be3aad8e30fa8b3cd744b4a Mon Sep 17 00:00:00 2001 From: Argo-Tianyi Date: Wed, 29 Dec 2021 11:21:19 +0800 Subject: [PATCH 06/18] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=E4=BF=9D?= =?UTF-8?q?=E5=AD=98=E5=81=A5=E5=BA=B7=E6=A3=80=E6=9F=A5=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Services/DictService.cs | 5 +++++ .../Services/DictService.cs | 8 ++++++++ src/blazor/admin/BootstrapAdmin.Web.Core/IDict.cs | 6 ++++++ 3 files changed, 19 insertions(+) diff --git a/src/blazor/admin/BootstrapAdmin.DataAccess.EFCore/Services/DictService.cs b/src/blazor/admin/BootstrapAdmin.DataAccess.EFCore/Services/DictService.cs index 3b60a3805..5b036a1dd 100644 --- a/src/blazor/admin/BootstrapAdmin.DataAccess.EFCore/Services/DictService.cs +++ b/src/blazor/admin/BootstrapAdmin.DataAccess.EFCore/Services/DictService.cs @@ -101,5 +101,10 @@ namespace BootstrapAdmin.DataAccess.EFCore.Services } return ret; } + + public bool SaveHealthCheck(bool enable = true) + { + throw new NotImplementedException(); + } } } diff --git a/src/blazor/admin/BootstrapAdmin.DataAccess.PetaPoco/Services/DictService.cs b/src/blazor/admin/BootstrapAdmin.DataAccess.PetaPoco/Services/DictService.cs index 23ef2823a..bd449e3bc 100644 --- a/src/blazor/admin/BootstrapAdmin.DataAccess.PetaPoco/Services/DictService.cs +++ b/src/blazor/admin/BootstrapAdmin.DataAccess.PetaPoco/Services/DictService.cs @@ -114,4 +114,12 @@ class DictService : BaseDatabase, IDict /// /// public bool SaveDemo(bool isDemo) => Database.Execute("Update Dicts Set Code = @0 Where Category = @1 and Name = @2 and Define = @3", isDemo ? "1" : "0", "网站设置", "演示系统", EnumDictDefine.System.ToString()) == 1; + + /// + /// + /// + /// + /// + /// + public bool SaveHealthCheck(bool enable = true) => Database.Execute("Update Dicts Set Code = @0 Where Category = @1 and Name = @2 and Define = @3", enable ? "1" : "0", "网站设置", "健康检查", EnumDictDefine.System.ToString()) == 1; } diff --git a/src/blazor/admin/BootstrapAdmin.Web.Core/IDict.cs b/src/blazor/admin/BootstrapAdmin.Web.Core/IDict.cs index bffcdc25d..936b2e2ae 100644 --- a/src/blazor/admin/BootstrapAdmin.Web.Core/IDict.cs +++ b/src/blazor/admin/BootstrapAdmin.Web.Core/IDict.cs @@ -36,6 +36,12 @@ /// bool SaveDemo(bool isDemo); + /// + /// 保存健康检查 + /// + /// + bool SaveHealthCheck(bool enable = true); + /// /// 获得当前授权码是否有效可更改网站设置 /// -- Gitee From 32445703595ae3e7b8a44d6d5fb25154c949f1f8 Mon Sep 17 00:00:00 2001 From: Argo-Tianyi Date: Wed, 29 Dec 2021 11:21:56 +0800 Subject: [PATCH 07/18] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Extensions/ServicesExtensions.cs | 6 +- .../Extensions/TasksExtensions.cs | 1 - .../Pages/Admin/Tasks.razor | 96 ++++++++++--------- .../Pages/Admin/Tasks.razor.cs | 64 ++++++++++++- .../Services/AdminTaskService.cs | 45 +++++++++ 5 files changed, 162 insertions(+), 50 deletions(-) create mode 100644 src/blazor/admin/BootstrapAdmin.Web/Services/AdminTaskService.cs diff --git a/src/blazor/admin/BootstrapAdmin.Web/Extensions/ServicesExtensions.cs b/src/blazor/admin/BootstrapAdmin.Web/Extensions/ServicesExtensions.cs index 773a69b67..ca1a2f350 100644 --- a/src/blazor/admin/BootstrapAdmin.Web/Extensions/ServicesExtensions.cs +++ b/src/blazor/admin/BootstrapAdmin.Web/Extensions/ServicesExtensions.cs @@ -1,7 +1,7 @@ using BootstrapAdmin.Web.Services; using BootstrapAdmin.Web.Services.SMS; using BootstrapAdmin.Web.Services.SMS.Tencent; -using Microsoft.EntityFrameworkCore; +using Longbow.Tasks; using System.Text; namespace Microsoft.Extensions.DependencyInjection @@ -84,6 +84,10 @@ namespace Microsoft.Extensions.DependencyInjection // 增加 PetaPoco 数据服务 //services.AddPetaPocoDataAccessServices(); + // 增加后台任务 + services.AddTaskServices(); + services.AddHostedService(); + return services; } } diff --git a/src/blazor/admin/BootstrapAdmin.Web/Extensions/TasksExtensions.cs b/src/blazor/admin/BootstrapAdmin.Web/Extensions/TasksExtensions.cs index 58cbbdc7b..deb691386 100644 --- a/src/blazor/admin/BootstrapAdmin.Web/Extensions/TasksExtensions.cs +++ b/src/blazor/admin/BootstrapAdmin.Web/Extensions/TasksExtensions.cs @@ -14,6 +14,5 @@ public static class TasksExtensions LastRunResult = i.LastRunResult, Status = i.Status, Trigger = i.Triggers.First().ToString() - }).ToList(); } diff --git a/src/blazor/admin/BootstrapAdmin.Web/Pages/Admin/Tasks.razor b/src/blazor/admin/BootstrapAdmin.Web/Pages/Admin/Tasks.razor index 91555c0d2..82b1a1260 100644 --- a/src/blazor/admin/BootstrapAdmin.Web/Pages/Admin/Tasks.razor +++ b/src/blazor/admin/BootstrapAdmin.Web/Pages/Admin/Tasks.razor @@ -1,46 +1,56 @@ @page "/Admin/Tasks" - - - -

后台任务说明:

-

1. 默认任务 (立即执行,仅执行一次)

-

- - TaskServicesManager.GetOrAdd("简单任务", token => Task.Delay(1000)); - -

-

2. 周期性任务 (1 分钟后间隔 5 秒执行 2 次任务)

-

- - var trigger = TriggerBuilder.Default.WithInterval(TimeSpan.FromSeconds(5)).WithRepeatCount(2).WithStartTime(DateTimeOffset.Now.AddMinutes(1)).Build(); -
- TaskServicesManager.GetOrAdd("测试任务", token => Task.Delay(1000), trigger); -
-

-

3. Cron 表达式任务 (间隔 5 秒循环执行任务)

-
- - TaskServicesManager.GetOrAdd("Cron 表达式任务", token => Task.Delay(1000), TriggerBuilder.Build("*/5 * * * * *")); - -
-
-
-
+
+ + + +

后台任务说明:

+

1. 默认任务 (立即执行,仅执行一次)

+

+ + TaskServicesManager.GetOrAdd("简单任务", token => Task.Delay(1000)); + +

+

2. 周期性任务 (1 分钟后间隔 5 秒执行 2 次任务)

+

+ + var trigger = TriggerBuilder.Default.WithInterval(TimeSpan.FromSeconds(5)).WithRepeatCount(2).WithStartTime(DateTimeOffset.Now.AddMinutes(1)).Build(); +
+ TaskServicesManager.GetOrAdd("测试任务", token => Task.Delay(1000), trigger); +
+

+

3. Cron 表达式任务 (间隔 5 秒循环执行任务)

+
+ + TaskServicesManager.GetOrAdd("Cron 表达式任务", token => Task.Delay(1000), TriggerBuilder.Build("*/5 * * * * *")); + +
+
+
+
- - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + +
\ No newline at end of file diff --git a/src/blazor/admin/BootstrapAdmin.Web/Pages/Admin/Tasks.razor.cs b/src/blazor/admin/BootstrapAdmin.Web/Pages/Admin/Tasks.razor.cs index 1927da884..df4e3858c 100644 --- a/src/blazor/admin/BootstrapAdmin.Web/Pages/Admin/Tasks.razor.cs +++ b/src/blazor/admin/BootstrapAdmin.Web/Pages/Admin/Tasks.razor.cs @@ -1,4 +1,4 @@ -using BootstrapAdmin.DataAccess.Models; +using BootstrapAdmin.Web.Components; using BootstrapAdmin.Web.Extensions; using BootstrapAdmin.Web.Models; using Longbow.Tasks; @@ -7,7 +7,10 @@ namespace BootstrapAdmin.Web.Pages.Admin; public partial class Tasks { - private Task> OnQueryAsync(QueryPageOptions options) + [NotNull] + private AdminTable? TaskTable { get; set; } + + private static Task> OnQueryAsync(QueryPageOptions options) { var tasks = TaskServicesManager.ToList().ToTasksModelList(); return Task.FromResult(new QueryData() @@ -16,17 +19,68 @@ public partial class Tasks }); } - private Task OnPause(TasksModel model) + private static Color GetResultColor(TriggerResult result) => result switch + { + TriggerResult.Success => Color.Success, + TriggerResult.Error => Color.Danger, + TriggerResult.Timeout => Color.Warning, + TriggerResult.Cancelled => Color.Dark, + _ => Color.Primary + }; + + private static string FormatResult(TriggerResult result) => result switch + { + TriggerResult.Success => "成功", + TriggerResult.Error => "故障", + TriggerResult.Timeout => "超时", + TriggerResult.Cancelled => "取消", + _ => "未知状态" + }; + + private static Color GetStatusColor(SchedulerStatus status) => status switch + { + SchedulerStatus.Running => Color.Success, + SchedulerStatus.Ready => Color.Danger, + SchedulerStatus.Disabled => Color.Danger, + _ => Color.Primary + }; + + private static string FormatStatus(SchedulerStatus status) => status switch { + SchedulerStatus.Running => "运行中", + SchedulerStatus.Ready => "已停止", + SchedulerStatus.Disabled => "禁用", + _ => "未知状态" + }; + + private static string GetStatusIcon(SchedulerStatus status) => status switch + { + SchedulerStatus.Running => "fa fa-play-circle", + SchedulerStatus.Ready => "fa fa-times-circle", + _ => "未知状态" + }; + + private static Task OnPause(TasksModel model) + { + var task = TaskServicesManager.ToList().FirstOrDefault(i => i.Name == model.Name); + if (task != null) + { + task.Status = SchedulerStatus.Ready; + } return Task.CompletedTask; } - private Task OnRun(TasksModel model) + private static Task OnRun(TasksModel model) { + var task = TaskServicesManager.ToList().FirstOrDefault(i => i.Name == model.Name); + if (task != null) + { + task.Status = SchedulerStatus.Running; + } return Task.CompletedTask; } - private Task OnLog(TasksModel model) + private static Task OnLog(TasksModel model) { return Task.CompletedTask; } diff --git a/src/blazor/admin/BootstrapAdmin.Web/Services/AdminTaskService.cs b/src/blazor/admin/BootstrapAdmin.Web/Services/AdminTaskService.cs new file mode 100644 index 000000000..c965e79a8 --- /dev/null +++ b/src/blazor/admin/BootstrapAdmin.Web/Services/AdminTaskService.cs @@ -0,0 +1,45 @@ +using BootstrapAdmin.DataAccess.Models; +using BootstrapAdmin.Web.Core; +using BootstrapAdmin.Web.Jobs; +using Longbow.Tasks; + +namespace BootstrapAdmin.Web.Services; + +class AdminTaskService : BackgroundService +{ + private IDict DictService { get; set; } + + /// + /// + /// + /// + public AdminTaskService(IDict dict) => DictService = dict; + + /// + /// 运行任务 + /// + /// + /// + protected override Task ExecuteAsync(CancellationToken stoppingToken) => Task.Run(() => + { + TaskServicesManager.GetOrAdd("单次任务", token => Task.Delay(1000)); + TaskServicesManager.GetOrAdd("周期任务", token => Task.Delay(1000), TriggerBuilder.Default.WithInterval(10000).Build()); + TaskServicesManager.GetOrAdd("Cron 任务", token => Task.Delay(1000), TriggerBuilder.Build(Cron.Secondly(5))); + TaskServicesManager.GetOrAdd("超时任务", token => Task.Delay(2000), TriggerBuilder.Default.WithTimeout(1000).WithInterval(1000).WithRepeatCount(2).Build()); + + // 本机调试时此处会抛出异常,配置文件中默认开启了任务持久化到物理文件,此处异常只有首次加载时会抛出 + // 此处异常是示例自定义任务内部未进行捕获异常时任务仍然能继续运行,不会导致整个进程崩溃退出 + // 此处代码可注释掉 + //TaskServicesManager.GetOrAdd("故障任务", token => throw new Exception("故障任务")); + TaskServicesManager.GetOrAdd("取消任务", token => Task.Delay(1000)).Triggers.First().Enabled = false; + + // 创建任务并禁用 + TaskServicesManager.GetOrAdd("禁用任务", token => Task.Delay(1000)).Status = SchedulerStatus.Disabled; + + // 真实任务负责批次写入数据执行脚本到日志中 + TaskServicesManager.GetOrAdd("SQL日志", TriggerBuilder.Build(Cron.Minutely())); + + // 真实任务负责周期性设置健康检查结果开关为开启 + TaskServicesManager.GetOrAdd("健康检查", token => Task.FromResult(DictService.SaveHealthCheck()), TriggerBuilder.Build(Cron.Minutely(10))); + }); +} -- Gitee From 28e98612d3c925d3e44d9eff34ad9d83deb20666 Mon Sep 17 00:00:00 2001 From: Argo-Tianyi Date: Wed, 29 Dec 2021 11:22:21 +0800 Subject: [PATCH 08/18] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E5=BA=93=E6=97=A5=E5=BF=97=E4=BB=BB=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BootstrapAdmin.DataAccess.Models/DBLog.cs | 33 +++++++++++ .../BootstrapAdmin.Web/Jobs/DBLogTask.cs | 59 +++++++++++++++++++ .../Extensions/TasksExtensions.cs | 2 +- src/mvc/admin/Bootstrap.Admin/Startup.cs | 5 +- 4 files changed, 94 insertions(+), 5 deletions(-) create mode 100644 src/blazor/admin/BootstrapAdmin.DataAccess.Models/DBLog.cs create mode 100644 src/blazor/admin/BootstrapAdmin.Web/Jobs/DBLogTask.cs diff --git a/src/blazor/admin/BootstrapAdmin.DataAccess.Models/DBLog.cs b/src/blazor/admin/BootstrapAdmin.DataAccess.Models/DBLog.cs new file mode 100644 index 000000000..c410bf13d --- /dev/null +++ b/src/blazor/admin/BootstrapAdmin.DataAccess.Models/DBLog.cs @@ -0,0 +1,33 @@ +using System.ComponentModel; + +namespace BootstrapAdmin.DataAccess.Models +{ + /// + /// 后台数据库脚本执行日志实体类 + /// + public class DBLog + { + /// + /// 获得/设置 主键ID + /// + public string? Id { get; set; } + + /// + /// 获得/设置 当前登陆名 + /// + [DisplayName("所属用户")] + public string? UserName { get; set; } + + /// + /// 获得/设置 数据库执行脚本 + /// + [DisplayName("脚本内容")] + public string SQL { get; set; } = ""; + + /// + /// 获取/设置 用户角色关联状态 checked 标示已经关联 '' 标示未关联 + /// + [DisplayName("执行时间")] + public DateTime LogTime { get; set; } + } +} diff --git a/src/blazor/admin/BootstrapAdmin.Web/Jobs/DBLogTask.cs b/src/blazor/admin/BootstrapAdmin.Web/Jobs/DBLogTask.cs new file mode 100644 index 000000000..806cd8a6e --- /dev/null +++ b/src/blazor/admin/BootstrapAdmin.Web/Jobs/DBLogTask.cs @@ -0,0 +1,59 @@ +using BootstrapAdmin.DataAccess.Models; +using Longbow.Tasks; +using PetaPoco; +using System.Collections.Concurrent; + +namespace BootstrapAdmin.Web.Jobs +{ + /// + /// 数据库脚本执行日志任务实体类 + /// + public class DBLogTask : ITask + { + private static readonly BlockingCollection _messageQueue = new(new ConcurrentQueue()); + + /// + /// 添加数据库日志实体类到内部集合中 + /// + /// + public static System.Threading.Tasks.Task AddDBLog(DBLog log) => System.Threading.Tasks.Task.Run(() => + { + if (!_messageQueue.IsAddingCompleted && !_pause) + { + _messageQueue.Add(log); + } + }); + + private static bool _pause; + /// + /// 暂停接收脚本执行日志 + /// + public static void Pause() => _pause = true; + + /// + /// 开始接收脚本执行日志 + /// + public static void Run() => _pause = false; + + /// + /// 任务执行方法 + /// + /// + /// + public System.Threading.Tasks.Task Execute(CancellationToken cancellationToken) + { + var logs = new List(); + while (_messageQueue.TryTake(out var log)) + { + if (log != null) logs.Add(log); + if (logs.Count >= 100) break; + } + if (logs.Any()) + { + //using var db = DbManager.Create(enableLog: false); + //db.InsertBatch(logs); + } + return System.Threading.Tasks.Task.CompletedTask; + } + } +} diff --git a/src/mvc/admin/Bootstrap.Admin/Extensions/TasksExtensions.cs b/src/mvc/admin/Bootstrap.Admin/Extensions/TasksExtensions.cs index 704b5a2dc..b5281143b 100644 --- a/src/mvc/admin/Bootstrap.Admin/Extensions/TasksExtensions.cs +++ b/src/mvc/admin/Bootstrap.Admin/Extensions/TasksExtensions.cs @@ -54,7 +54,7 @@ namespace Microsoft.Extensions.DependencyInjection // 真实任务负责批次写入数据执行脚本到日志中 TaskServicesManager.GetOrAdd("SQL日志", TriggerBuilder.Build(Cron.Minutely())); - // 真实人物负责周期性设置健康检查结果开关为开启 + // 真实任务负责周期性设置健康检查结果开关为开启 TaskServicesManager.GetOrAdd("健康检查", token => Task.FromResult(DictHelper.SaveSettings(new BootstrapDict[] { new BootstrapDict() { Category = "网站设置", diff --git a/src/mvc/admin/Bootstrap.Admin/Startup.cs b/src/mvc/admin/Bootstrap.Admin/Startup.cs index c604d3aea..2d840b1b0 100644 --- a/src/mvc/admin/Bootstrap.Admin/Startup.cs +++ b/src/mvc/admin/Bootstrap.Admin/Startup.cs @@ -91,10 +91,7 @@ namespace Bootstrap.Admin options.Filters.Add>(); }).AddJsonOptions(op => op.JsonSerializerOptions.AddDefaultConverters()); services.AddRazorPages(); - services.AddServerSideBlazor().AddCircuitOptions(options => - { - if (Enviroment.IsDevelopment()) options.DetailedErrors = true; - }); + services.AddServerSideBlazor(); services.AddDisplayNames(); services.AddBootstrapBlazor(); } -- Gitee From 0dc9a4ba09f4f6692dd03216fedd990df363042a Mon Sep 17 00:00:00 2001 From: Argo-Tianyi Date: Wed, 29 Dec 2021 11:23:03 +0800 Subject: [PATCH 09/18] =?UTF-8?q?chore:=20=E6=9B=B4=E6=96=B0=E7=BD=91?= =?UTF-8?q?=E7=AB=99=E7=AB=AF=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/BootstrapAdmin.Web/Properties/launchSettings.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/blazor/admin/BootstrapAdmin.Web/Properties/launchSettings.json b/src/blazor/admin/BootstrapAdmin.Web/Properties/launchSettings.json index 47ca96295..183489b3c 100644 --- a/src/blazor/admin/BootstrapAdmin.Web/Properties/launchSettings.json +++ b/src/blazor/admin/BootstrapAdmin.Web/Properties/launchSettings.json @@ -12,7 +12,7 @@ "commandName": "Project", "dotnetRunMessages": true, "launchBrowser": true, - "applicationUrl": "http://localhost:5110", + "applicationUrl": "http://localhost:5210", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" } -- Gitee From ca61ff1a4c9f0fdf77bef2e3f47b05cedfa1bd38 Mon Sep 17 00:00:00 2001 From: Argo-Tianyi Date: Wed, 29 Dec 2021 11:23:25 +0800 Subject: [PATCH 10/18] =?UTF-8?q?chore:=20=E6=A0=BC=E5=BC=8F=E5=8C=96?= =?UTF-8?q?=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/blazor/admin/BootstrapAdmin.Web/Models/LoginModel.cs | 9 --------- .../admin/BootstrapAdmin.Web/Pages/Admin/Roles.razor | 2 +- 2 files changed, 1 insertion(+), 10 deletions(-) diff --git a/src/blazor/admin/BootstrapAdmin.Web/Models/LoginModel.cs b/src/blazor/admin/BootstrapAdmin.Web/Models/LoginModel.cs index 56ffaf2d0..3ba125555 100644 --- a/src/blazor/admin/BootstrapAdmin.Web/Models/LoginModel.cs +++ b/src/blazor/admin/BootstrapAdmin.Web/Models/LoginModel.cs @@ -5,15 +5,6 @@ ///
public class LoginModel { - ///// - ///// 默认构造函数 - ///// - ///// - //public LoginModel(string? appId = null) - //{ - // //ImageLibUrl = DictHelper.RetrieveImagesLibUrl(); - //} - /// /// 验证码图床地址 /// diff --git a/src/blazor/admin/BootstrapAdmin.Web/Pages/Admin/Roles.razor b/src/blazor/admin/BootstrapAdmin.Web/Pages/Admin/Roles.razor index 2bf481b33..bc5d89bf8 100644 --- a/src/blazor/admin/BootstrapAdmin.Web/Pages/Admin/Roles.razor +++ b/src/blazor/admin/BootstrapAdmin.Web/Pages/Admin/Roles.razor @@ -8,7 +8,7 @@ - + -- Gitee From d9e10d1afbcb63e68f1357d28596b43945c177d8 Mon Sep 17 00:00:00 2001 From: Argo-Tianyi Date: Wed, 29 Dec 2021 12:25:37 +0800 Subject: [PATCH 11/18] =?UTF-8?q?feat:=20=E4=BF=AE=E5=A4=8D=E8=8F=9C?= =?UTF-8?q?=E5=8D=95=E5=AF=BC=E8=88=AA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/blazor/admin/BootstrapAdmin.Web/Pages/Admin/Index.razor | 2 +- .../admin/BootstrapAdmin.Web/Pages/Admin/Profiles.razor | 1 + src/blazor/admin/BootstrapAdmin.Web/Shared/MainLayout.razor | 4 ++-- .../admin/BootstrapAdmin.Web/Shared/MainLayout.razor.cs | 6 ++++++ 4 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/blazor/admin/BootstrapAdmin.Web/Pages/Admin/Index.razor b/src/blazor/admin/BootstrapAdmin.Web/Pages/Admin/Index.razor index e082b404c..60b052251 100644 --- a/src/blazor/admin/BootstrapAdmin.Web/Pages/Admin/Index.razor +++ b/src/blazor/admin/BootstrapAdmin.Web/Pages/Admin/Index.razor @@ -1,4 +1,4 @@ @page "/Admin/Index" -@attribute [TabItemOption(Text = "后台管理")] +@attribute [TabItemOption(Text = "后台管理", Icon = "fa fa-cog")]

欢迎使用后台管理

diff --git a/src/blazor/admin/BootstrapAdmin.Web/Pages/Admin/Profiles.razor b/src/blazor/admin/BootstrapAdmin.Web/Pages/Admin/Profiles.razor index 6287b173f..5722cad92 100644 --- a/src/blazor/admin/BootstrapAdmin.Web/Pages/Admin/Profiles.razor +++ b/src/blazor/admin/BootstrapAdmin.Web/Pages/Admin/Profiles.razor @@ -1,4 +1,5 @@ @page "/Admin/Profiles" +@attribute [TabItemOption(Text = "个人中心", Icon = "fa fa-suitcase")]
diff --git a/src/blazor/admin/BootstrapAdmin.Web/Shared/MainLayout.razor b/src/blazor/admin/BootstrapAdmin.Web/Shared/MainLayout.razor index a852a2431..c0435e85d 100644 --- a/src/blazor/admin/BootstrapAdmin.Web/Shared/MainLayout.razor +++ b/src/blazor/admin/BootstrapAdmin.Web/Shared/MainLayout.razor @@ -8,10 +8,10 @@ Bootstrap of Blazor - 个人中心 + 个人中心 设置 通知 - 注销 + 注销
diff --git a/src/blazor/admin/BootstrapAdmin.Web/Shared/MainLayout.razor.cs b/src/blazor/admin/BootstrapAdmin.Web/Shared/MainLayout.razor.cs index 9fc31d56a..6d4ea9872 100644 --- a/src/blazor/admin/BootstrapAdmin.Web/Shared/MainLayout.razor.cs +++ b/src/blazor/admin/BootstrapAdmin.Web/Shared/MainLayout.razor.cs @@ -13,6 +13,10 @@ namespace BootstrapAdmin.Web.Shared { private IEnumerable? MenuItems { get; set; } + [Inject] + [NotNull] + private NavigationManager? NavigationManager { get; set; } + [Inject] [NotNull] private INavigation? NavigationsService { get; set; } @@ -66,5 +70,7 @@ namespace BootstrapAdmin.Web.Shared } private Task OnAuthorizing(string url) => SecurityService.AuhorizingNavigation(Context.UserName, url); + + private void OnLogout() => NavigationManager.NavigateTo("/Account/Logout", true); } } -- Gitee From b0bff321f6f62e696600424d5afee8744e60d0bf Mon Sep 17 00:00:00 2001 From: zhangpeihang <948869991@qq.com> Date: Tue, 28 Dec 2021 16:31:26 +0800 Subject: [PATCH 12/18] =?UTF-8?q?feat:=20=E5=BC=80=E5=90=AFEF=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E6=9C=8D=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/BootstrapAdmin.Web/Extensions/ServicesExtensions.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/blazor/admin/BootstrapAdmin.Web/Extensions/ServicesExtensions.cs b/src/blazor/admin/BootstrapAdmin.Web/Extensions/ServicesExtensions.cs index ca1a2f350..4f7760156 100644 --- a/src/blazor/admin/BootstrapAdmin.Web/Extensions/ServicesExtensions.cs +++ b/src/blazor/admin/BootstrapAdmin.Web/Extensions/ServicesExtensions.cs @@ -2,6 +2,7 @@ using BootstrapAdmin.Web.Services.SMS; using BootstrapAdmin.Web.Services.SMS.Tencent; using Longbow.Tasks; +using Microsoft.EntityFrameworkCore; using System.Text; namespace Microsoft.Extensions.DependencyInjection -- Gitee From 80819eff13000134051c6de89a6d36b5ba3b425b Mon Sep 17 00:00:00 2001 From: zhangpeihang <948869991@qq.com> Date: Wed, 29 Dec 2021 15:43:51 +0800 Subject: [PATCH 13/18] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E8=8F=9C?= =?UTF-8?q?=E5=8D=95=E8=8E=B7=E5=8F=96=E4=B8=8D=E6=AD=A3=E7=A1=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BootstrapAdmin.DataAccess.EFCore/Services/DictService.cs | 2 +- .../Services/NavigationsService.cs | 2 +- .../BootstrapAdmin.DataAccess.EFCore/Services/UserService.cs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/blazor/admin/BootstrapAdmin.DataAccess.EFCore/Services/DictService.cs b/src/blazor/admin/BootstrapAdmin.DataAccess.EFCore/Services/DictService.cs index 5b036a1dd..f8f9363ca 100644 --- a/src/blazor/admin/BootstrapAdmin.DataAccess.EFCore/Services/DictService.cs +++ b/src/blazor/admin/BootstrapAdmin.DataAccess.EFCore/Services/DictService.cs @@ -104,7 +104,7 @@ namespace BootstrapAdmin.DataAccess.EFCore.Services public bool SaveHealthCheck(bool enable = true) { - throw new NotImplementedException(); + return true; } } } diff --git a/src/blazor/admin/BootstrapAdmin.DataAccess.EFCore/Services/NavigationsService.cs b/src/blazor/admin/BootstrapAdmin.DataAccess.EFCore/Services/NavigationsService.cs index d6ce8b6ed..4c78606e3 100644 --- a/src/blazor/admin/BootstrapAdmin.DataAccess.EFCore/Services/NavigationsService.cs +++ b/src/blazor/admin/BootstrapAdmin.DataAccess.EFCore/Services/NavigationsService.cs @@ -26,7 +26,7 @@ namespace BootstrapAdmin.DataAccess.EFCore.Services { using var context = DbFactory.CreateDbContext(); - var user = context.Set().Include(s => s.Roles).ThenInclude(s => s.Navigations).AsSplitQuery().FirstOrDefault(s => s.UserName == userName); + var user = context.Set().Include(s => s.Roles).ThenInclude(s => s.Navigations.Where(s => s.IsResource == EnumResource.Navigation)).AsSplitQuery().FirstOrDefault(s => s.UserName == userName); if (user == null) return new List(); diff --git a/src/blazor/admin/BootstrapAdmin.DataAccess.EFCore/Services/UserService.cs b/src/blazor/admin/BootstrapAdmin.DataAccess.EFCore/Services/UserService.cs index 6da872ab8..14f3f7c92 100644 --- a/src/blazor/admin/BootstrapAdmin.DataAccess.EFCore/Services/UserService.cs +++ b/src/blazor/admin/BootstrapAdmin.DataAccess.EFCore/Services/UserService.cs @@ -38,7 +38,7 @@ public class UserService : IUser public List GetApps(string userName) { - throw new NotImplementedException(); + return new List { "BA" }; } public string? GetDisplayName(string? userName) -- Gitee From 4ac02524cd1c7a243c1366362a8f22ea5b755c95 Mon Sep 17 00:00:00 2001 From: zhangpeihang <948869991@qq.com> Date: Wed, 29 Dec 2021 15:44:29 +0800 Subject: [PATCH 14/18] =?UTF-8?q?feat:=20=E9=85=8D=E7=BD=AE=E5=AE=9E?= =?UTF-8?q?=E4=BD=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../EntityConfiguration.cs | 38 +++++++++++++------ 1 file changed, 26 insertions(+), 12 deletions(-) diff --git a/src/blazor/admin/BootstrapAdmin.DataAccess.EFCore/EntityConfiguration.cs b/src/blazor/admin/BootstrapAdmin.DataAccess.EFCore/EntityConfiguration.cs index 55563e4ee..8200a6adb 100644 --- a/src/blazor/admin/BootstrapAdmin.DataAccess.EFCore/EntityConfiguration.cs +++ b/src/blazor/admin/BootstrapAdmin.DataAccess.EFCore/EntityConfiguration.cs @@ -1,10 +1,8 @@ using BootstrapAdmin.DataAccess.Models; using Microsoft.EntityFrameworkCore; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +using Microsoft.EntityFrameworkCore.ChangeTracking; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Microsoft.EntityFrameworkCore.ValueGeneration; namespace BootstrapAdmin.DataAccess.EFCore; @@ -16,11 +14,17 @@ public static class EntityConfiguration /// public static void Configure(this ModelBuilder builder) { + var converter = new ValueConverter( + v => Convert.ToInt32(v), + v => v.ToString(), + new ConverterMappingHints(valueGeneratorFactory: (p, t) => new GuidStringGenerator())); + builder.Entity().ToTable("Users"); builder.Entity().Ignore(u => u.Period); builder.Entity().Ignore(u => u.NewPassword); builder.Entity().Ignore(u => u.ConfirmPassword); builder.Entity().Ignore(u => u.IsReset); + builder.Entity().Property(s => s.Id).HasConversion(converter).ValueGeneratedOnAdd(); builder.Entity().HasMany(s => s.Roles).WithMany(s => s.Users).UsingEntity(s => { s.HasOne(s => s.User).WithMany(s => s.UserRoles).HasForeignKey(s => s.UserId); @@ -32,13 +36,10 @@ public static class EntityConfiguration s.HasOne(s => s.Group).WithMany(s => s.UserGroup).HasForeignKey(s => s.GroupId); }); - builder.Entity().Ignore(s => s.NewPassword); - builder.Entity().Ignore(s => s.Period); - builder.Entity().Ignore(s => s.IsReset); + builder.Entity().Property(s => s.Id).HasConversion(converter).ValueGeneratedOnAdd(); builder.Entity().ToTable("Roles"); - builder.Entity().HasKey(s => s.Id); - builder.Entity().Property(s => s.Id).IsRequired(); + builder.Entity().Property(s => s.Id).HasConversion(converter).ValueGeneratedOnAdd(); builder.Entity().HasMany(s => s.Navigations).WithMany(s => s.Roles).UsingEntity(s => { s.HasOne(s => s.Navigation).WithMany(s => s.NavigationRoles).HasForeignKey(s => s.NavigationId); @@ -51,9 +52,22 @@ public static class EntityConfiguration }); builder.Entity().ToTable("Navigations"); - builder.Entity().HasKey(s => s.Id); + builder.Entity().Property(s => s.Id).HasConversion(converter).ValueGeneratedOnAdd(); + builder.Entity().Property(s => s.IsResource).HasConversion(v => v.ToString(), + v => (EnumResource)Enum.Parse(typeof(EnumResource), v)); builder.Entity().Ignore(s => s.HasChildren); - builder.Entity(); + builder.Entity().Property(s => s.Id).HasConversion(converter).ValueGeneratedOnAdd(); + + builder.Entity().Property(s => s.Id).HasConversion(converter).ValueGeneratedOnAdd(); } } + +internal class GuidStringGenerator : ValueGenerator +{ + + public override bool GeneratesTemporaryValues => false; + + protected override object? NextValue(EntityEntry entry) => "0"; + +} -- Gitee From 1a815ba62186bbf56e62494083ef10dd8133601e Mon Sep 17 00:00:00 2001 From: zhangpeihang <948869991@qq.com> Date: Fri, 31 Dec 2021 14:11:25 +0800 Subject: [PATCH 15/18] =?UTF-8?q?fix:=20=E6=B6=88=E9=99=A4=E8=AD=A6?= =?UTF-8?q?=E5=91=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Services/GroupService.cs | 4 ++-- .../Services/NavigationsService.cs | 8 ++++---- .../Services/RoleService.cs | 6 +++--- .../Services/UserService.cs | 6 +++--- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/blazor/admin/BootstrapAdmin.DataAccess.EFCore/Services/GroupService.cs b/src/blazor/admin/BootstrapAdmin.DataAccess.EFCore/Services/GroupService.cs index e20561d42..0565379c0 100644 --- a/src/blazor/admin/BootstrapAdmin.DataAccess.EFCore/Services/GroupService.cs +++ b/src/blazor/admin/BootstrapAdmin.DataAccess.EFCore/Services/GroupService.cs @@ -26,14 +26,14 @@ public class GroupService : IGroup { using var dbcontext = DbFactory.CreateDbContext(); - return dbcontext.RoleGroup.Where(s => s.RoleId == roleId).Select(s => s.GroupId).ToList(); + return dbcontext.RoleGroup.Where(s => s.RoleId == roleId).Select(s => s.GroupId!).ToList(); } public List GetGroupsByUserId(string? userId) { using var dbcontext = DbFactory.CreateDbContext(); - return dbcontext.UserGroup.Where(s => s.UserId == userId).Select(s => s.GroupId).ToList(); + return dbcontext.UserGroup.Where(s => s.UserId == userId).Select(s => s.GroupId!).ToList(); } public bool SaveGroupsByRoleId(string? roleId, IEnumerable groupIds) diff --git a/src/blazor/admin/BootstrapAdmin.DataAccess.EFCore/Services/NavigationsService.cs b/src/blazor/admin/BootstrapAdmin.DataAccess.EFCore/Services/NavigationsService.cs index 4c78606e3..ef24026d2 100644 --- a/src/blazor/admin/BootstrapAdmin.DataAccess.EFCore/Services/NavigationsService.cs +++ b/src/blazor/admin/BootstrapAdmin.DataAccess.EFCore/Services/NavigationsService.cs @@ -26,18 +26,18 @@ namespace BootstrapAdmin.DataAccess.EFCore.Services { using var context = DbFactory.CreateDbContext(); - var user = context.Set().Include(s => s.Roles).ThenInclude(s => s.Navigations.Where(s => s.IsResource == EnumResource.Navigation)).AsSplitQuery().FirstOrDefault(s => s.UserName == userName); + var user = context.Set().Include(s => s.Roles!).ThenInclude(s => s.Navigations!.Where(s => s.IsResource == EnumResource.Navigation)).AsSplitQuery().FirstOrDefault(s => s.UserName == userName); if (user == null) return new List(); - return user.Roles.SelectMany(s => s.Navigations).ToList(); + return user.Roles!.SelectMany(s => s.Navigations!).ToList(); } - public List GetMenusByRoleId(string? roleId) + public List GetMenusByRoleId(string? roleId) { using var context = DbFactory.CreateDbContext(); - return context.NavigationRole.Where(s => s.RoleId == roleId).Select(s => s.NavigationId).ToList(); + return context.NavigationRole.Where(s => s.RoleId == roleId).Select(s => s.NavigationId!).ToList(); } public bool SaveMenusByRoleId(string? roleId, List menuIds) diff --git a/src/blazor/admin/BootstrapAdmin.DataAccess.EFCore/Services/RoleService.cs b/src/blazor/admin/BootstrapAdmin.DataAccess.EFCore/Services/RoleService.cs index f05d88140..a8feff767 100644 --- a/src/blazor/admin/BootstrapAdmin.DataAccess.EFCore/Services/RoleService.cs +++ b/src/blazor/admin/BootstrapAdmin.DataAccess.EFCore/Services/RoleService.cs @@ -26,21 +26,21 @@ public class RoleService : IRole { using var dbcontext = DbFactory.CreateDbContext(); - return dbcontext.RoleGroup.Where(s => s.GroupId == groupId).Select(s => s.RoleId).ToList(); + return dbcontext.RoleGroup.Where(s => s.GroupId == groupId).Select(s => s.RoleId!).ToList(); } public List GetRolesByMenuId(string? menuId) { using var dbcontext = DbFactory.CreateDbContext(); - return dbcontext.NavigationRole.Where(s => s.NavigationId == menuId).Select(s => s.RoleId).ToList(); + return dbcontext.NavigationRole.Where(s => s.NavigationId == menuId).Select(s => s.RoleId!).ToList(); } public List GetRolesByUserId(string? userId) { using var dbcontext = DbFactory.CreateDbContext(); - return dbcontext.UserRole.Where(s => s.UserId == userId).Select(s => s.RoleId).ToList(); + return dbcontext.UserRole.Where(s => s.UserId == userId).Select(s => s.RoleId!).ToList(); } public bool SaveRolesByGroupId(string? groupId, IEnumerable roleIds) diff --git a/src/blazor/admin/BootstrapAdmin.DataAccess.EFCore/Services/UserService.cs b/src/blazor/admin/BootstrapAdmin.DataAccess.EFCore/Services/UserService.cs index 14f3f7c92..05a0e5607 100644 --- a/src/blazor/admin/BootstrapAdmin.DataAccess.EFCore/Services/UserService.cs +++ b/src/blazor/admin/BootstrapAdmin.DataAccess.EFCore/Services/UserService.cs @@ -53,21 +53,21 @@ public class UserService : IUser var user = context.Users.Include(s => s.Roles).FirstOrDefault(s => s.UserName == userName); - return user != null ? user?.Roles?.Select(s => s.RoleName).ToList() : new List(); + return user != null ? user.Roles!.Select(s => s.RoleName).ToList() : new List(); } public List GetUsersByGroupId(string? groupId) { using var context = DbFactory.CreateDbContext(); - return context.UserGroup.Where(s => s.GroupId == groupId).Select(s => s.UserId).ToList(); + return context.UserGroup.Where(s => s.GroupId == groupId).Select(s => s.UserId!).ToList(); } public List GetUsersByRoleId(string? roleId) { using var context = DbFactory.CreateDbContext(); - return context.UserRole.Where(s => s.RoleId == roleId).Select(s => s.UserId).ToList(); + return context.UserRole.Where(s => s.RoleId == roleId).Select(s => s.UserId!).ToList(); } public bool SaveUsersByGroupId(string? groupId, IEnumerable userIds) -- Gitee From ce08026a1b329737c6adf8043ee3856061ea7fec Mon Sep 17 00:00:00 2001 From: zhangpeihang <948869991@qq.com> Date: Fri, 31 Dec 2021 14:12:33 +0800 Subject: [PATCH 16/18] =?UTF-8?q?refactor:=20=E7=A7=BB=E9=99=A4=E6=9E=9A?= =?UTF-8?q?=E4=B8=BE=E8=BD=AC=E6=8D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BootstrapAdmin.DataAccess.EFCore/EntityConfiguration.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/blazor/admin/BootstrapAdmin.DataAccess.EFCore/EntityConfiguration.cs b/src/blazor/admin/BootstrapAdmin.DataAccess.EFCore/EntityConfiguration.cs index 8200a6adb..8c9826695 100644 --- a/src/blazor/admin/BootstrapAdmin.DataAccess.EFCore/EntityConfiguration.cs +++ b/src/blazor/admin/BootstrapAdmin.DataAccess.EFCore/EntityConfiguration.cs @@ -53,8 +53,6 @@ public static class EntityConfiguration builder.Entity().ToTable("Navigations"); builder.Entity().Property(s => s.Id).HasConversion(converter).ValueGeneratedOnAdd(); - builder.Entity().Property(s => s.IsResource).HasConversion(v => v.ToString(), - v => (EnumResource)Enum.Parse(typeof(EnumResource), v)); builder.Entity().Ignore(s => s.HasChildren); builder.Entity().Property(s => s.Id).HasConversion(converter).ValueGeneratedOnAdd(); -- Gitee From e42644dd925f2732ba4370c1b6f307eb7ab7af07 Mon Sep 17 00:00:00 2001 From: zhangpeihang <948869991@qq.com> Date: Fri, 31 Dec 2021 14:14:07 +0800 Subject: [PATCH 17/18] =?UTF-8?q?refactor:=20GetAll=20=E6=94=B9=E4=B8=BA?= =?UTF-8?q?=E5=85=AC=E5=BC=80=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Extensions/ServicesExtensions.cs | 1 - .../Services/DictService.cs | 2 +- src/blazor/admin/BootstrapAdmin.Web.Core/IDict.cs | 11 ++++++++++- src/blazor/admin/BootstrapAdmin.Web/Jobs/DBLogTask.cs | 1 - 4 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/blazor/admin/BootstrapAdmin.DataAccess.EFCore/Extensions/ServicesExtensions.cs b/src/blazor/admin/BootstrapAdmin.DataAccess.EFCore/Extensions/ServicesExtensions.cs index 57de61548..b977005ef 100644 --- a/src/blazor/admin/BootstrapAdmin.DataAccess.EFCore/Extensions/ServicesExtensions.cs +++ b/src/blazor/admin/BootstrapAdmin.DataAccess.EFCore/Extensions/ServicesExtensions.cs @@ -54,4 +54,3 @@ public static class ServicesExtensions return services; } } -} diff --git a/src/blazor/admin/BootstrapAdmin.DataAccess.PetaPoco/Services/DictService.cs b/src/blazor/admin/BootstrapAdmin.DataAccess.PetaPoco/Services/DictService.cs index bd449e3bc..a80296563 100644 --- a/src/blazor/admin/BootstrapAdmin.DataAccess.PetaPoco/Services/DictService.cs +++ b/src/blazor/admin/BootstrapAdmin.DataAccess.PetaPoco/Services/DictService.cs @@ -22,7 +22,7 @@ class DictService : BaseDatabase, IDict AppId = configuration.GetValue("AppId", "BA"); } - private List GetAll() => Database.Fetch(); + public List GetAll() => Database.Fetch(); public Dictionary GetApps() { diff --git a/src/blazor/admin/BootstrapAdmin.Web.Core/IDict.cs b/src/blazor/admin/BootstrapAdmin.Web.Core/IDict.cs index 936b2e2ae..a627b2080 100644 --- a/src/blazor/admin/BootstrapAdmin.Web.Core/IDict.cs +++ b/src/blazor/admin/BootstrapAdmin.Web.Core/IDict.cs @@ -1,10 +1,19 @@ -namespace BootstrapAdmin.Web.Core +using BootstrapAdmin.DataAccess.Models; + +namespace BootstrapAdmin.Web.Core { /// /// Dict 字典表接口 /// public interface IDict { + + /// + /// + /// + /// + List GetAll(); + /// /// 获得 配置所有的 App 集合 /// diff --git a/src/blazor/admin/BootstrapAdmin.Web/Jobs/DBLogTask.cs b/src/blazor/admin/BootstrapAdmin.Web/Jobs/DBLogTask.cs index 806cd8a6e..f6bcde9c0 100644 --- a/src/blazor/admin/BootstrapAdmin.Web/Jobs/DBLogTask.cs +++ b/src/blazor/admin/BootstrapAdmin.Web/Jobs/DBLogTask.cs @@ -1,6 +1,5 @@ using BootstrapAdmin.DataAccess.Models; using Longbow.Tasks; -using PetaPoco; using System.Collections.Concurrent; namespace BootstrapAdmin.Web.Jobs -- Gitee From f819a26a14d29668f941f1c25aca19e430f3c5c8 Mon Sep 17 00:00:00 2001 From: zhangpeihang <948869991@qq.com> Date: Fri, 31 Dec 2021 14:14:26 +0800 Subject: [PATCH 18/18] =?UTF-8?q?refactor:=20=E4=BF=AE=E6=94=B9=E6=96=B9?= =?UTF-8?q?=E6=B3=95=E7=AD=BE=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/blazor/admin/BootstrapAdmin.Web.Core/INavigation.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/blazor/admin/BootstrapAdmin.Web.Core/INavigation.cs b/src/blazor/admin/BootstrapAdmin.Web.Core/INavigation.cs index 1126d010b..27b2961ba 100644 --- a/src/blazor/admin/BootstrapAdmin.Web.Core/INavigation.cs +++ b/src/blazor/admin/BootstrapAdmin.Web.Core/INavigation.cs @@ -18,7 +18,7 @@ namespace BootstrapAdmin.Web.Core ///
/// /// - List GetMenusByRoleId(string? roleId); + List GetMenusByRoleId(string? roleId); /// /// -- Gitee