技术选型:
1、JAVA版本:JDK11
2、数据库:mysql5.7 + Navicat
3、后端框架:SpringBoot + SpringMVC + MyBatisPlus
4、工具类:发邮件工具类、生成验证码工具类
5、项目优化:Nginx、Redis、读写分离
项目来源:
瑞吉外卖项目
项目源码(该源码是项目优化过后的):
reggie: 瑞吉外卖springboot项目jar包https://gitee.com/c_mmm/reggie.git
项目架构:
部署环境说明
通过这个项目学到或者复习了什么:
1、mybatisplus默认开启在映射实体或者属性时,将数据库中表名和字段名中的下划线去掉,按照驼峰命名法映射
user_name ---> userName
2、AntPathMatcher路径匹配器的match方法可以将定义的路径和访问的路劲进行匹配,可以识别通配符
3、md5加密的方法DigestUtils.md5DigestAsHex("字符串");
4、js对long型数据进行处理时可能会精度丢失,js只能保证16位数字精准
5、Java提供了ThreadLocal,可以为线程保存数据,线程与线程之间互不打扰
6、文件上传对form的要求:
method="file"
enctype="multipart/form-data"
type="file"
7、文件下载就是通过响应流将文件写回去,并且需要设置响应头response.setContentType("image/jpeg");
8、文件的读和写的固定写法:
byte[] bytes = new byte[1024];
int len = 0;
while((len = fis.read(bytes)) != -1){
outputStream.write(bytes,0,len);
outputStream.flush();
}
//关闭资源
fis.close();
outputStream.close();
9、DTO即数据传输对象,一般用于展示层与服务层之间的数据传输,有些表是需要关联查询的,那么一个实体类对应一个表,但是该实体类中可能会出现另一个实体类没有的属性,此时就需要dto进行扩展
10、jdk8新特性:lambda表达式 -> stream流的map方法的用法
List<DishFlavor> dishFlavors = flavors.stream().map((item) -> {
Long dish_id = dishDto.getId();
item.setDishId(dish_id);
return item;
}).collect(Collectors.toList());
11、AtomicInteger类可以保证原子性,保证线程安全 作用:进行金额计算,更加安全
amount.addAndGet(item.getAmount().multiply(new BigDecimal(item.getNumber())).intValue());
addAndGet ---- +=
item.getAmount() 获取金额
multiply() ---- *乘以
item.getNumber() 获取数量
.intValue() 转换为整形