操作系统WindowsJava开发包JDK1.8项目管理工具Maven3.6.0项目开发工具IntelliJIDEA数据库MySQLSpring Cloud版本Finchley.SR2Spring 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 groupIdorg.springframework.cloud/groupId artifactIdspring-cloud-starter-netflix-eureka-server/artifactId /dependency dependency groupIdorg.springframework.cloud/groupId artifactIdspring-cloud-starter-security/artifactId version2.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 groupIdorg.apache.maven.plugins/groupId artifactIdmaven-surefire-plugin/artifactId configuration skipTeststrue/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 version1.0 encodingUTF-8? project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd modelVersion4.0.0/modelVersion parent groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-parent/artifactId version2.0.6.RELEASE/version relativePath/ !-- lookup parent from repository -- /parent groupIdcom.bushuo/groupId artifactIduser-provider/artifactId version0.0.1-SNAPSHOT/version nameuser-provider/name descriptionDemo project for Spring Boot/description url/ properties java.version1.8/java.version /properties dependencies !--web启动依赖-- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency !--mybatis依赖-- dependency groupIdorg.mybatis.spring.boot/groupId artifactIdmybatis-spring-boot-starter/artifactId version2.0.1/version /dependency !--eureka依赖-- dependency groupIdorg.springframework.cloud/groupId artifactIdspring-cloud-starter-netflix-eureka-client/artifactId /dependency !--mysql依赖-- dependency groupIdmysql/groupId artifactIdmysql-connector-java/artifactId version8.0.29/version scoperuntime/scope /dependency dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-test/artifactId scopetest/scope /dependency /dependencies dependencyManagement dependencies dependency groupIdorg.springframework.cloud/groupId artifactIdspring-cloud-dependencies/artifactId versionFinchley.SR2/version typepom/type scopeimport/scope /dependency /dependencies /dependencyManagement build plugins plugin groupIdorg.springframework.boot/groupId artifactIdspring-boot-maven-plugin/artifactId /plugin /plugins /build /project注若MySQL驱动依赖报红则加一行版本号重新下载5.x的MySQL选择5.x.x8.x的MySQL选择8.x.x步骤2在全局配置文件application.yml中添加Eureka、MySQL以及MyBatis的相关配置注8.0以下MySQL驱动名com.mysql.jdbc.Driver8.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 version1.0 encodingUTF-8? project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd modelVersion4.0.0/modelVersion parent groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-parent/artifactId version2.0.6.RELEASE/version relativePath/ !-- lookup parent from repository -- /parent groupIdcom.bushuo/groupId artifactIduser-consumer/artifactId version0.0.1-SNAPSHOT/version nameuser-consumer/name descriptionDemo project for Spring Boot/description url/ licenses license/ /licenses developers developer/ /developers scm connection/ developerConnection/ tag/ url/ /scm properties java.version1.8/java.version /properties dependencies !--feign依赖-- dependency groupIdorg.springframework.cloud/groupId artifactIdspring-cloud-starter-openfeign/artifactId version2.0.0.RELEASE/version /dependency !--web依赖-- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency !--eureka依赖-- dependency groupIdorg.springframework.cloud/groupId artifactIdspring-cloud-starter-netflix-eureka-client/artifactId /dependency !--thymeleaf前端模板依赖-- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-thymeleaf/artifactId version2.0.0.RELEASE/version /dependency dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-test/artifactId scopetest/scope /dependency !--hystrix熔断依赖-- dependency groupIdorg.springframework.cloud/groupId artifactIdspring-cloud-starter-netflix-hystrix/artifactId version2.0.0.RELEASE/version /dependency dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-test/artifactId scopetest/scope /dependency /dependencies dependencyManagement dependencies dependency groupIdorg.springframework.cloud/groupId artifactIdspring-cloud-dependencies/artifactId versionFinchley.SR2/version typepom/type scopeimport/scope /dependency /dependencies /dependencyManagement build plugins plugin groupIdorg.springframework.boot/groupId artifactIdspring-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 version1.0 encodingUTF-8? !DOCTYPE mapper PUBLIC -//mybatis.org//DTD Mapper 3.0//EN http://mybatis.org/dtd/mybatis-3-mapper.dtd mapper namespacecom.bushuo.userprovider.Dao.UserDao select idlogin resultTypecom.bushuo.common.entity.User parameterTypejava.lang.String select * from user where uname#{uname} and upassword#{upassword} /select /mapper3在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 langen head meta charsetUTF-8 title登录页面/title /head body h1 aligncenter登录页面/h1 div stylewidth:100%;text-align:center form actionhttp://localhost:8003/admin/login methodget p用 户: input typetext iduserName nameuname //p p密 码: input typepassword idpassword nameupassword //p pinput typesubmit value登录 input typereset value重置/p /form 没有账号a hrefhttp://localhost:8003/admin/toregister去注册/a /div /body /htmlwecomle.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类中添加处理用户注册时跳转注册界面的请求/toregister4在UserController类中添加处理用户注册的请求5在resources下的templates目录中创建静态页面!DOCTYPE html html langen head meta charsetUTF-8 title注册页面/title /head body h1 aligncenter注册页面/h1 div stylewidth:100%;text-align:center form actionhttp://localhost:8003/admin/register methodget p用 户: input typetext iduserName nameuname //p p密 码: input typepassword idpassword nameupassword //p p确认密码: input typepassword idupassword nameupassword //p p性 别 input typetext idsex nameusex //p pinput typesubmit value注册 input typereset value重置/p /form 已有账号a hrefhttp://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