观前提示:
- 详细资料观看黑马程序员的畅购商城。
- 该博客尝试用解题思路说明代码实现。
- 笔者当前水平有限,因此该博客质量不高。
已知:
- Idworke:一个分布式的ID生成工具.
- 可以理解为帮助生成数据库表的id。
- 假设已经引入在common公共模块。
- 订单数据库表和订单数据库明细表
- 已建立订单实体类Order。
- 已建立订单明细实体类OrderIte。
- 订单实体类与订单明细实体类的关系可以理解为前者是购物车,后者是购物车的详情商品。
- 已经实现购物车模块
- 购物车实体类是使用了订单明细实体类OrderIte,但是只保存在redis缓存。
- redis缓存可以从RedisTemplate类的对象获取。
- 从Controller层接受Order对象。
- DAO层已经创建OrderMapper和OrderItemMapper。
- 已经依赖Spring Boot等框架。
要求:
- 在订单模块调用Idworker
- 在Service层完成:
- 给Order对象的订单主键id赋值。
- 给Order对象的订单创建时间createTime属性赋值。
- 给Order对象的最近更新时间updateTime属性赋值。
- 给Order对象的商品总数量num属性赋值。
- 给Order对象的商品总金额money属性赋值。
- 赋值后的Order对象和OrderItem对象封装给DAO层的OrderMapper和OrderItemMapper。
解决:
- Idworker在本模块的调用
//方法创建在OrderApplication.java
/****
* 创建IDworker
* workerld是机号
* datacenterld是序列
*/
@Bean
public IdWorker idWorker() {
return new IdWorker (workerld:0, datacenterld:0);
- 给Order对象的订单主键id赋值。
@Autowired
private IdWorker idWorker;
@Override
public void add (Order order){
//生成主键id:调用idWork,转换成String,赋给Order对象;
order.setId (String. valueOf (idWorker.nextId()));
}
- 给Order对象的订单创建时间createTime属性赋值。
- 给Order对象的最近更新时间updateTime属性赋值。
@Override
public void add (Order order){
// 创建时间
order.setCreateTime (new Date());
//修改时间:前端传递过来的Order对象中获取
order.setUpdateTime (order.getCreateTime());
}
- 给Order对象的商品总数量num属性赋值。
- 给Order对象的商品总金额money属性赋值。
@Autowired
private RedisTemplate redisTemplate;
@Override
public void add (Order order){
//从Token令牌中获取当前用户名username,并赋值给Order对象的username属性
String username = TokenDecode.getUserInfo().get("username");|
order.setUsername(username);
//根据Order对象的username属性获取redis缓存中购物车实体类,并赋值给OrderItem订单实体类
List<OrderItem> orderItem = redisTemplate.boundHash0ps("Cart_" +order.getUsername()).values();
int totalNum = 0; //总数量
int totalMoney =0; //总金额
for (OrderItem orderItem : orderItems) { //循环购物车里每一个商品
totalNum += orderItem.getNum(); //从购物车里获取每一个商品的数量
totalMoney += orderItem.getMoney(); //从购物车里获取每一个商品的金额
}
//循环出来的就是订单实体类需要的总数量和总金额
order.setTotalNum(totalNum);
order.setPayMoney(totalMoney);
}
- 赋值后的Order对象和OrderItem对象封装给DAO层的OrderMapper和OrderItemMapper。
@Autowired
private OrderMapper orderMapper;
@Autowired
private OrderItemMapper orderItemMapper;
@Override
public void add (Order order){
//订单明细的ID
orderItem.setId(String.valueOf(idWorker.nextId());
//订单明细所属的订单,从订单主键id获取,因此我们需要把订单主键id先在写在上面
orderItem.setOrderId(order.getId());
//先添加订单信息,再循环添加订单明细
orderMapper.insertSelective(order);
for (OrderItem orderItem : orderItems) {
orderItemMapper.insertSelective(orderItem);
}
}