Former-commit-id: 58196575415d897cb7de5443942d390ab9c4d881
Former-commit-id: 5eb05e4adaf35bc1695ae38ac10de7562840ba16
TSXN
wanggang 5 years ago
parent 7cb666c5b5
commit a06ec4d76e

@ -63,11 +63,7 @@ namespace Infrastructure.Web
{
if (!this.Env.IsDevelopment())
{
services.AddResponseCompression(options =>
{
options.Providers.Add<BrotliCompressionProvider>();
options.Providers.Add<GzipCompressionProvider>();
});
services.AddResponseCompression();
}
services.AddTransient<SettingService>();
services.AddTransient<ISettingService, CachedSettingService>();

@ -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<ProjectController> logger;
private readonly IConfiguration _cfg;
private readonly IRepository<Organ> _organRepo;
private readonly IRepository<User> _userRepo;
private readonly IRepository<OrganUser> _organUserRepo;
private readonly IRepository<Role> _roleRepo;
private readonly IRepository<UserRole> _userRoleRepo;
public ProjectController(
ILogger<ProjectController> logger,
IConfiguration cfg,
IRepository<Organ> organRepo,
IRepository<User> userRepo,
IRepository<OrganUser> organUserRepo,
IRepository<Role> roleRepo,
IRepository<UserRole> 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)),
});
}
}
}

@ -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))
{

@ -62,6 +62,7 @@
<script src="js/axios.js"></script>
<script src="js/route.js"></script>
<script src="js/components.js"></script>
<script src="js/valid.js"></script>
<script src="js/state.js"></script>
<script src="js/signalr.js"></script>
<script src="js/form.js"></script>

@ -1,2 +1,119 @@
Vue.prototype.valid2 = function () {
}
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);
};

@ -25,7 +25,7 @@
<component :is="getEditComponent(key)" mode="edit" :title="value.title" :name="key" :value.sync="data.model[key]" :data="data.data" :nullable="value.nullable" @change="change" />
</template>
<div style="height:1em;">
<span v-if="hasErrors(key)" class="field-validation-error text-danger">{{getErrorList(key)}}</span>
<span v-if="hasErrors(key)" class="field-validation-error text-danger">{{getPropertyErrors(key)}}</span>
<span v-else class="text-danger field-validation-valid"></span>
</div>
</div>
@ -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) {

@ -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

Loading…
Cancel
Save