From 772525a9b6892d26bdf5458ec6b603d544e0c057 Mon Sep 17 00:00:00 2001 From: ceruIean Date: Wed, 23 Feb 2022 17:19:19 +0800 Subject: [PATCH] 2022 jphd-3dprint --- Controllers/SubmissionController.cs | 170 ++++++++--- Data/BackendContext.cs | 3 + ....cs => 20220223070103_initial.Designer.cs} | 39 ++- ...9_initial.cs => 20220223070103_initial.cs} | 25 +- Migrations/BackendContextModelSnapshot.cs | 49 ++- Models/SMS.cs | 3 +- Models/Student.cs | 29 +- Models/Submission.cs | 2 +- Pages/Message/Index.cshtml | 1 + Pages/Message/Index.cshtml.cs | 136 ++++++--- Pages/Sessions/Index.cshtml.cs | 281 +++++++++++------- Pages/Students/Details.cshtml | 34 ++- Pages/Students/Index.cshtml.cs | 47 ++- Program.cs | 10 +- Startup.cs | 1 + Utils/CipherHelper.cs | 92 ++++++ Utils/TencentSMS.cs | 17 +- appsettings.json | 1 + 18 files changed, 712 insertions(+), 228 deletions(-) rename Migrations/{20220222090619_initial.Designer.cs => 20220223070103_initial.Designer.cs} (86%) rename Migrations/{20220222090619_initial.cs => 20220223070103_initial.cs} (86%) create mode 100644 Utils/CipherHelper.cs diff --git a/Controllers/SubmissionController.cs b/Controllers/SubmissionController.cs index b5a24a5..677045f 100644 --- a/Controllers/SubmissionController.cs +++ b/Controllers/SubmissionController.cs @@ -7,20 +7,52 @@ using System.Collections.Generic; using System.Linq; using System.Text.Json; using System.Threading.Tasks; +using System.Security.Cryptography; namespace _2021_backend.Controllers { - [Route("api/submit")] + + + [Route("api")] public class SubmissionController : Controller { - public BackendContext Context; + + public BackendContext context; public SubmissionController(BackendContext context) { - Context = context; + this.context = context; } - [HttpPost] - public async Task Post([FromForm] string dto) + + [HttpPost("checkCaptcha")] + public async Task CheckCaptcha([FromQuery] string stuid, [FromQuery] string captcha) + { + var stu = context.Students.FirstOrDefault(e => e.Stuid == stuid); + if (stu == null) return Ok(ApiResponse.Error("INVALID_STUID")); + else if (captcha == stu.LastCaptcha) + { + if (DateTime.Now - stu.LastCaptchaTime > TimeSpan.FromMinutes(15)) return Ok(ApiResponse.Error("CAPTCHA_TIMEOUT")); + return Ok(ApiResponse.Success("success")); + } + else return Ok(ApiResponse.Error("INVALID_CAPTCHA")); + } + + + [HttpPost("getCaptcha")] + public async Task GetCaptcha([FromQuery] string stuid) + { + + var stu = context.Students.FirstOrDefault(e => e.Stuid == stuid); + if (stu == null) return Ok(ApiResponse.Error("INVALID_STUID")); + else if (DateTime.Now - stu.LastCaptchaTime < TimeSpan.FromMinutes(1)) return Ok(ApiResponse.Error("ALREADY_SENT")); + var result = await TencentSMS.Send(context, SMSType.Captcha, stu, "smsbot"); + if (!result) return Ok(ApiResponse.Error("SEND_ERROR")); + return Ok(ApiResponse.Success("success")); + } + + + [HttpPost("submit")] + public async Task PostSubmit([FromForm] string dto) { var aDto = JsonSerializer.Deserialize(dto); string ip = Request.Headers["X-Real-IP"].FirstOrDefault(); @@ -29,48 +61,47 @@ namespace _2021_backend.Controllers if (aDto.Check() == false) return StatusCode(400, ApiResponse.Error("TICKET_NOT_LEGEAL")); Submission sub = new Submission(aDto, ip); - foreach (var tm in Context.Sessions) + foreach (var tm in context.Sessions) { if(aDto.Timelist != null)if (aDto.Timelist.Any(it => it.Day.Day == tm.Day.Day && it.BeginTime.TimeOfDay == tm.BeginTime.TimeOfDay)) { sub.Timelist.Add(tm.Id); } } - var q = Context.Students.Where(stu => (stu.Name == aDto.Name || stu.Stuid == aDto.Stuid)); + var q = context.Students.Where(stu => (stu.Name == aDto.Name || stu.Stuid == aDto.Stuid)); Student stu; if (q.Count() == 0) { stu = Student.create(sub); stu.Status = status.刚报名; - Context.Students.Add(stu); + context.Students.Add(stu); + context.SaveChanges(); + sub.Host = stu.Id; + context.Submissions.Add(sub); + context.SaveChanges(); + stu.Submissions.Add(sub.Id); + context.SaveChanges(); } else { stu = q.FirstOrDefault(); + sub.Host = stu.Id; + context.Submissions.Add(sub); + context.SaveChanges(); stu.Update(sub); + context.SaveChanges(); } - sub.Host = stu.Id; - Context.Submissions.Add(sub); - Context.SaveChanges(); - await TencentSMS.Send(Context, SMSType.Signed, stu, _2021_backend.Models.User.Bot.stuID); + + await TencentSMS.Send(context, SMSType.Signed, stu, _2021_backend.Models.User.Bot.stuID); return Ok(ApiResponse.Success("success")); } - } - [ApiController] - [Route("api/sessionlist")] - public class SessionlistContoller : Controller - { - private readonly BackendContext _context; - public SessionlistContoller(BackendContext context) - { - _context = context; - } - [HttpGet] + + [HttpGet("sessionlist")] public IActionResult GetSessions() { - var query = _context.Sessions.OrderBy(r => r.Day).ThenBy(r => r.BeginTime).ThenBy(r => r.Place).Where(e => e.Capacity > e.Students.Count).Select(r => new SessionDto + var query = context.Sessions.OrderBy(r => r.Day).ThenBy(r => r.BeginTime).ThenBy(r => r.Place).Where(e => e.Capacity > e.Students.Count).Select(r => new SessionDto { BeginTime = r.BeginTime, Day = r.Day, @@ -78,22 +109,76 @@ namespace _2021_backend.Controllers return Ok(ApiResponse.Success(query.ToList().FindAll(it => it.Day.Add(it.BeginTime.TimeOfDay).CompareTo(DateTime.Now) > 0).Distinct(new SessionDtoComparer()).ToList())); //return Ok(ApiResponse.Success("报名结束了")); } - } - [ApiController] - [Route("api/postsession")] - public class PostsessionController : Controller - { - private readonly BackendContext Context; - public PostsessionController(BackendContext context) + + + [HttpGet("fileinfo")] + public async Task GetInfo([FromQuery] string? stuid) { - Context = context; - } - [HttpPost] + if (stuid == null || (!context.Students.Any(e => e.Stuid == stuid))) + { + return Ok(ApiResponse.Error("INVALID_STUID")); + } + else + { + var student = context.Students.FirstOrDefault(e => e.Stuid == stuid.ToString()); + if (student.Uploads == null) + { + student.Uploads = new List { }; + context.SaveChangesAsync(); + return Ok(ApiResponse.Error("NO_FILES")); + } + var fileIdx = student.Uploads.Last(); + var file = context.FileDesc.Find(fileIdx); + var oldNameSplit = file.Name.Split("."); + var oldName = ""; + var oldNameExtension = oldNameSplit.LastOrDefault(); + for (int i = 0; i < oldNameSplit.Count() - 1; i++) + { + oldName += oldNameSplit[i]; + } + file.Path = "***.***.****"; + if (oldName.Count() >= 2) + { + file.Name = $"{oldName[0]}***{oldName}.{oldNameExtension}"; + } + else + { + file.Name = $"**.{oldNameExtension}"; + } + return Ok(ApiResponse.Success(file)); + + } + + } + + + + [HttpPost("upload")] + public async Task UploadFile([FromQuery] string? stuid,[FromQuery]string filename, [FromQuery] string filepath, [FromQuery] float fileSizeInKB) + { + var filedesc = new FileDesc { Name = filename, Path = $"jphd-3dprint-2022.oss-cn-hangzhou.aliyuncs.com/uploads/{stuid}/{filename}", Size = Convert.ToInt32(fileSizeInKB), UploadTime = DateTime.Now }; + if (!context.Students.Any(e => e.Stuid == stuid)) return Ok(ApiResponse.Error("INVALID_STUID")); + else + { + var s = context.Students.First(e => e.Stuid == stuid); + filedesc.OwnerId = s.Id; + if (s.Uploads == null) s.Uploads = new List { }; + context.FileDesc.Add(filedesc); + await context.SaveChangesAsync(); + s.Uploads.Add(filedesc.Id); + s.Status = status.已提交; + await context.SaveChangesAsync(); + return Ok(ApiResponse.Success("success")); + } + + } + + [HttpPost("postsession")] public async Task Post([FromQuery] string stuid, [FromQuery] string selection) { - Student stu = Context.Students.FirstOrDefault(r => r.Stuid == stuid); + Student stu = context.Students.FirstOrDefault(r => r.Stuid == stuid); if (stu == null) { return StatusCode(400, ApiResponse.Error("INVALID_STUDENT_int")); @@ -110,31 +195,32 @@ namespace _2021_backend.Controllers }; //get the selected session ints; int targetSession = 0; - var sessions = Context.Sessions.ToList(); + var sessions = context.Sessions.ToList(); var s = sessions.Find((Session s) => { return time.Day == s.Day && time.BeginTime == s.BeginTime; }); var overwritten = false; if (s.Students.Count >= s.Capacity) return Ok(ApiResponse.Error("OUT_OF_CAPACITY")); - if (Context.Sessions.Find(stu.InterviewTime) != null) + if (context.Sessions.Find(stu.InterviewTime) != null) { - var olds = Context.Sessions.Find(stu.InterviewTime); + var olds = context.Sessions.Find(stu.InterviewTime); olds.Students.Remove(stu.Id); - Context.SaveChanges(); + context.SaveChanges(); overwritten = true; } targetSession = s.Id; s.Students.Add(stu.Id); - stu.Timelist = new List { targetSession}; + stu.Timelist = new List { targetSession }; stu.Status = status.已选时间; stu.InterviewTime = s.Id; - await TencentSMS.Send(Context, SMSType.TimeSet, stu, "smsbot"); - Context.SaveChanges(); + await TencentSMS.Send(context, SMSType.TimeSet, stu, "smsbot"); + context.SaveChanges(); if (overwritten) return Ok(ApiResponse.Success("overwritten")); return Ok(ApiResponse.Success("success")); //return Ok(ApiResponse.Success("报名结束了")); } } + } \ No newline at end of file diff --git a/Data/BackendContext.cs b/Data/BackendContext.cs index f58711b..74df51a 100644 --- a/Data/BackendContext.cs +++ b/Data/BackendContext.cs @@ -16,6 +16,8 @@ namespace _2021_backend.Data public DbSet Students { get; set; } public DbSet SMS { get; set; } + public DbSet FileDesc { get; set; } + protected override void OnModelCreating(ModelBuilder mb) { mb.Entity() @@ -28,6 +30,7 @@ namespace _2021_backend.Data .HasKey(u => u.Id); mb.Entity() .HasKey(u => u.Id); + mb.Entity().HasKey(u => u.Id); } } } diff --git a/Migrations/20220222090619_initial.Designer.cs b/Migrations/20220223070103_initial.Designer.cs similarity index 86% rename from Migrations/20220222090619_initial.Designer.cs rename to Migrations/20220223070103_initial.Designer.cs index d981e82..1b3537a 100644 --- a/Migrations/20220222090619_initial.Designer.cs +++ b/Migrations/20220223070103_initial.Designer.cs @@ -13,7 +13,7 @@ using _2021_backend.Data; namespace _2021_backend.Migrations { [DbContext(typeof(BackendContext))] - [Migration("20220222090619_initial")] + [Migration("20220223070103_initial")] partial class initial { protected override void BuildTargetModel(ModelBuilder modelBuilder) @@ -51,6 +51,34 @@ namespace _2021_backend.Migrations b.ToTable("Comments"); }); + modelBuilder.Entity("_2021_backend.Models.FileDesc", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Name") + .HasColumnType("text"); + + b.Property("OwnerId") + .HasColumnType("integer"); + + b.Property("Path") + .HasColumnType("text"); + + b.Property("Size") + .HasColumnType("integer"); + + b.Property("UploadTime") + .HasColumnType("timestamp with time zone"); + + b.HasKey("Id"); + + b.ToTable("FileDesc"); + }); + modelBuilder.Entity("_2021_backend.Models.Session", b => { b.Property("Id") @@ -140,6 +168,12 @@ namespace _2021_backend.Migrations b.Property("InterviewTime") .HasColumnType("integer"); + b.Property("LastCaptcha") + .HasColumnType("text"); + + b.Property("LastCaptchaTime") + .HasColumnType("timestamp with time zone"); + b.Property("LastSubmission") .HasColumnType("timestamp with time zone"); @@ -176,6 +210,9 @@ namespace _2021_backend.Migrations b.Property>("Timelist") .HasColumnType("integer[]"); + b.Property>("Uploads") + .HasColumnType("integer[]"); + b.Property("Yard") .HasColumnType("integer"); diff --git a/Migrations/20220222090619_initial.cs b/Migrations/20220223070103_initial.cs similarity index 86% rename from Migrations/20220222090619_initial.cs rename to Migrations/20220223070103_initial.cs index f14fefb..e26fa0b 100644 --- a/Migrations/20220222090619_initial.cs +++ b/Migrations/20220223070103_initial.cs @@ -27,6 +27,23 @@ namespace _2021_backend.Migrations table.PrimaryKey("PK_Comments", x => x.Id); }); + migrationBuilder.CreateTable( + name: "FileDesc", + columns: table => new + { + Id = table.Column(type: "integer", nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + OwnerId = table.Column(type: "integer", nullable: false), + Name = table.Column(type: "text", nullable: true), + Size = table.Column(type: "integer", nullable: false), + Path = table.Column(type: "text", nullable: true), + UploadTime = table.Column(type: "timestamp with time zone", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_FileDesc", x => x.Id); + }); + migrationBuilder.CreateTable( name: "Sessions", columns: table => new @@ -81,13 +98,16 @@ namespace _2021_backend.Migrations Exp = table.Column(type: "integer", nullable: false), InterviewTime = table.Column(type: "integer", nullable: false), Submissions = table.Column>(type: "integer[]", nullable: true), + Uploads = table.Column>(type: "integer[]", nullable: true), Messages = table.Column>(type: "integer[]", nullable: true), Timelist = table.Column>(type: "integer[]", nullable: true), Comments = table.Column>(type: "integer[]", nullable: true), Score = table.Column(type: "integer", nullable: false), Status = table.Column(type: "integer", nullable: false), LastSubmission = table.Column(type: "timestamp with time zone", nullable: false), - RegisterTime = table.Column(type: "timestamp with time zone", nullable: false) + RegisterTime = table.Column(type: "timestamp with time zone", nullable: false), + LastCaptcha = table.Column(type: "text", nullable: true), + LastCaptchaTime = table.Column(type: "timestamp with time zone", nullable: false) }, constraints: table => { @@ -141,6 +161,9 @@ namespace _2021_backend.Migrations migrationBuilder.DropTable( name: "Comments"); + migrationBuilder.DropTable( + name: "FileDesc"); + migrationBuilder.DropTable( name: "Sessions"); diff --git a/Migrations/BackendContextModelSnapshot.cs b/Migrations/BackendContextModelSnapshot.cs index 1bef7f3..89d8dea 100644 --- a/Migrations/BackendContextModelSnapshot.cs +++ b/Migrations/BackendContextModelSnapshot.cs @@ -46,7 +46,35 @@ namespace _2021_backend.Migrations b.HasKey("Id"); - b.ToTable("Comments", (string)null); + b.ToTable("Comments"); + }); + + modelBuilder.Entity("_2021_backend.Models.FileDesc", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Name") + .HasColumnType("text"); + + b.Property("OwnerId") + .HasColumnType("integer"); + + b.Property("Path") + .HasColumnType("text"); + + b.Property("Size") + .HasColumnType("integer"); + + b.Property("UploadTime") + .HasColumnType("timestamp with time zone"); + + b.HasKey("Id"); + + b.ToTable("FileDesc"); }); modelBuilder.Entity("_2021_backend.Models.Session", b => @@ -81,7 +109,7 @@ namespace _2021_backend.Migrations b.HasKey("Id"); - b.ToTable("Sessions", (string)null); + b.ToTable("Sessions"); }); modelBuilder.Entity("_2021_backend.Models.SMS", b => @@ -112,7 +140,7 @@ namespace _2021_backend.Migrations b.HasKey("Id"); - b.ToTable("SMS", (string)null); + b.ToTable("SMS"); }); modelBuilder.Entity("_2021_backend.Models.Student", b => @@ -138,6 +166,12 @@ namespace _2021_backend.Migrations b.Property("InterviewTime") .HasColumnType("integer"); + b.Property("LastCaptcha") + .HasColumnType("text"); + + b.Property("LastCaptchaTime") + .HasColumnType("timestamp with time zone"); + b.Property("LastSubmission") .HasColumnType("timestamp with time zone"); @@ -174,12 +208,15 @@ namespace _2021_backend.Migrations b.Property>("Timelist") .HasColumnType("integer[]"); + b.Property>("Uploads") + .HasColumnType("integer[]"); + b.Property("Yard") .HasColumnType("integer"); b.HasKey("Id"); - b.ToTable("Students", (string)null); + b.ToTable("Students"); }); modelBuilder.Entity("_2021_backend.Models.Submission", b => @@ -231,7 +268,7 @@ namespace _2021_backend.Migrations b.HasKey("Id"); - b.ToTable("Submissions", (string)null); + b.ToTable("Submissions"); }); modelBuilder.Entity("_2021_backend.Models.User", b => @@ -256,7 +293,7 @@ namespace _2021_backend.Migrations b.HasKey("Id"); - b.ToTable("Users", (string)null); + b.ToTable("Users"); }); #pragma warning restore 612, 618 } diff --git a/Models/SMS.cs b/Models/SMS.cs index 98177f9..298e200 100644 --- a/Models/SMS.cs +++ b/Models/SMS.cs @@ -13,7 +13,8 @@ namespace _2021_backend.Models TimeSelect, TimeSet, Signed, - Reply + Reply, + Captcha, } public class SMS { diff --git a/Models/Student.cs b/Models/Student.cs index ee7ef3f..8a51add 100644 --- a/Models/Student.cs +++ b/Models/Student.cs @@ -15,6 +15,7 @@ namespace _2021_backend.Models 需调整时间, 已确认时间, 不通过, + 已提交, 已评分, 暂缺 } @@ -48,8 +49,21 @@ namespace _2021_backend.Models 暂缺 = 0, 萌新 = 1, 略有了解 = 2, - 了解较多 = 3, - 轻车熟路 = 4 + 轻车熟路 = 3, + } + + public class FileDesc + { + [Key] + public int Id { get; set; } + + public int OwnerId { get; set; } + public string Name { get; set; } + public int Size { get; set; } + + public string Path { get; set; } + + public DateTime UploadTime { get; set; } } public class Student @@ -91,7 +105,6 @@ namespace _2021_backend.Models student.Yard = sub.Yard; student.Exp = sub.Exp; student.Timelist = sub.Timelist; - student.Submissions.Add(sub.Id); student.RegisterTime = sub.SubmitTime; return student; } @@ -122,8 +135,12 @@ namespace _2021_backend.Models [Display(Name = "最终场次")] public int InterviewTime { get; set; } - [Display(Name = "提交记录")] + [Display(Name = "报名记录")] public List Submissions { get; set; } + + [Display(Name = "提交的文件")] + public List Uploads { get; set; } + [Display(Name = "短信记录")] public List Messages { get; set; } [Display(Name = "可选场次")] @@ -143,5 +160,9 @@ namespace _2021_backend.Models [Display(Name = "报名时间")] [DataType(DataType.DateTime)] public DateTime RegisterTime { get; set; } + + public string LastCaptcha { get; set; } + + public DateTime LastCaptchaTime { get; set; } } } diff --git a/Models/Submission.cs b/Models/Submission.cs index 55efc65..fd24bc6 100644 --- a/Models/Submission.cs +++ b/Models/Submission.cs @@ -121,7 +121,7 @@ namespace _2021_backend.Models if (Major.Length > 20) return false; if (Yard >= 6 && Yard <= 0) return false; - if (Exp >= 5 && Exp <= 0) return false; + if (Exp >= 3 && Exp <= 0) return false; if (!r.IsMatch(Email)) { return false; diff --git a/Pages/Message/Index.cshtml b/Pages/Message/Index.cshtml index e61a7c6..ef7da36 100644 --- a/Pages/Message/Index.cshtml +++ b/Pages/Message/Index.cshtml @@ -9,6 +9,7 @@ @Html.DisplayFor(model => Model.Errmsg)

发送短信

+
diff --git a/Pages/Message/Index.cshtml.cs b/Pages/Message/Index.cshtml.cs index 7c141d3..1b4b00f 100644 --- a/Pages/Message/Index.cshtml.cs +++ b/Pages/Message/Index.cshtml.cs @@ -40,7 +40,7 @@ namespace _2021_backend.Pages.Message Context = context; } - public IActionResult Construct(int PageId) + public IActionResult Construct(int PageId, string emsg) { List stus; IQueryable q; @@ -62,101 +62,149 @@ namespace _2021_backend.Pages.Message int count = (PageId + 1) * pageSize > cnt ? (cnt - PageId * pageSize) : pageSize; Messages = Messages.GetRange(PageId * pageSize, count); + Errmsg = emsg; + return Page(); } public async Task OnGetAsync(int PageId) { - return Construct(PageId); + return Construct(PageId, ""); } public async Task OnPostAsync(int PageId) { - return Construct(PageId); + return Construct(PageId, ""); } public async void OnPostPullAsync(int PageId) { - - var stu = Context.Students.ToList(); - foreach (var e in stu) + if (HttpContext.User.HasClaim((c) => { - await Utils.TencentSMS.Pull(Context, e, true); - } + return c.Type == ClaimTypes.Role && ( + c.Value == "admin" || c.Value == "manager"); + })) + { + var stu = Context.Students.ToList(); + foreach (var e in stu) + { + await Utils.TencentSMS.Pull(Context, e, true); + } - Construct(PageId); + Construct(PageId, ""); + } + else Construct(PageId, "您无权进行此操作"); } public async Task OnPostSignAsync(int PageId) { - - var stu = Context.Students.ToList(); - foreach (var e in stu) + if (HttpContext.User.HasClaim((c) => { - if (e.Status == status.刚报名) - await Utils.TencentSMS.Send(Context, SMSType.Signed, e, Context.Users.Find(int.Parse(User.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Sid).Value)).Name); - } + return c.Type == ClaimTypes.Role && ( + c.Value == "admin" || c.Value == "manager"); + })) + { + var stu = Context.Students.ToList(); + foreach (var e in stu) + { + if (e.Status == status.刚报名) + await Utils.TencentSMS.Send(Context, SMSType.Signed, e, Context.Users.Find(int.Parse(User.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Sid).Value)).Name); + } - return Construct(PageId); + return Construct(PageId, ""); + } + else return Construct(PageId, "您无权进行此操作"); } public async Task OnPostResultRejectAsync(int PageId) { - var stu = Context.Students.ToList(); - foreach (var e in stu) + if (HttpContext.User.HasClaim((c) => { - if (e.Status == status.不通过) + return c.Type == ClaimTypes.Role && ( + c.Value == "admin" || c.Value == "manager"); + })) + { + var stu = Context.Students.ToList(); + foreach (var e in stu) { - if (!Context.SMS.Any(it => it.Host == e.Id && it.Type == SMSType.Reject)) - await Utils.TencentSMS.Send(Context, SMSType.Reject, e, Context.Users.Find(int.Parse(User.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Sid).Value)).Name); + if (e.Status == status.不通过) + { + if (!Context.SMS.Any(it => it.Host == e.Id && it.Type == SMSType.Reject)) + await Utils.TencentSMS.Send(Context, SMSType.Reject, e, Context.Users.Find(int.Parse(User.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Sid).Value)).Name); + } } + return Construct(PageId, ""); } - return Construct(PageId); + else return Construct(PageId, "您无权进行此操作"); } public async Task OnPostTimeSelectAsync(int PageId) { - var stu = Context.Students.ToList(); - foreach (var e in stu) + if (HttpContext.User.HasClaim((c) => { - if (e.Status != status.不通过 && e.Status != status.已选时间) + return c.Type == ClaimTypes.Role && ( + c.Value == "admin" || c.Value == "manager"); + })) + { + var stu = Context.Students.ToList(); + foreach (var e in stu) { - await Utils.TencentSMS.Send(Context, SMSType.TimeSelect, e, Context.Users.Find(int.Parse(User.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Sid).Value)).Name); + if (e.Status != status.不通过 && e.Status != status.已选时间) + { + await Utils.TencentSMS.Send(Context, SMSType.TimeSelect, e, Context.Users.Find(int.Parse(User.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Sid).Value)).Name); + } } + Context.SaveChanges(); + return Construct(PageId, ""); } - Context.SaveChanges(); - return Construct(PageId); + else return Construct(PageId, "您无权进行此操作"); } - public async Task OnPostResultAccpetAsync(int PageId) + public async Task OnPostResultAcceptAsync(int PageId) { - var stu = Context.Students.ToList(); - foreach (var e in stu) + if (HttpContext.User.HasClaim((c) => { - if (e.Status == status.通过) + return c.Type == ClaimTypes.Role && ( + c.Value == "admin" || c.Value == "manager"); + })) + { + var stu = Context.Students.ToList(); + foreach (var e in stu) { - if (!Context.SMS.Any(it => it.Host == e.Id && it.Type == SMSType.Accept)) - await Utils.TencentSMS.Send(Context, SMSType.Accept, e, Context.Users.Find(int.Parse(User.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Sid).Value)).Name); - } + if (e.Status == status.通过) + { + if (!Context.SMS.Any(it => it.Host == e.Id && it.Type == SMSType.Accept)) + await Utils.TencentSMS.Send(Context, SMSType.Accept, e, Context.Users.Find(int.Parse(User.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Sid).Value)).Name); + } + } + return Construct(PageId, ""); } - return Construct(PageId); + else return Construct(PageId, "您无权进行此操作"); } public async Task OnPostTimeSetAsync(int PageId) { - var stu = Context.Students.ToList(); - foreach(var e in stu) + if (HttpContext.User.HasClaim((c) => { - var t = Context.Sessions.Find(e.InterviewTime); - if(t != null && t.Students.Find(s => s==e.Id)!= 0 && e.Status == status.已选时间) + return c.Type == ClaimTypes.Role && ( + c.Value == "admin" || c.Value == "manager"); + })) + { + var stu = Context.Students.ToList(); + foreach (var e in stu) { - await Utils.TencentSMS.Send(Context, SMSType.TimeSet, e, Context.Users.Find(int.Parse(User.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Sid).Value)).Name); - e.Status = status.已确认时间; + var t = Context.Sessions.Find(e.InterviewTime); + if (t != null && t.Students.Find(s => s == e.Id) != 0 && e.Status == status.已选时间) + { + await Utils.TencentSMS.Send(Context, SMSType.TimeSet, e, Context.Users.Find(int.Parse(User.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Sid).Value)).Name); + e.Status = status.已确认时间; + } } + Context.SaveChanges(); + return Construct(PageId, ""); } - Context.SaveChanges(); - return Construct(PageId); + else return Construct(PageId, "您无权进行此操作"); } } } diff --git a/Pages/Sessions/Index.cshtml.cs b/Pages/Sessions/Index.cshtml.cs index a40466a..db13944 100644 --- a/Pages/Sessions/Index.cshtml.cs +++ b/Pages/Sessions/Index.cshtml.cs @@ -8,6 +8,7 @@ using System.Linq; using System.Threading.Tasks; using System.Text.Json; using System.IO; +using System.Security.Claims; namespace _2021_backend.Pages.Sessions { @@ -124,159 +125,227 @@ namespace _2021_backend.Pages.Sessions public async Task OnPostArrangeAsync() { - if (Utils.Arranger.Arrange(Context)) return Construct(""); - else return Construct("排班失败,无法满足条件"); + if (HttpContext.User.HasClaim((c) => + { + return c.Type == ClaimTypes.Role&& ( + c.Value == "admin" || c.Value == "manager"); + })){ + if (Utils.Arranger.Arrange(Context)) return Construct(""); + else return Construct("排班失败,无法满足条件"); + } + else + { + return Construct("您无权进行此操作"); + } } public async Task OnPostClearAllAsync() { - foreach(var s in Context.Students) + + if (HttpContext.User.HasClaim((c) => { - s.InterviewTime = 0; - s.Status = status.需调整时间; - s.Timelist.Clear(); - } - Context.SaveChanges(); - foreach(var s in Context.Sessions) + return c.Type == ClaimTypes.Role && ( + c.Value == "admin" || c.Value == "manager"); + })) { - Context.Sessions.Remove(s); + foreach (var s in Context.Students) + { + s.InterviewTime = 0; + s.Status = status.需调整时间; + s.Timelist.Clear(); + } + Context.SaveChanges(); + foreach (var s in Context.Sessions) + { + Context.Sessions.Remove(s); + } + Context.SaveChanges(); + return Construct(""); + } + else + { + return Construct("您无权进行此操作"); } - Context.SaveChanges(); - return Construct(""); } public async Task OnPostResetAllAsync() { - var stus = Context.Students.ToList(); - foreach (var s in stus) + if (HttpContext.User.HasClaim((c) => { - if(s.Status == status.已选时间) + return c.Type == ClaimTypes.Role && ( + c.Value == "admin" || c.Value == "manager"); + })) + { + + + var stus = Context.Students.ToList(); + foreach (var s in stus) { - s.InterviewTime = 0; - s.Timelist.RemoveAll(it => !Context.Sessions.Any(k => k.Id == it)); - s.Timelist.Sort((int a, int b) => + if (s.Status == status.已选时间) { - var x = Context.Sessions.Find(a); - var y = Context.Sessions.Find(b); - var k1 = x.Day.CompareTo(y.Day); - var k2 = x.BeginTime.CompareTo(y.BeginTime); - return k1 != 0 ? k1 : k2; - }); + s.InterviewTime = 0; + s.Timelist.RemoveAll(it => !Context.Sessions.Any(k => k.Id == it)); + s.Timelist.Sort((int a, int b) => + { + var x = Context.Sessions.Find(a); + var y = Context.Sessions.Find(b); + var k1 = x.Day.CompareTo(y.Day); + var k2 = x.BeginTime.CompareTo(y.BeginTime); + return k1 != 0 ? k1 : k2; + }); + } + } - + Context.SaveChanges(); + foreach (var s in Context.Sessions) + { + s.Students.Clear(); + } + Context.SaveChanges(); + return Construct(""); } - Context.SaveChanges(); - foreach (var s in Context.Sessions) + else { - s.Students.Clear(); + return Construct("您无权进行此操作"); } - Context.SaveChanges(); - return Construct(""); } public async Task OnPostSaveAsync() { - var lst = Context.Sessions.ToList(); - var str = JsonSerializer.Serialize(lst); - Console.WriteLine("Saving arrangement: " + str); - if(!Directory.Exists("./saves")) Directory.CreateDirectory("./saves/"); - System.IO.File.WriteAllText($"./saves/{DateTime.Now.ToString("MM-dd-hh-mm-ss")}.txt", str); - return Construct(""); + if (HttpContext.User.HasClaim((c) => + { + return c.Type == ClaimTypes.Role && ( + c.Value == "admin" || c.Value == "manager"); + })) + { + var lst = Context.Sessions.ToList(); + var str = JsonSerializer.Serialize(lst); + Console.WriteLine("Saving arrangement: " + str); + if (!Directory.Exists("./saves")) Directory.CreateDirectory("./saves/"); + System.IO.File.WriteAllText($"./saves/{DateTime.Now.ToString("MM-dd-hh-mm-ss")}.txt", str); + return Construct(""); + } + else + { + return Construct("您无权进行此操作"); + } } public async Task OnPostTidyAsync() { - var stus = Context.Students.ToList(); - var sess = Context.Sessions.ToList(); - foreach(var i in stus) + if (HttpContext.User.HasClaim((c) => { - var tm = i.Timelist; - var ntm = new List(); - foreach(var j in tm) + return c.Type == ClaimTypes.Role && ( + c.Value == "admin" || c.Value == "manager"); + })) + { + var stus = Context.Students.ToList(); + var sess = Context.Sessions.ToList(); + foreach (var i in stus) { - var k = sess.Find(it => it.Id == j); - ntm.Add(k); - } - ntm.Sort((Session a,Session b) => - { - var x = a.Day.CompareTo(b.Day); - var y = a.BeginTime.CompareTo(b.BeginTime); - return x != 0 ? x : y; - }); - List nl = new List(); - foreach(var j in ntm) - { - if(i.Status != status.不通过 && i.Status != status.通过 && i.Status != status.已确认时间) + var tm = i.Timelist; + var ntm = new List(); + foreach (var j in tm) { - if (j.Day.Date.Add(j.BeginTime.TimeOfDay).CompareTo(DateTime.Now) < 0 || (j.Students.Count >= j.Capacity && !j.Students.Any(k => k ==i.Id) )) continue; - nl.Add(j.Id); + var k = sess.Find(it => it.Id == j); + ntm.Add(k); } - else + ntm.Sort((Session a, Session b) => { - nl.Add(j.Id); + var x = a.Day.CompareTo(b.Day); + var y = a.BeginTime.CompareTo(b.BeginTime); + return x != 0 ? x : y; + }); + List nl = new List(); + foreach (var j in ntm) + { + if (i.Status != status.不通过 && i.Status != status.通过 && i.Status != status.已确认时间) + { + if (j.Day.Date.Add(j.BeginTime.TimeOfDay).CompareTo(DateTime.Now) < 0 || (j.Students.Count >= j.Capacity && !j.Students.Any(k => k == i.Id))) continue; + nl.Add(j.Id); + } + else + { + nl.Add(j.Id); + } + } - + i.Timelist = nl; } - i.Timelist = nl; + Context.SaveChanges(); + return Construct(""); + } + else + { + return Construct("您无权进行此操作"); } - Context.SaveChanges(); - return Construct(""); } public async Task OnPostLoadAsync() { - var str = ""; + if (HttpContext.User.HasClaim((c) => + { + return c.Type == ClaimTypes.Role && ( + c.Value == "admin" || c.Value == "manager"); + })) + { + var str = ""; - List loads = new List(); - if (!string.IsNullOrEmpty(savename)) str = System.IO.File.ReadAllText(savename); - loads = JsonSerializer.Deserialize>(str); + List loads = new List(); + if (!string.IsNullOrEmpty(savename)) str = System.IO.File.ReadAllText(savename); + loads = JsonSerializer.Deserialize>(str); - var stus = Context.Students.ToList(); - foreach (var s in stus) - { - if (s.Status == status.已选时间) + var stus = Context.Students.ToList(); + foreach (var s in stus) { - s.InterviewTime = 0; - s.Timelist.RemoveAll(it => !Context.Sessions.Any(k => k.Id == it)); - s.Timelist.Sort((int a, int b) => + if (s.Status == status.已选时间) { - var x = Context.Sessions.Find(a); - var y = Context.Sessions.Find(b); - var k1 = x.Day.CompareTo(y.Day); - var k2 = x.BeginTime.CompareTo(y.BeginTime); - return k1 != 0 ? k1 : k2; - }); - } - } - Context.SaveChanges(); - foreach (var s in Context.Sessions) - { - s.Students.Clear(); - } - Context.SaveChanges(); - foreach(var item in loads) - { - Session s = Context.Sessions.Find(item.Id); - if(s != null) - { - s.BeginTime = item.BeginTime; - s.Day = item.Day; - s.Capacity = item.Capacity; - s.SendSMS = item.SendSMS; - s.Chiefs = item.Chiefs; - s.Students = new List(); - foreach(var s2 in item.Students) - { - if (Context.Students.Any(k => k.Id == s2)) + s.InterviewTime = 0; + s.Timelist.RemoveAll(it => !Context.Sessions.Any(k => k.Id == it)); + s.Timelist.Sort((int a, int b) => { - Context.Students.Find(s2).InterviewTime = item.Id; - s.Students.Add(s2); + var x = Context.Sessions.Find(a); + var y = Context.Sessions.Find(b); + var k1 = x.Day.CompareTo(y.Day); + var k2 = x.BeginTime.CompareTo(y.BeginTime); + return k1 != 0 ? k1 : k2; + }); + } + } + Context.SaveChanges(); + foreach (var s in Context.Sessions) + { + s.Students.Clear(); + } + Context.SaveChanges(); + foreach (var item in loads) + { + Session s = Context.Sessions.Find(item.Id); + if (s != null) + { + s.BeginTime = item.BeginTime; + s.Day = item.Day; + s.Capacity = item.Capacity; + s.SendSMS = item.SendSMS; + s.Chiefs = item.Chiefs; + s.Students = new List(); + foreach (var s2 in item.Students) + { + if (Context.Students.Any(k => k.Id == s2)) + { + Context.Students.Find(s2).InterviewTime = item.Id; + s.Students.Add(s2); + } } } } + Context.SaveChanges(); + return Construct(""); + } + else + { + return Construct("您无权进行此操作"); } - Context.SaveChanges(); - return Construct(""); } } } diff --git a/Pages/Students/Details.cshtml b/Pages/Students/Details.cshtml index 9c9dd2d..4b8f991 100644 --- a/Pages/Students/Details.cshtml +++ b/Pages/Students/Details.cshtml @@ -82,9 +82,35 @@
给他打分 - - + +
+
+
+ +
+ 作品链接: + @{ + if(Model.Student.Uploads == null) + { +
尚未提交作品
+ } + else + { + var fd = Model.Context.FileDesc.Find(Model.Student.Uploads.Last()); + if (fd == null) + { +
尚未提交作品
+ } + else + { + 点我 + } + } + + } +
+
@@ -161,7 +187,7 @@ - + @@ -293,7 +319,7 @@ -
地点 日期 时间 @Html.DisplayNameFor(model => model.SubmissionSample.Sex) + @Html.DisplayNameFor(model => model.SubmissionSample.Yard) diff --git a/Pages/Students/Index.cshtml.cs b/Pages/Students/Index.cshtml.cs index 4e6189d..45c67ec 100644 --- a/Pages/Students/Index.cshtml.cs +++ b/Pages/Students/Index.cshtml.cs @@ -8,6 +8,7 @@ using System.Collections.Generic; using System.Linq; using _2021_backend.Utils; using System.Threading.Tasks; +using System.Security.Claims; namespace _2021_backend.Pages.Students { @@ -96,26 +97,48 @@ namespace _2021_backend.Pages.Students public async Task OnPostFinalizeAsync(int? pageId, string errInfo) { - if (pageId == null) pageId = 0; - - foreach(var s in Context.Students) + if (HttpContext.User.HasClaim((c) => { - if (s.RegisterTime.CompareTo(new DateTime(2021, 11, 11)) > 0) s.Status = status.不通过; - else if (s.Timelist.Count == 0 && s.Status != status.不通过) s.Status = status.需调整时间; + return c.Type == ClaimTypes.Role && ( + c.Value == "admin" || c.Value == "manager"); + })) + { + if (pageId == null) pageId = 0; + + foreach (var s in Context.Students) + { + if (s.RegisterTime.CompareTo(new DateTime(2021, 11, 11)) > 0) s.Status = status.不通过; + else if (s.Timelist.Count == 0 && s.Status != status.不通过) s.Status = status.需调整时间; + } + Context.SaveChanges(); + return Construct((int)pageId, errInfo); + } + else + { + return Construct(pageId??0, "您无权进行此操作"); } - Context.SaveChanges(); - return Construct((int)pageId, errInfo); } public async Task OnPostReselectAllAsync(int? pageId,string errInfo) { - if (pageId == null) pageId = 0; - foreach (var s in Context.Students) + if (HttpContext.User.HasClaim((c) => { - if (s.Status != status.不通过) s.Status = status.需调整时间; + return c.Type == ClaimTypes.Role && ( + c.Value == "admin" || c.Value == "manager"); + })) + { + if (pageId == null) pageId = 0; + foreach (var s in Context.Students) + { + if (s.Status != status.不通过) s.Status = status.需调整时间; + } + Context.SaveChanges(); + return Construct((int)pageId, errInfo); + } + else + { + return Construct(pageId ?? 0, "您无权进行此操作"); } - Context.SaveChanges(); - return Construct((int)pageId,errInfo); } } } diff --git a/Program.cs b/Program.cs index 0ed0c14..24af241 100644 --- a/Program.cs +++ b/Program.cs @@ -14,6 +14,7 @@ namespace _2021_backend { public class Program { + public static void Main(string[] args) { AppContext.SetSwitch("Npgsql.EnableLegacyTimestampBehavior", true); @@ -28,7 +29,7 @@ namespace _2021_backend context.Database.Migrate(); Console.WriteLine("Migration succeeded."); var config = host.Services.GetRequiredService(); - TencentSMS.Init(config["TENCENT_ID"], config["TENCENT_KEY"], config["SMS_APPID"], config["SMS_ID_ACCEPT"], config["SMS_ID_REJECT"], config["SMS_ID_TIMESET"], config["SMS_ID_SUBMITTED"], config["SMS_ID_TIMESELECT"]); + TencentSMS.Init(config["TENCENT_ID"], config["TENCENT_KEY"], config["SMS_APPID"], config["SMS_ID_ACCEPT"], config["SMS_ID_REJECT"], config["SMS_ID_TIMESET"], config["SMS_ID_SUBMITTED"], config["SMS_ID_TIMESELECT"], config["SMS_ID_CAPTCHA"]); var botname = config["SMSBOT_NAME"]; var q = context.Users.Where(it => it.Name == botname); if (q.Count() == 0) @@ -47,14 +48,13 @@ namespace _2021_backend User.Bot = q.FirstOrDefault(); //do nothing cause I 've already got a bot } - var id = int.Parse("4c20c535-3661-40c7-b4db-ce479675bbd7"); - while (context.Users.Any(e => e.Id == id)) + var name = config["ADMIN_USERNAME"]; + while (context.Users.Any(e => e.stuID == name)) { - context.Users.Remove(context.Users.Find(id)); + context.Users.Remove(context.Users.FirstOrDefault(e => e.stuID == name)); context.SaveChanges(); } var usr = new User(); - usr.Id = id; usr.Name = config["ADMIN_USERNAME"]; usr.isManager = true; usr.Secret = EvaCryptoHelper.Password2Secret(config["ADMIN_PASSWORD"]); diff --git a/Startup.cs b/Startup.cs index f7ffd3f..4518e64 100644 --- a/Startup.cs +++ b/Startup.cs @@ -9,6 +9,7 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using System.Security.Claims; + namespace _2021_backend { public class Startup diff --git a/Utils/CipherHelper.cs b/Utils/CipherHelper.cs new file mode 100644 index 0000000..7c595a1 --- /dev/null +++ b/Utils/CipherHelper.cs @@ -0,0 +1,92 @@ +using System; +using System.IO; +using System.Security.Cryptography; + +namespace _2021_backend.Utils +{ + public static class CipherHelper + { + static byte[] EncryptStringToBytes_Aes(string plainText, byte[] Key, byte[] IV) + { + // Check arguments. + if (plainText == null || plainText.Length <= 0) + throw new ArgumentNullException("plainText"); + if (Key == null || Key.Length <= 0) + throw new ArgumentNullException("Key"); + if (IV == null || IV.Length <= 0) + throw new ArgumentNullException("IV"); + byte[] encrypted; + + // Create an Aes object + // with the specified key and IV. + using (Aes aesAlg = Aes.Create()) + { + aesAlg.Key = Key; + aesAlg.IV = IV; + + // Create an encryptor to perform the stream transform. + ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV); + + // Create the streams used for encryption. + using (MemoryStream msEncrypt = new MemoryStream()) + { + using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write)) + { + using (StreamWriter swEncrypt = new StreamWriter(csEncrypt)) + { + //Write all data to the stream. + swEncrypt.Write(plainText); + } + encrypted = msEncrypt.ToArray(); + } + } + } + + // Return the encrypted bytes from the memory stream. + return encrypted; + } + + static string DecryptStringFromBytes_Aes(byte[] cipherText, byte[] Key, byte[] IV) + { + // Check arguments. + if (cipherText == null || cipherText.Length <= 0) + throw new ArgumentNullException("cipherText"); + if (Key == null || Key.Length <= 0) + throw new ArgumentNullException("Key"); + if (IV == null || IV.Length <= 0) + throw new ArgumentNullException("IV"); + + // Declare the string used to hold + // the decrypted text. + string plaintext = null; + + // Create an Aes object + // with the specified key and IV. + using (Aes aesAlg = Aes.Create()) + { + aesAlg.Key = Key; + aesAlg.IV = IV; + + // Create a decryptor to perform the stream transform. + ICryptoTransform decryptor = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV); + + // Create the streams used for decryption. + using (MemoryStream msDecrypt = new MemoryStream(cipherText)) + { + using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read)) + { + using (StreamReader srDecrypt = new StreamReader(csDecrypt)) + { + + // Read the decrypted bytes from the decrypting stream + // and place them in a string. + plaintext = srDecrypt.ReadToEnd(); + } + } + } + } + + return plaintext; + } + } +} diff --git a/Utils/TencentSMS.cs b/Utils/TencentSMS.cs index 4227641..7375664 100644 --- a/Utils/TencentSMS.cs +++ b/Utils/TencentSMS.cs @@ -9,6 +9,7 @@ using TencentCloud.Common; using TencentCloud.Common.Profile; using TencentCloud.Sms.V20210111; using TencentCloud.Sms.V20210111.Models; +using System.Security.Cryptography; namespace _2021_backend.Utils { @@ -21,12 +22,13 @@ namespace _2021_backend.Utils public static string SMSID_reject { get; set; } public static string SMSID_timeSet { get; set; } public static string SMSID_signed { get; set; } + public static string SMSID_captcha { get; set; } private static bool Initialized = false; private static string SMSID_timeSelect { get; set; } - public static void Init(string tencentid, string tencentKey, string appid, string ID_accept, string ID_reject, string ID_timeSet, string ID_submitted, string ID_timeSelect) + public static void Init(string tencentid, string tencentKey, string appid, string ID_accept, string ID_reject, string ID_timeSet, string ID_submitted, string ID_timeSelect,string ID_captcha) { Tencent_id = tencentid; Tencent_key = tencentKey; @@ -36,6 +38,7 @@ namespace _2021_backend.Utils SMSID_timeSet = ID_timeSet; SMSID_signed = ID_submitted; SMSID_timeSelect = ID_timeSelect; + SMSID_captcha = ID_captcha; Initialized = true; } public static async Task Pull(BackendContext Context, Student stu, bool fullPull) @@ -145,6 +148,18 @@ namespace _2021_backend.Utils req.TemplateParamSet = new string[] { stu.Name }; req.TemplateId = SMSID_signed; break; + case SMSType.Captcha: + sms.Type = SMSType.Captcha; + var captchaBytes = new byte[]{0,0,0,0,0,0}; + RNGCryptoServiceProvider csp = new RNGCryptoServiceProvider(); + csp.GetBytes(captchaBytes); + for (int i = 0; i < 6; i++) captchaBytes[i] %= 10; + string captcha = $"{captchaBytes[0]}{captchaBytes[1]}{captchaBytes[2]}{captchaBytes[3]}{captchaBytes[4]}{captchaBytes[5]}"; + stu.LastCaptcha = captcha; + stu.LastCaptchaTime = DateTime.Now; + req.TemplateParamSet = new string[] { captcha }; + req.TemplateId = SMSID_captcha; + break; } sms.Tel = stu.Tel; sms.Host = stu.Id; diff --git a/appsettings.json b/appsettings.json index 0c67170..1e2182f 100644 --- a/appsettings.json +++ b/appsettings.json @@ -15,6 +15,7 @@ "SMS_ID_SUBMITTED": "1163892", "SMS_ID_TIMESET": "1232109", "SMS_ID_TIMESELECT": "1232577", + "SMS_ID_CAPTCHA": "1312236", "TENCENT_ID": "AKIDYv5JGwKSJtCE0VjhOpyqSotgDTSaYIsF", "TENCENT_KEY": "mPzSimdGenpdCWcT5TcWBboreAQQ9bmh", "SMSBOT_NAME": "msgbot",