1,首先创建一个自己项目的文件
打开vs新建项目 选择带有API的
2,创建一个model文件夹在里面创建一个User表
3.RoleId可以忽略,在controllers文件夹里创建一个UserController(右键-添加-类),创建一个数据库和表,代码为
public string CodeFisrt()
{
try
{
// 1、生成数据库
_db.DbMaintenance.CreateDatabase();
var tlist = _db.DbMaintenance.GetTableInfoList();
// 判断数据库表是否存在,如果存在就删除
if (tlist != null && tlist.Count > 0)
{
tlist.ForEach(t =>
{
// 删除表
_db.DbMaintenance.DropTable(t.Name);
});
}
// 2、通过实体反射生成表
string nspace = "beautyManagement.Model";
// 定义一个数组,获取程序集里特定命名空间下的所有类
Type[] ass = Assembly.LoadFrom(AppContext.BaseDirectory + "beautyManagement.dll").GetTypes()
.Where(p => p.Namespace == nspace).ToArray();
// 获取数据库实例 _db
// 使用CodeFirst反射表,字符串默认长度200
_db.CodeFirst.SetStringDefaultLength(200).InitTables(ass);
//3、添加测试数据
Role role = new Role()
{
Name = "admin",
Description = "超级管理员"
};
//插入数据
_db.Insertable(role).ExecuteCommand();
//查询到名称为admin的数据
Role role1=_db.Queryable<Role>().Where(r => r.Name == "admin").First();
User user = new User()
{
Name = "测试",
Email = "Test",
Password = "123456",
//把admin数据的id放到user里
RoleId=role.Id
};
// 把数据插入数据库
_db.Insertable(user).ExecuteCommand();
return "数据库初始化成功!";
}
catch (Exception ex) {
return ex.Message;
}
}
再写get请求 加入新增 删除 编辑
// 写Get请求,返回ok
[HttpGet]
public string GetOk() {
return "ok!!";
}
//ffffffffffffffffffffffffffffff
// 查询全部数据
[HttpGet]
[Authorize(Roles="admin")]
public List<User> GetUserAll()
{
return _userService.GetUserAll();
}
// 根据id查询
[HttpGet]
public User GetUserById(int id)
{
return _userService.GetUserById(id);
}
// 新增用户
[HttpPost]
public int AddUser([FromBody] User user) // 如果这个形参是实体类,需要配合使用[FromBody],这样才接收到值
{
return _userService.AddUser(user);
}
[HttpPost]
public User UpdateUser([FromBody] User user)
{
return _userService.UpdateUser(user);
}
[HttpPost]
public string DeleteUser(int id)
{
return _userService.DeleteUser(id);
}
如图添加
需要在appsettings.json里配置好自己的数据库
4.在services里面创建一个Imp文件夹和添加一个IUserService文件
IUserService内的代码为
using beautyManagement.Model;
using beautyManagement.Tool;
namespace beautyManagement.Services
{
public interface IUserService
{
// 用来定义方法
/// <summary>
/// 获取全部用户
/// </summary>
/// <returns></returns>
List<User> GetUserAll();
/// <summary>
/// 根据id查询
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
User GetUserById(int id);
/// <summary>
/// 新增用户
/// </summary>
/// <param name="user"></param>
/// <returns></returns>
int AddUser(User user);
/// <summary>
/// 更新修改用户
/// </summary>
/// <param name="user"></param>
/// <returns></returns>
User UpdateUser(User user);
/// <summary>
/// 删除用户
/// </summary>
/// <param name="user"></param>
/// <returns></returns>
string DeleteUser(int id);
//登录
ApiResponse<User> Login(string name, string password,string id, string code);
ApiResponse<User> Register(User user);
ApiResponse<PageResult<User>> GetAllPage(int pageNumber, int pageSize);
}
}
5.再在Imp内创建一个UserServiceImp接口
代码为
using beautyManagement.Config;
using beautyManagement.Model;
using beautyManagement.Tool;
using beautyManagement.Tool.Jwt;
using Lazy.Captcha.Core;
namespace beautyManagement.Services.Imp
{
public class UserServiceImp : IUserService
{
private readonly beautyContext _beautyContext; // 上下文私有成员
private readonly CustomJWTService _customJWTService;
private readonly ICaptcha _captcha;
public UserServiceImp(beautyContext beautyContext, CustomJWTService customJWTService,ICaptcha captcha) // 构造函数注入
{
_beautyContext = beautyContext;
_customJWTService = customJWTService;
_captcha = captcha;
}
// 用来实现接口的方法,并实现逻辑
public int AddUser(User user)
{
// 调用新增,新增用户
_beautyContext.user.Add(user);
// 保存(提交)到数据库表
_beautyContext.SaveChanges();
return 1;
}
public string DeleteUser(int id)
{
// 先查询到用户
User user = _beautyContext.user.AsQueryable().Where(p => p.Id == id).First();
// 判断是否存在
if (user == null)
{
return "找不到此用户";
}
// 存在则删除
_beautyContext.user.Remove(user);
_beautyContext.SaveChangesAsync();
return "删除成功!";
}
public ApiResponse<PageResult<User>> GetAllPage(int pageNumber, int pageSize)
{
//计算总数
var pageCount=_beautyContext.user.LongCount();
//应用分页查询
var users=_beautyContext.user.Skip((pageNumber - 1) * pageSize).Take(pageSize).ToList();
PageResult<User> result = new PageResult<User>
{
Items = users,
PageNumber = pageNumber,
PageSize = pageSize,
TotalCount = (int)pageCount,
};
return new ApiResponse<PageResult<User>>
{
StatusCode = 200,
Message = "查询成功",
Data = result
};
}
public List<User> GetUserAll() // 查询全部
{
return _beautyContext.user.AsQueryable().ToList();
}
public User GetUserById(int id)
{
// 根据id查询,如果输入id等于数据库中存在的id,那拿出第一条数据
var user = _beautyContext.user.AsQueryable().Where(p => p.Id == id);
// 如果user等于空,则返回空信息
if (!user.Any())
{
return null;
}
return user.First();
}
// 登录
public ApiResponse<User> Login(string name, string password,string id,string code)
{
//判断验证码是否正确
if(!_captcha.Validate(id, code))
{
return new ApiResponse<User> { StatusCode = 500, Message = "验证码不正确!", Data = null };
}
// 1、查询账号是否存在
var users = _beautyContext.user.AsQueryable().Where(p => p.Name == name);
// 数据是否存在
if (users.Any()) {
// 2、该账号的密码是否匹配
User user = users.First();
//查询指定用户的角色
Role? role= _beautyContext.role.AsQueryable().Where(r => r.Id == user.RoleId).First();
if (user.Password == password)
{
// 3、返回登录成功消息
return new ApiResponse<User>
{
StatusCode = 200,
Message = "登录成功!",
Data = user,
Token=_customJWTService.GetToken(user, role.Name)
};
}
// 密码不正确提示
return new ApiResponse<User> { StatusCode = 500, Message = "密码不正确!", Data = null };
}
// 账号不存在提示
return new ApiResponse<User> { StatusCode = 500, Message = "账号不存在,请去注册!", Data = null };
}
public ApiResponse<User> Register(User user)
{
throw new NotImplementedException();
}
public User UpdateUser(User user) // 修改用户
{
// 首先根据id查询到要修改的数据
User user1 = _beautyContext.user.AsQueryable().Where(p => p.Id == user.Id).First();
// 把查询出来的数据修改
user1.Name = user.Name;
user1.Email = user.Email;
user1.Password = user.Password;
user1.Picture = user.Picture;
// 保存提交到数据库表
_beautyContext.SaveChangesAsync();
return user1;
}
}
}
6.最后去Program.cs里把服务层注入到容器
完成所有没有报错就运行代码就成功写好接口了
运行代码,可以自己测试一下接口o不ok
7. 测试登录接口
使用Postman或其他API测试工具来测试你的登录接口。发送一个POST请求到/api/auth/login
,并在请求体中提供用户名和密码。
8. 安全性和改进
- 密码哈希:确保在存储用户密码时使用强哈希算法(如bcrypt)。
- HTTPS:在生产环境中使用HTTPS来保护数据传输。
- JWT令牌:实现JWT令牌生成和验证逻辑,以支持无状态认证。
- 错误处理:添加适当的错误处理逻辑,避免在失败登录尝试时泄露敏感信息。
- 输入验证:对用户输入进行验证,以防止SQL注入和其他安全问题。
通过这些步骤,你可以在ASP.NET Core中实现一个基本的账号登录接口。根据项目的具体需求,你可能需要添加更多的功能和安全措施。