奶茶店项目总结

1.介绍一下项目:

业务方面:分别支持商家端和顾客端。支持商家端进行奶茶新品上传,可以定义上传奶茶产品小料及冷热,支持定制情侣或多人套餐售卖。

用户端支持用户菜品预览,设置默认地址,自定义奶茶口味及甜度小料,加入购物车后下单功能,也支持多人点单模式。

技术栈方面:项目使用Springboot作为web框架,使用mybatis-plus链接数据库, 数据库方面使用mysql及非关系型数据库redis部署在云服务器的docker虚拟化容器上,同时使用git作为版本控制,maven进行依赖管理。

项目难点:自定义了copyonwrite容器,来过滤敏感词。

提升数据库的访问瓶颈,在docker中部署多个mysql数据库容器,使用sharding-jdbc根据不同端口号来做到主从分离、读写分离,采用轮询的方式在多个从库中读数据。使用spring cache功能以及fastjson使用cacheable自动缓存数据到redis。

数据备份,主从分离以及docker挂载数据文件来备份mysql。开启aof及rdb混合备份redis。

数据脱敏:对于身份证号以及密码进行MD5加密处理。

数据 传输:使用DTO 数据传输对象作为网页端和程序Entity之间的桥梁。

索引:使用Mybatis-plus的ASSIN-ID作为默认id,其使用雪花算法计算得到15位的id值。设置id为主键,达到一次即可查询到结果。对于奶茶套餐的名称,价钱两者作为联合索引,在用户首页展示时达到覆盖索引从而加快访问速度。

全局异常处理:RestControllerAdvice注解来对全局出现的不同异常进行不同的处理。

 文件上传:

  • method="post"            采用post方式提交数据
  • enctype="multipart/form-data"     采用multipart格式上传文件
  • type="file"              使用input的file控件上传

 在后端来保存图片到指定位置,在yml中指定path路径,使用下面代码访问路径。

 @Value("${reggie.path}")
    private String basePath;

file.transferTo(new File(basePath + fileName)); //来保存图片

文件下载:

根据图片名称打开本地图片的输入流,新建sevlet输出流,进行传输,

 

项目最困难的地方:

提升数据库的访问瓶颈,在docker中部署多个mysql数据库容器,使用sharding-jdbc根据不同端口号来做到主从分离、读写分离,采用轮询的方式在多个从库中读数据。使用spring cache功能以及fastjson使用cacheable自动缓存数据到redis。

2.项目数据分页:

开始使用sql语句limit进行分页(由于是全表查询,后进行过滤,速度慢),后期优化为使用Mybatis-plus内置的分页插件,page、pagesize组合成Page对象,结合lambdaQueryWrapper使用service的page方法进行分页查询。

 

3.敏感词过滤copyOnWrite容器

对于订单的备注要进行敏感词使用WordSegmenter进行中文字符串的分词,得到的词语来通过自定义的copyOnWriteSet容器进行过滤,在访问量低的时候进行复制,添加新数据,之后由旧引用到新容器上。

 

4.项目设计模式:

spring中IOC容器里的bean作用域都是单例模式,使用工厂模式BeanFactory或者ApplicationContext创建bean对象。AOP基于代理模式。RedisTemplate基于模板模式。SpringMVC的HandlerAdapter是适配器模式,用来找寻适合的controller处理方法。

使用ThreadLocal包装类进行储存userid,每次访问网页都是一个单例。统一返回类型R里面包含数据以及响应状态码,通过调用R的succes及fail函数来向网页传输数据,是包装器模式。使用属性字段Tablefiled注解,及Mybatis-plus的MetaObjectHanddler在插入和更新语句操作数据库前,填充公共字段,使用AOP切面技术,代理模式。

 

posted @ 2023-03-30 21:19  枫叶像思念  阅读(165)  评论(0编辑  收藏  举报