Former-commit-id: 5b06613547d2024bce5127ab009d9758e9e00a50
TangShanKaiPing
wanggang 6 years ago
parent 9700e86f6b
commit d24ac9c9e8

@ -122,7 +122,7 @@ namespace Infrastructure.Web
{ {
options.PayloadSerializerSettings.ContractResolver = options.PayloadSerializerSettings.ContractResolver =
new DefaultContractResolver(); new DefaultContractResolver();
}); ; });
services.AddMemoryCache(); services.AddMemoryCache();
services.AddHttpContextAccessor(); services.AddHttpContextAccessor();
services.AddSingleton<ITicketStore, DistributedCacheTicketStore>(); services.AddSingleton<ITicketStore, DistributedCacheTicketStore>();

@ -19,7 +19,7 @@ namespace IoT.UI.Shard.Controllers
{ {
[Authorize] [Authorize]
[ApiExplorerSettings(IgnoreApi = true)] [ApiExplorerSettings(IgnoreApi = true)]
public class AccountController : BaseController public class BaseAccountController : BaseController
{ {
private readonly IConfiguration _configuration; private readonly IConfiguration _configuration;
private readonly IRepository<User> _userRepo; private readonly IRepository<User> _userRepo;
@ -27,7 +27,7 @@ namespace IoT.UI.Shard.Controllers
private readonly IEncryptionService _encryptionService; private readonly IEncryptionService _encryptionService;
private readonly IEmailSender _emailSender; private readonly IEmailSender _emailSender;
public AccountController(IConfiguration configuration, public BaseAccountController(IConfiguration configuration,
IRepository<User> userRepo, IRepository<User> userRepo,
IEncryptionService encryptionService, IEncryptionService encryptionService,
IStringLocalizer<Resource> localizer, IStringLocalizer<Resource> localizer,

@ -0,0 +1,22 @@
using Application.Domain.Entities;
using Infrastructure.Data;
using Infrastructure.Email;
using Infrastructure.Resources;
using Infrastructure.Security;
using IoT.UI.Shard.Controllers;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Localization;
namespace FBeeService.Controllers
{
public class AccountController : BaseAccountController
{
public AccountController(IConfiguration configuration,
IRepository<User> userRepo,
IEncryptionService encryptionService,
IStringLocalizer<Resource> localizer,
IEmailSender emaliSender) : base(configuration, userRepo, encryptionService, localizer, emaliSender)
{
}
}
}

@ -1,8 +1,6 @@
using Application.Domain.Entities;
using IoT.UI.Shard; using IoT.UI.Shard;
using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Hosting;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
@ -26,10 +24,5 @@ namespace FBeeService
base.Configure(app, env, loggerFactory); base.Configure(app, env, loggerFactory);
app.ApplicationServices.GetService<DeviceService>().Start(); app.ApplicationServices.GetService<DeviceService>().Start();
} }
public override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
}
} }
} }

@ -24,8 +24,8 @@
<td>@Html.DisplayFor(o => item.Enable)</td> <td>@Html.DisplayFor(o => item.Enable)</td>
<td>@item.UserName</td> <td>@item.UserName</td>
<td>@item.Password</td> <td>@item.Password</td>
<td><a class="btn btn-primary cmd" href="/api/x9d?sn=@item.Number">查询网关信息</a></td> <td><a class="btn btn-primary cmd" href="/Gateway/X9d?gateway=@item.Number">查询网关信息</a></td>
<td><a class="btn btn-primary cmd" href="/api/x81?sn=@item.Number">查询网关设备</a></td> <td><a class="btn btn-primary cmd" href="/Gateway/X81?gateway=@item.Number">查询网关设备</a></td>
<td><a href="/Home/Gateway?sn=@item.Number">查看设备</a></td> <td><a href="/Home/Gateway?sn=@item.Number">查看设备</a></td>
</tr> </tr>
} }

@ -1,19 +0,0 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using Infrastructure.Domain;
namespace Application.Domain.Entities
{
[Display(Name = "权限")]
public class Permission : BaseEntity, IDisableUpdate, IDisableDelete
{
public string Name { get; set; }
public string Number { get; set; }
public Guid? CategoryId { get; set; }
public PermissionCategory Category { get; set; } = new PermissionCategory();
public List<RolePermission> RolePermissions { get; set; } = new List<RolePermission>();
}
}

@ -1,12 +0,0 @@
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using Infrastructure.Domain;
namespace Application.Domain.Entities
{
[Display(Name = "权限分类")]
public class PermissionCategory : BaseTreeEntity<PermissionCategory>
{
public List<Permission> Permissions { get; set; } = new List<Permission>();
}
}

@ -1,14 +0,0 @@
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using Infrastructure.Domain;
namespace Application.Domain.Entities
{
[Display(Name = "角色")]
public class Role : BaseEntity
{
public string Name { get; set; }
public List<UserRole> UserRoles { get; set; } = new List<UserRole>();
public List<RolePermission> RolePermissions { get; set; } = new List<RolePermission>();
}
}

@ -1,15 +0,0 @@
using System;
using System.ComponentModel.DataAnnotations;
using Infrastructure.Domain;
namespace Application.Domain.Entities
{
[Display(Name = "角色权限")]
public class RolePermission : BaseEntity
{
public Guid RoleId { get; set; }
public Guid PermissionId { get; set; }
public Role Role { get; set; }
public Permission Permission { get; set; }
}
}

@ -1,14 +0,0 @@
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using Infrastructure.Domain;
namespace Application.Domain.Entities
{
[Display(Name = "用户")]
public class User : BaseEntity, IDisableDelete
{
public string UserName { get; set; }
public List<UserRole> UserRoles { get; set; } = new List<UserRole>();
}
}

@ -1,15 +0,0 @@
using System;
using System.ComponentModel.DataAnnotations;
using Infrastructure.Domain;
namespace Application.Domain.Entities
{
[Display(Name = "用户角色")]
public class UserRole : BaseEntity
{
public Guid UserId { get; set; }
public Guid RoleId { get; set; }
public User User { get; set; }
public Role Role { get; set; }
}
}

@ -1,18 +0,0 @@
using System.ComponentModel.DataAnnotations;
using Infrastructure.Application;
namespace Application.Models
{
[Display(Name = "权限")]
public class EditPermissionModel : EditModel
{
[Display(Name = "分类")]
public string CategoryName { get; set; }
[Display(Name = "名称"), Required]
public string Name { get; set; }
[Display(Name = "编号"), Required]
public string Number { get; set; }
}
}

@ -1,18 +0,0 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using Infrastructure.Application;
namespace Application.Models
{
[Display(Name = "角色")]
public class EditRoleModel : EditModel
{
[Display(Name = "名称"), Required]
public string Name { get; set; }
[DataType("MultiSelectList")]
[Display(Name = "权限")]
public List<Guid> Permissions { get; set; } = new List<Guid>();
}
}

@ -1,56 +0,0 @@
using System.ComponentModel.DataAnnotations;
using Infrastructure.Application;
namespace Application.Models
{
[Display(Name = "配置")]
public class EditSettingModel : EditModel
{
[Display(Name = "名称", Order = 10)]
[Required(ErrorMessage = nameof(RequiredAttribute))]
public string Name { get; set; }
[Display(Name = "Logo", Order = 20)]
[Required(ErrorMessage = nameof(RequiredAttribute))]
[DataType(DataType.ImageUrl)]
public string Logo { get; set; }
[Display(Name = "版权", Order = 30)]
[Required(ErrorMessage = nameof(RequiredAttribute))]
[DataType(DataType.Html)]
public string Copyright { get; set; }
[Display(Name = "版本", Order = 40)]
[Required(ErrorMessage = nameof(RequiredAttribute))]
public string Version { get; set; }
[Display(Name = "密码错误次数", Order = 50)]
[Required(ErrorMessage = nameof(RequiredAttribute))]
public int MaxFailedAccessAttemptsBeforeLockout { get; set; }
[Display(Name = "账户锁定时间", Order = 60)]
[Required(ErrorMessage = nameof(RequiredAttribute))]
public int DefaultAccountLockoutMinutes { get; set; }
[Display(Name = "验证间隔时间", Order = 70)]
[Required(ErrorMessage = nameof(RequiredAttribute))]
public int CaptchaSeconds { get; set; }
[Display(Name = "邮件服务器", Order = 100)]
public string EmailHost { get; set; }
[Display(Name = "端口号", Order = 110)]
[RegularExpression(@"\d+")]
public int EmailPort { get; set; }
[Display(Name = "用户名", Order = 120)]
public string EmailUser { get; set; }
[Display(Name = "密码", Order = 130)]
[DataType(DataType.Password)]
public string EmailPassword { get; set; }
[Display(Name = "关闭注册", Order = 130)]
public bool RegisterDisabled { get; set; }
}
}

@ -1,21 +0,0 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using Infrastructure.Application;
namespace Application.Models
{
[Display(Name = "用户")]
public class EditUserModel : EditModel
{
[Required(ErrorMessage = nameof(RequiredAttribute))]
[RegularExpression("^[a-zA-Z0-9]+$", ErrorMessage = "")]
[StringLength(30, MinimumLength = 5, ErrorMessage = "用户名长度为5-30")]
[Display(Name = "用户名")]
public string UserName { get; set; }
[DataType("MultiSelectList")]
[Display(Name = "角色")]
public List<Guid> Roles { get; set; } = new List<Guid>();
}
}

@ -1,33 +1,33 @@
using System.Linq; //using System.Linq;
using Application.Domain.Entities; //using Application.Domain.Entities;
using Application.Models; //using Application.Models;
using Infrastructure.Data; //using Infrastructure.Data;
using Infrastructure.Extensions; //using Infrastructure.Extensions;
using Infrastructure.Web.Mvc; //using Infrastructure.Web.Mvc;
using IoTShared.Controllers; //using IoTShared.Controllers;
using Microsoft.AspNetCore.Authorization; //using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc; //using Microsoft.AspNetCore.Mvc;
namespace IoTCenter.Areas.Admin.Controllers //namespace IoTCenter.Areas.Admin.Controllers
{ //{
[Authorize] // [Authorize]
[Area(nameof(Admin))] // [Area(nameof(Admin))]
public class ApiController : CrudController<Api, ApiSearchModel, EditApiModel, EditApiModel> // public class ApiController : CrudController<Api, ApiSearchModel, EditApiModel, EditApiModel>
{ // {
private readonly AjaxController _ajax; // private readonly AjaxController _ajax;
public ApiController(IRepository<Api> repo, AjaxController ajax) : base(repo) // public ApiController(IRepository<Api> repo, AjaxController ajax) : base(repo)
{ // {
this._ajax = ajax; // this._ajax = ajax;
} // }
public override IQueryable<Api> Query(ApiSearchModel model, IQueryable<Api> query) // public override IQueryable<Api> Query(ApiSearchModel model, IQueryable<Api> query)
{ // {
ViewData.SelectList(o => model.NodeId, () => this._ajax.GetNodeSelectList(model.NodeId)); // ViewData.SelectList(o => model.NodeId, () => this._ajax.GetNodeSelectList(model.NodeId));
ViewData.SelectList(o => model.DeviceId, () => this._ajax.GetDeviceSelectList(model.NodeId.Value, model.DeviceId), model.NodeId.HasValue); // ViewData.SelectList(o => model.DeviceId, () => this._ajax.GetDeviceSelectList(model.NodeId.Value, model.DeviceId), model.NodeId.HasValue);
return query.WhereIf(model.NodeId.HasValue, o => o.Device.NodeId == model.NodeId.Value) // return query.WhereIf(model.NodeId.HasValue, o => o.Device.NodeId == model.NodeId.Value)
.WhereIf(model.DeviceId.HasValue, o => o.DeviceId == model.DeviceId.Value) // .WhereIf(model.DeviceId.HasValue, o => o.DeviceId == model.DeviceId.Value)
.WhereIf(!string.IsNullOrEmpty(model.Keyword), o => o.Name.Contains(model.Keyword)); // .WhereIf(!string.IsNullOrEmpty(model.Keyword), o => o.Name.Contains(model.Keyword));
} // }
} // }
} //}

@ -1,165 +1,165 @@
using System; //using System;
using System.Collections.Generic; //using System.Collections.Generic;
using System.Linq; //using System.Linq;
using Application.Domain.Entities; //using Application.Domain.Entities;
using Application.Models; //using Application.Models;
using Application.Services; //using Application.Services;
using Infrastructure.Application; //using Infrastructure.Application;
using Infrastructure.Data; //using Infrastructure.Data;
using Infrastructure.Extensions; //using Infrastructure.Extensions;
using Infrastructure.Web.Mvc; //using Infrastructure.Web.Mvc;
using IoTShared; //using IoTShared;
using IoTShared.Controllers; //using IoTShared.Controllers;
using Microsoft.AspNetCore.Authorization; //using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc; //using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Rendering; //using Microsoft.AspNetCore.Mvc.Rendering;
using Microsoft.AspNetCore.SignalR; //using Microsoft.AspNetCore.SignalR;
using Microsoft.EntityFrameworkCore; //using Microsoft.EntityFrameworkCore;
namespace IoTCenter.Areas.Admin.Controllers //namespace IoTCenter.Areas.Admin.Controllers
{ //{
[Authorize] // [Authorize]
[Area(nameof(Admin))] // [Area(nameof(Admin))]
public class CommandController : CrudController<Command, PagedListModel<DisplayCommandModel>, DisplayCommandModel, EditCommandModel> // public class CommandController : CrudController<Command, PagedListModel<DisplayCommandModel>, DisplayCommandModel, EditCommandModel>
{ // {
private readonly IRepository<Node> _nodeRepo; // private readonly IRepository<Node> _nodeRepo;
private readonly IRepository<Sence> _senceRepo; // private readonly IRepository<Sence> _senceRepo;
private readonly IRepository<Api> _apiRepo; // private readonly IRepository<Api> _apiRepo;
private readonly IRepository<Command> _repo; // private readonly IRepository<Command> _repo;
private readonly AjaxController _ajax; // private readonly AjaxController _ajax;
private readonly IHubContext<PageHub> _pageHubContext; // private readonly IHubContext<PageHub> _pageHubContext;
public CommandController(IRepository<Node> nodeRepo, IRepository<Sence> senceRepo, IRepository<Api> apiRepo, IRepository<Command> repo, AjaxController ajax, IHubContext<PageHub> pageHubContext) : base(repo) // public CommandController(IRepository<Node> nodeRepo, IRepository<Sence> senceRepo, IRepository<Api> apiRepo, IRepository<Command> repo, AjaxController ajax, IHubContext<PageHub> pageHubContext) : base(repo)
{ // {
this._repo = repo; // this._repo = repo;
this._nodeRepo = nodeRepo; // this._nodeRepo = nodeRepo;
this._senceRepo = senceRepo; // this._senceRepo = senceRepo;
this._apiRepo = apiRepo; // this._apiRepo = apiRepo;
this._ajax = ajax; // this._ajax = ajax;
this._pageHubContext = pageHubContext; // this._pageHubContext = pageHubContext;
} // }
public override IActionResult Add(EditCommandModel model) // public override IActionResult Add(EditCommandModel model)
{ // {
if (ModelState.IsValid) // if (ModelState.IsValid)
{ // {
var number = this._nodeRepo.ReadOnlyTable().FirstOrDefault(o => o.Id == model.NodeId).Number; // var number = this._nodeRepo.ReadOnlyTable().FirstOrDefault(o => o.Id == model.NodeId).Number;
this._pageHubContext.Clients.Group(number).SendAsync(nameof(INodeService.CreateCommand), model); // this._pageHubContext.Clients.Group(number).SendAsync(nameof(INodeService.CreateCommand), model);
return RedirectTo(); // return RedirectTo();
} // }
ModelState.AddModelError("", "服务器出现异常,请稍后重试"); // ModelState.AddModelError("", "服务器出现异常,请稍后重试");
return View(model); // return View(model);
} // }
public override IActionResult Edit(EditCommandModel model) // public override IActionResult Edit(EditCommandModel model)
{ // {
if (ModelState.IsValid) // if (ModelState.IsValid)
{ // {
var entity = this._repo.Table().FirstOrDefault(o => o.Id == model.Id); // var entity = this._repo.Table().FirstOrDefault(o => o.Id == model.Id);
var number = this._nodeRepo.ReadOnlyTable().FirstOrDefault(o => o.Id == model.NodeId).Number; // var number = this._nodeRepo.ReadOnlyTable().FirstOrDefault(o => o.Id == model.NodeId).Number;
this._pageHubContext.Clients.Group(number).SendAsync(nameof(INodeService.EditCommand), model); // this._pageHubContext.Clients.Group(number).SendAsync(nameof(INodeService.EditCommand), model);
return RedirectTo(); // return RedirectTo();
} // }
ModelState.AddModelError("", "服务器出现异常,请稍后重试"); // ModelState.AddModelError("", "服务器出现异常,请稍后重试");
return View(model); // return View(model);
} // }
public override IActionResult Delete(List<Guid> list) // public override IActionResult Delete(List<Guid> list)
{ // {
foreach (var id in list) // foreach (var id in list)
{ // {
try // try
{ // {
var entity = this._repo.Table().FirstOrDefault(o => o.Id == id); // var entity = this._repo.Table().FirstOrDefault(o => o.Id == id);
var number = this._nodeRepo.ReadOnlyTable().FirstOrDefault(o => o.Sences.Any(s => s.Id == entity.SenceId)).Number; // var number = this._nodeRepo.ReadOnlyTable().FirstOrDefault(o => o.Sences.Any(s => s.Id == entity.SenceId)).Number;
this._pageHubContext.Clients.Group(number).SendAsync(nameof(INodeService.DeleteCommand), id); // this._pageHubContext.Clients.Group(number).SendAsync(nameof(INodeService.DeleteCommand), id);
} // }
catch (Exception ex) // catch (Exception ex)
{ // {
ex.PrintStack(); // ex.PrintStack();
return RedirectTo(message: ex.Message); // return RedirectTo(message: ex.Message);
} // }
} // }
return RedirectTo(); // return RedirectTo();
} // }
public IActionResult Api(Guid id) // public IActionResult Api(Guid id)
{ // {
var model = this.GetParameters(id, null); // var model = this.GetParameters(id, null);
return PartialView("_Api", model); // return PartialView("_Api", model);
} // }
public override IQueryable<Command> Include(IQueryable<Command> query) // public override IQueryable<Command> Include(IQueryable<Command> query)
{ // {
return query.Include(o => o.Sence).Include(o => o.Api).ThenInclude(o => o.Device).ThenInclude(o => o.Node); // return query.Include(o => o.Sence).Include(o => o.Api).ThenInclude(o => o.Device).ThenInclude(o => o.Node);
} // }
public override void ToDisplayModel(Command entity, DisplayCommandModel model) // public override void ToDisplayModel(Command entity, DisplayCommandModel model)
{ // {
model.NodeId = entity.Api.Device.Node.Name; // model.NodeId = entity.Api.Device.Node.Name;
model.DeviceId = entity.Api.Device.DisplayName; // model.DeviceId = entity.Api.Device.DisplayName;
model.ApiId = entity.Api.Name; // model.ApiId = entity.Api.Name;
model.SenceId = entity.Sence.Name; // model.SenceId = entity.Sence.Name;
} // }
public override void ToModel(Command entity, EditCommandModel model) // public override void ToModel(Command entity, EditCommandModel model)
{ // {
if (entity != null) // if (entity != null)
{ // {
model.NodeId = entity.Api.Device.NodeId; // model.NodeId = entity.Api.Device.NodeId;
model.DeviceId = entity.Api.DeviceId; // model.DeviceId = entity.Api.DeviceId;
} // }
ViewData.SelectList(o => model.NodeId, () => this._ajax.GetNodeSelectList(model.NodeId)); // ViewData.SelectList(o => model.NodeId, () => this._ajax.GetNodeSelectList(model.NodeId));
ViewData.SelectList(o => model.SenceId, () => this._ajax.GetSenceSelectList(model.NodeId.Value, model.SenceId), model.NodeId.HasValue); // ViewData.SelectList(o => model.SenceId, () => this._ajax.GetSenceSelectList(model.NodeId.Value, model.SenceId), model.NodeId.HasValue);
ViewData.SelectList(o => model.DeviceId, () => this._ajax.GetDeviceSelectList(model.NodeId.Value, model.DeviceId), model.NodeId.HasValue); // ViewData.SelectList(o => model.DeviceId, () => this._ajax.GetDeviceSelectList(model.NodeId.Value, model.DeviceId), model.NodeId.HasValue);
ViewData.SelectList(o => model.ApiId, () => this._ajax.GetApiSelectList(model.DeviceId.Value, model.ApiId), model.DeviceId.HasValue); // ViewData.SelectList(o => model.ApiId, () => this._ajax.GetApiSelectList(model.DeviceId.Value, model.ApiId), model.DeviceId.HasValue);
if (model.ApiId.HasValue) // if (model.ApiId.HasValue)
{ // {
model.Parameters = this.GetParameters(model.ApiId.Value, entity.QueryString); // model.Parameters = this.GetParameters(model.ApiId.Value, entity.QueryString);
} // }
} // }
public override void ToEntity(EditCommandModel model, Command entity) // public override void ToEntity(EditCommandModel model, Command entity)
{ // {
entity.QueryString = model.GetQueryString(); // entity.QueryString = model.GetQueryString();
} // }
private List<EditApiParameterModel> GetParameters(Guid apiId, string queryString) // private List<EditApiParameterModel> GetParameters(Guid apiId, string queryString)
{ // {
var api = this._apiRepo.ReadOnlyTable().Include(o => o.Parameters).Include(o => o.Device).ThenInclude(o => o.Data).FirstOrDefault(o => o.Id == apiId); // var api = this._apiRepo.ReadOnlyTable().Include(o => o.Parameters).Include(o => o.Device).ThenInclude(o => o.Data).FirstOrDefault(o => o.Id == apiId);
ViewData["Number"] = api.Device.Number; // ViewData["Number"] = api.Device.Number;
var parameters = api.Parameters.Select(o => o.To<EditApiParameterModel>()).ToList(); // var parameters = api.Parameters.Select(o => o.To<EditApiParameterModel>()).ToList();
if (!string.IsNullOrEmpty(queryString)) // if (!string.IsNullOrEmpty(queryString))
{ // {
foreach (var item in queryString.Split('&')) // foreach (var item in queryString.Split('&'))
{ // {
var array = item.Split('='); // var array = item.Split('=');
var name = array[0]; // var name = array[0];
var vlaue = array[1]; // var vlaue = array[1];
var param = parameters.FirstOrDefault(o => o.Name == name); // var param = parameters.FirstOrDefault(o => o.Name == name);
if (param != null) // if (param != null)
{ // {
param.Value = vlaue; // param.Value = vlaue;
} // }
} // }
} // }
if (api.Device.Name == "红外转发器") // if (api.Device.Name == "红外转发器")
{ // {
if (!api.Path.Contains("add") && !api.Path.Contains("get")) // if (!api.Path.Contains("add") && !api.Path.Contains("get"))
{ // {
foreach (var item in parameters) // foreach (var item in parameters)
{ // {
if (item.Name == "code") // if (item.Name == "code")
{ // {
var list = api.Device.Data.Where(o => o.Name != "状态").ToList() // var list = api.Device.Data.Where(o => o.Name != "状态").ToList()
.Select(o => new SelectListItem { Text = o.Name, Value = o.Value }); // .Select(o => new SelectListItem { Text = o.Name, Value = o.Value });
item.SelectList = new SelectList(list, "Value", "Text", item.Value); // item.SelectList = new SelectList(list, "Value", "Text", item.Value);
} // }
} // }
} // }
} // }
return parameters; // return parameters;
} // }
} // }
} //}

@ -1,162 +1,162 @@
using Application.Domain.Entities; //using Application.Domain.Entities;
using Application.Models; //using Application.Models;
using Application.Services; //using Application.Services;
using Infrastructure.Data; //using Infrastructure.Data;
using Infrastructure.Extensions; //using Infrastructure.Extensions;
using Infrastructure.Jwt; //using Infrastructure.Jwt;
using IoTShared; //using IoTShared;
using Microsoft.AspNetCore.Authorization; //using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc; //using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.SignalR; //using Microsoft.AspNetCore.SignalR;
using Microsoft.EntityFrameworkCore; //using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration; //using Microsoft.Extensions.Configuration;
using Newtonsoft.Json; //using Newtonsoft.Json;
using System; //using System;
using System.Collections.Generic; //using System.Collections.Generic;
using System.Linq; //using System.Linq;
using Vibrant.InfluxDB.Client; //using Vibrant.InfluxDB.Client;
using Vibrant.InfluxDB.Client.Rows; //using Vibrant.InfluxDB.Client.Rows;
namespace IoTCenter.Controllers //namespace IoTCenter.Controllers
{ //{
public class AppController : Controller // public class AppController : Controller
{ // {
private readonly IConfiguration _configuration; // private readonly IConfiguration _configuration;
private readonly IJwtHelper _jwtHelper; // private readonly IJwtHelper _jwtHelper;
private readonly IRepository<Node> _nodeRepo; // private readonly IRepository<Node> _nodeRepo;
private readonly IRepository<Device> _deviceRepo; // private readonly IRepository<Device> _deviceRepo;
private readonly IHubContext<PageHub> _pageHubContext; // private readonly IHubContext<PageHub> _pageHubContext;
public AppController(IConfiguration configuration, // public AppController(IConfiguration configuration,
IJwtHelper jwtHelper, // IJwtHelper jwtHelper,
IRepository<Node> nodeRepo, // IRepository<Node> nodeRepo,
IRepository<Device> deviceRepo, // IRepository<Device> deviceRepo,
IHubContext<PageHub> pageHubContext) // IHubContext<PageHub> pageHubContext)
{ // {
this._configuration = configuration; // this._configuration = configuration;
this._jwtHelper = jwtHelper; // this._jwtHelper = jwtHelper;
this._nodeRepo = nodeRepo; // this._nodeRepo = nodeRepo;
this._deviceRepo = deviceRepo; // this._deviceRepo = deviceRepo;
this._pageHubContext = pageHubContext; // this._pageHubContext = pageHubContext;
} // }
[Authorize] // [Authorize]
public IActionResult Index() // public IActionResult Index()
{ // {
return View(); // return View();
} // }
public IActionResult GetNodes(string token) // public IActionResult GetNodes(string token)
{ // {
var userName = this._jwtHelper.GetPayload(token)["UserName"].ToString(); // var userName = this._jwtHelper.GetPayload(token)["UserName"].ToString();
var model = this._nodeRepo.ReadOnlyTable() // var model = this._nodeRepo.ReadOnlyTable()
.Select(o => new { o.Id, o.Number, o.Name, o.DisplayOrder, Count = o.Devices.Count }) // .Select(o => new { o.Id, o.Number, o.Name, o.DisplayOrder, Count = o.Devices.Count })
.ToList(); // .ToList();
return Json(model); // return Json(model);
} // }
public IActionResult GetNode(string token, string number) // public IActionResult GetNode(string token, string number)
{ // {
var userName = this._jwtHelper.GetPayload(token)["UserName"].ToString(); // var userName = this._jwtHelper.GetPayload(token)["UserName"].ToString();
var model = this._nodeRepo.ReadOnlyTable() // var model = this._nodeRepo.ReadOnlyTable()
.Include(o => o.Sences) // .Include(o => o.Sences)
.Include(o => o.Devices).ThenInclude(o => o.Data) // .Include(o => o.Devices).ThenInclude(o => o.Data)
.FirstOrDefault(o => o.Number == number); // .FirstOrDefault(o => o.Number == number);
return Json(model, new JsonSerializerSettings { ReferenceLoopHandling = ReferenceLoopHandling.Ignore }); // return Json(model, new JsonSerializerSettings { ReferenceLoopHandling = ReferenceLoopHandling.Ignore });
} // }
public IActionResult GetDevice(string token, string number) // public IActionResult GetDevice(string token, string number)
{ // {
var userName = this._jwtHelper.GetPayload(token)["UserName"].ToString(); // var userName = this._jwtHelper.GetPayload(token)["UserName"].ToString();
var model = this._deviceRepo.ReadOnlyTable() // var model = this._deviceRepo.ReadOnlyTable()
.Include(o => o.Data) // .Include(o => o.Data)
.Include(o => o.Apis).ThenInclude(o => o.Parameters) // .Include(o => o.Apis).ThenInclude(o => o.Parameters)
.FirstOrDefault(o => o.Number == number); // .FirstOrDefault(o => o.Number == number);
return Json(model, new JsonSerializerSettings { ReferenceLoopHandling = ReferenceLoopHandling.Ignore }); // return Json(model, new JsonSerializerSettings { ReferenceLoopHandling = ReferenceLoopHandling.Ignore });
} // }
public IActionResult Exec(string connectionId, string node, string cmd, Guid id) // public IActionResult Exec(string connectionId, string node, string cmd, Guid id)
{ // {
try // try
{ // {
var query = string.Empty; // var query = string.Empty;
foreach (var item in Request.Query.Where(o => o.Key != "node" && o.Key != "cmd" && !o.Key.StartsWith("id"))) // foreach (var item in Request.Query.Where(o => o.Key != "node" && o.Key != "cmd" && !o.Key.StartsWith("id")))
{ // {
query = query.SetParam(item.Key, item.Value); // query = query.SetParam(item.Key, item.Value);
} // }
this._pageHubContext.Clients.Group(node).SendAsync(nameof(INodeService.Exec), connectionId, id, cmd, query); // this._pageHubContext.Clients.Group(node).SendAsync(nameof(INodeService.Exec), connectionId, id, cmd, query);
return Json(ApiResponse.AsyncSuccess()); // return Json(ApiResponse.AsyncSuccess());
} // }
catch (Exception ex) // catch (Exception ex)
{ // {
ex.PrintStack(); // ex.PrintStack();
return Json(ApiResponse.Error(ex)); // return Json(ApiResponse.Error(ex));
} // }
} // }
public IActionResult ExecAll(string connectionId, string node, string cmd, List<Guid> id) // public IActionResult ExecAll(string connectionId, string node, string cmd, List<Guid> id)
{ // {
try // try
{ // {
var query = string.Empty; // var query = string.Empty;
foreach (var item in Request.Query.Where(o => o.Key != "node" && o.Key != "cmd" && !o.Key.StartsWith("id["))) // foreach (var item in Request.Query.Where(o => o.Key != "node" && o.Key != "cmd" && !o.Key.StartsWith("id[")))
{ // {
query = query.SetParam(item.Key, item.Value); // query = query.SetParam(item.Key, item.Value);
} // }
this._pageHubContext.Clients.Group(node).SendAsync(nameof(INodeService.ExecAll), connectionId, id, cmd, query); // this._pageHubContext.Clients.Group(node).SendAsync(nameof(INodeService.ExecAll), connectionId, id, cmd, query);
return Json(ApiResponse.AsyncSuccess()); // return Json(ApiResponse.AsyncSuccess());
} // }
catch (Exception ex) // catch (Exception ex)
{ // {
ex.PrintStack(); // ex.PrintStack();
return Json(ApiResponse.Error(ex)); // return Json(ApiResponse.Error(ex));
} // }
} // }
public IActionResult Sence(string connectionId, string node, Guid id) // public IActionResult Sence(string connectionId, string node, Guid id)
{ // {
try // try
{ // {
this._pageHubContext.Clients.Group(node).SendAsync(nameof(INodeService.Sence), connectionId, id); // this._pageHubContext.Clients.Group(node).SendAsync(nameof(INodeService.Sence), connectionId, id);
return Json(ApiResponse.AsyncSuccess()); // return Json(ApiResponse.AsyncSuccess());
} // }
catch (Exception ex) // catch (Exception ex)
{ // {
ex.PrintStack(); // ex.PrintStack();
return Json(ApiResponse.Error(ex)); // return Json(ApiResponse.Error(ex));
} // }
} // }
public IActionResult Data(Guid id, string time = "10m") // public IActionResult Data(Guid id, string time = "10m")
{ // {
var device = this._deviceRepo.ReadOnlyTable().Include(o => o.Node).Include(o => o.Data).FirstOrDefault(o => o.Id == id); // var device = this._deviceRepo.ReadOnlyTable().Include(o => o.Node).Include(o => o.Data).FirstOrDefault(o => o.Id == id);
var url = this._configuration["influxdb:url"]; // var url = this._configuration["influxdb:url"];
var usr = this._configuration["influxdb:usr"]; // var usr = this._configuration["influxdb:usr"];
var pwd = this._configuration["influxdb:pwd"]; // var pwd = this._configuration["influxdb:pwd"];
var dbName = "iot"; // var dbName = "iot";
var measurementName = "data"; // var measurementName = "data";
var list = new List<object>(); // var list = new List<object>();
using (var client = new InfluxClient(new Uri(url), usr, pwd)) // using (var client = new InfluxClient(new Uri(url), usr, pwd))
{ // {
var fileds = String.Join(',', device.Data.Where(o => o.Type == "Int" || o.Type == "Float").Select(o => o.Key)); // var fileds = String.Join(',', device.Data.Where(o => o.Type == "Int" || o.Type == "Float").Select(o => o.Key));
var query = $"select {fileds} from {measurementName} where time>now()-{time} and DeviceNumber = '{device.Number}' limit 10000"; // var query = $"select {fileds} from {measurementName} where time>now()-{time} and DeviceNumber = '{device.Number}' limit 10000";
var result = client.ReadAsync<DynamicInfluxRow>(dbName, query).Result; // var result = client.ReadAsync<DynamicInfluxRow>(dbName, query).Result;
var rows = result.Results.FirstOrDefault()? // var rows = result.Results.FirstOrDefault()?
.Series.FirstOrDefault()? // .Series.FirstOrDefault()?
.Rows; // .Rows;
var labels = rows?.Select(o => o.Timestamp.Value).Select(o => o.ToString("MM-dd HH:mm:ss")).ToList() ?? new List<string>(); // var labels = rows?.Select(o => o.Timestamp.Value).Select(o => o.ToString("MM-dd HH:mm:ss")).ToList() ?? new List<string>();
foreach (var data in device.Data.Where(o => o.Type == "Int" || o.Type == "Float")) // foreach (var data in device.Data.Where(o => o.Type == "Int" || o.Type == "Float"))
{ // {
list.Add(new // list.Add(new
{ // {
id = data.Key, // id = data.Key,
label = data.Name, // label = data.Name,
labels, // labels,
data = rows?.Select(o => o.GetField(data.Key)).ToList() ?? new List<object>() // data = rows?.Select(o => o.GetField(data.Key)).ToList() ?? new List<object>()
}); // });
} // }
} // }
return Json(list); // return Json(list);
} // }
} // }
} //}

@ -1,78 +1,78 @@
using System; //using System;
using System.Collections.Generic; //using System.Collections.Generic;
using System.Linq; //using System.Linq;
using Application.Domain.Entities; //using Application.Domain.Entities;
using Infrastructure.Data; //using Infrastructure.Data;
using Microsoft.AspNetCore.Authorization; //using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc; //using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore; //using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration; //using Microsoft.Extensions.Configuration;
using Vibrant.InfluxDB.Client; //using Vibrant.InfluxDB.Client;
using Vibrant.InfluxDB.Client.Rows; //using Vibrant.InfluxDB.Client.Rows;
namespace IoTCenter.Controllers //namespace IoTCenter.Controllers
{ //{
[Authorize] // [Authorize]
public class DeviceController : Controller // public class DeviceController : Controller
{ // {
private readonly IConfiguration _configuration; // private readonly IConfiguration _configuration;
private readonly IRepository<Node> _nodeRepo; // private readonly IRepository<Node> _nodeRepo;
private readonly IRepository<Device> _deviceRepo; // private readonly IRepository<Device> _deviceRepo;
public DeviceController(IConfiguration configuration, IRepository<Node> nodeRepo, IRepository<Device> deviceRepo) // public DeviceController(IConfiguration configuration, IRepository<Node> nodeRepo, IRepository<Device> deviceRepo)
{ // {
this._configuration = configuration; // this._configuration = configuration;
this._nodeRepo = nodeRepo; // this._nodeRepo = nodeRepo;
this._deviceRepo = deviceRepo; // this._deviceRepo = deviceRepo;
} // }
public IActionResult Index(Guid id) // public IActionResult Index(Guid id)
{ // {
var model = this._nodeRepo.ReadOnlyTable().FirstOrDefault(o => o.Id == id); // var model = this._nodeRepo.ReadOnlyTable().FirstOrDefault(o => o.Id == id);
return View(model); // return View(model);
} // }
public IActionResult Details(Guid id, string time = "10m") // public IActionResult Details(Guid id, string time = "10m")
{ // {
var model = this._deviceRepo.ReadOnlyTable() // var model = this._deviceRepo.ReadOnlyTable()
.Include(o => o.Node) // .Include(o => o.Node)
.Include(o => o.Data) // .Include(o => o.Data)
.Include(o => o.Apis).ThenInclude(o => o.Parameters) // .Include(o => o.Apis).ThenInclude(o => o.Parameters)
.FirstOrDefault(o => o.Id == id); // .FirstOrDefault(o => o.Id == id);
ViewBag.time = time; // ViewBag.time = time;
return View(model); // return View(model);
} // }
public IActionResult Data(Guid id, string time) // public IActionResult Data(Guid id, string time)
{ // {
var device = this._deviceRepo.ReadOnlyTable().Include(o => o.Node).Include(o => o.Data).FirstOrDefault(o => o.Id == id); // var device = this._deviceRepo.ReadOnlyTable().Include(o => o.Node).Include(o => o.Data).FirstOrDefault(o => o.Id == id);
var url = this._configuration["influxdb:url"]; // var url = this._configuration["influxdb:url"];
var usr = this._configuration["influxdb:usr"]; // var usr = this._configuration["influxdb:usr"];
var pwd = this._configuration["influxdb:pwd"]; // var pwd = this._configuration["influxdb:pwd"];
var dbName = "iot"; // var dbName = "iot";
var measurementName = "data"; // var measurementName = "data";
var list = new List<object>(); // var list = new List<object>();
using (var client = new InfluxClient(new Uri(url), usr, pwd)) // using (var client = new InfluxClient(new Uri(url), usr, pwd))
{ // {
var fileds = String.Join(',', device.Data.Where(o => o.Type == "Int" || o.Type == "Float").Select(o => o.Key)); // var fileds = String.Join(',', device.Data.Where(o => o.Type == "Int" || o.Type == "Float").Select(o => o.Key));
var query = $"select {fileds} from {measurementName} where time>now()-{time} and DeviceNumber = '{device.Number}' limit 10000"; // var query = $"select {fileds} from {measurementName} where time>now()-{time} and DeviceNumber = '{device.Number}' limit 10000";
var result = client.ReadAsync<DynamicInfluxRow>(dbName, query).Result; // var result = client.ReadAsync<DynamicInfluxRow>(dbName, query).Result;
var rows = result.Results.FirstOrDefault()? // var rows = result.Results.FirstOrDefault()?
.Series.FirstOrDefault()? // .Series.FirstOrDefault()?
.Rows; // .Rows;
var labels = rows?.Select(o => o.Timestamp.Value).Select(o => o.ToString("MM-dd HH:mm:ss")).ToList() ?? new List<string>(); // var labels = rows?.Select(o => o.Timestamp.Value).Select(o => o.ToString("MM-dd HH:mm:ss")).ToList() ?? new List<string>();
foreach (var data in device.Data.Where(o => o.Type == "Int" || o.Type == "Float")) // foreach (var data in device.Data.Where(o => o.Type == "Int" || o.Type == "Float"))
{ // {
list.Add(new // list.Add(new
{ // {
id = data.Key, // id = data.Key,
label = data.Name, // label = data.Name,
labels, // labels,
data = rows?.Select(o => o.GetField(data.Key)).ToList() ?? new List<object>() // data = rows?.Select(o => o.GetField(data.Key)).ToList() ?? new List<object>()
}); // });
} // }
} // }
return Json(list); // return Json(list);
} // }
} // }
} //}

@ -45,7 +45,7 @@ namespace IoTCenter.Controllers
var model = this._nodeRepo.ReadOnlyTable() var model = this._nodeRepo.ReadOnlyTable()
.Include(o => o.Sences) .Include(o => o.Sences)
.Include(o => o.Devices).ThenInclude(o => o.Data) .Include(o => o.Devices).ThenInclude(o => o.Data)
.Include(o => o.Devices).ThenInclude(o => o.Apis).ThenInclude(o => o.Parameters) //.Include(o => o.Devices).ThenInclude(o => o.Apis).ThenInclude(o => o.Parameters)
.FirstOrDefault(o => o.Id == id); .FirstOrDefault(o => o.Id == id);
return Json(model, new JsonSerializerSettings { ReferenceLoopHandling = ReferenceLoopHandling.Ignore }); return Json(model, new JsonSerializerSettings { ReferenceLoopHandling = ReferenceLoopHandling.Ignore });
} }

@ -73,7 +73,7 @@ namespace IoTCenter.Controllers
var device = this._deviceRepo.Table() var device = this._deviceRepo.Table()
.Include(o => o.Data) .Include(o => o.Data)
.Include(o => o.Apis).ThenInclude(o => o.Parameters) //.Include(o => o.Apis).ThenInclude(o => o.Parameters)
.FirstOrDefault(o => o.Number == newDevice.Number); .FirstOrDefault(o => o.Number == newDevice.Number);
if (device != null && device.Id != newDevice.Id) if (device != null && device.Id != newDevice.Id)
@ -107,42 +107,42 @@ namespace IoTCenter.Controllers
data.FromPlain(newData); data.FromPlain(newData);
} }
foreach (var command in device.Apis.Select(o => o.Command).ToList()) //foreach (var command in device.Apis.Select(o => o.Command).ToList())
{ //{
if (!newDevice.Apis.Any(o => o.Command == command)) // if (!newDevice.Apis.Any(o => o.Command == command))
{ // {
var api = device.Apis.FirstOrDefault(o => o.Command == command); // var api = device.Apis.FirstOrDefault(o => o.Command == command);
device.Apis.Remove(api); // device.Apis.Remove(api);
} // }
} //}
foreach (var newApi in newDevice.Apis) //foreach (var newApi in newDevice.Apis)
{ //{
var api = device.Apis.FirstOrDefault(o => o.Command == newApi.Command); // var api = device.Apis.FirstOrDefault(o => o.Command == newApi.Command);
if (api == null) // if (api == null)
{ // {
api = new Api(); // api = new Api();
device.Apis.Add(api); // device.Apis.Add(api);
} // }
api.FromPlain(newApi); // api.FromPlain(newApi);
foreach (var name in api.Parameters.Select(o => o.Name).ToList()) // foreach (var name in api.Parameters.Select(o => o.Name).ToList())
{ // {
if (!newApi.Parameters.Any(o => o.Name == name)) // if (!newApi.Parameters.Any(o => o.Name == name))
{ // {
var parameter = api.Parameters.FirstOrDefault(o => o.Name == name); // var parameter = api.Parameters.FirstOrDefault(o => o.Name == name);
api.Parameters.Remove(parameter); // api.Parameters.Remove(parameter);
} // }
} // }
foreach (var newParameter in newApi.Parameters) // foreach (var newParameter in newApi.Parameters)
{ // {
var parameter = api.Parameters.FirstOrDefault(o => o.Name == newParameter.Name); // var parameter = api.Parameters.FirstOrDefault(o => o.Name == newParameter.Name);
if (parameter == null) // if (parameter == null)
{ // {
parameter = new Parameter(); // parameter = new Parameter();
api.Parameters.Add(parameter); // api.Parameters.Add(parameter);
} // }
parameter.FromPlain(newParameter); // parameter.FromPlain(newParameter);
} // }
} //}
this._deviceRepo.SaveChanges(); this._deviceRepo.SaveChanges();
device.Node = node; device.Node = node;
UpdatePage(device); UpdatePage(device);
@ -206,15 +206,15 @@ namespace IoTCenter.Controllers
private IComparable GetDataValue(Data deviceData) private IComparable GetDataValue(Data deviceData)
{ {
if (deviceData.Type == "Int") if (deviceData.Type == DeviceDataType.Int)
{ {
return int.Parse(deviceData.Value); return int.Parse(deviceData.Value);
} }
else if (deviceData.Type == "Float") else if (deviceData.Type == DeviceDataType.Float)
{ {
return double.Parse(deviceData.Value); return double.Parse(deviceData.Value);
} }
if (deviceData.Type == "DateTime") if (deviceData.Type == DeviceDataType.DateTime)
{ {
return DateTime.Parse(deviceData.Value); return DateTime.Parse(deviceData.Value);
} }

@ -1,7 +1,6 @@
<Project Sdk="Microsoft.NET.Sdk.Web"> <Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup> <PropertyGroup>
<TargetFramework>netcoreapp2.2</TargetFramework> <TargetFramework>netcoreapp2.2</TargetFramework>
<AspNetCoreHostingModel>InProcess</AspNetCoreHostingModel>
<TargetLatestRuntimePatch>true</TargetLatestRuntimePatch> <TargetLatestRuntimePatch>true</TargetLatestRuntimePatch>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
@ -15,4 +14,9 @@
<ProjectReference Include="..\IoT\IoT.Resources\IoT.Resources.csproj" /> <ProjectReference Include="..\IoT\IoT.Resources\IoT.Resources.csproj" />
<ProjectReference Include="..\IoT\IoT.Shared\IoT.Shared.csproj" /> <ProjectReference Include="..\IoT\IoT.Shared\IoT.Shared.csproj" />
</ItemGroup> </ItemGroup>
<ItemGroup>
<Folder Include="Application\Domain\Entities\" />
<Folder Include="Application\Models\" />
<Folder Include="logs\" />
</ItemGroup>
</Project> </Project>

@ -13,6 +13,7 @@ namespace IoTCenter
var host = "localhost"; var host = "localhost";
WebHost.CreateDefaultBuilder(args) WebHost.CreateDefaultBuilder(args)
.Run<Startup>(new List<EFConfigurationValue> { .Run<Startup>(new List<EFConfigurationValue> {
new EFConfigurationValue { Id = "openapi.name", Value= "v1" },
new EFConfigurationValue { Id = "openapi.title", Value= "web api" }, new EFConfigurationValue { Id = "openapi.title", Value= "web api" },
new EFConfigurationValue { Id = "openapi.version", Value= "1.0" }, new EFConfigurationValue { Id = "openapi.version", Value= "1.0" },
new EFConfigurationValue { Id = "server.urls", Value= "http://*:8001" }, new EFConfigurationValue { Id = "server.urls", Value= "http://*:8001" },

@ -1,29 +1,15 @@
using Application.Domain.Entities;
using Application.Services; using Application.Services;
using Infrastructure.Data;
using Infrastructure.Domain;
using Infrastructure.Email; using Infrastructure.Email;
using Infrastructure.Extensions;
using Infrastructure.Sms; using Infrastructure.Sms;
using Infrastructure.UI; using IoT.UI.Shard;
using Infrastructure.Web;
using IoTShared;
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Hosting;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace IoTCenter namespace IoTCenter
{ {
public class Startup : BaseStartup public class Startup : IoTServiceStartup
{ {
public Startup(IConfiguration configuration, IHostingEnvironment env) : base(configuration, env) public Startup(IConfiguration configuration, IHostingEnvironment env) : base(configuration, env)
{ {
@ -34,139 +20,12 @@ namespace IoTCenter
services.AddTransient<IEmailSender, EmptyEmailSender>(); services.AddTransient<IEmailSender, EmptyEmailSender>();
services.AddTransient<ISmsSender, EmptySmsSender>(); services.AddTransient<ISmsSender, EmptySmsSender>();
services.AddSingleton<INodeService, NodeService>(); services.AddSingleton<INodeService, NodeService>();
services.AddSignalR(o => o.EnableDetailedErrors = true);
base.ConfigureServices(services); base.ConfigureServices(services);
} }
public override void ConfigureOptions(IServiceCollection services)
{
services.ConfigureOptions(new FileConfigureOptions(_env, new List<string> { "IoT.Shared" }));
}
public override void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
base.Configure(app, env, loggerFactory);
}
public override Task ValidatePrincipal(CookieValidatePrincipalContext arg)
{
return Task.Run(() =>
{
var userRepo = arg.HttpContext.RequestServices.GetService<IRepository<User>>();
var userName = arg.Principal.Identity.Name;
var userPermissions = userRepo.ReadOnlyTable().Where(o => o.UserName == userName)
.SelectMany(o => o.UserRoles)
.Select(o => o.Role)
.SelectMany(o => o.RolePermissions)
.Select(o => o.Permission.Number)
.ToList();
var currentPermissions = arg.Principal.Claims.Where(o => o.Type == "Role").Select(o => o.Value).ToList();
if (!currentPermissions.SequenceEqual(userPermissions))
{
arg.HttpContext.SignOutAsync();
arg.HttpContext.SignIn(userName, userPermissions, arg.Properties.IsPersistent);
}
});
}
public override void OnModelCreating(ModelBuilder modelBuilder) public override void OnModelCreating(ModelBuilder modelBuilder)
{ {
modelBuilder.Entity<PermissionCategory>().HasOne(o => o.Parent).WithMany(o => o.Children).HasForeignKey(o => o.ParentId).OnDelete(DeleteBehavior.SetNull); base.OnModelCreating(modelBuilder);
modelBuilder.Entity<Permission>().HasOne(o => o.Category).WithMany(o => o.Permissions).HasForeignKey(o => o.CategoryId).OnDelete(DeleteBehavior.SetNull);
modelBuilder.Entity<UserRole>().HasOne(o => o.User).WithMany(o => o.UserRoles).HasForeignKey(o => o.UserId);
modelBuilder.Entity<UserRole>().HasOne(o => o.Role).WithMany(o => o.UserRoles).HasForeignKey(o => o.RoleId);
modelBuilder.Entity<RolePermission>().HasOne(o => o.Role).WithMany(o => o.RolePermissions).HasForeignKey(o => o.RoleId);
modelBuilder.Entity<RolePermission>().HasOne(o => o.Permission).WithMany(o => o.RolePermissions).HasForeignKey(o => o.PermissionId);
modelBuilder.Entity<User>().HasIndex(o => o.UserName).IsUnique();
modelBuilder.Entity<Role>().HasIndex(o => o.Name).IsUnique();
modelBuilder.Entity<PermissionCategory>().HasIndex(o => o.Number).IsUnique();
modelBuilder.Entity<Permission>().HasIndex(o => o.Number).IsUnique();
modelBuilder.Entity<UserRole>().HasIndex(o => new { o.UserId, o.RoleId }).IsUnique();
modelBuilder.Entity<RolePermission>().HasIndex(o => new { o.RoleId, o.PermissionId }).IsUnique();
//
modelBuilder.Entity<Device>().HasOne(o => o.Node).WithMany(o => o.Devices).HasForeignKey(o => o.NodeId);
modelBuilder.Entity<Data>().HasOne(o => o.Device).WithMany(o => o.Data).HasForeignKey(o => o.DeviceId);
modelBuilder.Entity<Api>().HasOne(o => o.Device).WithMany(o => o.Apis).HasForeignKey(o => o.DeviceId);
modelBuilder.Entity<Parameter>().HasOne(o => o.Api).WithMany(o => o.Parameters).HasForeignKey(o => o.ApiId);
modelBuilder.Entity<Sence>().HasOne(o => o.Node).WithMany(o => o.Sences).HasForeignKey(o => o.NodeId);
modelBuilder.Entity<Command>().HasOne(o => o.Sence).WithMany(o => o.Commands).HasForeignKey(o => o.SenceId);
modelBuilder.Entity<Node>().HasIndex(o => o.Number).IsUnique();
modelBuilder.Entity<Device>().HasIndex(o => o.Number).IsUnique();
modelBuilder.Entity<Data>().HasIndex(o => new { o.DeviceId, o.Key }).IsUnique();
modelBuilder.Entity<Api>().HasIndex(o => new { o.DeviceId, o.Path, o.Command }).IsUnique();
modelBuilder.Entity<Parameter>().HasIndex(o => new { o.ApiId, o.Name }).IsUnique();
}
public override void UseSignalR(IApplicationBuilder app)
{
app.UseSignalR(routes =>
{
routes.MapHub<PageHub>("/hub", o =>
{
o.ApplicationMaxBufferSize = long.MaxValue;
o.TransportMaxBufferSize = long.MaxValue;
});
});
}
public override void Seed(DbContext dbContext, IServiceProvider serviceProvider, IConfiguration configuration)
{
dbContext.Set<PermissionCategory>().Add(new PermissionCategory
{
Name = "配置",
Number = "Configuration",
Permissions = new List<Permission> {
new Permission { Name = "查询配置", Number = "ListConfiguration",DisplayOrder =1 },
new Permission { Name = "修改配置", Number = "EditConfiguration",DisplayOrder =2 }
}
});
int i = 1;
var skipReadCollection = new string[] { "Permission" };
var skipAddCollection = new string[] { "Permission", "Setting", "Node", "Device", "Data", "Api", "Parameter" };
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,
DisplayOrder = i
};
category.Permissions.Add(new Permission { Name = $"查询{name}", Number = $"List{number}", DisplayOrder = 10 * i + 1 });
if (!skipReadCollection.Contains(type.Name))
{
category.Permissions.Add(new Permission { Name = $"查看{name}", Number = $"Read{number}", DisplayOrder = 10 * i + 2 });
}
if (!skipAddCollection.Contains(type.Name))
{
category.Permissions.Add(new Permission { Name = $"添加{name}", Number = $"Add{number}", DisplayOrder = 10 * i + 3 });
}
if (!typeof(IDisableUpdate).IsAssignableFrom(type))
{
category.Permissions.Add(new Permission { Name = $"修改{name}", Number = $"Edit{number}", DisplayOrder = 10 * i + 4 });
}
if (!typeof(IDisableDelete).IsAssignableFrom(type))
{
category.Permissions.Add(new Permission { Name = $"删除{name}", Number = $"Delete{number}", DisplayOrder = 10 * i + 5 });
}
dbContext.Set<PermissionCategory>().Add(category);
i += 1;
}
dbContext.SaveChanges();
var adminRole = new Role { Name = "管理员", IsReadOnly = true };
foreach (var item in dbContext.Set<Permission>())
{
adminRole.RolePermissions.Add(new RolePermission { Permission = item, IsReadOnly = true });
}
dbContext.Set<User>().Add(new User
{
UserName = "admin",
UserRoles = new List<UserRole> { new UserRole { Role = adminRole } }
});
dbContext.SaveChanges();
} }
} }
} }

@ -8,7 +8,7 @@
"UseMiniProfiler": false, "UseMiniProfiler": false,
"ConnectionStrings": { "ConnectionStrings": {
"database.mysql.connection": "Server=127.0.0.1;Port=3306;Database=iotcenter;Uid=root;Pwd=root;", "database.mysql.connection": "Server=127.0.0.1;Port=3306;Database=iotcenter;Uid=root;Pwd=root;",
"database.sqlite.connection": "Data Source=iotcenter.db" "database.sqlite.connection": "Data Source=data.db"
}, },
"AppSettings": { "AppSettings": {
"database": "sqlite", "database": "sqlite",

@ -1,6 +0,0 @@
{
"version": "1.0",
"defaultProvider": "cdnjs",
"libraries": [
]
}

@ -8,7 +8,7 @@
"UseMiniProfiler": false, "UseMiniProfiler": false,
"ConnectionStrings": { "ConnectionStrings": {
"database.mysql.connection": "Server=127.0.0.1;Port=3306;Database=usercenter;Uid=root;Pwd=root;", "database.mysql.connection": "Server=127.0.0.1;Port=3306;Database=usercenter;Uid=root;Pwd=root;",
"database.sqlite.connection": "Data Source=usercenter.db" "database.sqlite.connection": "Data Source=data.db"
}, },
"AppSettings": { "AppSettings": {
"database": "sqlite", "database": "sqlite",
@ -16,7 +16,7 @@
}, },
//Ocelot config //Ocelot config
"GlobalConfiguration": { "GlobalConfiguration": {
"BaseUrl": "http://192.168.3.83:8000/" "BaseUrl": "http://localhost:8000/"
}, },
"ReRoutes": [ "ReRoutes": [
{ {
@ -24,7 +24,7 @@
"DownstreamScheme": "http", "DownstreamScheme": "http",
"DownstreamHostAndPorts": [ "DownstreamHostAndPorts": [
{ {
"Host": "192.168.3.83", "Host": "localhost",
"Port": 8001 "Port": 8001
} }
], ],

Loading…
Cancel
Save