最近做了一个以SpringBoot+Mybaits为框架前后端分离的商城秒杀项目,主要使用的工具是Idea和Maven,SpringBoot是一个功能十分强大的框架集合,里面包含了很多的框架.
工程的开始,我先配置好了应该有的文件结构
然后在Pom.xml里配置好要用的Jar包必要的SpringBoot有关的两个Jar包,`
org.springframework.boot
spring-boot-starter-parent
2.1.4.RELEASE
org.springframework.boot
spring-boot-starter-web
然后再配置必要的数据库连接有关的Jar包
mysql
mysql-connector-java
5.1.40
还有必要的数据库连接池这里我们用的是阿里里巴巴的德鲁伊的数据库连接池
com.alibaba
druid
1.1.3
实现工程持久层我用的是Mybatis框架,所以我配置了springBoot和Mybaits的整合Jar包
org.mybatis.spring.boot
mybatis-spring-boot-starter
1.3.1
最重要的是在Pom.xml里配置一个插件用于逆向工程由数据库生成持久层代码.
maven-clean-plugin
3.1.0
maven-resources-plugin
3.0.2
maven-compiler-plugin
3.8.0
maven-surefire-plugin
2.22.1
maven-jar-plugin
3.0.2
maven-install-plugin
2.5.2
maven-deploy-plugin
2.8.2
maven-site-plugin
3.7.1
maven-project-info-reports-plugin
3.0.0
org.mybatis.generator
mybatis-generator-maven-plugin
1.3.5
mysql
mysql-connector-java
5.1.40
mybatisgenerator
package
generate
true
false
src/main/resources/mybatis-generator.xml
然后在自己生成一个mybaits-generator.xml文件,在插件中已经映射好了
src/main/resources/mybatis-generator.xml
然后在application.properties文件中配置数据库信息和数据库线程池
这些完成后我们就可以使用SpringMVC的方式开发用户信息
我先定义了Controller层的通用返回对象,在这个类里我封装了数据对象和是否成功的提示信息在发生错误时我们需要一个错误信息的提示,所有还有定义一个总的异常处理类来处理未被Controller层吸收的异常.
这样做的目的是为了能在接下来的工作中遇到错误时能找到问题的原因
然后我们通过对Controller层类的三个注解来让SpringBoot帮我自动配置这个项目
@SpringBootApplication(scanBasePackages = {“com.miaoshaproject”})
@RestController
@MapperScan(“com.miaoshaproject.dao”)
该工程中用到的注解在最后都会有总结
由于这个项目是前后端分离的,我们的前端用的是Metronic模板
1.用户注册模块
注册的方式是通过手机号注册,向手机号发生验证码来进行注册的,所以我们要先做一个前端页面,有两个输入框用来放置手机号和验证码.然后在创建好用来存放手机号和验证码和id的用户注册表
具体流程:
输入一个手机号在前端页面,然后点击获取验证码按钮向后端发送一个ajax请求,因为我用的是前后端分离的做法所以要用ajax请求,然后由后端生成一个随机的验证码,将手机号和验证码都存人数据库用户注册表中,然后再向前端返回验证码的信息,具体的业务逻辑这里不详细叙述.由于前后端分离的原因,会存在一个跨域请求的问题我们要这么在后端设置
@CrossOrigin(allowCredentials = “true”,allowedHeaders = “*”)
然后在前端也要进行设置
xhrFields:{withCredentials:true},
由于短信发送功能比较麻烦,我直接将验证码打印出来.
2.用户具体信息模块
在前端创建好对应的属性字段让用户输入,然后我们先在后端建立数据模型,然后再在数据库里建立一张对应的表,为什么要先在后端生成数据模型呢,是因为我们在Dao层,Service层,Controller层,都要生成对应的数据模型返回给上一层,这样做的目的是为了能够让数据的安全性能得到最好的保障.然后在以同样的流程从前端得到数据存人数据库中,不过在工程中要完成登录的验证工作,将前端得到的数据与数据库中的数据进行对比,由此判断是否成功.
3.第三个模块是商品模块,分为创建商品和商品详情
与登录流程一样先完成前端页面的开发,然后在后端建立每一层对应的模型,然后再在数据库中创建对应的表,在完成过程中基本没有遇到坑
4.下单模块
开始流程如上
通过点击前端商品的名字先进入商品详情的界面,点击下单按钮,向后端发送一个请求,并且将对应的商品信息传入后端,将订单信息存人数据库中,并返回下单成功的信息.
5.秒杀模块
秒杀模块是基于下单模块的加强版,我们先在后端建立起秒杀活动的模型,也在数据库建立对应的秒杀活动信息的模型,然后在商品详情的前端加上我们秒杀活动的信息,主要是秒杀活动的状态(进行中,未进行,即将进行),还有秒杀的价格,秒杀活动的信息我们现在数据库中自行插入,设置好秒杀活动的起始时间和结束时间,然后我在前端页面设置了一个秒杀的倒计时
对应的前端代码
setInterval(raloadDom,1000);
function raloadDom(){
$("#title").text(g_itemVo.title);
$("#description").text(g_itemVo.description);
$("#stock").text(g_itemVo.stock);
$("#price").text(g_itemVo.price);
$("#imgUrl").text(g_itemVo.imgUrl);
$("#sales").text(g_itemVo.sales);
if(g_itemVo.promoStatus == 1){
var startTime = g_itemVo.startDate.replace(new RegExp("-","gm"),"/");
startTime = (new Date(startTime)).getTime();
var nowTime = Date.parse(new Date());
var delta = (startTime - nowTime)/1000;
if(delta<=0){
//活动开始了
g_itemVo.promoStatus = 2;
raloadDom();
}
$("#promoStartDate").text("秒杀活动将于:"+g_itemVo.startDate+"开始 倒计时:"+delta+"秒");
$("#promoPrice").text(g_itemVo.promoPrice);
$("#createorder").attr("disabled",true);
}else if(g_itemVo.promoStatus == 2){
//秒杀活动真在进行
$("#promoStartDate").text("秒杀正在进行中");
$("#promoPrice").text(g_itemVo.promoPrice);
$("#createorder").attr("disabled",false);
$("#normalPrice").hide();
}
};
这样我就完成了一个基于SpringBoot的简单项目
在后端代码中用到的一些注解我也有了一定的了解
1.@Controller():声明这是一个Controller类
2.@RequestMapping():处理映射请求的注解。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。用在方法上,表示该方法的访问路径
3.@CrossOrigin(allowCredentials = “true”,allowedHeaders = “*”)解决跨域请求
4.@ResponseBody:指定方法返回的是String或json类型数据
5.@Service:声明这是一个Service类交给Spring控制
6.@Transactional:声明该方法为事务,具有事务的性质
7.@RequestParam(name = “id”)Integer id:该方法的传入参数
8.@ExceptionHandler:统一处理某一类异常,从而能够减少代码重复率和复杂度
9.@ ResponseStatus:一般修饰的是一个异常类,当处理器的方法被调用时,@ResponseStatus指定的code和reason会被返回给前端。value属性是http状态码,比如404,500等。reason是错误信息
10.@SpringBootApplication(scanBasePackages = {“com.miaoshaproject”}):相当于这三个注解组合
@Configuration:就可以创建一个简单的spring配置类,可以用来替代相应的xml配置文件。
@EnableAutoConfiguration:可以帮助SpringBoot应用将所有符合条件的@Configuration配置都加载到当前SpringBoot创建并使用的IoC容器。
@ComponentScan:主要就是定义扫描的路径从中找出标识了需要装配的类自动装配到spring的bean容器中
11.@RestController:= @Controller + @ResponseBody。
12.@MapperScan(“com.miaoshaproject.dao”):可以指定要扫描的Mapper类的包的路径
13.@Autowired:自动注入,用于只有一个继承类的情况
在来说说我在项目中用到的一些工具类
BeanUtils.copyProperties(object,object)
这个工具类帮助在转化各个层模型是提供了很多的帮助,它可以将第一个对象中的值复制给第二个对象,但是只能复制一样的字段的数据,其他数据还是要自己设置
LocalDateTime now = LocalDateTime.now();
String nowdata = now.format(DateTimeFormatter.ISO_DATE).replace("-","");
这个方法可以极好的得到你想要的时间格式