Swagger UI参数异常:员工注册登录接口参数与预期不符
问题描述
需求:实现员工通过用户名和密码完成注册与登录功能,User与Employee为一对一关联。
问题:Swagger UI中接口参数显示异常,与预期的用户名、密码参数不符(错误截图显示参数包含Employee相关字段,预期仅显示Username和Password)。代码无编译错误,多次修改AuthController.cs后问题仍未解决。
Employee.cs(模型)
using System; using System.ComponentModel.DataAnnotations; public class Employee { public int Id { get; set; } public string? FirstName { get; set; } public string? LastName { get; set; } [RegularExpression(@"^\+222\d{7}$")] public string? PhoneNumber { get; set; } public string? Department { get; set; } public DateTime CreatedAt { get; set; } public DateTime UpdatedAt { get; set; } public bool IsDeleted { get; set; } public User User { get; set; } }
User.cs(模型)
using System.ComponentModel.DataAnnotations; public class User { public int Id { get; set; } [Required] public string Username { get; set; } [Required] public string Password { get; set; } public Employee Employee { get; set; } }
DataContext.cs
using Microsoft.EntityFrameworkCore; public class DataContext : DbContext { public DataContext(DbContextOptions<DataContext> options) : base(options) { } public DbSet<User> Users { get; set; } public DbSet<Employee> Employees { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<User>() .HasOne(u => u.Employee) .WithOne(e => e.User) .HasForeignKey<Employee>(e => e.Id); base.OnModelCreating(modelBuilder); } }
AuthController.cs
using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using Microsoft.IdentityModel.Tokens; using System; using System.IdentityModel.Tokens.Jwt; using System.Security.Claims; using System.Text; using System.Threading.Tasks; using EmployeeAPI.Models; namespace EmployeeAPI.Controllers { [Route("api/auth")] [ApiController] public class AuthController : ControllerBase { private readonly IConfiguration _configuration; private readonly DataContext _context; public AuthController(DataContext context, IConfiguration configuration) { _context = context; _configuration = configuration; } // 用户注册 [HttpPost("register")] public async Task<IActionResult> Register([FromBody] User userRegistration) { if (await _context.Users.AnyAsync(u => u.Username == userRegistration.Username)) { return BadRequest("用户名已被占用。"); } var user = new User { Username = userRegistration.Username, Password = PasswordHash.HashPassword(userRegistration.Password) }; _context.Users.Add(user); await _context.SaveChangesAsync(); return Ok("用户注册成功。"); } // 用户登录 [HttpPost("login")] public async Task<IActionResult> Login([FromBody] User userLogin) { var user = await _context.Users.SingleOrDefaultAsync(u => u.Username == userLogin.Username); if (user == null || !PasswordHash.VerifyPassword(userLogin.Password, user.Password)) { return BadRequest("用户名或密码无效。"); } var token = GenerateJwtToken(user); return Ok(new { Token = token }); } private string GenerateJwtToken(User user) { var securityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["Jwt:Key"])); var credentials = new SigningCredentials(securityKey, SecurityAlgorithms.HmacSha256); var claims = new[] { new Claim(JwtRegisteredClaimNames.Sub, user.Username), new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()) }; var token = new JwtSecurityToken( _configuration["Jwt:Issuer"], _configuration["Jwt:Issuer"], claims, expires: DateTime.Now.AddMinutes(30), signingCredentials: credentials ); return new JwtSecurityTokenHandler().WriteToken(token); } } }
EmployeeController.cs
using EmployeeAPI.Models; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using System; using System.Linq; using System.Threading.Tasks; namespace EmployeeAPI.Controllers { [Authorize] [Route("api/employees")] [ApiController] public class EmployeeController : ControllerBase { private readonly DataContext _context; public EmployeeController(DataContext context) { _context = context; } // 获取员工列表 [HttpGet] public async Task<ActionResult<PagedResult<Employee>>> GetEmployees(int page = 1, int pageSize = 10, string department = null) { var username = User.Identity.Name; var query = _context.Employees.AsQueryable(); if (!string.IsNullOrEmpty(department)) { query = query.Where(e => e.Department == department); } query = query.Where(e => e.User.Username == username); var totalItems = await query.CountAsync(); var employees = await query.Skip((page - 1) * pageSize).Take(pageSize).ToListAsync(); return new PagedResult<Employee> { Page = page, PageSize = pageSize, TotalItems = totalItems, Data = employees }; } // 软删除员工 [HttpDelete("{id}")] public async Task<IActionResult> SoftDeleteEmployee(int id) { var username = User.Identity.Name; var employee = await _context.Employees.FirstOrDefaultAsync(e => e.Id == id && e.User.Username == username); if (employee == null) { return NotFound(); } employee.IsDeleted = true; employee.UpdatedAt = DateTime.UtcNow; await _context.SaveChangesAsync(); return NoContent(); } // 更新员工信息 [HttpPut("{id}")] public async Task<IActionResult> UpdateEmployee(int id, Employee updatedEmployee) { var username = User.Identity.Name; var existingEmployee = await _context.Employees.FirstOrDefaultAsync(e => e.Id == id && e.User.Username == username); if (existingEmployee == null) { return NotFound(); } // 更新需要修改的属性 existingEmployee.FirstName = updatedEmployee.FirstName; existingEmployee.LastName = updatedEmployee.LastName; existingEmployee.PhoneNumber = updatedEmployee.PhoneNumber; existingEmployee.Department = updatedEmployee.Department; existingEmployee.UpdatedAt = DateTime.UtcNow; await _context.SaveChangesAsync(); return NoContent(); } } }
内容的提问来源于stack exchange,提问作者user20663939
相关产品推荐
相关产品推荐

