2019_07_11 store商品模块_第十一天

博客主要围绕订单开发展开,先介绍显示确认订单信息页,需显示用户收货地址列表和所选购物车商品,给出相关SQL及各层开发步骤。接着阐述创建订单,包括创建数据表、实体类和持久层,还提及抽象类和接口的区别及应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

72. 显示确认订单信息页

显示“确认订单信息”页面中,需要显示2种数据:当前用户的所有收货地址列表;用户在前序页面中选择的购物车中的商品。

首先,完成“显示当前用户的所有收货地址的列表”,在此前开发“收货地址”相关功能时,已经可以通过/addresses/这个URL获取收货地址列表!则直接在orderConfirm.html中通过$.ajax()获取数据并显示即可!

接下来,应该“显示用户在前序页面中选择的购物车中的商品的列表”,对应的查询功能的SQL语句大致是:

select * from t_cart left join t_product on t_cart.pid=t_product.id where cid in (?,?,?)

所以,需要在CartMapper.java接口中添加:

List<CartVO> findByCids(Integer[] cids);

CartMapper.xml中配置以上抽象方法的映射:

<select id="findByCids" resultType="xx.xx.xx.CartVO">
	SELECT 
		cid, uid, 
		pid, t_cart.num, 
		t_cart.price, t_product.price AS realPrice,
		title, image
	FROM 
		t_cart 
	LEFT JOIN
		t_product
	ON
		t_cart.pid=t_product.id
	WHERE 
		cid IN
		<foreach collection="array"
			item="cid" seperator=","
			open="(" close=")">
			#{cid}
		</foreach>
	ORDER BY
		t_cart.created_time DESC
</select>

完成持久层后,接下来,需要在ICartService业务层接口中添加抽象方法,以对外提供数据访问功能:

List<CartVO> getByCids(Integer[] cids, Integer uid);

然后,在实现类中,先私有化编写持久层的方法:

private List<CartVO> findByCids(Integer[] cids) {
	return cartMapper.findByCids(cids);
}

并重写接口中的抽象方法:

public List<CartVO> getByCids(Integer[] cids, Integer uid) {
	if (cids == null) {
		return new ArrayList<>();
	}

	List<CartVO> result = findByCids(cids);

	Iterator<CartVO> it = result.iterator();
	while(it.hasNext()) {
		CartVO cartVO = it.next();
		if (cartVO.getUid() != uid) {
			it.remove();
		}
	}

	return result;
}

测试完成后,需要在控制器层提供接口:

@GetMapping("get_by_cids")
public JsonResult<List<CartVO>> getByCids(
		Integer[] cids, HttpSession session) {
	// 从session中获取uid
	Integer uid = getUidFromSession(session);
	// 调用业务层对象的方法执行任务
	List<CartVO> data = cartService.getByCids(cids, uid);
	// 响应成功
	return new JsonResult<>(SUCCESS, data);
}

然后,打开浏览器,可以通过http://localhost:8080/carts/get_by_cids?cids=14&cids=15&cids=16进行单元测试。

测试完成后,需要在orderConfirm.html中发出对这个URL的请求,以获取数据,并显示。

73. 创建订单-创建数据表

创建“订单表”:

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

创建“订单商品表”:

CREATE TABLE t_order_item (
	id INT AUTO_INCREMENT COMMENT 'id',
	oid INT COMMENT '归属的订单id',
	pid INT COMMENT '商品id',
	title VARCHAR(100) COMMENT '商品标题',
	image VARCHAR(500) COMMENT '商品图片',
	price BIGINT COMMENT '商品单价',
	num INT COMMENT '购买数量',
	created_user VARCHAR(50) COMMENT '创建人',
	created_time DATETIME COMMENT '创建时间',
	modified_user VARCHAR(50) COMMENT '最后修改人',
	modified_time DATETIME COMMENT '最后修改时间',
	PRIMARY KEY (id)
) DEFAULT CHARSET=UTF8;

73. 创建订单-创建实体类

74. 创建订单-持久层

只需要1个接口OrderMapper,而不需要OrderItemMapper。

所以,也只需要1个XML映射文件。

----------------------------------------------------

抽象类和接口的区别

  1. 藐视;
  2. 语法方面的区别;
  3. 深层次的理解;
  4. 应用方式、经验分享。

类:类别;接口:规范、标准、行为模式等。

类 is a 抽象类;实现类 has a 接口。

public class Teacher extends Person
public class Student extends Person
厨师,医生,司机……


public class Person implements 讲授, 学习, 烹饪, 医疗, 驾驶 {

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员西柚柚

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值