1.添加購(gòu)物車
1.1 需求分析和設(shè)計(jì)
1.1.1 產(chǎn)品原型
用戶可以將菜品或者套餐添加到購(gòu)物車。對(duì)于菜品來說,如果設(shè)置了口味信息,則需要選擇規(guī)格后才能加入購(gòu)物車;對(duì)于套餐來說,可以直接點(diǎn)擊+將當(dāng)前套餐加入購(gòu)物車。在購(gòu)物車中可以修改菜品和套餐的數(shù)量,也可以清空購(gòu)物車。
效果圖:
1.1.2 接口設(shè)計(jì)
通過上述原型圖,設(shè)計(jì)出對(duì)應(yīng)的添加購(gòu)物車接口。
說明:添加購(gòu)物車時(shí),有可能添加菜品,也有可能添加套餐。故傳入?yún)?shù)要么是菜品id,要么是套餐id。
1.1.3 表設(shè)計(jì)
用戶的購(gòu)物車數(shù)據(jù),也是需要保存在數(shù)據(jù)庫(kù)中的,購(gòu)物車對(duì)應(yīng)的數(shù)據(jù)表為shopping_cart表,具體表結(jié)構(gòu)如下:
字段名 | 數(shù)據(jù)類型 | 說明 | 備注 |
---|---|---|---|
id | bigint | 主鍵 | 自增 |
name | varchar(32) | 商品名稱 | 冗余字段 |
image | varchar(255) | 商品圖片路徑 | 冗余字段 |
user_id | bigint | 用戶id | 邏輯外鍵 |
dish_id | bigint | 菜品id | 邏輯外鍵 |
setmeal_id | bigint | 套餐id | 邏輯外鍵 |
dish_flavor | varchar(50) | 菜品口味 | |
number | int | 商品數(shù)量 | |
amount | decimal(10,2) | 商品單價(jià) | 冗余字段 |
create_time | datetime | 創(chuàng)建時(shí)間 |
說明:
- 購(gòu)物車數(shù)據(jù)是關(guān)聯(lián)用戶的,在表結(jié)構(gòu)中,我們需要記錄,每一個(gè)用戶的購(gòu)物車數(shù)據(jù)是哪些
- 菜品列表展示出來的既有套餐,又有菜品,如果用戶選擇的是套餐,就保存套餐ID(setmeal_id),如果用戶選擇的是菜品,就保存菜品ID(dish_id)
- 對(duì)同一個(gè)菜品/套餐,如果選擇多份不需要添加多條記錄,增加數(shù)量number即可
1.2 代碼開發(fā)
1.2.1 DTO設(shè)計(jì)
根據(jù)添加購(gòu)物車接口的參數(shù)設(shè)計(jì)DTO:
在sky-pojo模塊,ShoppingCartDTO.java已定義
package com.sky.dto;
import lombok.Data;
import java.io.Serializable;
@Data
public class ShoppingCartDTO implements Serializable {
private Long dishId;
private Long setmealId;
private String dishFlavor;
}
1.2.2 Controller層
根據(jù)添加購(gòu)物車接口創(chuàng)建ShoppingCartController:
package com.sky.controller.user;
/**
* 購(gòu)物車
*/
@RestController
@RequestMapping("/user/shoppingCart")
@Slf4j
@Api(tags = "C端-購(gòu)物車接口")
public class ShoppingCartController {
@Autowired
private ShoppingCartService shoppingCartService;
/**
* 添加購(gòu)物車
* @param shoppingCartDTO
* @return
*/
@PostMapping("/add")
@ApiOperation("添加購(gòu)物車")
public Result<String> add(@RequestBody ShoppingCartDTO shoppingCartDTO){
log.info("添加購(gòu)物車:{}", shoppingCartDTO);
shoppingCartService.addShoppingCart(shoppingCartDTO);//后緒步驟實(shí)現(xiàn)
return Result.success();
}
}
1.2.3 Service層接口
創(chuàng)建ShoppingCartService接口:
package com.sky.service;
public interface ShoppingCartService {
/**
* 添加購(gòu)物車
* @param shoppingCartDTO
*/
void addShoppingCart(ShoppingCartDTO shoppingCartDTO);
}
1.2.4 Service層實(shí)現(xiàn)類
創(chuàng)建ShoppingCartServiceImpl實(shí)現(xiàn)類,并實(shí)現(xiàn)add方法:
package com.sky.service.impl;
@Service
public class ShoppingCartServiceImpl implements ShoppingCartService {
@Autowired
private ShoppingCartMapper shoppingCartMapper;
@Autowired
private DishMapper dishMapper;
@Autowired
private SetmealMapper setmealMapper;
/**
* 添加購(gòu)物車
*
* @param shoppingCartDTO
*/
public void addShoppingCart(ShoppingCartDTO shoppingCartDTO) {
ShoppingCart shoppingCart = new ShoppingCart();
BeanUtils.copyProperties(shoppingCartDTO, shoppingCart);
//只能查詢自己的購(gòu)物車數(shù)據(jù)
shoppingCart.setUserId(BaseContext.getCurrentId());
//判斷當(dāng)前商品是否在購(gòu)物車中
List<ShoppingCart> shoppingCartList = shoppingCartMapper.list(shoppingCart);
if (shoppingCartList != null && shoppingCartList.size() == 1) {
//如果已經(jīng)存在,就更新數(shù)量,數(shù)量加1
shoppingCart = shoppingCartList.get(0);
shoppingCart.setNumber(shoppingCart.getNumber() + 1);
shoppingCartMapper.updateNumberById(shoppingCart);
} else {
//如果不存在,插入數(shù)據(jù),數(shù)量就是1
//判斷當(dāng)前添加到購(gòu)物車的是菜品還是套餐
Long dishId = shoppingCartDTO.getDishId();
if (dishId != null) {
//添加到購(gòu)物車的是菜品
Dish dish = dishMapper.getById(dishId);
shoppingCart.setName(dish.getName());
shoppingCart.setImage(dish.getImage());
shoppingCart.setAmount(dish.getPrice());
} else {
//添加到購(gòu)物車的是套餐
Setmeal setmeal = setmealMapper.getById(shoppingCartDTO.getSetmealId());
shoppingCart.setName(setmeal.getName());
shoppingCart.setImage(setmeal.getImage());
shoppingCart.setAmount(setmeal.getPrice());
}
shoppingCart.setNumber(1);
shoppingCart.setCreateTime(LocalDateTime.now());
shoppingCartMapper.insert(shoppingCart);
}
}
}
1.2.5 Mapper層
創(chuàng)建ShoppingCartMapper接口:
package com.sky.mapper;
@Mapper
public interface ShoppingCartMapper {
/**
* 條件查詢
*
* @param shoppingCart
* @return
*/
List<ShoppingCart> list(ShoppingCart shoppingCart);
/**
* 更新商品數(shù)量
*
* @param shoppingCart
*/
@Update("update shopping_cart set number = #{number} where id = #{id}")
void updateNumberById(ShoppingCart shoppingCart);
/**
* 插入購(gòu)物車數(shù)據(jù)
*
* @param shoppingCart
*/
@Insert("insert into shopping_cart (name, user_id, dish_id, setmeal_id, dish_flavor, number, amount, image, create_time) " +
" values (#{name},#{userId},#{dishId},#{setmealId},#{dishFlavor},#{number},#{amount},#{image},#{createTime})")
void insert(ShoppingCart shoppingCart);
}
創(chuàng)建ShoppingCartMapper.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.sky.mapper.ShoppingCartMapper">
<select id="list" parameterType="ShoppingCart" resultType="ShoppingCart">
select * from shopping_cart
<where>
<if test="userId != null">
and user_id = #{userId}
</if>
<if test="dishId != null">
and dish_id = #{dishId}
</if>
<if test="setmealId != null">
and setmeal_id = #{setmealId}
</if>
<if test="dishFlavor != null">
and dish_flavor = #{dishFlavor}
</if>
</where>
order by create_time desc
</select>
</mapper>
2. 查看購(gòu)物車
2.1 需求分析和設(shè)計(jì)
2.1.1 產(chǎn)品原型
當(dāng)用戶添加完菜品和套餐后,可進(jìn)入到購(gòu)物車中,查看購(gòu)物中的菜品和套餐。
2.1.2 接口設(shè)計(jì)
2.2 代碼開發(fā)
2.2.1 Controller層
在ShoppingCartController中創(chuàng)建查看購(gòu)物車的方法:
/**
* 查看購(gòu)物車
* @return
*/
@GetMapping("/list")
@ApiOperation("查看購(gòu)物車")
public Result<List<ShoppingCart>> list(){
return Result.success(shoppingCartService.showShoppingCart());
}
2.2.2 Service層接口
在ShoppingCartService接口中聲明查看購(gòu)物車的方法:
/**
* 查看購(gòu)物車
* @return
*/
List<ShoppingCart> showShoppingCart();
2.2.3 Service層實(shí)現(xiàn)類
在ShoppingCartServiceImpl中實(shí)現(xiàn)查看購(gòu)物車的方法:
/**
* 查看購(gòu)物車
* @return
*/
public List<ShoppingCart> showShoppingCart() {
return shoppingCartMapper.list(ShoppingCart.
builder().
userId(BaseContext.getCurrentId()).
build());
}
2.3 功能測(cè)試
3. 清空購(gòu)物車
3.1 需求分析和設(shè)計(jì)
3.1.1 產(chǎn)品原型
當(dāng)點(diǎn)擊清空按鈕時(shí),會(huì)把購(gòu)物車中的數(shù)據(jù)全部清空。
3.1.2 接口設(shè)計(jì)
3.2 代碼開發(fā)
3.2.1 Controller層
在ShoppingCartController中創(chuàng)建清空購(gòu)物車的方法:
/**
* 清空購(gòu)物車商品
* @return
*/
@DeleteMapping("/clean")
@ApiOperation("清空購(gòu)物車商品")
public Result<String> clean(){
shoppingCartService.cleanShoppingCart();
return Result.success();
}
3.2.2 Service層接口
在ShoppingCartService接口中聲明清空購(gòu)物車的方法:
/**
* 清空購(gòu)物車商品
*/
void cleanShoppingCart();
3.2.3 Service層實(shí)現(xiàn)類
在ShoppingCartServiceImpl中實(shí)現(xiàn)清空購(gòu)物車的方法:
/**
* 清空購(gòu)物車商品
*/
public void cleanShoppingCart() {
shoppingCartMapper.deleteByUserId(BaseContext.getCurrentId());
}
3.2.4 Mapper層
在ShoppingCartMapper接口中創(chuàng)建刪除購(gòu)物車數(shù)據(jù)的方法:文章來源:http://www.zghlxwxcb.cn/news/detail-799437.html
/**
* 根據(jù)用戶id刪除購(gòu)物車數(shù)據(jù)
*
* @param userId
*/
@Delete("delete from shopping_cart where user_id = #{userId}")
void deleteByUserId(Long userId);
后記
????????美好的一天,到此結(jié)束,下次繼續(xù)努力!欲知后續(xù),請(qǐng)看下回分解,寫作不易,感謝大家的支持?。???????文章來源地址http://www.zghlxwxcb.cn/news/detail-799437.html
到了這里,關(guān)于基于SpringBoot+Redis的前后端分離外賣項(xiàng)目-蒼穹外賣微信小程序端(十二)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!