using Application.Domain.Entities; using Infrastructure.Application.Entites.Settings; using Infrastructure.Data; using Infrastructure.Extensions; using Infrastructure.Security; using Microsoft.EntityFrameworkCore; using System.Collections.Generic; using System.Linq; namespace UserCenter { public class DbConfig : IDbConfig { private readonly IEncryptionService _encryptionService; public DbConfig(IEncryptionService encryptionService) { this._encryptionService = encryptionService; } public void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { } public void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity(); modelBuilder.Entity().Property(o => o.UserName).IsRequired(); modelBuilder.Entity().HasIndex(o => o.UserName).IsUnique(); modelBuilder.Entity().Property(o => o.Email).IsRequired(); modelBuilder.Entity().HasIndex(o => o.Email).IsUnique(); modelBuilder.Entity().HasIndex(o => o.PhoneNumber).IsUnique(); modelBuilder.Entity().HasIndex(o => o.NickName).IsUnique(); modelBuilder.Entity().HasIndex(o => o.Name).IsUnique(); modelBuilder.Entity().HasOne(o => o.Parent).WithMany(o => o.Children).HasForeignKey(o => o.ParentId).OnDelete(DeleteBehavior.SetNull); modelBuilder.Entity().HasIndex(o => o.Number).IsUnique(); modelBuilder.Entity().HasIndex(o => o.Number).IsUnique(); modelBuilder.Entity().HasOne(o => o.Category).WithMany(o => o.Permissions).HasForeignKey(o => o.CategoryId).OnDelete(DeleteBehavior.SetNull); modelBuilder.Entity().HasOne(o => o.User).WithMany(o => o.UserRoles).HasForeignKey(o => o.UserId); modelBuilder.Entity().HasOne(o => o.Role).WithMany(o => o.UserRoles).HasForeignKey(o => o.RoleId); modelBuilder.Entity().HasOne(o => o.Role).WithMany(o => o.RolePermissions).HasForeignKey(o => o.RoleId); modelBuilder.Entity().HasOne(o => o.Permission).WithMany(o => o.RolePermissions).HasForeignKey(o => o.PermissionId); modelBuilder.Entity().HasIndex(o => o.Number).IsUnique(); modelBuilder.Entity().HasIndex(o => o.Number).IsUnique(); modelBuilder.Entity().HasIndex(o => new { o.UserId, o.RoleId }).IsUnique(); modelBuilder.Entity().HasIndex(o => new { o.RoleId, o.PermissionId }).IsUnique(); modelBuilder.Entity().HasOne(o => o.Parent).WithMany(o => o.Children).HasForeignKey(o => o.ParentId); modelBuilder.Entity().Property(o => o.Number).IsRequired(); modelBuilder.Entity().HasIndex(o => o.Number).IsUnique(); modelBuilder.Entity().Property(o => o.Number).IsRequired(); modelBuilder.Entity().HasIndex(o => o.Number).IsUnique(); modelBuilder.Entity().HasOne(o => o.User).WithMany(o => o.OrganUsers).HasForeignKey(o => o.UserId); modelBuilder.Entity().HasOne(o => o.Organ).WithMany(o => o.OrganUsers).HasForeignKey(o => o.OrganId); modelBuilder.Entity().HasIndex(o => new { o.UserId, o.OrganId }).IsUnique(); modelBuilder.Entity().HasOne(o => o.User).WithMany(o => o.UserDepartments).HasForeignKey(o => o.UserId); modelBuilder.Entity().HasOne(o => o.Department).WithMany(o => o.UserDepartments).HasForeignKey(o => o.DepartmentId); modelBuilder.Entity().HasIndex(o => new { o.UserId, o.DepartmentId }).IsUnique(); //关系 modelBuilder.Entity(); modelBuilder.Entity().HasIndex(o => o.Name).IsUnique(); } public void Seed(DbContext dbContext) { var set = dbContext.Set(); set.Add(new Setting { Name = "name", Value = "用户中心", Type = SettingType.Text }); set.Add(new Setting { Name = "logo", Value = "/images/logo.png", Type = SettingType.ImageUrl }); set.Add(new Setting { Name = "copyright", Value = "Copyright © {0} Company. All rights reserved", Type = SettingType.Html }); //AccessTokenHours set.Add(new Setting { Name = "AccessTokenTimeout", Value = "1440", Type = SettingType.Text }); set.Add(new Setting { Name = "RefreshTokenTimeout", Value = "518400", Type = SettingType.Text }); set.Add(new Setting { Name = "MaxFailedAccessAttemptsBeforeLockout", Value = "5", Type = SettingType.Text }); set.Add(new Setting { Name = "DefaultAccountLockoutMinutes", Value = "10", Type = SettingType.Text }); set.Add(new Setting { Name = "CaptchaSeconds", Value = "60", Type = SettingType.Text }); set.Add(new Setting { Name = "RegisterDisabled", Value = "false", Type = SettingType.Text }); // set.Add(new Setting { Name = "email:host", Value = "nbaxp.com", Type = SettingType.Text }); set.Add(new Setting { Name = "email:port", Value = "25", Type = SettingType.Text }); set.Add(new Setting { Name = "email:user", Value = "admin@nbaxp.com", Type = SettingType.Text }); set.Add(new Setting { Name = "email:password", Value = "123456", Type = SettingType.Text }); set.Add(new Setting { Name = "sms", Value = "false", Type = SettingType.Text }); set.Add(new Setting { Name = "sms:url", Value = "https://api.netease.im/sms/sendcode.action", Type = SettingType.Text }); set.Add(new Setting { Name = "sms:key", Value = "123456", Type = SettingType.Text }); set.Add(new Setting { Name = "sms:secret", Value = "123456", Type = SettingType.Text }); dbContext.SaveChanges(); // foreach (var item in dbContext.Model.GetEntityTypes()) { var type = item.ClrType; var name = type.GetDisplayName(); var number = type.Name; var category = new PermissionCategory { Name = name, Number = type.Name }; category.Permissions.Add(new Permission { Name = $"查看{name}", Number = $"Read-{number}" }); category.Permissions.Add(new Permission { Name = $"添加{name}", Number = $"Add-{number}" }); category.Permissions.Add(new Permission { Name = $"修改{name}", Number = $"Edit-{number}" }); category.Permissions.Add(new Permission { Name = $"删除{name}", Number = $"Delete-{number}" }); dbContext.Set().Add(category); } dbContext.SaveChanges(); var saRole = new Role { Name = "超级管理员", IsReadOnly = true }; var adminRole = new Role { Name = "管理员", IsReadOnly = true }; var skips = new string[] { "添加权限", "修改权限", "添加权限分类", "修改权限分类" }; foreach (var item in dbContext.Set()) { saRole.RolePermissions.Add(new RolePermission { Permission = item, IsReadOnly = true }); if (!item.Name.Contains("删除") && !skips.Contains(item.Name)) { adminRole.RolePermissions.Add(new RolePermission { Permission = item, IsReadOnly = true }); } } var securityStam = "123456"; dbContext.Set().Add(new User { UserName = "super", SecurityStamp = securityStam, PasswordHash = _encryptionService.CreatePasswordHash("123456", securityStam), PasswordConfirmed = true, Email = "sa@test.com", EmailConfirmed = true, PhoneNumber = "13000000000", PhoneNumberConfirmed = true, NickName = "超级管理员", FaceImage = "/face/sa.jpg", UserRoles = new List { new UserRole { Role = saRole } } }); dbContext.Set().Add(new User { UserName = "admin", SecurityStamp = securityStam, PasswordHash = _encryptionService.CreatePasswordHash("123456", securityStam), PasswordConfirmed = true, Email = "admin@test.com", EmailConfirmed = true, PhoneNumber = "13000000001", PhoneNumberConfirmed = true, NickName = "管理员", FaceImage = "/face/admin.jpg", UserRoles = new List { new UserRole { Role = adminRole } } }); dbContext.SaveChanges(); var host = "localhost"; dbContext.Set().Add(new Site { Icon = "/images/iotcenter.png", Name = "物联网平台", Description = "内部系统", Home = $"http://{host}/IoTCenter/", Login = $"http://{host}/IoTCenter/Account/JsonpLogin", Logout = $"http://{host}/IoTCenter/Account/JsonpLogout", Key = "123456" }); dbContext.Set().Add(new Site { Icon = "/images/studycenter.png", Name = "学习平台", Description = "外部系统", Home = $"http://{host}:8012/", Login = $"http://{host}:8012/Account/JsonpLogin", Logout = $"http://{host}:8012/Account/JsonpLogout", Key = "123456" }); dbContext.SaveChanges(); var department = new Department { Name = "科学技术大学", Number = "0", Children = new List { new Department{ Name="人事部",Number="1"}, new Department{ Name="财务部",Number="2"}, new Department{ Name="理学院",Number="3"}, new Department{ Name ="计算机学院", Number ="4", Children = new List { new Department { Name ="计算机科学与技术专业", Number ="5", Children = new List { new Department { Name ="2018级", Number ="6", Children=new List { new Department{ Name="1班",Number="7" } } } } } } } } }; dbContext.Set().Add(department); dbContext.SaveChanges(); var departments = dbContext.Set().ToList(); foreach (var item in departments) { item.UpdatePath(); } dbContext.SaveChanges(); } } }