You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
iot/projects/Platform/DbConfig.cs

484 lines
26 KiB

using Infrastructure.Application.Entites.Settings;
using Infrastructure.Data;
using Infrastructure.Domain;
using Infrastructure.Extensions;
using Infrastructure.Security;
using IoT.Shared;
using IoT.Shared.Application.Domain.Entities;
using Microsoft.EntityFrameworkCore;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
namespace Platform
{
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)
{
IoTSharedDbConfig.OnModelCreating(modelBuilder);
//Admin
//User
modelBuilder.Entity<User>().Property(o => o.UserName).IsRequired();
modelBuilder.Entity<User>().HasIndex(o => o.UserName).IsUnique();
modelBuilder.Entity<User>().HasIndex(o => o.Email).IsUnique();
modelBuilder.Entity<User>().HasIndex(o => o.PhoneNumber).IsUnique();
//OrganRole
modelBuilder.Entity<OrganRole>().Property(o => o.Name).IsRequired();
modelBuilder.Entity<OrganRole>().Property(o => o.Number).IsRequired();
modelBuilder.Entity<OrganRole>().HasIndex(o => new { o.OrganId, o.Number }).IsUnique();
modelBuilder.Entity<OrganRole>().HasOne(o => o.Organ).WithMany(o => o.Roles).HasForeignKey(o => o.OrganId).OnDelete(DeleteBehavior.Cascade);
//Permission
modelBuilder.Entity<Permission>().Property(o => o.Name).IsRequired();
modelBuilder.Entity<Permission>().Property(o => o.Number).IsRequired();
modelBuilder.Entity<Permission>().HasIndex(o => o.Number).IsUnique();
modelBuilder.Entity<Permission>().HasOne(o => o.Category).WithMany(o => o.Permissions).HasForeignKey(o => o.CategoryId).OnDelete(DeleteBehavior.SetNull);
//OrganUserRole
modelBuilder.Entity<OrganUserRole>().HasOne(o => o.OrganUser).WithMany(o => o.UserRoles).HasForeignKey(o => o.OrganUserId);
modelBuilder.Entity<OrganUserRole>().HasOne(o => o.OrganRole).WithMany(o => o.UserRoles).HasForeignKey(o => o.OrganRoleId);
modelBuilder.Entity<OrganUserRole>().HasIndex(o => new { o.OrganUserId, o.OrganRoleId }).IsUnique();
//OrganRolePermission
modelBuilder.Entity<OrganRolePermission>().HasOne(o => o.Role).WithMany(o => o.RolePermissions).HasForeignKey(o => o.RoleId);
modelBuilder.Entity<OrganRolePermission>().HasOne(o => o.Permission).WithMany(o => o.RolePermissions).HasForeignKey(o => o.PermissionId);
modelBuilder.Entity<OrganRolePermission>().HasIndex(o => new { o.RoleId, o.PermissionId }).IsUnique();
//Site
modelBuilder.Entity<Site>().Property(o => o.Name).IsRequired();
modelBuilder.Entity<Site>().HasIndex(o => o.Name).IsUnique();
//Area
modelBuilder.Entity<Area>().HasIndex(o => o.Number).IsUnique();
//Organ
modelBuilder.Entity<Organ>().HasIndex(o => o.Name).IsUnique();
modelBuilder.Entity<Organ>().HasIndex(o => o.Number).IsUnique();
modelBuilder.Entity<Organ>().HasOne(o => o.Area).WithMany(o => o.Organs).HasForeignKey(o => o.AreaId).OnDelete(DeleteBehavior.SetNull);
//Building
modelBuilder.Entity<Building>().Property(o => o.OrganId).IsRequired();
modelBuilder.Entity<Building>().HasIndex(o => new { o.OrganId, o.ParentId, o.Number }).IsUnique();
modelBuilder.Entity<Building>().HasOne(o => o.Organ).WithMany(o => o.Buildings).HasForeignKey(o => o.OrganId);
//OrganUser
modelBuilder.Entity<OrganUser>().HasOne(o => o.Organ).WithMany(o => o.OrganUsers).HasForeignKey(o => o.OrganId);
modelBuilder.Entity<OrganUser>().HasOne(o => o.User).WithMany(o => o.OrganUsers).HasForeignKey(o => o.UserId);
modelBuilder.Entity<OrganUser>().HasIndex(o => new { o.OrganId, o.UserId }).IsUnique();
//Department
modelBuilder.Entity<Department>().HasIndex(o => new { o.OrganId, o.Number }).IsUnique();
//IoTCenter
//IoTProductCategory
modelBuilder.Entity<IoTProductCategory>().HasIndex(o => o.Number).IsUnique();
//IoTProductCategoryIoTProduct
modelBuilder.Entity<IoTProductCategoryIoTProduct>().HasOne(o => o.Category).WithMany(o => o.CategoryProducts).HasForeignKey(o => o.CategoryId);
modelBuilder.Entity<IoTProductCategoryIoTProduct>().HasOne(o => o.Product).WithMany().HasForeignKey(o => o.ProductId);
modelBuilder.Entity<IoTProductCategoryIoTProduct>().HasIndex(o => o.ProductId).IsUnique();//通过唯一约束,保证一个商品只有一个分类
//IoTCommand
modelBuilder.Entity<IoTCommand>().HasOne(o => o.Api).WithMany().HasForeignKey(o => o.ApiId);
//OrganIoTScene
modelBuilder.Entity<OrganIoTScene>().HasOne(o => o.Organ).WithMany(o => o.OrganScenes).HasForeignKey(o => o.OrganId);
//OrganIoTSceneIoTCommand
modelBuilder.Entity<OrganIoTSceneIoTCommand>().HasOne(o => o.OrganScene).WithMany(o => o.OrganSceneCommands).HasForeignKey(o => o.OrganSceneId);
modelBuilder.Entity<OrganIoTSceneIoTCommand>().HasOne(o => o.Command).WithMany().HasForeignKey(o => o.CommandId);
//OrganIoTSceneTimer
modelBuilder.Entity<OrganIoTSceneTimer>().HasOne(o => o.OrganScene).WithMany(o => o.OrganSceneTimers).HasForeignKey(o => o.OrganSceneId);
//OrganIoTSceneTigger
modelBuilder.Entity<OrganIoTSceneTigger>().HasOne(o => o.OrganScene).WithMany(o => o.OrganSceneTiggers).HasForeignKey(o => o.OrganSceneId);
modelBuilder.Entity<OrganIoTSceneTigger>().HasOne(o => o.Data).WithMany().HasForeignKey(o => o.DataId);
//BuildingIoTGateway
modelBuilder.Entity<BuildingIoTGateway>().HasOne(o => o.Building).WithMany(o => o.BuildingIoTGateways).HasForeignKey(o => o.BuildingId);
modelBuilder.Entity<BuildingIoTGateway>().HasOne(o => o.IoTGateway).WithMany().HasForeignKey(o => o.IoTGatewayId);
modelBuilder.Entity<BuildingIoTGateway>().HasIndex(o => o.IoTGatewayId).IsUnique();
//LiveRecord
modelBuilder.Entity<LiveRecord>().Property(o => o.DeviceNumber).IsRequired();
}
public void Seed(DbContext db)
{
var root = db.Set<IoTProductCategory>().Add(new IoTProductCategory
{
Name = "产品分类",
Number = "root"
}).Entity;
db.Set<IoTProductCategory>().Add(new IoTProductCategory { ParentId = root.Id, Number = "00", Name = "网关", Image = "/images/gateway.svg" });
db.Set<IoTProductCategory>().Add(new IoTProductCategory { ParentId = root.Id, Number = "10", Name = "安防", Image = "/images/safe.svg" });
db.Set<IoTProductCategory>().Add(new IoTProductCategory { ParentId = root.Id, Number = "20", Name = "电器", Image = "/images/socket.svg" });
db.Set<IoTProductCategory>().Add(new IoTProductCategory { ParentId = root.Id, Number = "30", Name = "照明", Image = "/images/light.svg" });
db.Set<IoTProductCategory>().Add(new IoTProductCategory { ParentId = root.Id, Number = "40", Name = "监测", Image = "/images/monitor.svg" });
db.SaveChanges();
db.Set<IoTProductCategory>().FirstOrDefault(o => o.Number == "root").Update();
db.SaveChanges();
var permissionCategoryRoot = new PermissionCategory
{
Name = "权限分类",
Number = "root"
};
db.Set<PermissionCategory>().Add(permissionCategoryRoot);
db.SaveChanges();
foreach (var item in db.Model.GetEntityTypes())
{
var group = item.ClrType.GetCustomAttribute<GroupAttribute>();
var categoryGroup = db.Set<PermissionCategory>().FirstOrDefault(o => o.Number == group.Number);
if (categoryGroup == null)
{
categoryGroup = db.Set<PermissionCategory>().Add(new PermissionCategory
{
Parent = permissionCategoryRoot,
Name = group.Name,
Number = group.Number
}).Entity;
db.Set<PermissionCategory>().Add(categoryGroup);
db.SaveChanges();
}
var type = item.ClrType;
var name = type.GetDisplayName();
var number = type.Name;
var category = new PermissionCategory
{
Parent = categoryGroup,
Name = name,
Number = number
};
var scopeAttribute = type.GetCustomAttribute<ScopeAttribute>();
if (scopeAttribute != null)
{
var scope = scopeAttribute.Scope;
//平台权限
if (scope.HasFlag(ScopeType.PlatformRead))
{
category.Permissions.Add(new Permission { IsReadOnly = true, Type = PermissionType.Platform, Name = $"查看平台{name}", Number = $"Read-Platform-{number}" });
}
if (scope.HasFlag(ScopeType.PlatformAdd))
{
category.Permissions.Add(new Permission { IsReadOnly = true, Type = PermissionType.Platform, Name = $"添加平台{name}", Number = $"Add-Platform-{number}" });
}
if (scope.HasFlag(ScopeType.PlatformEdit))
{
category.Permissions.Add(new Permission { IsReadOnly = true, Type = PermissionType.Platform, Name = $"修改平台{name}", Number = $"Edit-Platform-{number}" });
}
if (scope.HasFlag(ScopeType.PlatformDelete))
{
category.Permissions.Add(new Permission { IsReadOnly = true, Type = PermissionType.Platform, Name = $"删除平台{name}", Number = $"Delete-Platform-{number}" });
}
//机构权限
if (scope.HasFlag(ScopeType.OrganRead))
{
category.Permissions.Add(new Permission { IsReadOnly = true, Type = PermissionType.Organ, Name = $"查看机构{name}", Number = $"Read-Organ-{number}" });
}
if (scope.HasFlag(ScopeType.OrganAdd))
{
category.Permissions.Add(new Permission { IsReadOnly = true, Type = PermissionType.Organ, Name = $"添加机构{name}", Number = $"Add-Organ-{number}" });
}
if (scope.HasFlag(ScopeType.OrganEdit))
{
category.Permissions.Add(new Permission { IsReadOnly = true, Type = PermissionType.Organ, Name = $"修改机构{name}", Number = $"Edit-Organ-{number}" });
}
if (scope.HasFlag(ScopeType.OrganDelete))
{
category.Permissions.Add(new Permission { IsReadOnly = true, Type = PermissionType.Organ, Name = $"删除机构{name}", Number = $"Delete-Organ-{number}" });
}
//个人权限
if (scope.HasFlag(ScopeType.UserRead))
{
category.Permissions.Add(new Permission { IsReadOnly = true, Type = PermissionType.User, Name = $"查看个人{name}", Number = $"Read-User-{number}" });
}
if (scope.HasFlag(ScopeType.UserAdd))
{
category.Permissions.Add(new Permission { IsReadOnly = true, Type = PermissionType.User, Name = $"添加个人{name}", Number = $"Add-User-{number}" });
}
if (scope.HasFlag(ScopeType.UserEdit))
{
category.Permissions.Add(new Permission { IsReadOnly = true, Type = PermissionType.User, Name = $"修改个人{name}", Number = $"Edit-User-{number}" });
}
if (scope.HasFlag(ScopeType.UserDelete))
{
category.Permissions.Add(new Permission { IsReadOnly = true, Type = PermissionType.User, Name = $"删除个人{name}", Number = $"Delete-User-{number}" });
}
}
db.Set<PermissionCategory>().Add(category);
db.SaveChanges();
}
db.Set<PermissionCategory>().FirstOrDefault(o => o.Number == "root").Update();
db.SaveChanges();
//初始化区域
var areaRoot = new Area
{
Name = "区域",
Number = "root",
Children = new List<Area> {
new Area{
Type = AreaType.Province,
Name="吉林省",
Number="Jilin",
Children = new List<Area>
{
new Area{
Type= AreaType.City,
Name="长春市",
Number="changchun",
Children = new List<Area>
{
new Area
{
Type= AreaType.Township,
Name="南关区",
Number="nanguan"
}
}
}
}
}
}
};
db.Set<Area>().Add(areaRoot);
db.SaveChanges();
//初始化机构
var organRoot = new Organ
{
Name = "机构",
Number = "root",
Children = new List<Organ>
{
new Organ
{
Area = db.Set<Area>().FirstOrDefault(o => o.Number == "changchun"),
Type= OrganType.Type5,
IsReadOnly=true,
Name="默认教育局",
Number="jiaoyuju",
Children = new List<Organ>
{
new Organ
{
Area = db.Set<Area>().FirstOrDefault(o => o.Number == "nanguan"),
Type= OrganType.Type5,
Name="默认学校",
Number="xuexiao"
},
new Organ
{
Area = db.Set<Area>().FirstOrDefault(o => o.Number == "nanguan"),
Type= OrganType.Type1,
Name="其他学校",
Number="qitaxuexiao"
}
}
}
}
};
db.Set<Organ>().Add(organRoot);
db.SaveChanges();
//初始化建筑
var organId = db.Set<Organ>().FirstOrDefault(o => o.Number == "xuexiao").Id;
var buildingRoot = new Building
{
Name = "建筑",
Number = "root",
OrganId = organRoot.Id,
Children = new List<Building>
{
new Building
{
OrganId=organId,
Type= BuildingType.Building,
Name="默认建筑",
Number="1",
Children = new List<Building> {
new Building {
OrganId=organId,
Type= BuildingType.Layer,
Name="1楼",
Number="11",
Children=new List<Building>
{
new Building{
OrganId=organId,
Type= BuildingType.Room,
Name="101室",
Number="101"
},
new Building{
OrganId=organId,
Type= BuildingType.Room,
Name="102室",
Number="102"
}
}
},
new Building {
OrganId=organId,
Type= BuildingType.Layer,
Name="2楼",
Number="12",
Children=new List<Building>
{
new Building{
OrganId=organId,
Type= BuildingType.Room,
Name="201室",
Number="201"
},
new Building{
OrganId=organId,
Type= BuildingType.Room,
Name="202室",
Number="202"
}
}
}
}
}
}
};
db.Set<Building>().Add(buildingRoot);
db.SaveChanges();
//更新Left和Right编号
db.Set<Area>().FirstOrDefault(o => o.Number == "root").Update();
db.Set<Organ>().FirstOrDefault(o => o.Number == "root").Update();
db.Set<Building>().FirstOrDefault(o => o.Number == "root").Update();
db.SaveChanges();
var defaultOrganId = db.Set<Organ>().FirstOrDefault(o => o.IsReadOnly).Id;
var superRole = new OrganRole { OrganId = defaultOrganId,Number="super", Name = "超级管理员", IsReadOnly = true };
var adminRole = new OrganRole { OrganId = defaultOrganId, Number = "admin", Name = "管理员" };
var organRole = new OrganRole { OrganId = defaultOrganId, Number = "organ", Name = "机构管理员" };
//初始化角色
var skips = new string[] {
//"添加Api", "修改Api", "添加分类", "修改分类", "添加参数", "修改参数", "添加产品", "修改产品", "添加节点", "添加权限", "修改权限", "添加权限分类", "修改权限分类", "添加设备"
};
foreach (var item in db.Set<Permission>())
{
superRole.RolePermissions.Add(new OrganRolePermission { IsReadOnly = true, Permission = item });
if (!item.Name.Contains("删除") && !skips.Contains(item.Name))
{
adminRole.RolePermissions.Add(new OrganRolePermission { Permission = item });
if (item.Type == PermissionType.Organ)
{
organRole.RolePermissions.Add(new OrganRolePermission { Permission = item });
}
}
}
db.Set<OrganRole>().AddRange(superRole, adminRole, organRole);
db.SaveChanges();
var securityStam = "123456";
db.Set<User>().Add(new User
{
UserName = "super",
SecurityStamp = securityStam,
PasswordHash = _encryptionService.CreatePasswordHash("123456", securityStam),
PasswordConfirmed = true,
Email = "super@test.com",
EmailConfirmed = true,
NickName = "超级管理员",
OrganUsers = new List<OrganUser> {
new OrganUser {
IsReadOnly=true,
Type= OrganUserType.Type1,
OrganId=defaultOrganId,
UserRoles=new List<OrganUserRole>
{
new OrganUserRole{
IsReadOnly=true,
OrganRoleId=superRole.Id
}
}
},
new OrganUser
{
Type= OrganUserType.Type1,
OrganId=db.Set<Organ>().FirstOrDefault(o=>o.Name=="默认学校").Id,
}
}
});
db.Set<User>().Add(new User
{
UserName = "admin",
SecurityStamp = securityStam,
PasswordHash = _encryptionService.CreatePasswordHash("123456", securityStam),
PasswordConfirmed = true,
Email = "admin@test.com",
EmailConfirmed = true,
NickName = "管理员",
OrganUsers = new List<OrganUser> {
new OrganUser {
Type= OrganUserType.Type1,
OrganId=defaultOrganId,
UserRoles=new List<OrganUserRole>
{
new OrganUserRole{ OrganRoleId=adminRole.Id}
}
}
}
});
db.Set<User>().Add(new User
{
UserName = "organ",
SecurityStamp = securityStam,
PasswordHash = _encryptionService.CreatePasswordHash("123456", securityStam),
PasswordConfirmed = true,
Email = "organ@test.com",
EmailConfirmed = true,
NickName = "机构管理员",
OrganUsers = new List<OrganUser> {
new OrganUser {
Type= OrganUserType.Type1,
OrganId=defaultOrganId,
UserRoles=new List<OrganUserRole>
{
new OrganUserRole{ OrganRoleId=organRole.Id}
}
}
}
});
db.SaveChanges();
//
var set = db.Set<Setting>();
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();
}
}
}