本项目是一个外卖平台,实现了用户登录、附近店铺信息模糊查询,ip定位、收货地址管理、购物车修改、下单支付以及订单查询等功能。
项目基于前后端分离的设计方式,通过json进行数据交互。前端基于 Vue,后端基于 SpringBoot、MyBatis 等框架开发。
- 使用 JWT 进行授权认证
- 使用 ElasticSearch 进行附近店铺的模糊查询
- 利用腾讯地图 API 进行IP地位以及地点关键词查询
- 将店铺数据、商品信息等缓存到Redis
- 使用 Quartz 处理订单超时任务
- 使用 Base64 处理图片上传
- 实现了全局异常处理
- 使用 JSR303 以及分组校验进行数据验证
- 依据 RESTful 风格设计 API
在用户登录或注册成功后,为用户生成一个 token,用户获取token之后,每次请求都需要携带 token。用户发送请求后,如果请求需要用户登录,服务会从请求头 Authorization 获取 token,再利用服务器的秘钥判断 token 是否被篡改,最后进行 token 的有效性验证,判断 token 是否过期或已经失效。
对于 token 失效的处理:
-
用户注销
用户注销后,将 token 放入黑名单并存储在 Redis 中,并设置键的过期时间
-
用户修改密码
用户修改密码后,在此之前颁发给用户的 token 都应做失效处理,将用户id、修改密码后的时间同样存储在 Redis 中,这样如果获取到的 token 颁发的时间早于失效时间,就认为 token 是无效的。
token 续签:
除了设置 token 失效时间外,再设置一个刷新时间,若 token 已失效但是任然在刷新时间内,服务器会重新生成 token 并返回给浏览器,浏览器请求后若发现 token 已被刷新,更新 token 后重新访问 API 请求数据。
ElasticSearch 提供了强大的模糊查询功能以及地理范围查询,但我们的数据保存在 MySQL 关系型数据库中,为此,使用 Logstash 定时增量同步 MySQL 中的部分数据到 Es 中。相关的配置文件在:https://github.com/PhoenixXC/DtoProject/tree/master/back-end/logstash
为了更好的实现模糊查询的准确性,使用了 ik 中文分词和拼音分词器。
附近店铺的查询使用es的地理范围查询,过滤掉不在店铺配送范围外的店铺。
由于用户对购物车的使用比较频繁,对实时性也有较高的要求,所以将购物车的数据存储到 Redis 中,为了保证购物车数据的可靠性,防止购物车信息在店铺商品信息发生更改后发生不同步的问题,在 redis 中维护店铺商品信息的一个版本号,若购物车存储的版本号与redis的版本号发生不一致的情况,需要同步购物车的商品信息。
在获取前端传来的参数后,有必要对参数进行校验并返回合适的错误信息,这部分处理相对比较繁琐,若每次在控制器中加入参数验证逻辑无疑会给代码的维护和可读性带来困难。所以使用了 JSR303 进行数据校验,将验证逻辑与业务逻辑分离。
有时不同的情况下对参数有不同的验证逻辑,为此使用了 JSR303 的分组验证来处理这个问题。
订单的过期:使用 Quartz 设置定时任务,如果超时则执行订单更新处理,同时恢复被占用的商品库存。若在过期前用户成功进行了支付操作,移除定时任务,更新订单状态为等待商家处理。


