You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 21:45:03