添加购物车和地址相关功能接口和注释

hk_branch
lh 7 months ago
parent 8dcdaeda8f
commit 704d97b2e5

@ -0,0 +1,65 @@
package com.sky.controller.admin;
import com.sky.result.Result;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.*;
/**
*
*/
@RestController("adminShopController")
@RequestMapping("/admin/shop")
@Api(tags = "店铺相关接口") // 使用 Swagger 注解,标记该类为店铺相关的接口,便于文档生成
@Slf4j // 使用 Lombok 的日志功能,自动生成日志对象
public class ShopController {
// 定义用于存储店铺状态的 Redis 键
public static final String KEY = "SHOP_STATUS";
// 自动注入 RedisTemplate用于与 Redis 数据库进行交互
@Autowired
private RedisTemplate redisTemplate;
/**
*
* 1 0 Redis
*
* @param status 1 0
* @return
*/
@PutMapping("/{status}") // 使用 PUT 请求方法来更新店铺状态
@ApiOperation("设置店铺的营业状态") // 使用 Swagger 注解,描述该接口的功能
public Result setStatus(@PathVariable Integer status){
// 打印日志,记录当前设置的状态
log.info("设置店铺的营业状态:{}", status == 1 ? "营业中" : "打烊中");
// 将店铺状态存储到 Redis 中,使用 `opsForValue().set` 方法设置键值对
redisTemplate.opsForValue().set(KEY, status);
// 返回成功的操作结果
return Result.success();
}
/**
*
* Redis
*
* @return 1 0
*/
@ApiOperation("获取店铺营业状态") // 使用 Swagger 注解,描述该接口的功能
@GetMapping("/status") // 使用 GET 请求方法获取店铺状态
public Result<Integer> getStatus(){
// 从 Redis 中获取店铺的状态值
Integer status = (Integer) redisTemplate.opsForValue().get(KEY);
// 打印日志,记录当前获取到的状态
log.info("获取店铺营业状态:{}", status == 1 ? "营业中" : "打烊中");
// 返回店铺状态的查询结果,包装在 Result 中
return Result.success(status);
}
}

@ -0,0 +1,95 @@
package com.sky.controller.user;
import com.sky.dto.ShoppingCartDTO; // 导入购物车数据传输对象
import com.sky.entity.ShoppingCart; // 导入购物车实体
import com.sky.result.Result; // 导入统一结果封装类
import com.sky.service.ShoppingCartService; // 导入购物车服务类
import io.swagger.annotations.Api; // 导入 Swagger 注解,用于生成 API 文档
import io.swagger.annotations.ApiOperation; // 导入 Swagger 注解,用于描述接口功能
import lombok.extern.slf4j.Slf4j; // 导入 Lombok 的日志功能
import org.springframework.beans.factory.annotation.Autowired; // 导入 Spring 的自动注入注解
import org.springframework.web.bind.annotation.*; // 导入 Spring Web 注解,用于处理请求
import java.util.List; // 导入 List 集合类
/**
* C
*/
@RestController // 将该类标记为一个 RESTful 控制器
@RequestMapping("/user/shoppingCart") // 设置基础请求路径为 "/user/shoppingCart"
@Slf4j // 使用 Lombok 提供的 @Slf4j 注解,自动生成日志记录器
@Api(tags = "C端购物车相关接口") // Swagger 文档注解标记该类为“C端购物车相关接口”
public class ShoppingCartController {
// 自动注入 ShoppingCartService用于执行购物车的业务逻辑
@Autowired
private ShoppingCartService shoppingCartService;
/**
*
*
* @param shoppingCartDTO
* @return Result
*/
@PostMapping("/add") // 设置请求路径为 "/add",并且使用 POST 方法
@ApiOperation("添加购物车") // Swagger 注解,用于生成 API 文档并描述该接口的功能
public Result add(@RequestBody ShoppingCartDTO shoppingCartDTO) {
// 打印日志,记录添加购物车时的商品信息
log.info("添加购物车,商品信息为:{}", shoppingCartDTO);
// 调用服务层的方法,将商品添加到购物车
shoppingCartService.addShoppingCart(shoppingCartDTO);
// 返回操作成功的结果
return Result.success();
}
/**
*
*
* @return Result<List<ShoppingCart>>
*/
@GetMapping("/list") // 设置请求路径为 "/list",并且使用 GET 方法
@ApiOperation("查看购物车") // Swagger 注解,描述该接口的功能
public Result<List<ShoppingCart>> list() {
// 调用服务层方法,获取当前用户购物车中的商品列表
List<ShoppingCart> list = shoppingCartService.showShoppingCart();
// 返回购物车商品列表
return Result.success(list);
}
/**
*
*
* @return Result
*/
@DeleteMapping("/clean") // 设置请求路径为 "/clean",并且使用 DELETE 方法
@ApiOperation("清空购物车") // Swagger 注解,描述该接口的功能
public Result clean() {
// 调用服务层方法,清空购物车
shoppingCartService.cleanShoppingCart();
// 返回操作成功的结果
return Result.success();
}
/**
*
*
* @param shoppingCartDTO
* @return Result
*/
@PostMapping("sub") // 设置请求路径为 "/sub",并且使用 POST 方法
@ApiOperation("删除购物车中一个商品") // Swagger 注解,描述该接口的功能
public Result sub(@RequestBody ShoppingCartDTO shoppingCartDTO) {
// 打印日志,记录删除购物车中的商品信息
log.info("删除购物车中的商品:{}", shoppingCartDTO);
// 调用服务层方法,从购物车中删除指定的商品
shoppingCartService.subShoppingCart(shoppingCartDTO);
// 返回操作成功的结果
return Result.success();
}
}

@ -1,4 +1,61 @@
package com.sky.mapper;
import com.sky.entity.AddressBook; // 导入 AddressBook 实体类
import org.apache.ibatis.annotations.*; // 导入 MyBatis 注解
import java.util.List; // 导入 List 集合类
@Mapper // 标识这是一个 MyBatis 的 Mapper 接口MyBatis 会自动扫描并生成对应的实现
public interface AddressBookMapper {
/**
* 簿
*
* @param addressBook AddressBook
* @return 簿
*/
List<AddressBook> list(AddressBook addressBook);
/**
*
*
* @param addressBook AddressBook
*/
@Insert("insert into address_book" +
" (user_id, consignee, phone, sex, province_code, province_name, city_code, city_name, district_code," +
" district_name, detail, label, is_default)" +
" values (#{userId}, #{consignee}, #{phone}, #{sex}, #{provinceCode}, #{provinceName}, #{cityCode}, #{cityName}," +
" #{districtCode}, #{districtName}, #{detail}, #{label}, #{isDefault})")
void insert(AddressBook addressBook);
/**
* id
*
* @param id id
* @return AddressBook null
*/
@Select("select * from address_book where id = #{id}")
AddressBook getById(Long id);
/**
* id
*
* @param addressBook AddressBook
*/
void update(AddressBook addressBook);
/**
* id
*
* @param addressBook id AddressBook
*/
@Update("update address_book set is_default = #{isDefault} where user_id = #{userId}")
void updateIsDefaultByUserId(AddressBook addressBook);
/**
* id
*
* @param id id
*/
@Delete("delete from address_book where id = #{id}")
void deleteById(Long id);
}

@ -1,4 +1,7 @@
package com.sky.mapper;
import com.sky.entity.Setmeal;
public interface SetmealMapper {
Setmeal getById(Long setmealId);
}

@ -1,4 +1,93 @@
package com.sky.mapper;
import com.sky.entity.ShoppingCart;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Update;
import java.util.List;
@Mapper // 标识该接口为 MyBatis 的 MapperMyBatis 会自动生成代理类并进行依赖注入
public interface ShoppingCartMapper {
/**
*
*
* @param shoppingCart
* @return
*
* `shoppingCart`
* - `userId`
* - `dishId`
*
* MyBatis XML `shoppingCart`
*/
List<ShoppingCart> list(ShoppingCart shoppingCart);
/**
* ID
*
* @param shoppingCart ID
*
* `shoppingCart` `id` `number`
* - `id`
* - `number`
*
* SQL MyBatis `number`
*/
@Update("update shopping_cart set number = #{number} where id = #{id}")
void updateNumberById(ShoppingCart shoppingCart);
/**
*
*
* @param shoppingCart
*
* `shoppingCart`
* - `name`, `image`, `userId`, `dishId`, `setmealId`, `dishFlavor`, `amount`, `createTime`
*
* SQL MyBatis
*/
@Insert("insert into shopping_cart(name, image, user_id, dish_id, setmeal_id, dish_flavor, amount, create_time) " +
"values (#{name},#{image},#{userId},#{dishId},#{setmealId},#{dishFlavor},#{amount},#{createTime})")
void insert(ShoppingCart shoppingCart);
/**
* ID
*
* @param userId ID
*
* `userId`
* -
*
* SQL MyBatis `user_id` `userId`
*/
@Delete("delete from shopping_cart where user_id = #{userId}")
void deleteByUserId(Long userId);
/**
* ID
*
* @param id
*
* `id`
* - `id`
*
* SQL MyBatis `id` `id`
*/
@Delete("delete from shopping_cart where id = #{id}")
void deleteById(Long id);
/**
*
*
* @param shoppingCartList
*
* `shoppingCartList` `ShoppingCart`
* - `ShoppingCart` `shopping_cart`
*
* MyBatis
*/
void insertBatch(List<ShoppingCart> shoppingCartList);
}

@ -0,0 +1,85 @@
package com.sky.service;
import com.sky.entity.AddressBook;
import java.util.List;
/**
* AddressBookService 簿
* 簿
* 簿AddressBook
*
*/
public interface AddressBookService {
/**
* 簿
* 簿簿
*
* @param addressBook 簿
* `addressBook`
* @return 簿簿
*
* `addressBook` 簿
*/
List<AddressBook> list(AddressBook addressBook);
/**
* 簿
* 簿
*
* @param addressBook 簿
*
*
* `addressBook` 簿
*/
void save(AddressBook addressBook);
/**
* ID 簿
* 簿 ID 簿
*
* @param id 簿ID ID 簿
* @return ID 簿 null
*
* 簿
*/
AddressBook getById(Long id);
/**
* 簿
* 簿
*
* @param addressBook 簿
* ID
*
* `addressBook` `id`
*
*/
void update(AddressBook addressBook);
/**
* 簿
* 簿 "默认"
*
* @param addressBook 簿
* `isDefault`
*
*
* `addressBook` `isDefault` `true`
* `isDefault` `false`
*/
void setDefault(AddressBook addressBook);
/**
* ID 簿
* 簿 ID 簿
*
* @param id 簿 ID
*
* `id` 簿
*
*
* 簿 `id` `id`
*/
void deleteById(Long id);
}

@ -0,0 +1,46 @@
package com.sky.service;
import com.sky.dto.ShoppingCartDTO;
import com.sky.entity.ShoppingCart;
import java.util.List;
/**
* ShoppingCartService
*
* ShoppingCart
*/
public interface ShoppingCartService {
/**
*
* ShoppingCartDTO
*
* @param shoppingCartDTO DTOID
*
*/
void addShoppingCart(ShoppingCartDTO shoppingCartDTO);
/**
*
*
*
* @return
*/
List<ShoppingCart> showShoppingCart();
/**
*
*
*/
void cleanShoppingCart();
/**
*
* ShoppingCartDTO
*
* @param shoppingCartDTO DTOID
* 0
*/
void subShoppingCart(ShoppingCartDTO shoppingCartDTO);
}

@ -0,0 +1,99 @@
package com.sky.service.impl;
import com.sky.context.BaseContext;
import com.sky.entity.AddressBook;
import com.sky.mapper.AddressBookMapper;
import com.sky.service.AddressBookService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
@Service // 标识该类为一个服务层组件,会被 Spring 扫描并管理
@Slf4j // 使用 Lombok 提供的日志功能,自动生成日志记录器
public class AddressBookServiceImpl implements AddressBookService {
@Autowired // 自动注入 AddressBookMapper进行数据库操作
private AddressBookMapper addressBookMapper;
/**
* 簿
*
* @param addressBook AddressBook
* @return AddressBook
*/
public List<AddressBook> list(AddressBook addressBook) {
// 调用 mapper 层的 list 方法,执行查询操作
return addressBookMapper.list(addressBook);
}
/**
* 簿
*
* @param addressBook AddressBook
*/
public void save(AddressBook addressBook) {
// 设置当前用户的 ID假设 BaseContext.getCurrentId() 返回当前用户的 ID
addressBook.setUserId(BaseContext.getCurrentId());
// 默认将新增的地址设置为非默认地址
addressBook.setIsDefault(0);
// 调用 mapper 层的 insert 方法执行插入操作
addressBookMapper.insert(addressBook);
}
/**
* ID
*
* @param id
* @return AddressBook
*/
public AddressBook getById(Long id) {
// 调用 mapper 层的 getById 方法查询地址
AddressBook addressBook = addressBookMapper.getById(id);
return addressBook; // 返回查询结果
}
/**
* ID
*
* @param addressBook AddressBook
*/
public void update(AddressBook addressBook) {
// 调用 mapper 层的 update 方法更新地址数据
addressBookMapper.update(addressBook);
}
/**
*
*
* 使
* 1.
* 2.
*
* @param addressBook AddressBook
*/
@Transactional // 标识该方法为事务性方法,多个操作要么全部成功,要么全部失败
public void setDefault(AddressBook addressBook) {
// 1. 将当前用户的所有地址修改为非默认地址
addressBook.setIsDefault(0); // 将 isDefault 设置为 0非默认
addressBook.setUserId(BaseContext.getCurrentId()); // 设置用户 ID
// 调用 mapper 层的 updateIsDefaultByUserId 方法更新所有地址的默认状态
addressBookMapper.updateIsDefaultByUserId(addressBook);
// 2. 将当前地址改为默认地址
addressBook.setIsDefault(1); // 将 isDefault 设置为 1默认
// 调用 mapper 层的 update 方法更新指定地址的默认状态
addressBookMapper.update(addressBook);
}
/**
* ID
*
* @param id
*/
public void deleteById(Long id) {
// 调用 mapper 层的 deleteById 方法删除指定的地址
addressBookMapper.deleteById(id);
}
}

@ -0,0 +1,140 @@
package com.sky.service.impl;
import com.fasterxml.jackson.databind.ser.Serializers;
import com.sky.context.BaseContext;
import com.sky.dto.ShoppingCartDTO;
import com.sky.entity.Dish;
import com.sky.entity.Setmeal;
import com.sky.entity.ShoppingCart;
import com.sky.mapper.DishMapper;
import com.sky.mapper.SetmealMapper;
import com.sky.mapper.ShoppingCartMapper;
import com.sky.service.ShoppingCartService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.util.List;
@Service
@Slf4j
public class ShoppingCartServiceImpl implements ShoppingCartService {
@Autowired
private ShoppingCartMapper shoppingCartMapper;
// 注入购物车数据库操作接口
@Autowired
private DishMapper dishMapper;
// 注入菜品数据库操作接口
@Autowired
private SetmealMapper setmealMapper;
// 注入套餐数据库操作接口
/*
*
* */
@Override
public void addShoppingCart(ShoppingCartDTO shoppingCartDTO) {
// 创建购物车对象并将DTO数据复制到实体对象中
ShoppingCart shoppingCart = new ShoppingCart();
BeanUtils.copyProperties(shoppingCartDTO, shoppingCart);
// 获取当前用户的ID假设通过BaseContext获取
Long userId = BaseContext.getCurrentId();
shoppingCart.setUserId(userId);
// 查询当前用户购物车中是否已有此商品
List<ShoppingCart> list = shoppingCartMapper.list(shoppingCart);
// 如果购物车中已经有该商品数量加1
if (list != null && list.size() > 0) {
ShoppingCart cart = list.get(0);
cart.setNumber(cart.getNumber() + 1); // 更新购物车中商品的数量 + 1
shoppingCartMapper.updateNumberById(cart); // 更新数据库中的购物车数据
} else {
// 如果购物车中没有该商品,插入一条新的购物车记录
Long dishId = shoppingCartDTO.getDishId();
if (dishId != null) {
// 如果添加的是菜品
Dish dish = dishMapper.getById(dishId); // 从数据库查询该菜品的信息
shoppingCart.setName(dish.getName()); // 设置菜品名称
shoppingCart.setImage(dish.getImage()); // 设置菜品图片
shoppingCart.setAmount(dish.getPrice()); // 设置菜品价格
} else {
// 如果添加的是套餐
Long setmealId = shoppingCart.getSetmealId();
Setmeal setmeal = setmealMapper.getById(setmealId); // 从数据库查询该套餐的信息
shoppingCart.setName(setmeal.getName()); // 设置套餐名称
shoppingCart.setImage(setmeal.getImage()); // 设置套餐图片
shoppingCart.setAmount(setmeal.getPrice()); // 设置套餐价格
}
shoppingCart.setNumber(1); // 新增购物车商品数量为1
shoppingCart.setCreateTime(LocalDateTime.now()); // 设置当前时间为创建时间
shoppingCartMapper.insert(shoppingCart); // 将购物车记录插入数据库
}
}
/*
*
* */
@Override
public List<ShoppingCart> showShoppingCart() {
// 获取当前用户ID
Long userId = BaseContext.getCurrentId();
// 创建一个ShoppingCart对象只设置了用户ID用于查询该用户的购物车
ShoppingCart shoppingCart = ShoppingCart.builder()
.userId(userId)
.build();
// 查询该用户的购物车数据并返回
List<ShoppingCart> list = shoppingCartMapper.list(shoppingCart);
return list;
}
/*
*
* */
@Override
public void cleanShoppingCart() {
// 获取当前用户ID
Long userId = BaseContext.getCurrentId();
// 调用删除方法,清空该用户的所有购物车数据
shoppingCartMapper.deleteByUserId(userId);
}
/*
*
* */
@Override
public void subShoppingCart(ShoppingCartDTO shoppingCartDTO) {
// 创建购物车对象并将DTO数据复制到实体对象中
ShoppingCart shoppingCart = new ShoppingCart();
BeanUtils.copyProperties(shoppingCartDTO, shoppingCart);
// 获取当前用户的ID
Long userId = BaseContext.getCurrentId();
shoppingCart.setUserId(userId);
// 查询该用户的购物车数据
List<ShoppingCart> list = shoppingCartMapper.list(shoppingCart);
if (list != null && list.size() > 0) {
shoppingCart = list.get(0);
Integer number = shoppingCart.getNumber();
// 如果商品数量为1删除这条购物车记录
if (number == 1) {
shoppingCartMapper.deleteById(shoppingCart.getId()); // 删除该商品
} else {
// 如果商品数量大于1将数量减1并更新数据库
shoppingCart.setNumber(shoppingCart.getNumber() - 1); // 减少商品数量
shoppingCartMapper.updateNumberById(shoppingCart); // 更新购物车数据
}
}
}
}

@ -0,0 +1,59 @@
<?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.AddressBookMapper">
<!-- 查询地址簿列表 -->
<select id="list" parameterType="AddressBook" resultType="com.sky.entity.AddressBook">
<!-- 从 address_book 表中查询数据 -->
select * from address_book
<where>
<!-- 如果传入的 userId 不为 null则添加查询条件user_id = #{userId} -->
<if test="userId != null">
and user_id = #{userId}
</if>
<!-- 如果传入的 phone 不为 null则添加查询条件phone = #{phone} -->
<if test="phone != null">
and phone = #{phone}
</if>
<!-- 如果传入的 isDefault 不为 null则添加查询条件is_default = #{isDefault} -->
<if test="isDefault != null">
and is_default = #{isDefault}
</if>
</where>
</select>
<!-- 更新地址簿中的一条记录 -->
<update id="update" parameterType="addressBook">
<!-- 更新 address_book 表中的数据 -->
update address_book
<set>
<!-- 如果 consignee 不为 null则更新 consignee 字段 -->
<if test="consignee != null">
consignee = #{consignee},
</if>
<!-- 如果 sex 不为 null则更新 sex 字段 -->
<if test="sex != null">
sex = #{sex},
</if>
<!-- 如果 phone 不为 null则更新 phone 字段 -->
<if test="phone != null">
phone = #{phone},
</if>
<!-- 如果 detail 不为 null则更新 detail 字段 -->
<if test="detail != null">
detail = #{detail},
</if>
<!-- 如果 label 不为 null则更新 label 字段 -->
<if test="label != null">
label = #{label},
</if>
<!-- 如果 isDefault 不为 null则更新 is_default 字段 -->
<if test="isDefault != null">
is_default = #{isDefault},
</if>
</set>
<!-- 根据传入的 id 更新指定的记录 -->
where id = #{id}
</update>
</mapper>

@ -0,0 +1,42 @@
<?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">
<!-- 批量插入购物车数据 -->
<insert id="insertBatch" parameterType="list">
<!-- 向 shopping_cart 表插入数据 -->
insert into shopping_cart
(name, image, user_id, dish_id, setmeal_id, dish_flavor, amount, create_time)
values
<!-- 使用 foreach 元素遍历传入的 shoppingCartList 列表,将每一项数据作为一条记录插入 -->
<foreach collection="shoppingCartList" item="sc" separator=",">
<!-- 每一条记录的数据字段映射 -->
(#{sc.name},#{sc.image},#{sc.userId},#{sc.dishId},#{sc.setmealId},#{sc.dishFlavor},#{sc.amount},#{sc.createTime})
</foreach>
</insert>
<!-- 查询购物车列表 -->
<select id="list" resultType="com.sky.entity.ShoppingCart">
<!-- 从 shopping_cart 表中查询数据 -->
select * from shopping_cart
<where>
<!-- 如果传入的 userId 不为 null则添加查询条件user_id = #{userId} -->
<if test="userId != null">
and user_id = #{userId}
</if>
<!-- 如果传入的 setmealId 不为 null则添加查询条件setmeal_id = #{setmealId} -->
<if test="setmealId != null">
and setmeal_id = #{setmealId}
</if>
<!-- 如果传入的 dishId 不为 null则添加查询条件dish_id = #{dishId} -->
<if test="dishId != null">
and dish_id = #{dishId}
</if>
<!-- 如果传入的 dishFlavor 不为 null则添加查询条件dish_flavor = #{dishFlavor} -->
<if test="dishFlavor != null">
and dish_flavor = #{dishFlavor}
</if>
</where>
</select>
</mapper>
Loading…
Cancel
Save