using Application.Domain.Entities; using Infrastructure.Application.Entites.Settings; using Infrastructure.Data; using Infrastructure.Domain; using Infrastructure.Events; using Infrastructure.Extensions; using Infrastructure.Security; using IoT.Shared; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Linq; using System.Reflection; namespace Platform.Data { public class PlatformDbContext : EfDbContext, IDbConfig { private readonly IEncryptionService _encryptionService; public PlatformDbContext(DbContextOptions options, ILogger logger, IHostEnvironment env, IConfiguration cfg, IEventPublisher publisher, IEncryptionService encryptionService) : base(options, logger, env, cfg, publisher) { this._encryptionService = encryptionService; } protected override void OnModelCreating(ModelBuilder modelBuilder) { IoTSharedDbConfig.OnModelCreating(modelBuilder); //Platform modelBuilder.Entity().HasIndex(o => o.Key).IsUnique(); modelBuilder.Entity().HasIndex(o => new { o.CategoryId, o.Value }).IsUnique(); modelBuilder.Entity().HasOne(o => o.Category).WithMany(o => o.Items).HasForeignKey(o => o.CategoryId); modelBuilder.Entity().HasIndex(o => o.Name).IsUnique(); //Statistic modelBuilder.Entity().HasIndex(o => o.Key).IsUnique(); //User modelBuilder.Entity().Property(o => o.UserName).IsRequired(); modelBuilder.Entity().HasIndex(o => o.UserName).IsUnique(); modelBuilder.Entity().HasIndex(o => o.Email).IsUnique(); modelBuilder.Entity().HasIndex(o => o.PhoneNumber).IsUnique(); //OrganRole modelBuilder.Entity().Property(o => o.Name).IsRequired(); modelBuilder.Entity().Property(o => o.Number).IsRequired(); modelBuilder.Entity().HasIndex(o => new { o.OrganId, o.Number }).IsUnique(); modelBuilder.Entity().HasOne(o => o.Organ).WithMany(o => o.Roles).HasForeignKey(o => o.OrganId).OnDelete(DeleteBehavior.Cascade); //Permission modelBuilder.Entity().HasOne(o => o.AppModule).WithMany(o => o.PermissionCategories).HasForeignKey(o => o.AppModuleId).OnDelete(DeleteBehavior.Cascade); modelBuilder.Entity().HasOne(o => o.Category).WithMany(o => o.Permissions).HasForeignKey(o => o.CategoryId).OnDelete(DeleteBehavior.SetNull); modelBuilder.Entity().HasIndex(o => o.Number).IsUnique(); //OrganUserRole modelBuilder.Entity().HasOne(o => o.OrganUser).WithMany(o => o.UserRoles).HasForeignKey(o => o.OrganUserId); modelBuilder.Entity().HasOne(o => o.OrganRole).WithMany(o => o.UserRoles).HasForeignKey(o => o.OrganRoleId); modelBuilder.Entity().HasIndex(o => new { o.OrganUserId, o.OrganRoleId }).IsUnique(); //OrganRolePermission 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 => new { o.RoleId, o.PermissionId }).IsUnique(); //Site modelBuilder.Entity().Property(o => o.Name).IsRequired(); modelBuilder.Entity().HasIndex(o => o.Name).IsUnique(); //Area modelBuilder.Entity().HasIndex(o => o.Number).IsUnique(); //Organ modelBuilder.Entity().HasIndex(o => o.Name).IsUnique(); modelBuilder.Entity().HasIndex(o => o.Number).IsUnique(); modelBuilder.Entity().HasOne(o => o.Area).WithMany(o => o.Organs).HasForeignKey(o => o.AreaId).OnDelete(DeleteBehavior.SetNull); //Building modelBuilder.Entity().Property(o => o.OrganId).IsRequired(); modelBuilder.Entity().HasIndex(o => new { o.OrganId, o.ParentId, o.Number }).IsUnique(); modelBuilder.Entity().HasOne(o => o.Organ).WithMany(o => o.Buildings).HasForeignKey(o => o.OrganId); //OrganUser modelBuilder.Entity().HasOne(o => o.Organ).WithMany(o => o.OrganUsers).HasForeignKey(o => o.OrganId); modelBuilder.Entity().HasOne(o => o.User).WithMany(o => o.OrganUsers).HasForeignKey(o => o.UserId); modelBuilder.Entity().HasIndex(o => new { o.OrganId, o.UserId }).IsUnique(); //Department modelBuilder.Entity().HasIndex(o => new { o.OrganId, o.Number }).IsUnique(); //DepartmentUser modelBuilder.Entity().HasOne(o => o.Department).WithMany(o => o.DepartmentUsers).HasForeignKey(o => o.DeparementId); modelBuilder.Entity().HasOne(o => o.OrganUser).WithMany(o => o.DepartmentUsers).HasForeignKey(o => o.OrganUserId); modelBuilder.Entity().HasIndex(o => new { o.DeparementId, o.OrganUserId }).IsUnique(); modelBuilder.Entity().HasOne(o => o.Job).WithMany(o => o.DepartmentUsers).HasForeignKey(o => o.JobId).OnDelete(DeleteBehavior.SetNull); //IoTCenter //IoTProductCategory modelBuilder.Entity().HasIndex(o => o.Number).IsUnique(); modelBuilder.Entity().HasOne(o => o.IoTProductCategory).WithMany(o => o.Products).HasForeignKey(o => o.IoTProductCategoryId).OnDelete(DeleteBehavior.SetNull); //IoTGateway modelBuilder.Entity().HasOne(o => o.Building).WithMany(o => o.IoTGateways).HasForeignKey(o => o.BuildingId).OnDelete(DeleteBehavior.SetNull); //IoTCommand modelBuilder.Entity().HasOne(o => o.Api).WithMany(o => o.IoTCommands).HasForeignKey(o => o.ApiId); modelBuilder.Entity().HasOne(o => o.IoTDevice).WithMany(o => o.IoTCommands).HasForeignKey(o => o.DeviceId); //IoTScene modelBuilder.Entity().HasOne(o => o.Building).WithMany(o => o.Scenes).HasForeignKey(o => o.BuildingId); //IoTSceneIoTCommand modelBuilder.Entity().HasOne(o => o.IoTScene).WithMany(o => o.IoTSceneIoTCommands).HasForeignKey(o => o.IoTSceneId); modelBuilder.Entity().HasOne(o => o.IoTCommand).WithMany(o => o.IoTSceneIoTCommands).HasForeignKey(o => o.IoTCommandId); //IoTTimer modelBuilder.Entity().HasOne(o => o.IoTScene).WithMany(o => o.IoTTimers).HasForeignKey(o => o.IoTSceneId); //IoTTigger modelBuilder.Entity().HasOne(o => o.IoTScene).WithMany(o => o.IoTTiggers).HasForeignKey(o => o.IoTSceneId); modelBuilder.Entity().HasOne(o => o.IoTData).WithMany(o => o.IoTTiggers).HasForeignKey(o => o.IoTDataId); //LiveRecord modelBuilder.Entity().Property(o => o.DeviceNumber).IsRequired(); base.OnModelCreating(modelBuilder); } public void Seed(DbContext db) { db.Set().Add(new DictionaryCategory { Key = "AreaType", Name = "区域类型", Items = new List { new DictionaryItem{ Name="省",Value="省",Order=0}, new DictionaryItem{ Name="县",Value="县",Order=1}, new DictionaryItem{ Name="乡",Value="乡",Order=2} } }); db.SaveChanges(); db.Set().Add(new DictionaryCategory { Key = "OrganType", Name = "机构类型", Items = new List { new DictionaryItem{ Name="企业",Value="企业",Order=0}, new DictionaryItem{ Name="机关",Value="机关",Order=1}, new DictionaryItem{ Name="事业单位",Value="事业单位",Order=2}, new DictionaryItem{ Name="社会团体",Value="社会团体",Order=3}, new DictionaryItem{ Name="其他组织机构",Value="其他组织机构",Order=4} } }); db.SaveChanges(); db.Set().Add(new DictionaryCategory { Key = "BuildingType", Name = "建筑类型", Items = new List { new DictionaryItem{ Name="建筑",Value="建筑",Order=0}, new DictionaryItem{ Name="楼层",Value="楼层",Order=1}, new DictionaryItem{ Name="房间",Value="房间",Order=2} } }); db.SaveChanges(); db.Set().Add(new DictionaryCategory { Key = "DepartmentType", Name = "部门类型", Items = new List { new DictionaryItem{ Name="行政",Value="行政",Order=0}, new DictionaryItem{ Name="党政",Value="党政",Order=1}, new DictionaryItem{ Name="其他",Value="其他",Order=2} } }); db.SaveChanges(); db.Set().Add(new DictionaryCategory { Key = "DepartmentUserType", Name = "部门成员类型", Items = new List { new DictionaryItem{ Name="行政",Value="行政",Order=0}, new DictionaryItem{ Name="借调",Value="借调",Order=1}, } }); db.SaveChanges(); db.Set().Add(new DictionaryCategory { Key = "OrganUserType", Name = "用户类型", Items = new List { new DictionaryItem{ Name="劳动关系",Value="劳动关系",Order=0}, new DictionaryItem{ Name="劳务关系",Value="劳务关系",Order=1}, new DictionaryItem{ Name="其他",Value="其他",Order=2} } }); db.SaveChanges(); var order = 0; var root = db.Set().Add(new IoTProductCategory { Name = "产品分类", Number = "root" }).Entity; db.Set().Add(new IoTProductCategory { Order = order++, ParentId = root.Id, Number = "00", Name = "网关", Image = "/images/gateway.svg" }); db.Set().Add(new IoTProductCategory { Order = order++, ParentId = root.Id, Number = "10", Name = "安防", Image = "/images/safe.svg" }); db.Set().Add(new IoTProductCategory { Order = order++, ParentId = root.Id, Number = "20", Name = "电器", Image = "/images/socket.svg" }); db.Set().Add(new IoTProductCategory { Order = order++, ParentId = root.Id, Number = "30", Name = "照明", Image = "/images/light.svg" }); db.Set().Add(new IoTProductCategory { Order = order++, ParentId = root.Id, Number = "40", Name = "监测", Image = "/images/monitor.svg" }); db.SaveChanges(); db.Set().FirstOrDefault(o => o.Number == "root").Update(); db.SaveChanges(); var permissionCategoryRoot = new PermissionCategory { Name = "权限分类", Number = "root" }; db.Set().Add(permissionCategoryRoot); db.SaveChanges(); foreach (var item in db.Model.GetEntityTypes()) { var module = item.ClrType.GetCustomAttributes() .FirstOrDefault(o => typeof(ModuleAttribute).IsAssignableFrom(o.GetType())) as ModuleAttribute; var appModule = db.Set().FirstOrDefault(o => o.Number == module.Number); if (appModule == null) { appModule = new AppModule { Name = module.Name, Number = module.Number, Order = module.Order }; db.Set().Add(appModule); db.SaveChanges(); } var display = item.ClrType.GetCustomAttribute(); var categoryName = display.Name; var categoryNumber = item.ClrType.Name; var permissionCatgegory = db.Set().FirstOrDefault(o => o.Number == categoryNumber); if (permissionCatgegory == null) { permissionCatgegory = new PermissionCategory { AppModuleId = appModule.Id, ParentId = permissionCategoryRoot.Id, Name = display.Name, Number = categoryNumber, Order = display.GetOrder() ?? 0 }; db.Set().Add(permissionCatgegory); db.SaveChanges(); } var scopeAttribute = item.ClrType.GetCustomAttribute(); var name = display.Name; var number = item.ClrType.Name; var permissionCategoryId = permissionCatgegory.Id; if (scopeAttribute != null) { var scope = scopeAttribute.Scope; //平台权限 if (scope.HasFlag(ScopeType.PlatformRead)) { permissionCatgegory.Permissions.Add(new Permission { IsReadOnly = true, Type = PermissionType.Platform, Name = $"查看平台{name}", Number = $"Read-Platform-{number}" }); } if (scope.HasFlag(ScopeType.PlatformAdd)) { permissionCatgegory.Permissions.Add(new Permission { IsReadOnly = true, Type = PermissionType.Platform, Name = $"添加平台{name}", Number = $"Add-Platform-{number}" }); } if (scope.HasFlag(ScopeType.PlatformEdit)) { permissionCatgegory.Permissions.Add(new Permission { IsReadOnly = true, Type = PermissionType.Platform, Name = $"修改平台{name}", Number = $"Edit-Platform-{number}" }); } if (scope.HasFlag(ScopeType.PlatformDelete)) { permissionCatgegory.Permissions.Add(new Permission { IsReadOnly = true, Type = PermissionType.Platform, Name = $"删除平台{name}", Number = $"Delete-Platform-{number}" }); } //机构权限 if (scope.HasFlag(ScopeType.OrganRead)) { permissionCatgegory.Permissions.Add(new Permission { IsReadOnly = true, Type = PermissionType.Organ, Name = $"查看机构{name}", Number = $"Read-Organ-{number}" }); } if (scope.HasFlag(ScopeType.OrganAdd)) { permissionCatgegory.Permissions.Add(new Permission { IsReadOnly = true, Type = PermissionType.Organ, Name = $"添加机构{name}", Number = $"Add-Organ-{number}" }); } if (scope.HasFlag(ScopeType.OrganEdit)) { permissionCatgegory.Permissions.Add(new Permission { IsReadOnly = true, Type = PermissionType.Organ, Name = $"修改机构{name}", Number = $"Edit-Organ-{number}" }); } if (scope.HasFlag(ScopeType.OrganDelete)) { permissionCatgegory.Permissions.Add(new Permission { IsReadOnly = true, Type = PermissionType.Organ, Name = $"删除机构{name}", Number = $"Delete-Organ-{number}" }); } //个人权限 if (scope.HasFlag(ScopeType.UserRead)) { permissionCatgegory.Permissions.Add(new Permission { IsReadOnly = true, Type = PermissionType.User, Name = $"查看个人{name}", Number = $"Read-User-{number}" }); } if (scope.HasFlag(ScopeType.UserAdd)) { permissionCatgegory.Permissions.Add(new Permission { IsReadOnly = true, Type = PermissionType.User, Name = $"添加个人{name}", Number = $"Add-User-{number}" }); } if (scope.HasFlag(ScopeType.UserEdit)) { permissionCatgegory.Permissions.Add(new Permission { IsReadOnly = true, Type = PermissionType.User, Name = $"修改个人{name}", Number = $"Edit-User-{number}" }); } if (scope.HasFlag(ScopeType.UserDelete)) { permissionCatgegory.Permissions.Add(new Permission { IsReadOnly = true, Type = PermissionType.User, Name = $"删除个人{name}", Number = $"Delete-User-{number}" }); } db.SaveChanges(); } } db.Set().ToList().FirstOrDefault(o => o.Number == "root").Update(); db.SaveChanges(); var permissionHideList = new string[] { "Read-Platform-AppModule", "Read-Platform-Statistic", "Read-Platform-Department", "Read-Platform-DepartmentUser", "Read-Platform-OrganUserRole", "Read-Platform-RolePermission", "Read-Organ-Department", "Read-Organ-DepartmentUser", "Read-Organ-OrganUserRole", "Read-Organ-RolePermission", "Read-Organ-IoTScene", "Read-Organ-IoTSceneIoTCommand", "Read-Organ-IoTTimer", "Read-Organ-IoTTigger", }; foreach (var item in db.Set().Where(o => permissionHideList.Contains(o.Number))) { item.Hide = true; } db.SaveChanges(); //初始化区域 var areaRoot = new Area { Name = "区域", Number = "root", Children = new List { new Area{ Type = "省", Name="吉林省", Number="Jilin", Children = new List { new Area{ Type= "市", Name="长春市", Number="changchun", Children = new List { new Area { Type= "区", Name="南关区", Number="nanguan" } } } } } } }; db.Set().Add(areaRoot); db.SaveChanges(); //初始化机构 var organRoot = new Organ { Name = "机构", Number = "root", Children = new List { new Organ { Area = db.Set().FirstOrDefault(o => o.Number == "changchun"), Type= "事业单位", IsReadOnly=true, Name="默认教育局", Number="jiaoyuju", Children = new List { new Organ { Area = db.Set().FirstOrDefault(o => o.Number == "nanguan"), Type= "事业单位", Name="默认学校", Number="xuexiao" }, new Organ { Area = db.Set().FirstOrDefault(o => o.Number == "nanguan"), Type= "事业单位", Name="其他学校", Number="qitaxuexiao" } } } } }; db.Set().Add(organRoot); db.SaveChanges(); //初始化建筑 var image = "/images/empty.svg"; var organId = db.Set().FirstOrDefault(o => o.Number == "xuexiao").Id; var buildingRoot = new Building { Image = image, Name = "建筑", Number = "root", OrganId = organRoot.Id, Children = new List { new Building { Image= image, Order=order++, OrganId=organId, Type= "建筑", Name="默认建筑", Number="1", Children = new List { new Building { Image= image, Order=order++, OrganId=organId, Type= "楼层", Name="1楼", Number="11", Children=new List { new Building{ Image= image, Order=order++, OrganId=organId, Type= "房间", Name="101室", Number="101" }, new Building{ Image= image, Order=order++, OrganId=organId, Type= "房间", Name="102室", Number="102" } } }, new Building { Image= image, Order=order++, OrganId=organId, Type= "楼层", Name="2楼", Number="12", Children=new List { new Building{ Image= image, Order=order++, OrganId=organId, Type= "房间", Name="201室", Number="201" }, new Building{ Image= image, Order=order++, OrganId=organId, Type= "房间", Name="202室", Number="202" } } } } } } }; db.Set().Add(buildingRoot); db.SaveChanges(); //更新Left和Right编号 db.Set().FirstOrDefault(o => o.Number == "root").Update(); db.Set().FirstOrDefault(o => o.Number == "root").Update(); db.Set().FirstOrDefault(o => o.Number == "root").Update(); db.SaveChanges(); var platformOrganId = db.Set().FirstOrDefault(o => o.IsReadOnly).Id; var superRole = new Role { OrganId = platformOrganId, Number = "super", Name = "超级管理员", IsReadOnly = true }; var adminRole = new Role { OrganId = platformOrganId, Number = "admin", Name = "管理员" }; var organRole = new Role { OrganId = platformOrganId, Number = "organ", Name = "机构管理员" }; //初始化角色 var skips = new string[] { //"添加Api", "修改Api", "添加分类", "修改分类", "添加参数", "修改参数", "添加产品", "修改产品", "添加节点", "添加权限", "修改权限", "添加权限分类", "修改权限分类", "添加设备" }; foreach (var item in db.Set()) { superRole.RolePermissions.Add(new RolePermission { IsReadOnly = true, Permission = item }); if (!item.Name.Contains("删除") && !skips.Contains(item.Name)) { adminRole.RolePermissions.Add(new RolePermission { Permission = item }); if (item.Type == PermissionType.Organ) { organRole.RolePermissions.Add(new RolePermission { Permission = item }); } } } db.Set().AddRange(superRole, adminRole, organRole); db.SaveChanges(); var securityStam = "123456"; db.Set().Add(new User { UserName = "super", SecurityStamp = securityStam, PasswordHash = _encryptionService.CreatePasswordHash("123456", securityStam), PasswordConfirmed = true, Email = "super@test.com", EmailConfirmed = true, NickName = "超级管理员", OrganUsers = new List { new OrganUser { IsReadOnly=true, Type= "", OrganId=platformOrganId, UserRoles=new List { new OrganUserRole{ IsReadOnly=true, OrganRoleId=superRole.Id } } }, new OrganUser { Type= "其他", OrganId=db.Set().FirstOrDefault(o=>o.Name=="默认学校").Id, } } }); db.Set().Add(new User { UserName = "admin", SecurityStamp = securityStam, PasswordHash = _encryptionService.CreatePasswordHash("123456", securityStam), PasswordConfirmed = true, Email = "admin@test.com", EmailConfirmed = true, NickName = "管理员", OrganUsers = new List { new OrganUser { Type= "其他", OrganId=platformOrganId, UserRoles=new List { new OrganUserRole{ OrganRoleId=adminRole.Id} } } } }); db.Set().Add(new User { UserName = "organ", SecurityStamp = securityStam, PasswordHash = _encryptionService.CreatePasswordHash("123456", securityStam), PasswordConfirmed = true, Email = "organ@test.com", EmailConfirmed = true, NickName = "机构管理员", OrganUsers = new List { new OrganUser { Type= "其他", OrganId=platformOrganId, UserRoles=new List { new OrganUserRole{ OrganRoleId=organRole.Id} } } } }); db.SaveChanges(); // var set = db.Set(); set.Add(new Setting { Name = "name", Value = "物联平台", Type = SettingType.String }); 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 }); set.Add(new Setting { Name = "iosAppUrl", Value = "itms-services://?action=download-manifest&url=https://iot.edusoa.com/IoTCenter/Info.plist", Type = SettingType.String }); // var macAddress = Helper.Instance.GetMacAddress(); set.Add(new Setting { Name = "sn", Value = macAddress, Type = SettingType.String }); set.Add(new Setting { Name = "id", Value = macAddress.Md5(), Type = SettingType.String }); set.Add(new Setting { Name = "code", Value = "根据id生成的授权码", Type = SettingType.String }); set.Add(new Setting { Name = "delay", Value = "500", Type = SettingType.String }); db.SaveChanges(); // set.Add(new Setting { Name = "AccessTokenTimeout", Value = "1440", Type = SettingType.String }); set.Add(new Setting { Name = "RefreshTokenTimeout", Value = "518400", Type = SettingType.String }); set.Add(new Setting { Name = "MaxFailedAccessAttemptsBeforeLockout", Value = "5", Type = SettingType.String }); set.Add(new Setting { Name = "DefaultAccountLockoutMinutes", Value = "10", Type = SettingType.String }); set.Add(new Setting { Name = "CaptchaSeconds", Value = "60", Type = SettingType.String }); set.Add(new Setting { Name = "RegisterDisabled", Value = "false", Type = SettingType.String }); // set.Add(new Setting { Name = "email:host", Value = "nbaxp.com", Type = SettingType.String }); set.Add(new Setting { Name = "email:port", Value = "25", Type = SettingType.String }); set.Add(new Setting { Name = "email:user", Value = "admin@nbaxp.com", Type = SettingType.String }); set.Add(new Setting { Name = "email:password", Value = "123456", Type = SettingType.String }); set.Add(new Setting { Name = "sms", Value = "false", Type = SettingType.String }); set.Add(new Setting { Name = "sms:url", Value = "https://api.netease.im/sms/sendcode.action", Type = SettingType.String }); set.Add(new Setting { Name = "sms:key", Value = "123456", Type = SettingType.String }); set.Add(new Setting { Name = "sms:secret", Value = "123456", Type = SettingType.String }); db.SaveChanges(); } } }