我想让员工注册和登录使用用户名和密码(1:1关系).但是在Swagger UI中有一些错误,该参数检查照片以获取更多信息:Errorand the parameter I want username and pass
代码中没有错误,我多次尝试更改AuthController.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; }
}
DBcontext.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;
}
// User registration
[HttpPost("register")]
public async Task<IActionResult> Register([FromBody] User userRegistration)
{
if (await _context.Users.AnyAsync(u => u.Username == userRegistration.Username))
{
return BadRequest("Username is already taken.");
}
var user = new User
{
Username = userRegistration.Username,
Password = PasswordHash.HashPassword(userRegistration.Password)
};
_context.Users.Add(user);
await _context.SaveChangesAsync();
return Ok("User registered successfully.");
}
// User login
[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("Invalid username or password.");
}
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);
}
}
}
Employee.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;
}
// GET: api/employees
[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
};
}
// Soft delete an employee
[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();
}
// Update an employee
[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();
}
// Update the properties you want to change
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();
}
}
}
1条答案
按热度按时间ecfdbz9o1#
如果你解释属性下面的红线,它是你的平台的拼写检查器,是可验证的。
你的代码是真的,如果你的代码运行没有任何错误,不要注意红线和去。