微服务: 结合MySQL实现登录注册

简介

MySQL8.0.15在Win10上的折腾记微服务: MySQL基本操作 后,由于个人原因没能继续创作,从今天开始补上,继续前进💪。

本篇是 微服务系列 的第 N 篇,本篇结合 MySQL 和 SpringBoot 实现用户登录注册,算是一个小实战也是对之前知识点的一个小结。

在阅读本篇内容之前,需要大家做好如下几件事情:

  • 在本机安装了 MySQL,并且可以正常使用;如果你用的是 Windows10,可以参考 MySQL8.0.15在Win10上的折腾记 这篇文章;
  • 已经搭建好了 SpringBoot 的开发环境;可以参考 微服务: 想办法让项目运行起来 来搭建环境;
  • 能使用 SpringBoot 正确连接 MySQL,实现简单的增删改查(CRUD);可以参考 微服务: MySQL基本操作 这篇文章;
  • 理解跨域问题,请务必先阅读 跨域和OPTIONS这对欢喜冤家;
  • 树立信心,坚持不懈,不怕困难;

本篇文章主要内容:

  • 网页端,提供注册、登录的入口,请求服务端提供的 API,请求采用 Ajax;
  • 服务端,提供注册、登录的 API,处理用户注册和登录的请求,并能正确读写 MySQL 数据库;

代码全部放在 Github,有需要的朋友们可以自行获取。

登录注册流程图

本篇分享的用户注册和登录流程比较简单,看图说话。
在这里插入图片描述

前端效果

本篇中的前端页面很简单,我本人对前端的认知是个二半吊子,现学现卖,主要是配合接口做一些实例,没啥技术含量。使用前端开发,给我最大的感觉就是方便,简洁。

1、注册页面
在这里插入图片描述
注册成功会自动跳转到登录页面。

2、登录页面
在这里插入图片描述
登录失败会自动跳转到注册页面。

页面和逻辑的源代码对应分别如下:
在这里插入图片描述
1 -> ms_login.html 是登录页面的 HTML 文件;

2 -> ms_signup.html 是注册页面的 HTML 文件;

3 -> ms_user.js 是 Ajax 的请求逻辑的 JavaScript 代码。

配置 MySQL 的连接

既然要使用 MySQL,首先要在工程中配置跟 MySQL 相关的连接参数。

在工程的 application.properties 文件中,配置下面参数即可。

# jdbc
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
# charset=utf8mb4
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/mzc_user?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8
spring.datasource.username=root
# 设置为你自己 MySQL 的密码
spring.datasource.password=root

具体的这些参数含义在 微服务: MySQL基本操作 这篇文章中有详细的讲解。

编写 API

源文件 MSSigninController 实现了登录的 API,核心代码如下:

@RestController
@RequestMapping(value = "signup") // 注意这里不要在signup前后加"/"
public class MSSignupController {

    @Autowired
    private MSUserService userService;

    @CrossOrigin(origins = {"*"})
    @PostMapping(value = "/name")
    public MSResponse signup(@RequestParam(value = "username") String userName, @RequestParam(value = "userpwd") String userPwd) {
        MSResponse response = new MSResponse();
        MSUser user = null;
        if (null == userName || null == userPwd || userName.length() <= 0 || userPwd.length() <= 0) {
            MSResponseEnum signupError = MSResponseEnum.SignupInvalidInfo;
            response.setMsg(signupError.getMsg());
            response.setCode(signupError.getCode());
        } else {
            // 创建user表
            userService.createUserTable();
            // 检查用户数据库的‘user’表中是否有该用户?
            List<Map> query_users = userService.queryUserByUserName(userName);
            if (null == query_users || query_users.isEmpty()) {// 没有该用户的数据
                user = MSUserUtil.createUser(userName, userPwd);
                // 插入一条用户数据到数据表中
                userService.addUser(user);
                response.setCode(MSResponseEnum.SUCCESS.getCode());
                response.setMsg(MSResponseEnum.SUCCESS.getMsg());
            } else {// 用户数据库的‘user’表中有该用户信息
                // 返回错误信息:该用户已经注册过了
                MSResponseEnum signupError = MSResponseEnum.SignupHasExistUser;
                response.setMsg(signupError.getMsg());
                response.setCode(signupError.getCode());
            }
        }

        response.setResults(user);

        return response;
    }
}

源文件 MSSignupController 实现了注册的 API,核心代码如下:

@RestController
@RequestMapping(value = "signin") // 注意这里不要在signin前后加"/"
public class MSSigninController {

    @Autowired
    private MSUserService userService;

    @CrossOrigin(origins = {"*", "http://localhost:8082"})
    @RequestMapping(value = "/name", method = RequestMethod.GET)
    public MSResponse sigin(@RequestParam(value = "username") String userName, @RequestParam(value = "userpwd") String userPwd) {
        MSResponse response = new MSResponse();
        MSUser user = null;
        if (null == userName || null == userPwd || userName.length() <= 0 || userPwd.length() <= 0) {
            MSResponseEnum responseEnum = MSResponseEnum.Login4SiginInvalidInfo;
            response.setCode(responseEnum.getCode());
            response.setMsg(responseEnum.getMsg());
        } else {
            // 检查用户数据库的‘user’表中是否有该用户?
            List<Map> query_users = userService.queryUserByUserName(userName);
            if (query_users.isEmpty()) {// 没有该用户
                MSResponseEnum responseEnum = MSResponseEnum.LoginNoSuchUser;
                response.setCode(responseEnum.getCode());
                response.setMsg(responseEnum.getMsg());
            } else {// 有这个用户
                Map user_map = query_users.get(0);
                String query_user_name = (String) user_map.get("accountName");
                // 没有对应的用户名
                if (!query_user_name.equals(userName)) {
                    MSResponseEnum responseEnum = MSResponseEnum.LoginNoSuchUser;
                    response.setCode(responseEnum.getCode());
                    response.setMsg(responseEnum.getMsg());
                } else {// 查询到了该用户
                    // 将查询出来的map对象使用FastJson转换为MSUser对象
                    user = JSON.parseObject(JSON.toJSONString(user_map), MSUser.class);
                    MSResponseEnum rspEnum = MSResponseEnum.SUCCESS;
                    response.setCode(rspEnum.getCode());
                    response.setMsg(rspEnum.getMsg());
                }
            }
        }

        response.setResults(user);

        return response;
    }
}

相比于之前的代码逻辑,现在的代码无非就是加入了操作数据库的逻辑。代码比较简单,看注释就可以看明白。

操作数据库的代码,都在 MSUserServiceImpl 这个实现类中。我就不一一的粘贴代码了。有兴趣的朋友可以自行到 Github 下载。

验证

首先,启动工程,让工程在本地正常运行起来。如果你还没有搭建 SpringBoot 的开发环境,建议参考 微服务-想办法让项目运行起来 这篇文章。

然后在浏览器打开注册页面,建议使用 Chrome 浏览器操作。如下图,我使用 foobar 用户名和 foobar 密码进行注册。
在这里插入图片描述
点击注册按钮,成功后用终端登录 MySQL 数据库,看看是否有数据。如下图,可以看到数据库和对应的表。
在这里插入图片描述
可以从下图看出,数据已经成功的写入数据库中了。
在这里插入图片描述
最后,打开登录界面,输入用户名称和密码都是 foobar 的就可以登录成功,说明从数据库读取数据也是正常的。

今天就说这么多吧,下次再见!


从现在做起,一切都还来得及。
在这里插入图片描述

已标记关键词 清除标记
1、课程简介 Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。        在本套课程中,我们将全面的讲解Spring Cloud技术栈, 从环境的部署到技术的应用,再到项目实战,让我们不仅是学习框架技术的使用,而且可以学习到使用Spring Cloud如何解决实际的问题。 Spring Cloud各个组件相互配合,合作支持了一套完整的服务架构。 - 注册中心负责服务注册与发现,很好将各服务连接起来 - 断路器负责监控服务之间的调用情况,连续多次失败进行熔断保护。 - API网关负责转发所有对外的请求和服务 - 配置中心提供了统一的配置信息管理服务,可以实时的通知各个服务获取最新的配置信息 - 链路追踪技术可以将所有的请求数据记录下来,方便我们进行后续分析 - 各个组件又提供了功能完善的dashboard监控平台,可以方便的监控各组件的运行状况 2、适应人群 有一定的Java基础,并且要有一定的web开发基础。 3、课程亮点        系统的学习Spring Cloud技术栈,由浅入深的讲解服务技术。涵盖了基础知识,原理剖析,组件使用,源码分析,优劣分析,替换方案等,以案例的形式讲解服务中的种种问题和解决方案 l  服务的基础知识 n  软件架构的发展史 n  服务的核心知识(CAP,RPC等) l  注册中心 n  Eureka搭建配置服务注册 n  Eureka服务端高可用集群 n  Eureka的原理和源码导读 n  Eureka替换方案Consul n  Consul下载安装&服务注册&高可用 l  服务发现与服务调用 n  Ribbon负载均衡基本使用&源码分析 n  Feign的使用与源码分析 n  Hystrix熔断(雪崩效应,Hystrix使用与原理分析) n  Hystrix替换方案Sentinel l  服务网关 n  Zuul网关使用&原理分析&源码分析 n  Zuul 1.x 版本的不足与替换方案 n  SpringCloud Gateway深入剖析 l  链路追踪 n  链路追踪的基础知识 n  Sleuth的介绍与使用 n  Sleuth与Zipkin的整合开发 l  配置中心 n  SpringClond Config与bus 开发配置中心 n  开源配置中心Apollo 4、主讲内容 章节一: 1.     服务基础知识 2.     SpringCloud概述 3.     服务注册中心Eureka 4.     Eureka的替换方案Consul 章节二: 1.     Ribbon实现客户端负载均衡 2.     基于Feign的服务调用 3.     服务熔断技术Hystrix 4.     Hystrix的替换方案Sentinel 章节三: 1.     服务网关Zuul的基本使用 2.     Zuul1.x 版本的不足和替换方案 3.     深入SpringCloud Gateway 4.     链路追踪Sleuth与Zipkin 章节四: 1.     SpringCloud Config的使用 2.     SpringCloud Config结合SpringCloud Bus完成动态配置更新 3.     开源配置中心Apollo
©️2020 CSDN 皮肤主题: 酷酷鲨 设计师:CSDN官方博客 返回首页