操作系统:Windows
Java开发包:JDK1.8
项目管理工具:Maven3.6.0
项目开发工具:IntelliJIDEA
数据库:MySQL
Spring Cloud版本:Finchley.SR2
Spring Boot版本:2.0.6.RELEASE
目录
- 用户模块—user-service
- 商品模块—goods-service
- 数据库设计
- EurekaServer与公共工程的搭建
- 搭建Eureka Server
- 步骤1:创建项目,引入依赖
- 步骤2:添加Eureka的相关配置
- 步骤3:定义Security安全控制
- 步骤4:在项目启动类添加注解
- 步骤5:测试运行
- 搭建公共工程
- 步骤1:创建公共工程模块
- 步骤2:创建与数据库中各张表对应的实体类
- 步骤3:将Module项目打成jar包到Maven仓库
- 用户模块实现
- 步骤2:在全局配置文件application.yml中添加Eureka、MySQL以及MyBatis的相关配置
- 步骤3:在项目启动类添加@EnableEurekaClient注解
- 搭建user-consumer
- 步骤1:创建项目,引入依赖
- 步骤2:在全局配置文件application.yml中添加Eureka和Thymeleaf的相关配置信息
- 用户登录功能
- 步骤1:在工程user-provider中定义用户登录接口
- 步骤2:在工程user-consumer中调用user-provider中的接口实现用户登录功能
- 步骤3:启动测试登录功能
- 用户注册功能
- 步骤1:在工程user-provider中定义用户注册接口
- 步骤2:在工程user-consumer中调用user-provider中的接口实现用户注册功能
此电商系统包含了用户与商品两个模块的部分功能,用户模块包括用户注册、用户登录;商品模块包括商品展示、商品详情、购物车以及订单。
开发项目之前,有必要根据项目业务进行分析,设计一套合理的架构。
本系统采用的是Spring Cloud微服务架构,根据业务功能将系统划分为5个服务,这5个服务构成了一套完整的微服务系统。其中,2个服务是基础服务,提供了一套服务治理的功能,它们分别是Eureka Server和网关服务;2个服务是资源服务,分别是用户服务和商品服务,对外暴露API接口,除此之外,还有一个common的工程,为资源服务提供基本的工具类。
浏览器访问服务端时,首先会经过网关,网关会根据请求路由到不同的服务,并且每个服务都会从不同的MySQL数据库获取数据。
用户模块—user-service
商品模块—goods-service
数据库设计
1.用户模块
/*创建数据库webuser*/
CREATE DATABASE webuser;
/*8.0以下版本MySQL执行以下SQL修改字符编码*/
alter database webuser character set utf8;
set names gbk;
/*使用数据库webuser*/
USE webuser;
/*创建表user*/
CREATE TABLE user (
uaccount int(11) AUTO_INCREMENT PRIMARY KEY,
upassword varchar(255) NOT NULL ,
uname varchar(255) NOT NULL,
usex varchar(50)
) ;
/*向user表插入数据 */
insert into user(uaccount,upassword,uname,usex)
values
(10018,'123','rose','女'),
(10019,'123','jake','男'),
(10020,'123','张三','男'),
(10021,'1','李四','男'),
(10022,'1','李明','男'),
(10023,'2','whhh','男'),
(10024,'1','王五','女'),
(10025,'1','hh','女');
2.商品模块
/*创建数据库webgoods*/
CREATE DATABASE webgoods;
/*8.0以下版本MySQL执行以下SQL修改字符编码*/
alter database webgoods character set utf8;
set names gbk;
/*使用数据库webgoods*/
USE webgoods;
/*创建数据表goods*/
CREATE TABLE goods (
gid int(11) AUTO_INCREMENT PRIMARY KEY,
gname varchar(255) ,
gdetails varchar(255) ,
gprice int(11)
) ;
/*向goods表插入数据*/
insert into goods(gid,gname,gdetails,gprice)
values
(1,'草莓','可口草莓',4),
(2,'苹果','红富士苹果',2),
(3,'橙子','金黄的大橙子',4),
(4,'葡萄','吐鲁番葡萄',12),
(5,'大虾','山东大虾',5),
(6,'带鱼','好吃的带鱼',50),
(7,'扇贝','大神快来快来',20),
(8,'皮皮虾','啥的客户',10),
(9,'脉动','不在状态,脉动一下',4),
(10,'汽水','栓双',8),
(11,'沙棘汁','好喝',3),
(12,'和其正','dsa asd',5),
(13,'菠菜','大',2),
(14,'生菜','asdajlskdja',2),
(15,'番茄','好吃',1),
(16,'胡萝卜','asdkjlajkld',2);
EurekaServer与公共工程的搭建
使用SpringInitializr方式创建一个项目web-store:
后面其他项目均在父工程中创建模块Moudle的方式创建,结构如下:
搭建Eureka Server
搭建eureka-server作为服务中心,是每个Spring Cloud微服务的心脏,所有服务将会注册到Eureka Server中。
步骤:
1.创建项目,引入依赖
2.添加Eureka相关配置
3.定义Security安全控制
4.添加@EnableEurekaServer注解
5.测试运行
步骤1:创建项目,引入依赖
在父工程web-store中创建Moudle,使用Spring Initializr方式创建一个名称为eureka-server的Spring Boot模块,将Artifact命名为eureka-server,在pom.xml文件中添加Eureka Server和Security依赖。
dependency>
groupId>org.springframework.cloud/groupId>
artifactId>spring-cloud-starter-netflix-eureka-server/artifactId>
/dependency>
dependency>
groupId>org.springframework.cloud/groupId>
artifactId>spring-cloud-starter-security/artifactId>
version>2.0.0.RELEASE/version>
/dependency>
注:记得修改SpringBoot版本号,添加SpringCloud版本号,要匹配。添加管理依赖。(后面每次新创建项目同)
步骤2:添加Eureka的相关配置
在全局配置文件application.yml中添加Eureka的相关配置信息,和Security的安全配置信息。
遇到这种情况
点击reload in ‘GBK’,ok
步骤3:定义Security安全控制
创建csrf包,csrf包下创建Security安全配置类WebSecurityConfig,该类定义了Security的安全控制。
步骤4:在项目启动类添加注解
@EnableEurekaServer注解
在项目启动类EurekaServerApplication上添加@EnableEurekaServer注解开启Eureka Server功能。
步骤5:测试运行
- yml的语法格式有误
这是最先考虑的问题,办法只有一个,就是校验yml语法,仔细检查看看,不多说了。
- application.yml文件格式问题
如果你的项目没有配置错误,配置文件名称也正常,还出现这个问题,那一定是你的yml文件编码的问题。
因为这个文件的编码格式是GBK,项目的编码格式是UTF-8,里面有注释,注释乱码,导致编译失败。
办法如下:
IDEA打开路径:File –> Settings –> File Encodings,然后将 /application.yml 的便面格式改成与项目一致,即:UTF-8;
保险起见,将“Project Encoding”也都改成UTF-8;
重启IDEA,然后启动项目,OK啦。
或者在 spring. freemarker.charset: utf-8
启动eureka-server项目,在浏览器中访问http://localhost:8001。首先会跳转到登录认证页面,输入application.yml中配置的用户名密码登录。
搭建公共工程
在用户模块中会有user-provider与user-consumer,我们需要在两个项目中都编写User实体类,会有很多重复性代码,这时,就需要把User实体类存放在公共项目中,并以Jar的形式打包到Maven仓库,方便提供者与消费者调用
步骤1:创建公共工程模块
在父工程web-store中使用Spring Initializr方式新建公共工程Moudle项目common,将Group命名为com.bushuo,将Artifact命名为common。
步骤2:创建与数据库中各张表对应的实体类
在公共工程common中创建entity包,并在该包中创建User实体类、Goods实体类。
点击右键,Generate
点击Getter and Setter,然后全部选中。就OK了
注:实体类中属性名与对应数据表中字段名要相同,且类型对应
步骤3:将Module项目打成jar包到Maven仓库
选择IEDA工具右侧的MAVEN→common→Lifecyle,双击Lifecyle中的install进行打包。打包完成后,会在工程common的target目录下生成刚刚打包的jar。
我出现了打包测试异常
plugin>
groupId>org.apache.maven.plugins/groupId>
artifactId>maven-surefire-plugin/artifactId>
configuration>
skipTests>true/skipTests> !-- 不会编译测试 -->
/configuration>
/plugin>
在去clean,然后install
用户模块实现
搭建user-provider
步骤1:创建项目,引入依赖
在父工程web-store中创建Moudle,使用Spring Initializr方式创建一个名称为user-provider的Spring Boot项目,将Artifact命名为user-provider,添加Web、Eureka Client、MyBatis、公共实体类common、MySQL依赖。
?xml version="1.0" encoding="UTF-8"?>
project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
modelVersion>4.0.0/modelVersion>
parent>
groupId>org.springframework.boot/groupId>
artifactId>spring-boot-starter-parent/artifactId>
version>2.0.6.RELEASE/version>
relativePath/> !-- lookup parent from repository -->
/parent>
groupId>com.bushuo/groupId>
artifactId>user-provider/artifactId>
version>0.0.1-SNAPSHOT/version>
name>user-provider/name>
description>Demo project for Spring Boot/description>
url/>
properties>
java.version>1.8/java.version>
/properties>
dependencies>
!--web启动依赖-->
dependency>
groupId>org.springframework.boot/groupId>
artifactId>spring-boot-starter-web/artifactId>
/dependency>
!--mybatis依赖-->
dependency>
groupId>org.mybatis.spring.boot/groupId>
artifactId>mybatis-spring-boot-starter/artifactId>
version>2.0.1/version>
/dependency>
!--eureka依赖-->
dependency>
groupId>org.springframework.cloud/groupId>
artifactId>spring-cloud-starter-netflix-eureka-client/artifactId>
/dependency>
!--mysql依赖-->
dependency>
groupId>mysql/groupId>
artifactId>mysql-connector-java/artifactId>
version>8.0.29/version>
scope>runtime/scope>
/dependency>
dependency>
groupId>org.springframework.boot/groupId>
artifactId>spring-boot-starter-web/artifactId>
/dependency>
dependency>
groupId>org.springframework.boot/groupId>
artifactId>spring-boot-starter-test/artifactId>
scope>test/scope>
/dependency>
/dependencies>
dependencyManagement>
dependencies>
dependency>
groupId>org.springframework.cloud/groupId>
artifactId>spring-cloud-dependencies/artifactId>
version>Finchley.SR2/version>
type>pom/type>
scope>import/scope>
/dependency>
/dependencies>
/dependencyManagement>
build>
plugins>
plugin>
groupId>org.springframework.boot/groupId>
artifactId>spring-boot-maven-plugin/artifactId>
/plugin>
/plugins>
/build>
/project>
注:若MySQL驱动依赖报红,则加一行版本号重新下载:
5.x的MySQL选择:5.x.x
8.x的MySQL选择:8.x.x
步骤2:在全局配置文件application.yml中添加Eureka、MySQL以及MyBatis的相关配置
注:
8.0以下MySQL驱动名:com.mysql.jdbc.Driver
8.0以上MySQL驱动名:com.mysql.cj.jdbc.Driver
步骤3:在项目启动类添加@EnableEurekaClient注解
在项目启动类上添加@EnableEurekaClient注解开启Eureka Client功能。
搭建user-consumer
步骤1:创建项目,引入依赖
在父工程web-store中创建Moudle,使用Spring Initializr方式创建一个名称为user-consumer的Spring Boot项目,将Artifact命名为user-consumer,添加Web、Eureka Client、公共实体类common、Feign、Thymeleaf、Hystrix等依赖。
?xml version="1.0" encoding="UTF-8"?>
project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
modelVersion>4.0.0/modelVersion>
parent>
groupId>org.springframework.boot/groupId>
artifactId>spring-boot-starter-parent/artifactId>
version>2.0.6.RELEASE/version>
relativePath/> !-- lookup parent from repository -->
/parent>
groupId>com.bushuo/groupId>
artifactId>user-consumer/artifactId>
version>0.0.1-SNAPSHOT/version>
name>user-consumer/name>
description>Demo project for Spring Boot/description>
url/>
licenses>
license/>
/licenses>
developers>
developer/>
/developers>
scm>
connection/>
developerConnection/>
tag/>
url/>
/scm>
properties>
java.version>1.8/java.version>
/properties>
dependencies>
!--feign依赖-->
dependency>
groupId>org.springframework.cloud/groupId>
artifactId>spring-cloud-starter-openfeign/artifactId>
version>2.0.0.RELEASE/version>
/dependency>
!--web依赖-->
dependency>
groupId>org.springframework.boot/groupId>
artifactId>spring-boot-starter-web/artifactId>
/dependency>
!--eureka依赖-->
dependency>
groupId>org.springframework.cloud/groupId>
artifactId>spring-cloud-starter-netflix-eureka-client/artifactId>
/dependency>
!--thymeleaf前端模板依赖-->
dependency>
groupId>org.springframework.boot/groupId>
artifactId>spring-boot-starter-thymeleaf/artifactId>
version>2.0.0.RELEASE/version>
/dependency>
dependency>
groupId>org.springframework.boot/groupId>
artifactId>spring-boot-starter-test/artifactId>
scope>test/scope>
/dependency>
!--hystrix熔断依赖-->
dependency>
groupId>org.springframework.cloud/groupId>
artifactId>spring-cloud-starter-netflix-hystrix/artifactId>
version>2.0.0.RELEASE/version>
/dependency>
dependency>
groupId>org.springframework.boot/groupId>
artifactId>spring-boot-starter-web/artifactId>
/dependency>
dependency>
groupId>org.springframework.boot/groupId>
artifactId>spring-boot-starter-test/artifactId>
scope>test/scope>
/dependency>
/dependencies>
dependencyManagement>
dependencies>
dependency>
groupId>org.springframework.cloud/groupId>
artifactId>spring-cloud-dependencies/artifactId>
version>Finchley.SR2/version>
type>pom/type>
scope>import/scope>
/dependency>
/dependencies>
/dependencyManagement>
build>
plugins>
plugin>
groupId>org.springframework.boot/groupId>
artifactId>spring-boot-maven-plugin/artifactId>
/plugin>
/plugins>
/build>
/project>
步骤2:在全局配置文件application.yml中添加Eureka和Thymeleaf的相关配置信息
步骤3:在项目启动类添加@EnableEurekaClient和@EnableFeignClients注解
在项目启动类上添加@EnableEurekaClient注解开启Eureka Client功能,添加@EnableFeignClients注解开启Feign功能。
用户登录功能
步骤:
1.在工程user-provider中定义用户登录接口
2.user-consumer调用user-provider中的接口实现用户登录功能
3. 启动测试用户登录功能
步骤1:在工程user-provider中定义用户登录接口
(1)在dao包的UserDao接口中,添加用户登录的方法
(2)在resources下的mapper包中的UserMapper.xml文件中配置用户登录访问接口
?xml version="1.0" encoding="UTF-8"?>
!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
mapper namespace="com.bushuo.userprovider.Dao.UserDao">
select id="login" resultType="com.bushuo.common.entity.User"
parameterType="java.lang.String">
select * from user where uname=#{uname} and upassword=#{upassword}
/select>
/mapper>
(3)在controller包中的UserController类中添加登录接口
user-consumer程序结构:
步骤2:在工程user-consumer中调用user-provider中的接口实现用户登录功能
先构造相同结构
(1)在UserService接口中编写Feign组件调用user-provider中接口的登录方法
(2)在UserServiceHystrix类中编写处理用户登录的熔断处理逻辑
(3)在UserController类中添加处理用户登录时跳转登录界面的请求/tologin
注:采用 @Controller 注解将该类标识为控制器层的组件。与 @RestController 不同,@Controller 的方法返回值为 String 类型时,默认会被视为视图名称。结合在 application.yml 文件中配置的前端页面路径,方法可以返回 templates 目录中的 login.html 页面进行渲染。
(4)在UserController类中添加处理用户登录的请求
(5)在resources下的templates目录中创建静态页面
login.html:
html lang="en">
head>
meta charset="UTF-8">
title>登录页面/title>
/head>
body>
h1 align="center">登录页面/h1>
div style="width:100%;text-align:center">
form action="http://localhost:8003/admin/login" method="get">
p>用 户: input type="text" id="userName" name="uname" />/p>
p>密 码: input type="password" id="password" name="upassword" />/p>
p>input type="submit" value="登录">
input type="reset" value="重置">/p>
/form>
没有账号?a href="http://localhost:8003/admin/toregister">去注册/a>
/div>
/body>
/html>
wecomle.html:
步骤3:启动测试登录功能
启动eureka-server、user-provider和user-consumer,使用浏览器访问localhost:8003/admin/tologin。
用户注册功能
步骤1:在工程user-provider中定义用户注册接口
(1)在dao包的UserDao接口中,添加用户注册的方法
(2)在resources下的mapper包中的UserMapper.xml文件中配置用户注册访问接口
(3)在controller包中的UserController类中添加注册接口
@RequestMapping(value = "/register",method = RequestMethod.GET)
public int register(@RequestParam(value ="upassword" )String upassword,@RequestParam(value ="uname" )String uname,@RequestParam(value ="usex" )String usex){
return userDao.register( upassword,uname,usex );
}
步骤2:在工程user-consumer中调用user-provider中的接口实现用户注册功能
(1)在UserService接口中编写Feign组件调用user-provider中接口的注册方法
(2)在UserServiceHystrix类中编写处理用户注册的熔断处理逻辑
(3)在UserController类中添加处理用户注册时跳转注册界面的请求/toregister
(4)在UserController类中添加处理用户注册的请求
(5)在resources下的templates目录中创建静态页面
!DOCTYPE html>
html lang="en">
head>
meta charset="UTF-8">
title>注册页面/title>
/head>
body>
h1 align="center">注册页面/h1>
div style="width:100%;text-align:center">
form action="http://localhost:8003/admin/register" method="get">
p>用 户: input type="text" id="userName" name="uname" />/p>
p>密 码: input type="password" id="password" name="upassword" />/p>
p>确认密码: input type="password" id="upassword" name="upassword" />/p>
p>性 别: input type="text" id="sex" name="usex" />/p>
p>input type="submit" value="注册">
input type="reset" value="重置">/p>
/form>
已有账号?a href="http://localhost:8003/admin/toregister">去登录/a>
/div>
script>
document.querySelector('form').addEventListener('submit', function(event) {
const password = document.getElementById('password').value;
const confirmPassword = document.getElementById('confirmPassword').value;
if (password !== confirmPassword) {
alert('密码和确认密码不匹配!');
event.preventDefault(); // 阻止表单提交
}
});
/script>
/body>
/html>
步骤3:启动测试登录功能
启动eureka-server、user-provider和user-consumer,使用浏览器访问注册页面:http://localhost:8003/admin/toregister