0
点赞
收藏
分享

微信扫一扫

基于springboot框架的电脑商城项目(十)

创建订单功能的实现及AOP

创建订单

(一)创建数据库

CREATE TABLE t_order (
	oid INT AUTO_INCREMENT COMMENT '订单id',
	uid INT NOT NULL COMMENT '用户id',
	recv_name VARCHAR(20) NOT NULL COMMENT '收货人姓名',
	recv_phone VARCHAR(20) COMMENT '收货人电话',
	recv_province VARCHAR(15) COMMENT '收货人所在省',
	recv_city VARCHAR(15) COMMENT '收货人所在市',
	recv_area VARCHAR(15) COMMENT '收货人所在区',
	recv_address VARCHAR(50) COMMENT '收货详细地址',
	total_price BIGINT COMMENT '总价',
	status INT COMMENT '状态:0-未支付,1-已支付,2-已取消,3-已关闭,4-已完成',
	order_time DATETIME COMMENT '下单时间',
	pay_time DATETIME COMMENT '支付时间',
	created_user VARCHAR(20) COMMENT '创建人',
	created_time DATETIME COMMENT '创建时间',
	modified_user VARCHAR(20) COMMENT '修改人',
	modified_time DATETIME COMMENT '修改时间',
	PRIMARY KEY (oid)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE t_order_item (
	id INT AUTO_INCREMENT COMMENT '订单中的商品记录的id',
	oid INT NOT NULL COMMENT '所归属的订单的id',
	pid INT NOT NULL COMMENT '商品的id',
	title VARCHAR(100) NOT NULL COMMENT '商品标题',
	image VARCHAR(500) COMMENT '商品图片',
	price BIGINT COMMENT '商品价格',
	num INT COMMENT '购买数量',
	created_user VARCHAR(20) COMMENT '创建人',
	created_time DATETIME COMMENT '创建时间',
	modified_user VARCHAR(20) COMMENT '修改人',
	modified_time DATETIME COMMENT '修改时间',
	PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

(二)创建实体类

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Order extends baseEntity{
    private Integer oid;
    private Integer uid;
    private String recvName;
    private String recvPhone;
    private String recvProvince;
    private String recvCity;
    private String recvArea;
    private String recvAddress;
    private Long totalPrice;
    private Integer status;
    private Date orderTime;
    private Date payTime;
}

@Data
@NoArgsConstructor
@AllArgsConstructor
public class OrderItem extends baseEntity{
    private Integer id;
    private Integer oid;
    private Integer pid;
    private String title;
    private String image;
    private Long price;
    private Integer num;
}

(三)创建订单(持久层)

1.规划sql

inert into t_order (aid除外的所有字段) values (字段的值)
inert into t_order (id除外的所有字段) values (字段的值)

2.实现接口和抽象方法

public interface OrderMapper {
    /**
     * 插入订单数据
     * @param order 订单数据
     * @return 受影响的行数
     */
    Integer addOrder(Order order);

    /**
     * 插入某一个订单中商品数据
     * @param orderItem 订单中商品数据
     * @return 受影响的行数
     */
    Integer addOrderItem(OrderItem orderItem);
}

(四)创建订单(业务层)

1.规划异常

2.实现接口和抽象方法及实现

    //根据aid查询
    Address getByAid(Integer uid,Integer aid);
  @Override
    public Address getByAid(Integer uid, Integer aid) {
        Address address = addressMapper.findByAid(aid);
        if (address==null){
            throw new AddressNotFoundException("收货地址不存在");
        }
        if (!address.getUid().equals(uid)){
            throw new AccessDeniedException("非法数据访问");
        }
        address.setProvinceCode(null);
        address.setCityCode(null);
        address.setAreaCode(null);
        address.setCreatedUser(null);
        address.setCreatedTime(null);
        address.setModifiedUser(null);
        address.setModifiedTime(null);
        return address;
    }
public interface IOrderService {
    Order addOrder(Integer aid,Integer[] cids,Integer uid,String username);
}

@Service
public class OrderServiceImpl implements IOrderService {
   @Resource
    private IAddressService addressService;
    @Autowired
    private ICartService cartService;
    @Resource
    private OrderMapper orderMapper;
@Autowired
private IUserService userService;

    @Override
    public Order addOrder(Integer aid, Integer[] cids, Integer uid, String username) {
        List<CartVo> list = cartService.getByCids(uid, cids);
       Long totalPrice=0L;
        for (CartVo c:list
             ) {
          totalPrice+= c.getRealPrice()*c.getNum();

        }
        Address address = addressService.getByAid(uid, aid);
Order order=new Order();
order.setUid(uid);
order.setRecvProvince(address.getProvinceName());
order.setRecvName(address.getName());
order.setRecvCity(address.getCityName());
order.setRecvArea(address.getAreaName());
order.setRecvAddress(address.getAddress());
order.setRecvPhone(address.getPhone());
order.setOrderTime(new Date());
order.setTotalPrice(totalPrice);
order.setModifiedUser(username);
order.setModifiedTime(new Date());
order.setCreatedTime(new Date());
order.setStatus(0);
order.setCreatedUser(username);

        Integer integer = orderMapper.addOrder(order);
if (integer!=1){
    throw new InsertException("订单显示错误");
}
        for (CartVo c:list
             ) {
            OrderItem orderItem=new OrderItem();
            orderItem.setOid(order.getOid());
            orderItem.setTitle(c.getTitle());
            orderItem.setPrice(c.getRealPrice());
            orderItem.setPid(c.getPid());
            orderItem.setNum(c.getNum());
            orderItem.setImage(c.getImage());
            orderItem.setCreatedTime(new Date());
            orderItem.setCreatedUser(username);
            orderItem.setModifiedTime(new Date());
            orderItem.setModifiedUser(username);
            Integer integer1 = orderMapper.addOrderItem(orderItem);
            if (integer1!=1){
                throw new InsertException("订单项插入产生异常");
            }
        }
        return order;
    }
}

(五)创建订单(控制层)

1.处理异常

2.设计请求

3.处理请求

@RestController
@RequestMapping("/orders")
public class OrderController extends BaseController{
    @Autowired
    private IOrderService orderService;

    @GetMapping("/create")
    public JsonResult<Order> createOrder(Integer[] cids, Integer aid, HttpSession session){

        Order order = orderService.addOrder(aid, cids, getuidfromsession(session), getusernamesession(session));

        return new JsonResult<>(ok,order);
        
    }
}

(六)创建订单(前端页面)

$("#btn-create-order").click(function() {
    var aid = $("#address-list").val();//12
    var cids = location.search.substr(1);//cids=4&cids=6&cids=8
    $.ajax({
        url: "/orders/create",
        data: "aid=" + aid + "&" + cids,//aid=12&cids=4&cids=6&cids=8
        type: "GET",
        dataType: "JSON",
        success: function(json) {
            if (json.state == 200) {
                location.href = "payment.html";
            } else {
                alert("创建订单失败!" + json.message);
            }
        },
        error: function(xhr) {
            alert("创建订单数据时产生未知的异常" + xhr.status);
        }
    });
});

AOP

(一)Spring AOP

使用步骤:
首先定义一个类,将这个类作为切面类
在这个类中定义切面方法(5种:前置,后置,环绕,异常,最终)
将这个切面方法中的业务逻辑对应的代码进行编写和设计
通过连接点来连接目标方法,就是用粗粒度表达式和细粒度表达式来进行连接

(二)切面方法

(三)统计业务方法执行时长

<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjweaver</artifactId>
</dependency>
<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjtools</artifactId>
</dependency>

@Aspect(将当前类标记为切面类)
@Component(将当前类的对象创建使用维护交由Spring容器维护)

@Aspect
@Component
public class TimerAspect {
}

public Object around(ProceedingJoinPoint pjp) throws Throwable {
    //开始时间
    long start = System.currentTimeMillis();
    //调用目标方法,比如login方法,getByUid方法
    Object result = pjp.proceed();
    //结束时间
    long end = System.currentTimeMillis();
    System.out.println("耗时:"+(end-start));
    return result;
}
@Around("execution(* com.cy.store.service.impl.*.*(..))")

第一个表示方法返回值是任意的
第二个
表示imp包下的类是任意的
第三个*表示类里面的方法是任意的
(…)表示方法的参数是任意的

后记
👉👉💕💕美好的一天,到此结束,下次继续努力!欲知后续,请看下回分解,写作不易,感谢大家的支持!! 🌹🌹🌹

举报

相关推荐

0 条评论