using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using static asg_form.Controllers.excel; using System.Security.Claims; using static asg_form.Controllers.login; using Microsoft.AspNetCore.Authorization; using Newtonsoft.Json.Linq; using RestSharp; using static asg_form.blog; using static asg_form.Controllers.schedule; using NLog; using System.Security.Authentication; using System.Text.Json; using Microsoft.AspNetCore.SignalR; using asg_form.Controllers.Hubs; using Mirai.Net.Data.Shared; using MimeKit; using MailKit.Net.Smtp; using Mirai.Net.Utils.Scaffolds; using Mirai.Net.Sessions.Http.Managers; using asg_form.Controllers.Store; using static asg_form.Controllers.Store.Storehttp; using Flandre.Framework; using Flandre.Core.Common; using Flandre.Core.Messaging; using Mirai.Net.Data.Messages.Concretes; using Flandre.Core.Messaging.Segments; using System.Runtime.Serialization; using System.Net; namespace asg_form.Controllers { public class admin : ControllerBase { private readonly RoleManager roleManager; private readonly UserManager userManager; private readonly IHubContext hubContext; public admin( RoleManager roleManager, UserManager userManager, IHubContext hubContext) { this.roleManager = roleManager; this.userManager = userManager; this.hubContext = hubContext; } [Route("api/v1/admin/allperson_c")] [HttpGet] [Authorize] public async Task> getalladmin_c() { int a = await userManager.Users.CountAsync(); return Ok(a); } [Route("api/v1/admin/allteam_c")] [HttpGet] [Authorize] public async Task> getteam_c() { TestDbContext testDb = new TestDbContext(); int a = testDb.Forms.Count(); if (a >= 100) { } return Ok(a); } [Route("api/v1/admin/statistics")] [HttpGet] [Authorize] [ResponseCache(Duration = 600)] public async Task> all_total() { TestDbContext testDb = new TestDbContext(); int form_t = testDb.Forms.Count(); int user_t = userManager.Users.Count(); int sh_t = testDb.team_Games.Count(); int team_log_t = testDb.schlogs.Count(); int role_t = testDb.Roles.Count(); return new { form_t = form_t, user_t = user_t, sh_t = sh_t, sh_log_t = team_log_t, role_t = role_t }; } [Route("api/v1/admin/updata_img")] [HttpPost] public async Task> update_img(IFormFile imageFile) { if (imageFile == null || imageFile.Length == 0) return BadRequest("Invalid image file."); // 将文件保存到磁盘 var filePath = Path.Combine(Directory.GetCurrentDirectory(), "loge/", $"friend-{imageFile.FileName}"); using (var stream = new FileStream(filePath, FileMode.Create)) { await imageFile.CopyToAsync(stream); } // 返回成功响应 return Ok("Image file uploaded successfully."); } [Route("api/v1/admin/dbgu")] [HttpPost] public async Task> dbgu() { using(TestDbContext db=new TestDbContext()) { await db.Database.MigrateAsync(); } return Ok("successfully."); } [Route("api/v1/admin/Privacy_Policy")] [HttpPost] [Authorize] public async Task> Privacy_Policy([FromBody] string rule_markdown) { if (!this.User.FindAll(ClaimTypes.Role).Any(a => a.Value == "admin")) { return BadRequest(new error_mb { code = 400, message = "无权访问" }); } System.IO.File.WriteAllText(AppDomain.CurrentDomain.BaseDirectory + $"doc/rule/隐私政策.md", rule_markdown); return Ok("添加成功!"); } public class qqmsg { public string type { get; set;} public string content { get; set; } } [Route("api/v1/admin/post_qqbotmsg")] [HttpPost] [Authorize] public async Task> post_qqbotmsg([FromBody] string msg,string qqgrope,string atuserqq) { if (!this.User.FindAll(ClaimTypes.Role).Any(a => a.Value == "admin")) { return BadRequest(new error_mb { code = 400, message = "无权访问" }); } var message= new MessageBuilder().Add(new AtSegment(atuserqq)).Text(msg).Build(); await runbot.runbotr.SendMessageAsync(MessageEnvironment.Channel,qqgrope,null,message,qqgrope); return Ok("成功!"); } [Route("api/v2/admin/post_qqbotmsg")] [HttpPost] [Authorize] public async Task> post_qqbotmsgv2([FromBody] List qqmsgs, string qqgrope) { if (!this.User.FindAll(ClaimTypes.Role).Any(a => a.Value == "admin")) { return BadRequest(new error_mb { code = 400, message = "无权访问" }); } var message = new MessageBuilder(); foreach (var item in qqmsgs) { switch (item.type) { case "text": message.Text(item.content); break; case "image": message.Image(GetImageByte(item.content)); break; case "at": message.Add(new AtSegment(item.content)); break; default: message.Text("不支持的消息类型"); break; } } message.Build(); await runbot.runbotr.SendMessageAsync(MessageEnvironment.Channel, qqgrope, null, message, qqgrope); return Ok("成功!"); } //把url图片转换为byte数组 public static byte[] GetImageByte(string url) { HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); HttpWebResponse response = (HttpWebResponse)request.GetResponse(); Stream stream = response.GetResponseStream(); BinaryReader reader = new BinaryReader(stream); byte[] bytes = reader.ReadBytes(int.MaxValue); return bytes; } [Route("api/v1/admin/allschedle_c")] [HttpGet] [Authorize] public async Task> getschedle_c() { TestDbContext testDb = new TestDbContext(); int a = testDb.team_Games.Count(); return Ok(a); } /// /// 获取所有用户-支持分页 /// /// /// /// [Route("api/v1/admin/allperson")] [HttpGet] [Authorize] public async Task>> getalladmin(short page, short page_long = 10) { if (this.User.FindAll(ClaimTypes.Role).Any(a => a.Value == "admin")) { int a = userManager.Users.Count(); int b = page_long * page; if (page_long * page > a) { b = a; } var users = userManager.Users.Skip(page_long * page - page_long).Take(page_long).ToList(); List user = new List(); foreach (var auser in users) { bool isadmin = await userManager.IsInRoleAsync(auser, "admin"); var roles = await userManager.GetRolesAsync(auser); user.Add(new post_user { id = auser.Id, chinaname = auser.chinaname, name = auser.UserName, isadmin = isadmin, email = auser.Email, Roles = (List)roles, officium = auser.officium }); } return user; } else { return BadRequest(new error_mb { code = 400, message = "无权访问" }); } } [Route("api/v1/admin/userfind/{userid}")] [HttpGet] [Authorize] public async Task> getuser(long userid) { if (!this.User.FindAll(ClaimTypes.Role).Any(a => a.Value == "admin")) { return BadRequest(new error_mb { code = 400, message = "无权访问" }); } return await userManager.Users.Select(a => new { a.Id, a.Email, a.chinaname, a.UserName, a.Integral, a.officium }).FirstAsync(a=>a.Id==userid); } /// /// 获取所有用户-支持分页(整合api:allperson_c) /// /// 搜索关键字 /// 页码,默认为1 /// 每页大小,默认为10 /// 部门筛选条件 /// 返回分页后的用户列表及总数 [Route("api/v2/admin/allperson")] [HttpGet] [Authorize] public async Task> GetAdminUsersV2(string? keyword = null, short pageindex = 1, short pagesize = 10, string? officium = null) { // 检查用户是否有管理员权限 if (!this.User.HasClaim(ClaimTypes.Role, "admin")) { return BadRequest(new error_mb { code = 400, message = "无权访问" }); } var query = userManager.Users.AsQueryable(); // 根据关键词和部门进行过滤 if (!string.IsNullOrEmpty(keyword)) { query = query.Where(u => u.chinaname.Contains(keyword) || u.UserName == keyword || u.Email == keyword); } if (!string.IsNullOrEmpty(officium)) { query = query.Where(u => u.officium == officium); } // 获取总记录数 int total = await query.CountAsync(); // 分页查询 var paginatedUsers = await query.Paginate(pageindex, pagesize) .Select(u => new { u.Id, u.Email, u.chinaname, u.UserName, u.Integral, u.officium, u.qqnumber, u.roleListName, u.roleListCode }) .ToListAsync(); // 构建返回结果 var result = new all_record { cout = total, msg = paginatedUsers }; return Ok(result); } public class post_user_v2 { public int Count { get; set; } public List user { get; set; } = new List(); } /// /// 设置管理员,需要superadmin /// /// /// [Route("api/v1/admin/setadmin")] [HttpPost] [Authorize] public async Task> setadmin(string userid) { if (this.User.FindAll(ClaimTypes.Role).Any(a => a.Value == "admin")) { var ouser = await userManager.FindByIdAsync(userid); await userManager.AddToRoleAsync(ouser, "admin"); return Ok(new { message = "用户成功设置为管理员" }); } else { return BadRequest(new error_mb { code = 400, message = "无权访问" }); } } /// /// 设置用户权限口 /// [Route("api/v1/admin/setRight")] [HttpPost] [Authorize] public async Task> opRight(userRights msg) { if (!this.User.FindAll(ClaimTypes.Role).Any(a => a.Value == "nbadmin")) { return BadRequest(new error_mb { code = 400, message = "无权访问" }); } using (var db = new TestDbContext()) { var user = await userManager.FindByIdAsync(msg.userId); if (user == null) { return BadRequest(new error_mb { code = 404, message = "用户未找到" }); } try { user.roleListCode = msg.roleListCode; user.roleListName = msg.roleListName; await userManager.UpdateAsync(user); return Ok(new { code = 200, message = "成功存入" ,msg}); }catch (Exception ex) { return Ok(new { code = 500, message = "服务器错误", ex }); } } } public class userRights { public string userId { get; set; } public string? roleListCode { get; set; } public string? roleListName { get; set; } } /// /// 设置管理员,需要superadmin /// /// /// [Route("api/v1/admin/removeadmin")] [HttpPost] [Authorize] public async Task> removeadmin(string userid) { if (this.User.FindAll(ClaimTypes.Role).Any(a => a.Value == "admin")) { var ouser = await userManager.FindByIdAsync(userid); await userManager.RemoveFromRoleAsync(ouser, "admin"); return Ok(new { message = "用户成功设置为管理员" }); } else { return BadRequest(new error_mb { code = 400, message = "无权访问" }); } } //管理员设置用户的职位 [Route("api/v1/admin/setop")] [HttpPost] [Authorize] public async Task> setrole(string userid, string opname) { if (this.User.FindAll(ClaimTypes.Role).Any(a => a.Value == "admin")) { var ouser = await userManager.FindByIdAsync(userid); ouser.officium = opname; await userManager.UpdateAsync(ouser); return "成功!"; } else { return BadRequest(new error_mb { code = 400, message = "无权访问" }); } } /// /// 发送邮件 /// /// 收件人邮箱 /// 标题 /// 发送内容 /// public static bool SendEmail(string email1, string title, string content) { var message = new MimeMessage(); message.From.Add(new MailboxAddress("ASG管理员", "admin@idvasg.cn")); message.To.Add(new MailboxAddress("用户", email1)); message.Subject = title; message.Body = new TextPart("html") { Text = content }; var client = new SmtpClient(); try { client.SslProtocols = System.Security.Authentication.SslProtocols.Tls12; client.Connect("smtp.zeptomail.com.cn", 587, false); client.Authenticate("emailapikey", "eiwqDPhYvz0JfAQUxXs1c7O73eRiDb3M8/Gf5RApUPFGGubJSXsdBgtmpwu3IVEtfn3yErFsaKxyy8T14VUn85QSbSlYs6Cq+CaF7ISNMHtAL/6LeVmGwh9Qhwk1b6IDW6AK/kk2B53nNw=="); client.Send(message); client.Disconnect(true); } catch (Exception e) { Console.Write(e.Message); } return true; } public class tmpUserAdd { public string UserName { get; set; } public string Password { get; set; } public string chinaname { get; set; } public string? qqnumber { get; set; } } /// /// 管理员直接添加一个用户 /// /// /// /// [Route("api/v1/admin/enroll")] [HttpPost] [Authorize] public async Task> Post([FromBody] tmpUserAdd newuser) { if (this.User.FindAll(ClaimTypes.Role).Any(a => a.Value == "nbadmin")) { var maxId = await userManager.Users.MaxAsync(u => u.Id); User? user = await this.userManager.FindByNameAsync(newuser.UserName); if (user == null) { user = new User { Id = maxId + 1, UserName = newuser.UserName, chinaname = newuser.chinaname, EmailConfirmed = true,Integral=0 }; var r = await userManager.CreateAsync(user, newuser.Password); if (!r.Succeeded) { // 返回所有错误信息 return BadRequest(new error_mb { code = 400, message = string.Join(", ", r.Errors.Select(e => e.Description)) }); } return newuser; } return BadRequest(new error_mb { code = 400, message = "此邮件已被使用" }); } else { return BadRequest(new error_mb { code = 400, message = "无权访问" }); } } /// /// 删除用户,需要superadmin /// /// /// [Route("api/v1/admin/deluser")] [HttpDelete] [Authorize] public async Task> deluser(string userid) { if (this.User.FindAll(ClaimTypes.Role).Any(a => a.Value == "admin")) { var setuser = await userManager.FindByIdAsync(userid); await userManager.DeleteAsync(setuser); logger.Warn($"管理员删除了用户{setuser.UserName}!"); return "成功!"; } else { return BadRequest(new error_mb { code = 400, message = "无权访问" }); } } public class setoffium { public string userid { get; set; } public string officium { get; set; } } /// /// 设置职位,需要superadmin /// /// /// [Route("api/v1/admin/officium")] [HttpPost] [Authorize] public async Task> setofficium([FromBody]setoffium stof ) { if (this.User.FindAll(ClaimTypes.Role).Any(a => a.Value == "admin")) { var ouser = await userManager.FindByIdAsync(stof.userid); ouser.officium = stof.officium; await userManager.UpdateAsync(ouser); logger.Warn($"设置了{ouser.UserName}的职位为{stof.officium}"); SendEmail(ouser.Email, "ASG赛事组", $@"
{ouser.chinaname} ,欢迎加入ASG赛事组。
欢迎
欢迎{ouser.chinaname}加入ASG赛事组。
你的职位已经被设置为{stof.officium}。
  • 对此次执行有疑问请联系我们的QQ:2667210109。
  • 请不要回复此邮件。如果你需要帮助,请联系我们。
  • 请加入对应职位的群聊。
版权所有 ASG赛事官网
"); return "成功!"; } else { return BadRequest(new error_mb { code = 400, message = "无权访问" }); } } /// /// 给所有form两两随机组队 /// /// /// [Route("api/v1/admin/team/")] [HttpPost] public async Task> team([FromBody] int[] formid, string game_tag) { if (this.User.FindAll(ClaimTypes.Role).Any(a => a.Value == "admin")) { TestDbContext ctx = new TestDbContext(); var form = ctx.Forms.Include(a => a.events).OrderBy(a => Guid.NewGuid()).Where(a => formid.Any(b => b == a.Id)).ToList(); string teamname1 = ""; string teamname2 = ""; for (int i = 0; i < form.Count; i++) { if (i % 2 == 0) { teamname1 = form[i].team_name; } else { teamname2 = form[i].team_name; ctx.team_Games.Add(new team_game { team1_name = teamname1, team2_name = teamname2, opentime = DateTime.Now.ToString(), team1_piaoshu = 0, team2_piaoshu = 0, commentary = "待公布", referee = "待公布", belong = form[1].events.name, tag = game_tag }); // await Task.Delay(6000); } } await ctx.SaveChangesAsync(); logger.Info($"管理员已经随机分组"); return "OK"; } return BadRequest(new error_mb { code = 400, message = "无权访问" }); } [Route("api/v1/admin/SendEmail/")] [HttpPost] public async Task> Sendemail(string To, string Title, string msg) { SendEmail(To, Title, msg); return Ok(); } /// /// 删除表单 /// /// 表单id /// 表单密码 /// [Route("api/v1/admin/form/")] [HttpDelete] public async Task> delform(int formid) { if (this.User.FindAll(ClaimTypes.Role).Any(a => a.Value == "admin")) { TestDbContext ctx = new TestDbContext(); var form = await ctx.Forms.Include(a => a.role).FirstOrDefaultAsync(a => a.Id == formid); var users = await userManager.Users.Include(a => a.haveform).Where(a => a.haveform == form).ToListAsync(); try { foreach (var user in users) { user.haveform = null; await userManager.UpdateAsync(user); } } catch { } ctx.Forms.Remove(form); ; await ctx.SaveChangesAsync(); logger.Warn($"管理员删除了表单{formid},参赛选手:{string.Join(',', form.role.Select(a => a.role_name))}"); return Ok("删除成功!"); } else { return BadRequest(new error_mb { code = 400, message = "无权访问" }); } } //管理员设置用户的职位 [Route("api/v1/admin/Friend")] [HttpPost] [Authorize] public async Task> Add_Friend(T_Friend friend) { if (this.User.FindAll(ClaimTypes.Role).Any(a => a.Value == "admin")) { using (TestDbContext ctx = new TestDbContext()) { ctx.T_Friends.Add(friend); await ctx.SaveChangesAsync(); } return "成功!"; } else { return BadRequest(new error_mb { code = 400, message = "无权访问" }); } } //管理员设置用户的职位 [Route("api/v1/admin/Friend")] [HttpPut] [Authorize] public async Task> Put_Friend(T_Friend friend, int friend_id) { if (this.User.FindAll(ClaimTypes.Role).Any(a => a.Value == "admin")) { using (TestDbContext ctx = new TestDbContext()) { var friend_p = ctx.T_Friends.First(a => a.id == friend_id); friend_p.comMsg = friend.comMsg; friend_p.comTime = friend.comTime; friend_p.account = friend.account; friend_p.orgName = friend.orgName; friend_p.headName = friend.headName; friend_p.degree = friend.degree; friend_p.comType = friend.comType; friend_p.headTel = friend.headTel; await ctx.SaveChangesAsync(); } return "成功!"; } else { return BadRequest(new error_mb { code = 400, message = "无权访问" }); } } [Route("api/v1/admin/Friend")] [HttpDelete] [Authorize] public async Task> Del_Friend(long friend_id) { if (this.User.FindAll(ClaimTypes.Role).Any(a => a.Value == "admin")) { using (TestDbContext ctx = new TestDbContext()) { var friend = await ctx.T_Friends.FirstAsync(a => a.id == friend_id); ctx.Remove(friend); await ctx.SaveChangesAsync(); } return "成功!"; } else { return BadRequest(new error_mb { code = 400, message = "无权访问" }); } } [Route("api/v1/admin/Friend")] [HttpGet] public async Task> Get_Friend(short page, short page_long) { using (TestDbContext ctx = new TestDbContext()) { int Total = ctx.T_Friends.Count(); int b = page_long * page; if (page_long * page > Total) { b = Total; } var friend = await ctx.T_Friends.OrderByDescending(a => a.degree).Skip(page_long * page - page_long).Take(page_long).ToListAsync(); object body = new { friend, Total }; return Ok(body); } } private readonly Logger logger = LogManager.GetCurrentClassLogger(); } }