9. 实现业务功能--用户登录

这篇具有很好参考价值的文章主要介绍了9. 实现业务功能--用户登录。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1. 顺序图 

2. 参数要求

3. 创建 Service 接口

4. 实现 Service 接口

5. 单体测试

6. 实现 Controller 

7. 实现前端


在用户登录部分特别注意的是需要进行密码校验:

1. MD5(MD5(用户提交的原密码)+数据库查出来的用户的盐)= 密码的密文

2. 用上面的生成的密码的密文和数据库中用户的 password 字段的密码作比较,如果相等,则校验通过,否则失败。

1. 顺序图 

9. 实现业务功能--用户登录,项目,数据库,服务器,运维

2. 参数要求

登录时需要用户提交的参数列表:

参数名 描述 类型 默认值 条件
username 用户名 String 必须
password 密码 String 必须

3. 创建 Service 接口

根据用户名查询用户信息:

public interface IUserService {
    /**
     * 根据用户名查询用户信息
     * @param username 用户名
     * @return
     */
    User selectByName(String username);

    /**
     * 创建普通用户
     *
     * @param user 用户名
     */
    void createNormalUser(User user);

    /**
     * ⽤⼾登录
     * @param username ⽤⼾名
     * @param password 密码
     * @return
     */
    User login(String username, String password);
}

4. 实现 Service 接口

@Slf4j // 日志
@Service // 交给 Spring 管理
public class UserServiceImpl implements IUserService {

    @Resource
    private UserMapper userMapper;

    @Override
    public User selectByName(String username) {
        // 非空校验
        if(StringUtils.isEmpty(username)){
            // 打印日志
            log.warn(ResultCode.FAILED_PARAMS_VALIDATE.toString());
            // 抛出异常
            throw new ApplicationException(AppResult.failed(ResultCode.FAILED_PARAMS_VALIDATE));
        }
        // 根据用户名查询用户信息
        User user = userMapper.selectByName(username);
        // 返回结果
        return user;
    }

    @Override
    public void createNormalUser(User user) {
        // 非空校验
        if(user == null || StringUtils.isEmpty(user.getUsername())
                || StringUtils.isEmpty(user.getNickname())
                || StringUtils.isEmpty(user.getPassword())
                || StringUtils.isEmpty(user.getSalt())){
            // 打印日志
            log.warn(ResultCode.FAILED_PARAMS_VALIDATE.toString());
            // 抛出异常
            throw new ApplicationException(AppResult.failed(ResultCode.FAILED_PARAMS_VALIDATE));
        }
        // 校验用户是否存在
        User existUser = selectByName(user.getUsername());
        if(existUser != null){
            // 打印日志
            log.warn(ResultCode.FAILED_USER_EXISTS.toString() + "username = " + user.getUsername());
            // 抛出异常,用户已存在
            throw new ApplicationException(AppResult.failed(ResultCode.FAILED_USER_EXISTS));
        }
        // 为属性设置默认值
        // 性别 0女 1男 2保密
        if(user.getGender() != null){
            if(user.getGender() < 0 || user.getGender() > 2){
                user.setGender((byte)2);
            }
        }else{
            user.setGender((byte)2);
        }
        // 发帖数
        user.setArticleCount(0);
        // 是否管理员
        user.setIsAdmin((byte)0);
        // 状态
        user.setState((byte)0);
        // 时间
        Date date = new Date();
        user.setCreateTime(date); // 创建时间
        user.setUpdateTime(date); // 更新时间

        // 写入数据库
        int row = userMapper.insertSelective(user);
        if(row != 1){
            // 打印日志
            log.warn(ResultCode.FAILED_CREATE.toString() + "注册用户失败,username = " + user.getUsername());
            // 抛出异常,用户已存在
            throw new ApplicationException(AppResult.failed(ResultCode.FAILED_CREATE));
        }
    }

    @Override
    public User login(String username, String password) {
        // 非空校验
        if(StringUtils.isEmpty(username) || StringUtils.isEmpty(password)){
            // 打印日志
            log.warn(ResultCode.FAILED_PARAMS_VALIDATE.toString());
            // 抛出异常,用户已存在
            throw new ApplicationException(AppResult.failed(ResultCode.FAILED_PARAMS_VALIDATE));
        }
        // 根据用户名查询用户信息
        User user = selectByName(username);
        // 校验用户是否存在
        if (user == null) {
            // 打印日志
            log.info(ResultCode.FAILED_USER_NOT_EXISTS.toString()+",username = " + username);
            // 抛出异常
            throw new ApplicationException(AppResult.failed(ResultCode.FAILED_LOGIN));
        }
        // 校验密码是否正确
        String encryptPassword = MD5Utils.md5Salt(password, user.getSalt());
        if (!encryptPassword.equalsIgnoreCase(user.getPassword())) {
            // 打印日志
            log.info("密码输入错误,username = " + username + ", password = " + password);
            // 密码不正确抛出异常
            throw new ApplicationException(AppResult.failed(ResultCode.FAILED_LOGIN));
        }
        // 校验通过,返回用户信息
        return user;
    }
}

5. 单体测试

编写测试代码:

@Test
    void login() throws JsonProcessingException {
        // 正确用户
        User user = userService.login("Danny","123");
        System.out.println(objectMapper.writeValueAsString(user));

        // 错误用户
        user = userService.login("123","123");
        System.out.println(objectMapper.writeValueAsString(user));

    }

测试结果如下: 

9. 实现业务功能--用户登录,项目,数据库,服务器,运维

6. 实现 Controller 

在 UserControlle r中实现登录方法:
9. 实现业务功能--用户登录,项目,数据库,服务器,运维

 因此在 Config 包下新建 AppConfig 类,添加全局变量:

public class AppConfig {
    /**
     * 为 session 中存储的 User 对象定义一个全局变量
     */
    public static final String SESSION_USER_KEY = "SESSION_USER_KEY";
}

继续编写 UserController 类中的方法:

/**
     * 用户登录
     *
     * @param request
     * @param username 用户名
     * @param password 密码
     * @return AppResult
     */
    @ApiOperation("⽤⼾登录")
    @PostMapping("/login")
    public AppResult login (HttpServletRequest request,
                            @ApiParam(value = "用户名") @RequestParam(value = "username") @NonNull String username,
                            @ApiParam(value = "密码") @RequestParam(value = "password") @NonNull String password) {
        // 调用 Service
        User user = userService.login(username, password);
        // 在 session 中保存当前登录的用户信息
        // 1. 获取 session 对象
        HttpSession session = request.getSession(true);
        // 2. 把用户信息保存在 session 中
        session.setAttribute(AppConfig.SESSION_USER_KEY, user);
        // 登录成功响应
        return AppResult.success("登录成功");
    }
启动程序,访问 API 页面 login 接口,分别提交错误和正确的用户名密码进行测试:
登录失败:

9. 实现业务功能--用户登录,项目,数据库,服务器,运维

 登陆成功:

9. 实现业务功能--用户登录,项目,数据库,服务器,运维

7. 实现前端

完整的前端代码:forum: 论坛项目 - Gitee.com

// 构造数据
        let postData = {
          username : $('#username').val(),
          password : $('#password').val()
        };
        // 发送AJAX请求,成功后跳转到index.html
        $.ajax({
          // 请求的方法类型
          type : 'POST',
          // API 的 URL
          url : 'user/login',
          //数据格式
          contentType : 'application/x-www-form-urlencoded',
          // 提交的数据
          data : postData,
          // 成功回调
          success : function(respData) {
          // ⽤状态码判断是否成功
            if (respData.code == 0) {
              // 成功
              location.assign('index.html');
            } else {
            // 失败
            $.toast({
              heading : '警告',
              text : respData.message,
              icon : 'Warning'
            });
           }
          },
          // 失败(HTTP)
          error: function() {
            $.toast({
              heading : '错误',
              text : '出错了,请联系管理员',
              icon : 'error'
            });
          }
        });
      });

登录后的界面如下: 

9. 实现业务功能--用户登录,项目,数据库,服务器,运维


以上即为登录功能的实现,接下来在下篇博客中我们将实现在上面登录进去的界面中进行退出。文章来源地址https://www.toymoban.com/news/detail-660159.html

到了这里,关于9. 实现业务功能--用户登录的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 手把手教你实现:Android注册登录功能,通过本地服务器保存用户账号密码到数据库

    代码我放到文章最后面了 首先你需要电脑一台:如果没有电脑将会很难办呢 -----沃兹基硕德 下载并安装以下开发工具 Android Studio 官网最新版 用来开发 安卓App IntelliJ IDEA 官网最新版 用来开发 后端 ,处理安卓APP的请求 Navicat for MySql 官网最新版 数据库可视化工具,用来查看数

    2024年01月16日
    浏览(49)
  • JavaEE 课堂案例: 简单实现登录功能: 1.前端用户自己输入账号密码, 点击登录 2.服务器端获得账号密码, 数据库查询 jar JdbcTemplate 3.登录成功 -> 跳转到首页

    1 首先导入jar包(看个人情况导入)     这里需要注意的是平时我们导入jar包是导入在自己的工程或者moudle下面的,在这里我们必须把jar包导入在WEB-INF中(详情可看图),从图中可看出,一个工程在编译过后,只有src下的数据会编译到WEB-INF下的classes目录中,所以需要将静态

    2024年02月03日
    浏览(43)
  • 9. 实现业务功能--用户登录

    目录 1. 顺序图  2. 参数要求 3. 创建 Service 接口 4. 实现 Service 接口 5. 单体测试 6. 实现 Controller  7. 实现前端 在用户登录部分特别注意的是需要进行密码校验: 1. MD5(MD5(用户提交的原密码)+数据库查出来的用户的盐)= 密码的密文 2. 用上面的生成的密码的密文和数据库中用户

    2024年02月12日
    浏览(42)
  • Flutter框架实现登录注册功能,不连接数据库

    要在Flutter框架中实现登录和注册功能,而不连接数据库,可以使用本地存储来存储用户信息。以下是一个简单的示例,演示如何使用本地存储来实现登录和注册功能。 首先,我们需要添加 shared_preferences 插件到 pubspec.yaml 文件中: 然后,在 lib 文件夹中创建一个新的文件夹

    2024年02月08日
    浏览(42)
  • JavaWeb04(登录&绑值&模糊查询&功能实现&连接数据库)

    目录 一.实现登录功能  2.2 制作简易验证码 2.3 完成登录验证 2.4 登录实现 ①连接字符串 private static final String URL=\\\"jdbc:oracle:thin:@localhost:1521:orcl\\\"; ②加载驱动  OracleDriver private static final String URL=\\\"jdbc:oracle:thin:@localhost:1521:orcl\\\";      二.实现表格版的绑定数据 2.1 效果预览 2.2 代

    2024年02月02日
    浏览(50)
  • JavaWeb实现简易的注册登录功能(与数据库连接)

    一、创建数据库表连接 这里我们创建一个数据库名为db_user,创建库的使用可视化工具很简单就不细说了,下面sql代码块是我们创建一个简易用户表为了方便我们后续进行登录注册操作。 下面就是建好的表: 1、建一个与数据库连接的file文件:db.properties 二、创建前端页面 1、

    2024年01月19日
    浏览(47)
  • java连接数据库实现登录与注册小功能(小白版)

    准备工作: 创建数据库stu;        create database stu charset=utf8; 使用数据库stu;            use stu; 创建用户表user(id,username,password,nick) create table user(id int primary key auto_increment,username varchar(50),password varchar(50),nick varchar(50));   1.开始创建springboot工程,勾选Web-spring Web,  SQL-MyBatis Frame

    2024年02月08日
    浏览(39)
  • 通过Annotation将用户操作记录到数据库表功能实现

    一、背景         在用户对我们所开发的系统访问的时候,需要我们的系统具有强大的健壮性,使得给与用户的体验感十足。在业务开发的过程中,我们通过将几个相关的操作绑定成一个事件,使得安全性以及数据的前后一致性得到提高。但是在溯源方面,我们往往没有很好

    2024年03月13日
    浏览(87)
  • 微信小程序实现登录授权,并将获取到的用户授权信息存储到数据库中

    官方开发文档 注意:在实现授权登录时,不要使用测试号进行 wx.getUserProfile使用文档 config文件代码如下 路由模块 主要代码(如果不想多个文件,可以将wxuserHandle.wxuser这个位置内容替换为exports.wxuser的内容) 注意: 在返回token的字符串拼接时,Bearer 后面必须有一个空格 数据

    2024年02月10日
    浏览(54)
  • Unity3D实现MySql数据库登录与注册功能

    1、界面布局如下: 2、界面控件 1、封装MySql 2、编写登录、注册功能脚本 挂载LoginPanel脚本,并将控件映射到公共属性如下: 有问题请指出,谢谢!

    2024年02月11日
    浏览(61)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包