sql/xc_mall.sql
@@ -126,3 +126,21 @@ PRIMARY KEY (ID) ) COMMENT = '购物车'; DROP TABLE IF EXISTS mall_address_info; CREATE TABLE mall_address_info( REVISION INT COMMENT '乐观锁' , CREATED_BY VARCHAR(32) COMMENT '创建人' , CREATED_TIME DATETIME COMMENT '创建时间' , UPDATED_BY VARCHAR(32) COMMENT '更新人' , UPDATED_TIME DATETIME COMMENT '更新时间' , ID BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键' , member_id BIGINT COMMENT '用户ID' , name VARCHAR(255) COMMENT '姓名' , phone VARCHAR(255) COMMENT '联系方式' , area TEXT COMMENT '地区' , address TEXT COMMENT '地址' , longitude VARCHAR(255) COMMENT '经度' , latitude VARCHAR(255) COMMENT '纬度' , is_default INT COMMENT '是否默认;1-是2-否' , PRIMARY KEY (ID) ) COMMENT = '用户地址'; src/main/java/cc/mrbird/febs/mall/controller/ApiMallAddressInfoController.java
New file @@ -0,0 +1,81 @@ package cc.mrbird.febs.mall.controller; import cc.mrbird.febs.common.entity.FebsResponse; import cc.mrbird.febs.mall.conversion.MallAddressInfoConversion; import cc.mrbird.febs.mall.dto.AddressInfoDto; import cc.mrbird.febs.mall.entity.MallAddressInfo; import cc.mrbird.febs.mall.service.IApiMallAddressInfoService; import cc.mrbird.febs.mall.vo.AddressInfoVo; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiResponse; import io.swagger.annotations.ApiResponses; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import java.util.List; /** * @author wzy * @date 2021-09-18 **/ @Slf4j @Validated @RestController @RequiredArgsConstructor @RequestMapping(value = "/api/address") @Api(value = "ApiMallAddressInfoController", tags = "用户地址管理接口类") public class ApiMallAddressInfoController { private final IApiMallAddressInfoService mallAddressInfoService; @ApiOperation(value = "获取地址列表", notes = "获取地址列表") @ApiResponses({ @ApiResponse(code = 200, message = "success", response = AddressInfoVo.class) }) @GetMapping(value = "/findAddressList") public FebsResponse findAddressList() { return new FebsResponse().success().data(mallAddressInfoService.findAddressInfoList()); } @ApiOperation(value = "获取地址信息", notes = "获取地址信息") @ApiResponses({ @ApiResponse(code = 200, message = "success", response = AddressInfoVo.class) }) @GetMapping(value = "/findAddressList/{id}") public FebsResponse findAddressInfoById(@PathVariable("id") Long id) { MallAddressInfo addressInfo = mallAddressInfoService.getById(id); return new FebsResponse().success().data(MallAddressInfoConversion.INSTANCE.entityToVo(addressInfo)); } @ApiOperation(value = "添加地址", notes = "添加地址") @PostMapping(value = "/addAddress") public FebsResponse addAddress(@RequestBody AddressInfoDto addressInfoDto) { mallAddressInfoService.addAddress(addressInfoDto); return new FebsResponse().success().message("添加成功"); } @ApiOperation(value = "修改地址", notes = "修改地址") @PostMapping(value = "/modifyAddress") public FebsResponse modifyAddress(@RequestBody AddressInfoDto addressInfoDto) { mallAddressInfoService.modifyAddress(addressInfoDto); return new FebsResponse().success().message("修改成功"); } @ApiOperation(value = "删除地址", notes = "删除地址") @PostMapping(value = "/delAddress/{id}") public FebsResponse delAddress(@PathVariable("id") Long id) { mallAddressInfoService.removeById(id); return new FebsResponse().success().message("删除成功"); } @ApiOperation(value = "设置地址为默认地址", notes = "设置地址为默认地址") @PostMapping(value = "/setAddressDefault/{id}") public FebsResponse setAddressDefault(@PathVariable("id") Long id) { mallAddressInfoService.setDefaultAddress(id); return new FebsResponse().success().message("设置成功"); } } src/main/java/cc/mrbird/febs/mall/controller/ApiMallShoppingCartController.java
@@ -3,15 +3,15 @@ import cc.mrbird.febs.common.entity.FebsResponse; import cc.mrbird.febs.mall.dto.AddCartDto; import cc.mrbird.febs.mall.service.IApiMallShoppingCartService; import cc.mrbird.febs.mall.vo.ShoppingCartGoodsVo; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiResponse; import io.swagger.annotations.ApiResponses; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.*; /** * @author wzy @@ -28,6 +28,9 @@ private final IApiMallShoppingCartService mallShoppingCartService; @ApiOperation(value = "获取购物车商品列表", notes = "获取购物车商品列表") @ApiResponses({ @ApiResponse(code = 200, message = "success", response = ShoppingCartGoodsVo.class) }) @PostMapping(value = "/findCartGoodsList") public FebsResponse findCartGoodsList() { return new FebsResponse().success().data(mallShoppingCartService.findCartGoodsList()); @@ -41,8 +44,9 @@ } @ApiOperation(value = "从购物车中删除商品", notes = "从购物车中删除商品") @PostMapping(value = "/delGoods") public FebsResponse delGoods() { return null; @PostMapping(value = "/delGoods/{id}") public FebsResponse delGoods(@PathVariable("id") Long id) { mallShoppingCartService.removeById(id); return new FebsResponse().success().data("删除成功"); } } src/main/java/cc/mrbird/febs/mall/conversion/MallAddressInfoConversion.java
New file @@ -0,0 +1,25 @@ package cc.mrbird.febs.mall.conversion; import cc.mrbird.febs.mall.dto.AddressInfoDto; import cc.mrbird.febs.mall.entity.MallAddressInfo; import cc.mrbird.febs.mall.vo.AddressInfoVo; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; import java.util.List; /** * @author wzy * @date 2021-09-18 **/ @Mapper public abstract class MallAddressInfoConversion { public static final MallAddressInfoConversion INSTANCE = Mappers.getMapper(MallAddressInfoConversion.class); public abstract AddressInfoVo entityToVo(MallAddressInfo addressInfo); public abstract List<AddressInfoVo> entityListToVos(List<MallAddressInfo> addressInfoList); public abstract MallAddressInfo dtoToEntity(AddressInfoDto addressInfoDto); } src/main/java/cc/mrbird/febs/mall/dto/AddressInfoDto.java
New file @@ -0,0 +1,44 @@ package cc.mrbird.febs.mall.dto; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import javax.validation.constraints.NotBlank; /** * @author wzy * @date 2021-09-18 **/ @Data @ApiModel(value = "AddressInfoDto", description = "地址接收参数类") public class AddressInfoDto { @ApiModelProperty(value = "id", example = "编辑的时候传") private Long id; @NotBlank(message = "参数不能为空") @ApiModelProperty(value = "姓名", example = "王") private String name; @NotBlank(message = "参数不能为空") @ApiModelProperty(value = "手机号", example = "15773001234") private String phone; @NotBlank(message = "参数不能为空") @ApiModelProperty(value = "地区", example = "北京市朝阳区") private String area; @NotBlank(message = "参数不能为空") @ApiModelProperty(value = "地址", example = "朝阳街道110栋119号") private String address; @ApiModelProperty(value = "经度", example = "112.12345678") private String longitude; @ApiModelProperty(value = "纬度", example = "87.12345678") private String latitude; @ApiModelProperty(value = "是否默认", example = "1是2否") private Integer isDefault; } src/main/java/cc/mrbird/febs/mall/entity/MallAddressInfo.java
New file @@ -0,0 +1,48 @@ package cc.mrbird.febs.mall.entity; import cc.mrbird.febs.common.entity.BaseEntity; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; /** * @author wzy * @date 2021-09-18 **/ @Data @TableName("mall_address_info") public class MallAddressInfo extends BaseEntity { private String name; private String phone; private Long memberId; /** * 地区 省市区 */ private String area; /** * 具体地址 */ private String address; /** * 经度 */ private String longitude; /** * 纬度 */ private String latitude; /** * 是否默认地址 1-是 2-否 */ private Integer isDefault; public static final Integer IS_DEFAULT_Y = 1; public static final Integer IS_DEFAULT_N = 2; } src/main/java/cc/mrbird/febs/mall/mapper/MallAddressInfoMapper.java
New file @@ -0,0 +1,14 @@ package cc.mrbird.febs.mall.mapper; import cc.mrbird.febs.mall.entity.MallAddressInfo; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Param; import java.util.List; public interface MallAddressInfoMapper extends BaseMapper<MallAddressInfo> { List<MallAddressInfo> selectAddressInfoListByMemberId(@Param("memberId") Long memberId); int updateIsDefault(@Param("isDefault") Integer isDefault, @Param("memberId") Long memberId, @Param("id") Long id); } src/main/java/cc/mrbird/febs/mall/service/IApiMallAddressInfoService.java
New file @@ -0,0 +1,19 @@ package cc.mrbird.febs.mall.service; import cc.mrbird.febs.mall.dto.AddressInfoDto; import cc.mrbird.febs.mall.entity.MallAddressInfo; import cc.mrbird.febs.mall.vo.AddressInfoVo; import com.baomidou.mybatisplus.extension.service.IService; import java.util.List; public interface IApiMallAddressInfoService extends IService<MallAddressInfo> { List<AddressInfoVo> findAddressInfoList(); void addAddress(AddressInfoDto addressInfoDto); void modifyAddress(AddressInfoDto addressInfoDto); void setDefaultAddress(Long id); } src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallAddressInfoServiceImpl.java
New file @@ -0,0 +1,88 @@ package cc.mrbird.febs.mall.service.impl; import cc.mrbird.febs.common.exception.FebsException; import cc.mrbird.febs.common.utils.LoginUserUtil; import cc.mrbird.febs.mall.conversion.MallAddressInfoConversion; import cc.mrbird.febs.mall.dto.AddressInfoDto; import cc.mrbird.febs.mall.entity.MallAddressInfo; import cc.mrbird.febs.mall.entity.MallMember; import cc.mrbird.febs.mall.mapper.MallAddressInfoMapper; import cc.mrbird.febs.mall.service.IApiMallAddressInfoService; import cc.mrbird.febs.mall.vo.AddressInfoVo; import cn.hutool.core.collection.CollUtil; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import java.util.Date; import java.util.List; /** * @author wzy * @date 2021-09-18 **/ @Slf4j @Service @RequiredArgsConstructor public class ApiMallAddressInfoServiceImpl extends ServiceImpl<MallAddressInfoMapper, MallAddressInfo> implements IApiMallAddressInfoService { @Override public List<AddressInfoVo> findAddressInfoList() { Long memberId = LoginUserUtil.getLoginUser().getId(); List<MallAddressInfo> addressInfos = this.baseMapper.selectAddressInfoListByMemberId(memberId); return MallAddressInfoConversion.INSTANCE.entityListToVos(addressInfos); } @Override public void addAddress(AddressInfoDto addressInfoDto) { MallAddressInfo addressInfo = MallAddressInfoConversion.INSTANCE.dtoToEntity(addressInfoDto); MallMember member = LoginUserUtil.getLoginUser(); Long memberId = member.getId(); List<MallAddressInfo> existAddress = this.baseMapper.selectList(null); if (CollUtil.isEmpty(existAddress)) { addressInfo.setIsDefault(MallAddressInfo.IS_DEFAULT_Y); } else { if (MallAddressInfo.IS_DEFAULT_Y.equals(addressInfoDto.getIsDefault())) { this.baseMapper.updateIsDefault(MallAddressInfo.IS_DEFAULT_N, memberId, null); } } addressInfo.setMemberId(memberId); addressInfo.setCreatedBy(member.getPhone()); addressInfo.setUpdatedBy(member.getPhone()); this.baseMapper.insert(addressInfo); } @Override public void modifyAddress(AddressInfoDto addressInfoDto) { MallAddressInfo existAddress = this.baseMapper.selectById(addressInfoDto.getId()); if (existAddress == null) { throw new FebsException("地址不存在"); } Long memberId = LoginUserUtil.getLoginUser().getId(); MallAddressInfo addressInfo = MallAddressInfoConversion.INSTANCE.dtoToEntity(addressInfoDto); if (MallAddressInfo.IS_DEFAULT_Y.equals(addressInfoDto.getIsDefault())) { this.baseMapper.updateIsDefault(MallAddressInfo.IS_DEFAULT_N, memberId, null); } addressInfo.setUpdatedTime(new Date()); this.baseMapper.updateById(addressInfo); } @Override public void setDefaultAddress(Long id) { MallAddressInfo addressInfo = this.baseMapper.selectById(id); if (addressInfo == null) { throw new FebsException("地址不存在"); } MallMember member = LoginUserUtil.getLoginUser(); this.baseMapper.updateIsDefault(MallAddressInfo.IS_DEFAULT_N, member.getId(), null); this.baseMapper.updateIsDefault(MallAddressInfo.IS_DEFAULT_Y, member.getId(), id); } } src/main/java/cc/mrbird/febs/mall/vo/AddressInfoVo.java
New file @@ -0,0 +1,32 @@ package cc.mrbird.febs.mall.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; /** * @author wzy * @date 2021-09-18 **/ @Data @ApiModel(value = "AddressInfoVo", description = "地址信息返回参数类") public class AddressInfoVo { @ApiModelProperty(value = "id") private String id; @ApiModelProperty(value = "姓名") private String name; @ApiModelProperty(value = "手机号") private String phone; @ApiModelProperty(value = "地区") private String area; @ApiModelProperty(value = "地址") private String address; @ApiModelProperty(value = "是否默认地址 1-是 2-否") private Integer isDefault; } src/main/resources/mapper/modules/MallAddressInfoMapper.xml
New file @@ -0,0 +1,19 @@ <?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="cc.mrbird.febs.mall.mapper.MallAddressInfoMapper"> <select id="selectAddressInfoListByMemberId" resultType="cc.mrbird.febs.mall.entity.MallAddressInfo"> select * from mall_address_info where member_id=#{memberId} order by is_default asc, created_time desc </select> <update id="updateIsDefault"> update mall_address_info set is_default=#{isDefault} where member_id=#{memberId} <if test="id != null"> and id=#{id} </if> </update> </mapper>