diff --git a/sky-server/src/main/java/com/sky/controller/admin/ShopController.java b/sky-server/src/main/java/com/sky/controller/admin/ShopController.java new file mode 100644 index 0000000..3fc23a4 --- /dev/null +++ b/sky-server/src/main/java/com/sky/controller/admin/ShopController.java @@ -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 getStatus(){ + // 从 Redis 中获取店铺的状态值 + Integer status = (Integer) redisTemplate.opsForValue().get(KEY); + + // 打印日志,记录当前获取到的状态 + log.info("获取店铺营业状态:{}", status == 1 ? "营业中" : "打烊中"); + + // 返回店铺状态的查询结果,包装在 Result 中 + return Result.success(status); + } +} diff --git a/sky-server/src/main/java/com/sky/controller/user/ShoppingCartController.java b/sky-server/src/main/java/com/sky/controller/user/ShoppingCartController.java new file mode 100644 index 0000000..67007d5 --- /dev/null +++ b/sky-server/src/main/java/com/sky/controller/user/ShoppingCartController.java @@ -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> 返回购物车商品列表 + */ + @GetMapping("/list") // 设置请求路径为 "/list",并且使用 GET 方法 + @ApiOperation("查看购物车") // Swagger 注解,描述该接口的功能 + public Result> list() { + // 调用服务层方法,获取当前用户购物车中的商品列表 + List 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(); + } +} diff --git a/sky-server/src/main/java/com/sky/mapper/AddressBookMapper.java b/sky-server/src/main/java/com/sky/mapper/AddressBookMapper.java index 7ea2d19..1f6f16a 100644 --- a/sky-server/src/main/java/com/sky/mapper/AddressBookMapper.java +++ b/sky-server/src/main/java/com/sky/mapper/AddressBookMapper.java @@ -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 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); } diff --git a/sky-server/src/main/java/com/sky/mapper/SetmealMapper.java b/sky-server/src/main/java/com/sky/mapper/SetmealMapper.java index e7634d2..801b630 100644 --- a/sky-server/src/main/java/com/sky/mapper/SetmealMapper.java +++ b/sky-server/src/main/java/com/sky/mapper/SetmealMapper.java @@ -1,4 +1,7 @@ package com.sky.mapper; +import com.sky.entity.Setmeal; + public interface SetmealMapper { + Setmeal getById(Long setmealId); } diff --git a/sky-server/src/main/java/com/sky/mapper/ShoppingCartMapper.java b/sky-server/src/main/java/com/sky/mapper/ShoppingCartMapper.java index 72f11be..4af9c1a 100644 --- a/sky-server/src/main/java/com/sky/mapper/ShoppingCartMapper.java +++ b/sky-server/src/main/java/com/sky/mapper/ShoppingCartMapper.java @@ -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 的 Mapper,MyBatis 会自动生成代理类并进行依赖注入 public interface ShoppingCartMapper { + + /** + * 根据动态条件查询购物车数据 + * + * @param shoppingCart 包含查询条件的购物车对象,支持动态查询 + * @return 返回符合条件的购物车列表 + * + * 该方法可以根据传入的 `shoppingCart` 对象中设置的字段进行动态查询,例如: + * - 如果传入的购物车对象中设置了 `userId`,则查询该用户的购物车数据。 + * - 如果设置了 `dishId`,则查询特定菜品的购物车数据等。 + * + * 具体的查询条件在 MyBatis 的 XML 映射文件中根据 `shoppingCart` 对象的属性动态拼接。 + */ + List 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 shoppingCartList); } diff --git a/sky-server/src/main/java/com/sky/service/AddressBookService.java b/sky-server/src/main/java/com/sky/service/AddressBookService.java new file mode 100644 index 0000000..59f4ead --- /dev/null +++ b/sky-server/src/main/java/com/sky/service/AddressBookService.java @@ -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 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); +} diff --git a/sky-server/src/main/java/com/sky/service/ShoppingCartService.java b/sky-server/src/main/java/com/sky/service/ShoppingCartService.java new file mode 100644 index 0000000..6afd9d0 --- /dev/null +++ b/sky-server/src/main/java/com/sky/service/ShoppingCartService.java @@ -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 包含购物车商品信息的数据传输对象(DTO),如商品ID、数量等。 + * 该对象用于封装用户请求的购物车操作数据。 + */ + void addShoppingCart(ShoppingCartDTO shoppingCartDTO); + + /** + * 查看当前购物车中的所有商品。 + * 该方法返回当前用户购物车中所有商品的列表。 + * + * @return 返回一个购物车对象列表,包含当前购物车中所有的商品及其数量等信息。 + */ + List showShoppingCart(); + + /** + * 清空购物车。 + * 该方法将删除购物车中的所有商品,将购物车清空。 + */ + void cleanShoppingCart(); + + /** + * 从购物车中减少商品数量。 + * 该方法根据传入的购物车数据对象(ShoppingCartDTO),减少指定商品在购物车中的数量。 + * + * @param shoppingCartDTO 包含商品信息的数据传输对象(DTO),如商品ID和减少的数量。 + * 如果减少后的数量为0或以下,可能会触发从购物车中完全删除该商品。 + */ + void subShoppingCart(ShoppingCartDTO shoppingCartDTO); +} diff --git a/sky-server/src/main/java/com/sky/service/impl/AddressBookServiceImpl.java b/sky-server/src/main/java/com/sky/service/impl/AddressBookServiceImpl.java new file mode 100644 index 0000000..623d18a --- /dev/null +++ b/sky-server/src/main/java/com/sky/service/impl/AddressBookServiceImpl.java @@ -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 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); + } +} diff --git a/sky-server/src/main/java/com/sky/service/impl/ShoppingCartServiceImpl.java b/sky-server/src/main/java/com/sky/service/impl/ShoppingCartServiceImpl.java new file mode 100644 index 0000000..f46cf95 --- /dev/null +++ b/sky-server/src/main/java/com/sky/service/impl/ShoppingCartServiceImpl.java @@ -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 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 showShoppingCart() { + // 获取当前用户ID + Long userId = BaseContext.getCurrentId(); + + // 创建一个ShoppingCart对象,只设置了用户ID,用于查询该用户的购物车 + ShoppingCart shoppingCart = ShoppingCart.builder() + .userId(userId) + .build(); + + // 查询该用户的购物车数据并返回 + List 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 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); // 更新购物车数据 + } + } + } +} diff --git a/sky-server/src/main/resources/mapper/AddressBookMapper.xml b/sky-server/src/main/resources/mapper/AddressBookMapper.xml new file mode 100644 index 0000000..7db0ecf --- /dev/null +++ b/sky-server/src/main/resources/mapper/AddressBookMapper.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + update address_book + + + + consignee = #{consignee}, + + + + sex = #{sex}, + + + + phone = #{phone}, + + + + detail = #{detail}, + + + + label = #{label}, + + + + is_default = #{isDefault}, + + + + where id = #{id} + + + diff --git a/sky-server/src/main/resources/mapper/ShoppingCartMapper.xml b/sky-server/src/main/resources/mapper/ShoppingCartMapper.xml new file mode 100644 index 0000000..90b8f45 --- /dev/null +++ b/sky-server/src/main/resources/mapper/ShoppingCartMapper.xml @@ -0,0 +1,42 @@ + + + + + + + + insert into shopping_cart + (name, image, user_id, dish_id, setmeal_id, dish_flavor, amount, create_time) + values + + + + (#{sc.name},#{sc.image},#{sc.userId},#{sc.dishId},#{sc.setmealId},#{sc.dishFlavor},#{sc.amount},#{sc.createTime}) + + + + + +