diff --git a/labs/Teacher/Infrastructure/Areas/Admin/Controllers/SettingController.cs b/labs/Teacher/Infrastructure/Areas/Admin/Controllers/SettingController.cs index 914ccbb6..793fdf2e 100644 --- a/labs/Teacher/Infrastructure/Areas/Admin/Controllers/SettingController.cs +++ b/labs/Teacher/Infrastructure/Areas/Admin/Controllers/SettingController.cs @@ -14,6 +14,7 @@ using System.Linq; namespace Infrastructure.Areas.Admin.Controllers { + [ApiExplorerSettings(IgnoreApi = true)] [Authorize] [ApiController] [Route("Admin/[controller]/[action]")] diff --git a/labs/Teacher/Infrastructure/Web/JwtTokenValidator.cs b/labs/Teacher/Infrastructure/Web/JwtTokenValidator.cs index 1dea6ef6..d4b45630 100644 --- a/labs/Teacher/Infrastructure/Web/JwtTokenValidator.cs +++ b/labs/Teacher/Infrastructure/Web/JwtTokenValidator.cs @@ -46,7 +46,6 @@ namespace Infrastructure.Web var claims2 = userService.GetRoles(userName,organId); claims.AddRange(claims2); - return new ClaimsPrincipal(new ClaimsIdentity(claims, JwtBearerDefaults.AuthenticationScheme)); } catch (Exception ex) diff --git a/labs/Teacher/TeacherExt/Controllers/AccountController.cs b/labs/Teacher/TeacherExt/Controllers/AccountController.cs index 62fcb6a5..2a0ec407 100644 --- a/labs/Teacher/TeacherExt/Controllers/AccountController.cs +++ b/labs/Teacher/TeacherExt/Controllers/AccountController.cs @@ -2,7 +2,13 @@ using Infrastructure.Extensions; using Infrastructure.Security; using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.ModelBinding; +using Newtonsoft.Json; +using Newtonsoft.Json.Serialization; +using System; +using System.Collections.Generic; using System.Linq; +using System.Security.Claims; using TeacherExt.Entities; using TeacherExt.Models; @@ -29,14 +35,25 @@ namespace TeacherExt.Controllers public IActionResult Login(LoginModel model) { if (ModelState.IsValid) - { + { var user = this._userRepo.ReadOnlyTable().FirstOrDefault(o => o.UserName == model.UserName); if (user!=null) { if (user.PasswordHash == this._encryptionService.CreatePasswordHash(user.PasswordSalt, model.Password)) { Request.HttpContext.JwtSignIn(model.UserName, model.RememberMe); - return RedirectToAction("Index","Home"); + if(!Request.IsAjax()) + { + return RedirectToAction("Index", "Home"); + } + else + { + return Json(new + { + AccessToken = Request.HttpContext.CreateJwtToken(new List { new Claim(ClaimTypes.Name, model.UserName) }, DateTime.Now.AddYears(100)), + RefreshToken = Request.HttpContext.CreateJwtToken(new List { new Claim(ClaimTypes.Name, model.UserName) }, DateTime.Now.AddYears(100)), + }); + } } else { @@ -48,7 +65,7 @@ namespace TeacherExt.Controllers ModelState.AddModelError(nameof(model.UserName), "用户不存在"); } } - return View(); + return Result(model); } public IActionResult Logout() @@ -56,5 +73,19 @@ namespace TeacherExt.Controllers Request.HttpContext.JwtSignOut(); return RedirectToAction("Index", "Home"); } + protected IActionResult Result(object model) + { + if (this.IsJsonRequest()) + { + return Json(new + { + schema = this.GetJsonSchema(), + model, + errors = ModelState.Where(o => o.Value.ValidationState == ModelValidationState.Invalid), + data = ViewData + }, new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver(), ReferenceLoopHandling = ReferenceLoopHandling.Ignore }); + } + return View(model); + } } } diff --git a/labs/Teacher/TeacherExt/Controllers/HomeController.cs b/labs/Teacher/TeacherExt/Controllers/HomeController.cs index 3fa5227e..bad1a017 100644 --- a/labs/Teacher/TeacherExt/Controllers/HomeController.cs +++ b/labs/Teacher/TeacherExt/Controllers/HomeController.cs @@ -2,10 +2,13 @@ using Infrastructure.Extensions; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.ModelBinding; using Microsoft.AspNetCore.Mvc.Rendering; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; +using Newtonsoft.Json; +using Newtonsoft.Json.Serialization; using NPOI.SS.UserModel; using NPOI.XSSF.UserModel; using System; @@ -13,20 +16,26 @@ using System.Collections.Generic; using System.Globalization; using System.IO; using System.Linq; -using System.Text; using TeacherExt.Entities; using TeacherExt.Models; namespace TeacherExt.Controllers { [Authorize] + [ApiController] + [Route("[controller]/[action]")] public class HomeController : Controller { private readonly IHostEnvironment _env; + private readonly ILogger _logger; + private readonly IRepository _organRepo; + private readonly IRepository _userRepo; + private readonly IRepository _teacherRepo; + private readonly IRepository _checkLogRepo; public HomeController(IHostEnvironment env, @@ -44,6 +53,8 @@ namespace TeacherExt.Controllers this._checkLogRepo = checkLogRepo; } + [HttpGet] + [Route("/")] public IActionResult Index(QueryTeacherModel model) { var query = Query(model); @@ -68,9 +79,10 @@ namespace TeacherExt.Controllers model.List.AddRange(list); ViewData.SelectList(o => model.RequestEditStatus, () => this.GetRequestEditStatus(model.RequestEditStatus)); ViewData.SelectList(o => model.CheckStatus, () => this.GetCheckStatus(model.CheckStatus)); - return View(model); + return Result(model); } + [HttpGet] public IActionResult Details(Guid userId) { var entity = this._userRepo.ReadOnlyTable() @@ -88,24 +100,25 @@ namespace TeacherExt.Controllers model.RealName = entity.RealName; this.EntityToModel(entity.Teacher, model); this.ToEditModel(entity.Teacher, model); - return View(model); + return Result(model); } [HttpPost] - public IActionResult Details(EditTeacherModel model) + public IActionResult Details([FromForm] EditTeacherModel model) { ValidEditModel(model); var entity = this._userRepo.Table().Include(o => o.Organ).Include(o => o.Teacher).FirstOrDefault(o => o.Id == model.UserId); if (ModelState.IsValid) { - if(entity.Teacher.CheckStatus!=model.CheckStatus) + if (entity.Teacher.CheckStatus != model.CheckStatus) { - this._checkLogRepo.Add( new CheckLog { + this._checkLogRepo.Add(new CheckLog + { UpdateBy = User.Identity.Name, UpdateAt = DateTime.Now, UserName = entity.UserName, FromStatus = entity.Teacher.CheckStatus, - ToStatus=model.CheckStatus + ToStatus = model.CheckStatus }); } entity.Teacher.From(model); @@ -114,9 +127,10 @@ namespace TeacherExt.Controllers } this.EntityToModel(entity?.Teacher, model); this.ToEditModel(entity?.Teacher, model); - return View(model); + return Result(model); } + [HttpGet] public IActionResult Add() { var model = new EditTeacherModel(); @@ -124,6 +138,7 @@ namespace TeacherExt.Controllers return View(model); } + [HttpGet] public IActionResult Edit(Guid userId) { var entity = this._userRepo.ReadOnlyTable() @@ -141,11 +156,11 @@ namespace TeacherExt.Controllers model.RealName = entity.RealName; this.EntityToModel(entity.Teacher, model); this.ToEditModel(entity.Teacher, model); - return View(model); + return Result(model); } [HttpPost] - public IActionResult Add(EditTeacherModel model) + public IActionResult Add([FromForm] EditTeacherModel model) { if (ModelState.IsValid) { @@ -160,7 +175,7 @@ namespace TeacherExt.Controllers } [HttpPost] - public IActionResult Edit(EditTeacherModel model) + public IActionResult Edit([FromForm] EditTeacherModel model) { ValidEditModel(model); var entity = this._userRepo.Table().Include(o => o.Organ).Include(o => o.Teacher).FirstOrDefault(o => o.Id == model.UserId); @@ -179,14 +194,15 @@ namespace TeacherExt.Controllers return View(model); } - public IActionResult History(QueryHistoryModel model) + [HttpGet] + public IActionResult History([FromQuery] QueryHistoryModel model) { var query = this._checkLogRepo.ReadOnlyTable() .Where(o => o.UserName == model.UserName) .OrderByDescending(o => o.UpdateAt); model.TotalCount = query.Count(); var list = query.Skip(model.PageSize * (model.PageIndex - 1)) - .OrderByDescending(o=>o.UpdateAt) + .OrderByDescending(o => o.UpdateAt) .Take(model.PageSize) .ToList() .Select(o => @@ -196,7 +212,60 @@ namespace TeacherExt.Controllers }) .ToList(); model.List.AddRange(list); - return View(model); + return Result(model); + } + + /// + /// https://github.com/nissl-lab/npoi/wiki/How-to-use-NPOI-on-Linux + /// apt-get install libgdiplus libc6-dev + /// cd /usr/lib + /// ln -s libgdiplus.so gdiplus.dll + /// + /// + [HttpGet] + public FileResult Export([FromQuery] QueryTeacherModel model) + { + var template = Path.Combine(this._env.ContentRootPath, "wwwroot", "teacher.xlsx"); + using var fs = System.IO.File.OpenRead(template); + var wk = new XSSFWorkbook(fs); + var sheet = wk.GetSheetAt(0); + this.ExportInternal(sheet, model); + using var ms = new MemoryStream(); + wk.Write(ms); + return File(ms.ToArray(), "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", $"教师列表_{DateTime.Now.ToString("yyyy_MM-dd_HH_mm_ss")}.xlsx"); + } + + private IQueryable Query(QueryTeacherModel model) + { + var userName = User.Identity.Name; + var organId = this._userRepo.ReadOnlyTable().Where(o => o.UserName == userName).Select(o => o.OrganId).FirstOrDefault(); + model.OrganId = model.OrganId.HasValue ? model.OrganId : organId; + if (User.IsInRole("局管理员")) + { + model.Organs = this._organRepo.Table().ToList().Where(o => o.ParentId == null).ToList(); + } + else + { + model.Organs = this._organRepo.ReadOnlyTable().ToList().Where(o => o.Id == organId).ToList(); + } + var query = this._userRepo.ReadOnlyTable().Include(o => o.Organ).Include(o => o.Teacher).AsQueryable(); + if (User.IsInRole("局管理员")) + { + //全部数据 + } + else if (User.IsInRole("校管理员")) + { + query = query.Where(o => o.OrganId == organId); + } + else + { + query = query.Where(o => o.UserName == userName); + } + query = query + .WhereIf(!string.IsNullOrEmpty(model.RequestEditStatus), o => o.Teacher.RequestEditStatus == model.RequestEditStatus) + .WhereIf(!string.IsNullOrEmpty(model.CheckStatus), o => o.Teacher.CheckStatus == model.CheckStatus) + .WhereIf(!string.IsNullOrEmpty(model.RealName), o => o.RealName.Contains(model.RealName)); + return query; } private void ValidEditModel(EditTeacherModel model) @@ -290,58 +359,6 @@ namespace TeacherExt.Controllers } } - /// - /// https://github.com/nissl-lab/npoi/wiki/How-to-use-NPOI-on-Linux - /// apt-get install libgdiplus libc6-dev - /// cd /usr/lib - /// ln -s libgdiplus.so gdiplus.dll - /// - /// - public FileResult Export(QueryTeacherModel model) - { - var template = Path.Combine(this._env.ContentRootPath, "wwwroot", "teacher.xlsx"); - using var fs = System.IO.File.OpenRead(template); - var wk = new XSSFWorkbook(fs); - var sheet = wk.GetSheetAt(0); - this.ExportInternal(sheet, model); - using var ms = new MemoryStream(); - wk.Write(ms); - return File(ms.ToArray(), "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", $"教师列表_{DateTime.Now.ToString("yyyy_MM-dd_HH_mm_ss")}.xlsx"); - } - - private IQueryable Query(QueryTeacherModel model) - { - var userName = User.Identity.Name; - var organId = this._userRepo.ReadOnlyTable().Where(o => o.UserName == userName).Select(o => o.OrganId).FirstOrDefault(); - model.OrganId = model.OrganId.HasValue ? model.OrganId : organId; - if (User.IsInRole("局管理员")) - { - model.Organs = this._organRepo.Table().ToList().Where(o => o.ParentId == null).ToList(); - } - else - { - model.Organs = this._organRepo.ReadOnlyTable().ToList().Where(o => o.Id == organId).ToList(); - } - var query = this._userRepo.ReadOnlyTable().Include(o => o.Organ).Include(o => o.Teacher).AsQueryable(); - if (User.IsInRole("局管理员")) - { - //全部数据 - } - else if (User.IsInRole("校管理员")) - { - query = query.Where(o => o.OrganId == organId); - } - else - { - query = query.Where(o => o.UserName == userName); - } - query = query - .WhereIf(!string.IsNullOrEmpty(model.RequestEditStatus), o => o.Teacher.RequestEditStatus == model.RequestEditStatus) - .WhereIf(!string.IsNullOrEmpty(model.CheckStatus), o => o.Teacher.CheckStatus == model.CheckStatus) - .WhereIf(!string.IsNullOrEmpty(model.RealName), o => o.RealName.Contains(model.RealName)); - return query; - } - private void ExportInternal(ISheet sheet, QueryTeacherModel model) { var style = sheet.Workbook.CreateCellStyle(); @@ -353,7 +370,7 @@ namespace TeacherExt.Controllers .ToList() .Select(o => { - var m = o.Teacher != null ? o.Teacher.To() : new EditTeacherModel { Id=Guid.Empty}; + var m = o.Teacher != null ? o.Teacher.To() : new EditTeacherModel { Id = Guid.Empty }; if (o.Teacher != null) { this.EntityToModel(o.Teacher, m); @@ -378,21 +395,21 @@ namespace TeacherExt.Controllers row.Order(02).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(teacher.UserType); row.Order(03).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(teacher.RealName); row.Order(04).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(teacher.Sex); - row.Order(05).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(teacher.Birthday.HasValue? teacher.Birthday.Value.ToString("yyyy-MM"):""); - row.Order(06).CreateCell(++colIndex).SetStyle(style).SetType(CellType.Numeric).SetCellValue(teacher.Age.HasValue? teacher.Age.Value:0); + row.Order(05).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(teacher.Birthday.HasValue ? teacher.Birthday.Value.ToString("yyyy-MM") : ""); + row.Order(06).CreateCell(++colIndex).SetStyle(style).SetType(CellType.Numeric).SetCellValue(teacher.Age.HasValue ? teacher.Age.Value : 0); row.Order(07).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(teacher.Nation); row.Order(08).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(teacher.NativePlace); row.Order(09).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(teacher.PhoneNumber); row.Order(10).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(teacher.IdNumber); - row.Order(11).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(teacher.JobStart.HasValue? teacher.JobStart.Value.ToString("yyyy-MM"):""); - row.Order(12).CreateCell(++colIndex).SetStyle(style).SetType(CellType.Numeric).SetCellValue(teacher.JobAge.HasValue?teacher.JobAge.Value:0); + row.Order(11).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(teacher.JobStart.HasValue ? teacher.JobStart.Value.ToString("yyyy-MM") : ""); + row.Order(12).CreateCell(++colIndex).SetStyle(style).SetType(CellType.Numeric).SetCellValue(teacher.JobAge.HasValue ? teacher.JobAge.Value : 0); row.Order(13).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(teacher.TeachDate.HasValue ? teacher.TeachDate.Value.ToString("yyyy-MM") : ""); row.Order(14).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(teacher.CurrentJobStart.HasValue ? teacher.CurrentJobStart.Value.ToString("yyyy-MM") : ""); row.Order(15).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(teacher.Politics); row.Order(16).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(teacher.JoinPartyDate.HasValue ? teacher.JoinPartyDate.Value.ToString("yyyy-MM") : ""); row.Order(17).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(teacher.MaxTitle); - row.Order(18).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(teacher.MaxTitleStart.HasValue? teacher.MaxTitleStart.Value.ToString("yyyy-MM"):""); - if(teacher.IsJobAsMaxTitle.HasValue) + row.Order(18).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(teacher.MaxTitleStart.HasValue ? teacher.MaxTitleStart.Value.ToString("yyyy-MM") : ""); + if (teacher.IsJobAsMaxTitle.HasValue) { if (teacher.IsJobAsMaxTitle.Value) { @@ -442,7 +459,7 @@ namespace TeacherExt.Controllers row.Order(44).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(teacher.MainTeachGrade); row.Order(45).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(teacher.OtherTeachPeriod); row.Order(46).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(teacher.OtherTeachSubject); - if(teacher.HasPosition.HasValue) + if (teacher.HasPosition.HasValue) { if (teacher.HasPosition.Value) { @@ -531,7 +548,7 @@ namespace TeacherExt.Controllers } } - public void EntityToModel(Teacher entity, EditTeacherModel model) + private void EntityToModel(Teacher entity, EditTeacherModel model) { if (entity != null) { @@ -548,8 +565,7 @@ namespace TeacherExt.Controllers } } - - public void ToEditModel(Teacher entity, EditTeacherModel model) + private void ToEditModel(Teacher entity, EditTeacherModel model) { ViewData.SelectList(o => model.RequestEditStatus, () => this.GetRequestEditStatus(model.RequestEditStatus)); ViewData.SelectList(o => model.CheckStatus, () => this.GetCheckStatus(model.CheckStatus)); @@ -615,6 +631,7 @@ namespace TeacherExt.Controllers "女", }.ToSelectList(selected); } + private SelectList GetNation(string selected) { return new string[] { @@ -695,6 +712,7 @@ namespace TeacherExt.Controllers "其他民主党派", }.ToSelectList(selected); } + private SelectList GetTitle(string selected) { return new string[] { @@ -730,6 +748,7 @@ namespace TeacherExt.Controllers "十二级", }.ToSelectList(selected); } + private SelectList GetEducationGrade(string selected) { return new string[] { @@ -737,6 +756,7 @@ namespace TeacherExt.Controllers "专技十二级", }.ToSelectList(selected); } + private SelectList GetFullTimeSchoolType(string selected) { return new string[] { @@ -746,6 +766,7 @@ namespace TeacherExt.Controllers "非师范院校非师范专业", }.ToSelectList(selected); } + private SelectList GetEducation(string selected) { return new string[] { @@ -760,6 +781,7 @@ namespace TeacherExt.Controllers "其他", }.ToSelectList(selected); } + private SelectList GetDegree(string selected) { return new string[] { @@ -768,6 +790,7 @@ namespace TeacherExt.Controllers "博士学位", }.ToSelectList(selected); } + private SelectList GetTeachPeriod(string selected) { return new string[] { @@ -776,6 +799,7 @@ namespace TeacherExt.Controllers "普通初中", }.ToSelectList(selected); } + private SelectList GetTeachSubject(string selected) { return new string[] { @@ -800,6 +824,7 @@ namespace TeacherExt.Controllers "无", }.ToSelectList(selected); } + private SelectList GetTeachGrade(string selected) { return new string[] { @@ -817,6 +842,7 @@ namespace TeacherExt.Controllers "幼儿园小班", }.ToSelectList(selected); } + private SelectList GetPosition(string selected) { return new string[] { @@ -835,6 +861,7 @@ namespace TeacherExt.Controllers "总务副主任", }.ToSelectList(selected); } + private SelectList GetTeacherCardType(string selected) { return new string[] { @@ -847,6 +874,7 @@ namespace TeacherExt.Controllers "高等学校教师资格", }.ToSelectList(selected); } + private SelectList GetLangLevel(string selected) { return new string[] { @@ -857,6 +885,7 @@ namespace TeacherExt.Controllers "三级甲等", }.ToSelectList(selected); } + private SelectList GetAddressArea(string selected) { return new string[] { @@ -867,5 +896,19 @@ namespace TeacherExt.Controllers }.ToSelectList(selected); } + private IActionResult Result(object model) + { + if (this.IsJsonRequest()) + { + return Json(new + { + schema = this.GetJsonSchema(), + model, + errors = ModelState.Where(o => o.Value.ValidationState == ModelValidationState.Invalid), + data = ViewData + }, new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver(), ReferenceLoopHandling = ReferenceLoopHandling.Ignore }); + } + return View(model); + } } } diff --git a/labs/Teacher/TeacherExt/Startup.cs b/labs/Teacher/TeacherExt/Startup.cs index 8c5541ef..7cdb137d 100644 --- a/labs/Teacher/TeacherExt/Startup.cs +++ b/labs/Teacher/TeacherExt/Startup.cs @@ -1,4 +1,5 @@ -using Infrastructure.Data; +using Infrastructure.Application.Services.Settings; +using Infrastructure.Data; using Infrastructure.Extensions; using Infrastructure.Security; using Infrastructure.Web; @@ -11,6 +12,7 @@ using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.IdentityModel.Tokens; +using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Linq; @@ -34,19 +36,21 @@ namespace TeacherExt } public IConfiguration Configuration { get; } + public IHostEnvironment HostEnvironment { get; } public void ConfigureServices(IServiceCollection services) { + services.AddSwaggerGen(); services.AddSingleton(HtmlEncoder.Create(UnicodeRanges.All)); services.AddHttpContextAccessor(); - services.AddCors(options => options.AddPolicy(_origins,builder => - { - builder.SetIsOriginAllowed(o => true) - .AllowAnyMethod() - .AllowAnyHeader() - .AllowCredentials(); - })); + services.AddCors(options => options.AddPolicy(_origins, builder => + { + builder.SetIsOriginAllowed(o => true) + .AllowAnyMethod() + .AllowAnyHeader() + .AllowCredentials(); + })); var connstr = HostEnvironment.IsDevelopment() ? Configuration.GetConnectionString("sqlite") : Configuration.GetConnectionString("mysql"); if (HostEnvironment.IsDevelopment()) { @@ -56,11 +60,29 @@ namespace TeacherExt { services.AddDbContext(o => o.UseMySql(connstr, ServerVersion.AutoDetect(connstr))); } + services.AddDistributedMemoryCache(); services.AddScoped(); services.AddTransient(typeof(IRepository<>), typeof(EfRepository<>)); services.AddTransient(); + services.AddTransient(); + services.AddTransient(); services.AddTransient(); - services.AddControllersWithViews(); + services.AddMvc() + .AddNewtonsoftJson() + .AddControllersAsServices(); + services.AddControllers() + .ConfigureApiBehaviorOptions(options => + { + options.SuppressConsumesConstraintForFormFileParameters = true; + options.SuppressInferBindingSourcesForParameters = true; + options.SuppressModelStateInvalidFilter = true; + options.SuppressMapClientErrors = true; + //options.ClientErrorMapping[404].Link = "https://httpstatuses.com/404"; + }) + .AddNewtonsoftJson(o => + { + o.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore; + }); services.AddAuthentication(x => { x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; @@ -81,14 +103,14 @@ namespace TeacherExt { OnTokenValidated = context => { - if (context.SecurityToken == null) + if (context.SecurityToken == null) { context.Fail("token error"); } else if (DateTime.UtcNow > context.SecurityToken.ValidTo) { context.Fail("token time out"); - } + } return Task.CompletedTask; }, OnForbidden = context => @@ -116,10 +138,13 @@ namespace TeacherExt { context.Token = context.Request.Query["access_token"]; } - var jwtCookieName = context.HttpContext.GetJwtCookieName(); - if (!context.Request.Headers.ContainsKey("Authorization") && context.Request.Cookies.Keys.Contains(jwtCookieName)) + else { - context.Token = context.Request.Cookies[jwtCookieName]; + var jwtCookieName = context.HttpContext.GetJwtCookieName(); + if (!context.Request.Headers.ContainsKey("Authorization") && context.Request.Cookies.Keys.Contains(jwtCookieName)) + { + context.Token = context.Request.Cookies[jwtCookieName]; + } } } return Task.CompletedTask; @@ -136,10 +161,11 @@ namespace TeacherExt { app.UseDeveloperExceptionPage(); } - else + app.UseSwagger(); + app.UseSwaggerUI(c => { - app.UseExceptionHandler("/Home/Error"); - } + c.SwaggerEndpoint("/swagger/v1/swagger.json", "My API V1"); + }); app.UseStaticFiles(); app.UseRouting(); app.UseCors(_origins); @@ -163,10 +189,11 @@ namespace TeacherExt db.Set().Add(new Role { Name = "教职工" }); db.SaveChanges(); - db.Set().Add(new Organ { - Name="教育局", - Number="jiaoyuju", - Children=new List { + db.Set().Add(new Organ + { + Name = "教育局", + Number = "jiaoyuju", + Children = new List { new Organ { Name="学校1", @@ -177,17 +204,18 @@ namespace TeacherExt Name="学校2", Number="xuexiao2" } - } + } }); db.SaveChanges(); - db.Set().Add(new User { - UserName="admin", - PasswordSalt=salt, - PasswordHash=password, - RealName="教育局管理员", - OrganId = db.Set().FirstOrDefault(o=>o.Number=="jiaoyuju").Id, - UserRoles=new List { new UserRole { RoleId=db.Set().FirstOrDefault(o=>o.Name== "局管理员").Id} } + db.Set().Add(new User + { + UserName = "admin", + PasswordSalt = salt, + PasswordHash = password, + RealName = "教育局管理员", + OrganId = db.Set().FirstOrDefault(o => o.Number == "jiaoyuju").Id, + UserRoles = new List { new UserRole { RoleId = db.Set().FirstOrDefault(o => o.Name == "局管理员").Id } } }); db.Set().Add(new User { diff --git a/labs/Teacher/TeacherExt/TeacherExt.csproj b/labs/Teacher/TeacherExt/TeacherExt.csproj index 101dcb34..6944a066 100644 --- a/labs/Teacher/TeacherExt/TeacherExt.csproj +++ b/labs/Teacher/TeacherExt/TeacherExt.csproj @@ -9,18 +9,9 @@ - - - - - - - - - - + - +