如何用后端实现账号登录的接口

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中实现一个基本的账号登录接口。根据项目的具体需求,你可能需要添加更多的功能和安全措施。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值