diff --git a/projects/Infrastructure/Web/BaseStartup.cs b/projects/Infrastructure/Web/BaseStartup.cs index 28a1047e..e3c20af5 100644 --- a/projects/Infrastructure/Web/BaseStartup.cs +++ b/projects/Infrastructure/Web/BaseStartup.cs @@ -63,11 +63,7 @@ namespace Infrastructure.Web { if (!this.Env.IsDevelopment()) { - services.AddResponseCompression(options => - { - options.Providers.Add(); - options.Providers.Add(); - }); + services.AddResponseCompression(); } services.AddTransient(); services.AddTransient(); diff --git a/projects/IoTCenter/Api/ProjectController.cs b/projects/IoTCenter/Api/ProjectController.cs new file mode 100644 index 00000000..de21bfe0 --- /dev/null +++ b/projects/IoTCenter/Api/ProjectController.cs @@ -0,0 +1,134 @@ +using Application.Domain.Entities; +using Infrastructure.Data; +using Infrastructure.Extensions; +using IoTCenter.Application.Domain; +using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.Logging; +using System; +using System.Linq; + +namespace IoTCenter.Api.Controllers +{ + [ApiVersion("1.0")] + [Route("api/v{version:apiVersion}/[controller]/[action]")] + [ApiController] + public class ProjectController : ControllerBase + { + private readonly ILogger logger; + private readonly IConfiguration _cfg; + private readonly IRepository _organRepo; + private readonly IRepository _userRepo; + private readonly IRepository _organUserRepo; + private readonly IRepository _roleRepo; + private readonly IRepository _userRoleRepo; + + public ProjectController( + ILogger logger, + IConfiguration cfg, + IRepository organRepo, + IRepository userRepo, + IRepository organUserRepo, + IRepository roleRepo, + IRepository userRoleRepo) + { + this.logger = logger; + this._cfg = cfg; + this._organRepo = organRepo; + this._userRepo = userRepo; + this._organUserRepo = organUserRepo; + this._roleRepo = roleRepo; + this._userRoleRepo = userRoleRepo; + } + + [HttpGet] + public IActionResult Update(string userName, string realName, string organName, string organNumber, long timestamp, string role, string token) + { + if (string.IsNullOrEmpty(userName) || string.IsNullOrEmpty(organName)) + { + var message = "参数不能为空"; + this.logger.LogError(message); + return Problem(message); + } + try + { + var query = this.Request.QueryString.ToString().RemoveParam("token").TrimStart('?').Trim(); + var token2 = $"{query},123456".Md5(); + if (token2 != token) + { + var message = "token无效"; + this.logger.LogError(message); + throw new Exception(message); + } + var sendTime = DateTimeOffset.FromUnixTimeSeconds(timestamp); + var seconds = (DateTime.UtcNow - sendTime).TotalSeconds; + if (seconds > 60) + { + var message = $"timestamp差距{seconds}秒"; + this.logger.LogError(message); + throw new Exception(message); + } + var organ = this._organRepo.Table().FirstOrDefault(o => o.Name == organName); + if (organ == null) + { + organ = new Organ { Name = organName, Number = organNumber }; + this._organRepo.Add(organ); + } + else + { + organ.Number = organNumber; + } + this._organRepo.SaveChanges(); + + var user = this._userRepo.Table().FirstOrDefault(o => o.UserName == userName); + if (user == null) + { + user = new User + { + UserName = userName, + Email = $"{userName}@test.com" + }; + this._userRepo.Add(user); + } + this._userRepo.SaveChanges(); + var organUser = this._organUserRepo.Table().FirstOrDefault(o => o.UserId == user.Id && o.Organ.Id == organ.Id); + if (organUser == null) + { + organUser = new OrganUser { UserId = user.Id, OrganId = organ.Id }; + this._organUserRepo.SaveChanges(); + } + var roles = role.Split(','); + var userRoles = this._userRoleRepo.Table().Where(o => o.User.UserName == userName); + if (roles.Any()) + { + foreach (var item in roles) + { + var role2 = _roleRepo.Table().FirstOrDefault(o => o.Name == item); + if (role2 == null) + { + role2 = new Role { Name = item }; + _roleRepo.Add(role2); + _roleRepo.SaveChanges(); + } + if (!userRoles.Any(o => o.Role.Name == item)) + { + _userRoleRepo.Add(new UserRole { UserId = user.Id, RoleId = role2.Id }); + _userRoleRepo.SaveChanges(); + } + } + } + } + catch (Exception ex) + { + this.logger.LogError(ex.ToString()); + return Problem(ex.Message); + } + + return Ok(new + { + AccessToken = Request.HttpContext.GetToken(userName, _cfg, DateTime.Now.AddYears(100)), + RefreshToken = Request.HttpContext.GetToken(userName, _cfg, DateTime.Now.AddYears(100)), + }); + } + } +} \ No newline at end of file diff --git a/projects/UserCenter/Areas/Admin/Controllers/UserController.cs b/projects/UserCenter/Areas/Admin/Controllers/UserController.cs index 28f07f9e..85012d02 100644 --- a/projects/UserCenter/Areas/Admin/Controllers/UserController.cs +++ b/projects/UserCenter/Areas/Admin/Controllers/UserController.cs @@ -103,7 +103,7 @@ namespace UserCenter.Areas.Admin.Controllers } if (!string.IsNullOrEmpty(model.PhoneNumber) && this.Repo.ReadOnlyTable().Any(o => o.PhoneNumber == model.PhoneNumber)) { - ModelState.AddModelError(o => model.Email, "ֻѾ"); + ModelState.AddModelError(o => model.PhoneNumber, "ֻѾ"); } if (this.Repo.ReadOnlyTable().Any(o => o.NickName == model.NickName)) { diff --git a/projects/WebMVC/wwwroot/index.html b/projects/WebMVC/wwwroot/index.html index d82f73bc..3586bd5d 100644 --- a/projects/WebMVC/wwwroot/index.html +++ b/projects/WebMVC/wwwroot/index.html @@ -62,6 +62,7 @@ + diff --git a/projects/WebMVC/wwwroot/js/valid.js b/projects/WebMVC/wwwroot/js/valid.js index 0666dde5..027a7205 100644 --- a/projects/WebMVC/wwwroot/js/valid.js +++ b/projects/WebMVC/wwwroot/js/valid.js @@ -1,2 +1,119 @@ -Vue.prototype.valid2 = function () { -} \ No newline at end of file +Vue.prototype.$camelCased = function (name) { + return name[0].toLowerCase() + name.substr(1); +}; +Vue.prototype.$validInternal = function (validator, name, valid, message) { + if (validator) { + var errors = this.getErrors(); + var vm = this; + message = message || validator.message; + return valid().then(function (value) { + var error = Enumerable.from(errors).firstOrDefault(o => o.key.toLowerCase() === name.toLowerCase()); + if (value) { + if (error) { + if (Enumerable.from(error.value.errors).any(o => o.errorMessage === message)) { + error.value.errors = Enumerable.from(error.value.errors).where(o => o.errorMessage !== message).toArray(); + } + if (error.value.errors.length === 0) { + var index = _.findIndex(errors, o => o.key.toLowerCase() === name.toLowerCase()); + vm.getErrors().splice(index, 1); + } + } + } + else { + if (!error) { + error = { + key: name, + value: { + errors: [{ errorMessage: message }] + } + }; + errors.push(error); + } + else { + if (!Enumerable.from(error.value.errors).any(o => o.errorMessage === message)) { + error.value.errors.push({ errorMessage: message }); + } + } + } + }); + } + return Promise.resolve(''); +}; +Vue.prototype.$validProperty = function (name, schema, model, errors) { + schema = schema || this.getSchema(); + model = model || this.getModel(); + errors = errors || this.getErrors(); + var vm = this; + var property = schema.properties[name]; + var value = model[name]; + var list = []; + list.push( + this.$validInternal(property.required, name, o => Promise.resolve(value !== undefined && value !== null&&value!=='')) + ); + if (value) { + list.push( + this.$validInternal(property.email, name, o => Promise.resolve(/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/.test(value))) + ); + list.push( + this.$validInternal(property.url, name, o => Promise.resolve(/^(?:(?:(?:https?|ftp):)?\/\/)(?:\S+(?::\S*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,})).?)(?::\d{2,5})?(?:[/?#]\S*)?$/i.test(value))) + ); + list.push( + this.$validInternal(property.date, name, o => Promise.resolve(!/Invalid|NaN/.test(new Date(value).toString()))) + ); + list.push( + this.$validInternal(property.number, name, o => Promise.resolve(/^(?:-?\d+|-?\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/.test(value))) + ); + list.push( + this.$validInternal(property.digits, name, o => Promise.resolve(/^\d+$/.test(value))) + ); + //dateiso + //creditcard + //accept + list.push( + this.$validInternal(property.pattern, name, o => Promise.resolve(new RegExp(property.pattern.regex).test(value))) + ); + list.push( + this.$validInternal(property.minLength, name, o => Promise.resolve(value.length >= property.minLength.min)) + ); + list.push( + this.$validInternal(property.maxLength, name, o => Promise.resolve(value.length <= property.maxLength.max)) + ); + list.push( + this.$validInternal(property.rangeLength, name, o => Promise.resolve(value.length >= property.rangeLength.min && value.length <= property.rangeLength.max)) + ); + list.push( + this.$validInternal(property.range, name, o => Promise.resolve(parseFloat(value) >= property.range.min && parseFloat(value) <= property.range.max)) + ); + list.push(this.$validInternal(property.equalTo, name, o => Promise.resolve(o === model[vm.$camelCased(name)])) + ); + list.push( + this.$validInternal(property.remote, name, o => new Promise((resolve, reject) => { + var url = property.remote.url + '?' + name + '=' + value; + if (property.remote.additionalFields) { + var keys = property.remote.additionalFields.split(','); + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + url = url + '&' + key + '=' + model[vm.$camelCased(key)]; + } + } + axios.get(url).then(function (response) { + resolve(response.data === true); + }).catch(function () { + resolve(false); + }); + })) + ); + } + return Promise.all(list); +}; +Vue.prototype.$valid = function (schema, model, errors) { + schema = schema || this.getSchema(); + model = model || this.getModel(); + errors = errors || this.getErrors(); + var vm = this; + var list = []; + _.forIn(schema.properties, function (value, key) { + list.push(vm.$validProperty(key)); + }); + return Promise.all(list); +}; \ No newline at end of file diff --git a/projects/WebMVC/wwwroot/router/shared/update.html b/projects/WebMVC/wwwroot/router/shared/update.html index 3af6837b..8b66ec60 100644 --- a/projects/WebMVC/wwwroot/router/shared/update.html +++ b/projects/WebMVC/wwwroot/router/shared/update.html @@ -25,7 +25,7 @@
- {{getErrorList(key)}} + {{getPropertyErrors(key)}}
@@ -76,7 +76,7 @@ return this.data.schema ? this.data.schema.title : ''; }, title: function () { - return this.name + '列表'; + return this.name + (this.mode === 'edit' ? '编辑' : '新建'); } }, mounted: function () { @@ -99,120 +99,9 @@ getErrors: function () { return this.data.errors; }, - change: function (name) { - var vm = this; - var schema = this.getSchema(); - var model = this.getModel(); - var property = schema.properties[name]; - var value = model[name]; - var list = []; - list.push( - this.validInternal(property.required, name, o => Promise.resolve(value !== undefined && value !== null)) - ); - if (value) { - list.push( - this.validInternal(property.email, name, o => Promise.resolve(/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/.test(value))) - ); - list.push( - this.validInternal(property.url, name, o => Promise.resolve(/^(?:(?:(?:https?|ftp):)?\/\/)(?:\S+(?::\S*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,})).?)(?::\d{2,5})?(?:[/?#]\S*)?$/i.test(value))) - ); - list.push( - this.validInternal(property.date, name, o => Promise.resolve(!/Invalid|NaN/.test(new Date(value).toString()))) - ); - list.push( - this.validInternal(property.number, name, o => Promise.resolve(/^(?:-?\d+|-?\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/.test(value))) - ); - list.push( - this.validInternal(property.digits, name, o => Promise.resolve(/^\d+$/.test(value))) - ); - //dateiso - //creditcard - //accept - list.push( - this.validInternal(property.pattern, name, o => Promise.resolve(new RegExp(property.pattern.regex).test(value))) - ); - list.push( - this.validInternal(property.minLength, name, o => Promise.resolve(value.length >= property.minLength.min)) - ); - list.push( - this.validInternal(property.maxLength, name, o => Promise.resolve(value.length <= property.maxLength.max)) - ); - list.push( - this.validInternal(property.rangeLength, name, o => Promise.resolve(value.length >= property.rangeLength.min && value.length <= property.rangeLength.max)) - ); - list.push( - this.validInternal(property.range, name, o => Promise.resolve(parseFloat(value) >= property.range.min && parseFloat(value) <= property.range.max)) - ); - list.push(this.validInternal(property.equalTo, name, o => Promise.resolve(o === vm.data.model[vm.camelCased(name)])) - ); - list.push( - this.validInternal(property.remote, name, o => new Promise((resolve, reject) => { - var url = property.remote.url + '?' + name + '=' + value; - if (property.remote.additionalFields) { - var keys = property.remote.additionalFields.split(','); - for (var i = 0; i < keys.length; i++) { - var key = keys[i]; - url = url + '&' + key + '=' + vm.data.model[vm.camelCased(key)]; - } - } - axios.get(url).then(function (response) { - resolve(response.data === true); - }).catch(function () { - resolve(false); - }); - })) - ); - } - return Promise.all(list); - }, - valid: function () { - var vm = this; - var schema = this.getSchema(); - var list = []; - _.forIn(schema.properties, function (value, key) { - list.push(vm.change(key)); - }); - return Promise.all(list); - }, - validInternal: function (validator, name, valid, message) { - if (validator) { - var vm = this; - message = message || validator.message; - return valid().then(function (value) { - var error = Enumerable.from(vm.data.errors).firstOrDefault(o => o.key.toLowerCase() === name.toLowerCase()); - if (value) { - if (error) { - if (Enumerable.from(error.value.errors).any(o => o.errorMessage === message)) { - error.value.errors = Enumerable.from(error.value.errors).where(o => o.errorMessage !== message).toArray(); - } - if (error.value.errors.length === 0) { - var index = _.findIndex(vm.data.errors, o => o.key.toLowerCase() === name.toLowerCase()); - vm.getErrors().splice(index, 1); - } - } - } - else { - if (!error) { - error = { - key: name, - value: { - errors: [{ errorMessage: message }] - } - }; - vm.data.errors.push(error); - } - else { - if (!Enumerable.from(error.value.errors).any(o => o.errorMessage === message)) { - error.value.errors.push({ errorMessage: message }); - } - } - } - }); - } - return Promise.resolve(''); - }, - camelCased: function (name) { - return name[0].toLowerCase() + name.substr(1); + hasErrors: function (key) { + key = key.toLowerCase(); + return Enumerable.from(this.getErrors()).any(o => o.key.toLowerCase() === key); }, getValidationSummary: function (excludePropertyErrors) { var query = Enumerable.from(this.getErrors()); @@ -221,15 +110,14 @@ } return query.select(o => o.value.errors[0].errorMessage).toArray(); }, - hasErrors: function (key) { - key = key.toLowerCase(); - return Enumerable.from(this.getErrors()).any(o => o.key.toLowerCase() === key); - }, - getErrorList: function (key) { + getPropertyErrors: function (key) { key = key.toLowerCase(); return Enumerable.from(this.getErrors()) .where(o => o.key.toLowerCase() === key).selectMany(o => o.value.errors).select(o => o.errorMessage).toArray().join(','); }, + change: function (name) { + return this.$validProperty(name); + }, hasPermission: function () { var permission = this.mode + '-' + this.entity; return Enumerable.from(store.state.permissions).any(o => o.toLowerCase() === permission.toLowerCase()); @@ -249,7 +137,7 @@ }, onSubmit: function (e) { var vm = this; - vm.valid().then(function (value) { + vm.$valid().then(function (value) { if (vm.data.errors.length === 0) { axios.post(e.target.action, vm.data.model).then(function (response) { if (response.status === 204) { diff --git a/projects/projects.sln b/projects/projects.sln index 3f484587..b9940a86 100644 --- a/projects/projects.sln +++ b/projects/projects.sln @@ -42,6 +42,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WebSPA", "WebSPA\WebSPA.csp EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JobServer", "JobServer\JobServer.csproj", "{6E2766D8-9ECF-469E-8662-A20F673E52CC}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Test", "Test\Test.csproj", "{8F970326-776E-4BA9-B300-AF68752AC84A}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -160,6 +162,18 @@ Global {6E2766D8-9ECF-469E-8662-A20F673E52CC}.Release|iPhone.Build.0 = Release|Any CPU {6E2766D8-9ECF-469E-8662-A20F673E52CC}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU {6E2766D8-9ECF-469E-8662-A20F673E52CC}.Release|iPhoneSimulator.Build.0 = Release|Any CPU + {8F970326-776E-4BA9-B300-AF68752AC84A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8F970326-776E-4BA9-B300-AF68752AC84A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8F970326-776E-4BA9-B300-AF68752AC84A}.Debug|iPhone.ActiveCfg = Debug|Any CPU + {8F970326-776E-4BA9-B300-AF68752AC84A}.Debug|iPhone.Build.0 = Debug|Any CPU + {8F970326-776E-4BA9-B300-AF68752AC84A}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {8F970326-776E-4BA9-B300-AF68752AC84A}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU + {8F970326-776E-4BA9-B300-AF68752AC84A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8F970326-776E-4BA9-B300-AF68752AC84A}.Release|Any CPU.Build.0 = Release|Any CPU + {8F970326-776E-4BA9-B300-AF68752AC84A}.Release|iPhone.ActiveCfg = Release|Any CPU + {8F970326-776E-4BA9-B300-AF68752AC84A}.Release|iPhone.Build.0 = Release|Any CPU + {8F970326-776E-4BA9-B300-AF68752AC84A}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU + {8F970326-776E-4BA9-B300-AF68752AC84A}.Release|iPhoneSimulator.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -176,7 +190,7 @@ Global {6E2766D8-9ECF-469E-8662-A20F673E52CC} = {E1681DC3-9AC2-4FF6-B3DE-37EF826E6F8A} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution - BuildVersion_StartDate = 2000/1/1 SolutionGuid = {0B7095FB-5E70-4EF8-805A-CB4A91AE4B0A} + BuildVersion_StartDate = 2000/1/1 EndGlobalSection EndGlobal