购物车模块
加入购物车
持久层
1.规划持久层的语句
1.向购物车表中插入数据
insert into t_cart (aid除外) values (值列表)
2.当当前的商品已经在购物车中存在,则直接更新 number的数量即可
update t_cart set number = #{number} where cid= #{cid}
3.查询当前cid是否存在
select * from t_cart where cid= #{cid} and uid =?
2.接口与方法
CartMapper CartMapper.xml
/**
* 插入购物车的收据
* @param cart
* @return
*/
Integer insert(Cart cart);
/**
* 更新购物车里面某个商品的数量
* @param cid
* @param num
* @param modifiedUser
* @param modifiedTime
* @return
*/
Integer updateNumerByCid(@Param("cid") Integer cid, @Param("num") Integer num, @Param("modifiedUser") String modifiedUser, @Param("modifiedTime") Date modifiedTime);
/**
* 根据用户的id和商品的id来查询购物车中的数据
* @param uid
* @param pid
* @return
*/
Cart findByUidAndPid(@Param("uid") Integer uid,@Param("pid") Integer pid);
<resultMap id="CartEntityMap" type="com.cy.store.pojo.Cart">
<id column="cid" property="cid"/>
<result column="created_user" property="createdUser"/>
<result column="created_time" property="createdTime"/>
<result column="modified_user" property="modifiedUser"/>
<result column="modified_time" property="modifiedTime"/>
</resultMap>
<insert id="insert" useGeneratedKeys="true" keyProperty="cid">
INSERT INTO t_cart (uid, pid, price, num, created_user, created_time, modified_user, modified_time)
VALUES (#{uid}, #{pid}, #{price}, #{num}, #{createdUser}, #{createdTime}, #{modifiedUser}, #{modifiedTime})
</insert>
<update id="updateNumerByCid">
update t_cart set num= #{num},
modified_user =#{modifiedUser},
modified_time =#{modifiedTime}
where cid =#{cid}
</update>
<select id="findByUidAndPid" resultMap="CartEntityMap">
SELECT
*
FROM
t_cart
WHERE
uid=#{uid} AND pid=#{pid}
</select>
测试
/**
* 测试插入购物车的方法
*/
@Test
void testInsert(){
Cart cart = new Cart();
cart.setUid(10);
cart.setPid(10000010);
cart.setPrice(1000l);
cart.setNum(2);
Integer insert = cartMapper.insert(cart);
log.info("插入的结果为:{}",insert);
}
/**
* 测试更新某个商品在购物车里的数量
*/
@Test
void testUpdataNum(){
Integer admin = cartMapper.updateNumerByCid(1, 4, "admin", new Date());
log.info("更新的结果为:{}",admin);
}
/**
* 测试通过uid和pid查找指定的某个商品
*/
@Test
void testFindByCidAndPid() {
Cart byUidAndPid = cartMapper.findByUidAndPid(10, 10000010);
log.info("查找的结果为:{}",byUidAndPid);
}
业务层
1.规划异常
1.在插入数据时可能会产生异常:insetException
2.更新数据时可能会产生异常: updateException
2.接口
创建一个ICartService 实现类: CartServiceImpl
3.实现方法
@Override
public void addToCart(Integer uid, Integer pid, Integer count, String username) {
//执行插入操作之前
Cart result = cartMapper.findByUidAndPid(uid, pid);
if (result == null) {//表示这个商品从来没有被添加在购物车内
Cart cart = new Cart();
cart.setUid(uid);
cart.setPid(pid);
cart.setPid(pid);
cart.setNum(count);
cart.setModifiedUser(username);
cart.setModifiedTime(new Date());
cart.setCreatedTime(new Date());
cart.setCreatedUser(username);
//价格 来至于商品中的数据 补全价格
Product product = productMapper.findById(pid);
cart.setPrice(product.getPrice());
Integer insert = cartMapper.insert(cart);
if (insert == null||insert !=1) {
throw new InsertException("插入时发生未知的异常");
}
}else{//表示当前的商品在购物车中,则更新这条数据的num值
Integer integer = cartMapper.updateNumerByCid(result.getCid(), count+result.getNum(), username, new Date());
if (integer != 1) {
throw new UpdateException("更新数据时发生了未知的异常");
}
}
}
4.测试
@Test
void addToCart(){
cartService.addToCart(10,10000011,2,"管理员");
}
控制层
1.异常处理
不需要处理
2.请求设计
/carts/add_to_cart
/get
/pid amount session
/JsonResult
3.实现方法
/**
* 添加某个商品到购物车
* @param session
* @param pid
* @param amount
* @return
*/
@RequestMapping("/add_to_carts")
public JsonResult<Void> addToCart(HttpSession session,Integer pid,Integer amount){
Integer uid = getUidFromSession(session);
String username = getUsernameFromSession(session);
cartService.addToCart(uid,pid,amount,username);
return new JsonResult<Void>(OK);
}
测试
@Test
void addToCart(){
cartService.addToCart(10,10000011,2,"管理员");
}
前端页面
$("#btn-add-to-collect").click(function() {
$.ajax({
url: "/carts/add_to_carts",
type: "GET",
date:{
"pid":id,
"amount":$("#num").val()
},
dataType: "JSON",
success: function (json) {
if (json.state == 200) {
alert("加入购物车成功");
} else {
alert("加入购物车失败!");
}
},
error: function (xhr) {
alert("加入购物车时产生了位置的异常" + xhr.message);
}
});
});