diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/redis/RedisService.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/redis/RedisService.java index a314cd5..739e798 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/redis/RedisService.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/redis/RedisService.java @@ -1,5 +1,6 @@ package com.ruoyi.common.core.redis; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -22,7 +23,51 @@ public class RedisService { return redisCache.getCacheList(key); } + public String getAddressList() { + String key = RedisKeys.ADDRESS_LIST_KEY; + return redisCache.getCacheObject(key); + } + + public void setAddressList(String list) { + String key = RedisKeys.ADDRESS_LIST_KEY; + redisCache.setCacheObject(key,list); + } + interface RedisKeys { String MATCH_LIST_OF = "MATCH_LIST_OF_"; + String ADDRESS_LIST_KEY = "ADDRESS_LIST_KEY_"; + } + + /** + * redis实现分布式锁 --- 上锁 + * + * @param key + * @param jobInfo + * @param lockSecond + * @return + * @throws Exception + */ + public void lock(String key, String jobInfo, Integer lockSecond) throws Exception { + String existJobInfo = redisCache.getCacheObject(key); + if (StringUtils.isNotEmpty(existJobInfo)) { + throw new Exception(String.format("获取锁失败: redisKey: %s, existJobInfo: %s", key, existJobInfo)); + } + redisCache.setCacheObject(key, jobInfo, lockSecond, TimeUnit.SECONDS); + } + + /** + * redis实现分布式锁 --- 解锁 + * + * @param key + * @param jobInfo + * @throws Exception + */ + public void unLock(String key, String jobInfo) throws Exception { + String existJobInfo = redisCache.getCacheObject(key); + if (jobInfo.equals(existJobInfo)) { + redisCache.deleteObject(key); + } else { + throw new Exception(String.format("释放锁异常: redisKey: %s, existJobInfo: %s, jobInfo: %s", key, existJobInfo, jobInfo)); + } } } diff --git a/ruoyi-mall/src/main/java/com/cyl/h5/controller/H5CommonController.java b/ruoyi-mall/src/main/java/com/cyl/h5/controller/H5CommonController.java new file mode 100644 index 0000000..db54253 --- /dev/null +++ b/ruoyi-mall/src/main/java/com/cyl/h5/controller/H5CommonController.java @@ -0,0 +1,77 @@ +package com.cyl.h5.controller; + +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.cyl.ums.domain.Address; +import com.cyl.ums.mapper.AddressMapper; +import com.cyl.ums.pojo.dto.AddressDTO; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.redis.RedisService; +import com.ruoyi.common.utils.OssUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.*; +import java.util.stream.Collectors; + +@RestController +@RequestMapping("/h5") +public class H5CommonController { + + @Autowired + private OssUtils ossUtils; + @Autowired + private AddressMapper addressMapper; + @Autowired + private RedisService redisService; + + + @GetMapping("/area") + public AjaxResult getAddressList() { + String addresses = redisService.getAddressList(); + if (StringUtils.isNotEmpty(addresses)) { + return AjaxResult.success(JSON.parseArray(addresses, AddressDTO.class)); + } + QueryWrapper
addressQueryWrapper = new QueryWrapper<>(); + addressQueryWrapper.in("level", Arrays.asList(0,1,2)); + List
addressList = addressMapper.selectList(addressQueryWrapper); + Map> cityMap = addressList.stream().filter(it -> it.getLevel() == 1).collect(Collectors.groupingBy(it -> it.getParentCode())); + Map> districtMap = addressList.stream().filter(it -> it.getLevel() == 2).collect(Collectors.groupingBy(it -> it.getParentCode())); + List result = new ArrayList<>(); + addressList.stream().filter(it -> it.getLevel() == 0).forEach(it -> { + AddressDTO dto = new AddressDTO(); + dto.setId(it.getCode()); + dto.setLevel("province"); + dto.setName(it.getName()); + dto.setPid(0L); + //获取城市列表 + List child = new ArrayList<>(); + if (cityMap.containsKey(it.getCode())) { + cityMap.get(it.getCode()).forEach(city -> { + AddressDTO cityDto = new AddressDTO(); + cityDto.setId(city.getCode()); + cityDto.setLevel("city"); + cityDto.setName(city.getName()); + cityDto.setPid(city.getParentCode()); + cityDto.setChildren(districtMap.containsKey(city.getCode()) ? + districtMap.get(city.getCode()).stream().map(district -> { + AddressDTO districtDto = new AddressDTO(); + districtDto.setId(district.getCode()); + districtDto.setLevel("district"); + districtDto.setName(district.getName()); + districtDto.setPid(district.getParentCode()); + return districtDto; + }).collect(Collectors.toList()) : Collections.EMPTY_LIST); + child.add(cityDto); + }); + } + dto.setChildren(child); + result.add(dto); + }); + redisService.setAddressList(JSON.toJSONString(result)); + return AjaxResult.success(result); + } +} diff --git a/ruoyi-mall/src/main/java/com/cyl/h5/controller/H5MemberAddressController.java b/ruoyi-mall/src/main/java/com/cyl/h5/controller/H5MemberAddressController.java new file mode 100644 index 0000000..542001b --- /dev/null +++ b/ruoyi-mall/src/main/java/com/cyl/h5/controller/H5MemberAddressController.java @@ -0,0 +1,45 @@ +package com.cyl.h5.controller; + +import com.cyl.h5.service.H5MemberAddressService; +import com.cyl.ums.domain.MemberAddress; +import com.ruoyi.common.core.domain.AjaxResult; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/h5/member/address") +public class H5MemberAddressController { + + @Autowired + private H5MemberAddressService h5MemberAddressService; + + @GetMapping("/list") + public AjaxResult getList(){ + return AjaxResult.success(h5MemberAddressService.selectList()); + } + + @GetMapping("/default") + public AjaxResult getDefault(){ + return AjaxResult.success(h5MemberAddressService.getDefault()); + } + + @PostMapping("/create") + public AjaxResult create(@RequestBody MemberAddress memberAddress){ + return AjaxResult.success(h5MemberAddressService.insert(memberAddress)); + } + + @PutMapping("/update") + public AjaxResult update(@RequestBody MemberAddress memberAddress){ + return AjaxResult.success(h5MemberAddressService.update(memberAddress)); + } + + @GetMapping("/{id}") + public AjaxResult getInfo(@PathVariable Long id){ + return AjaxResult.success(h5MemberAddressService.selectById(id)); + } + + @DeleteMapping("/{id}") + public AjaxResult remove(@PathVariable Long id) { + return AjaxResult.success(h5MemberAddressService.deleteById(id)); + } +} diff --git a/ruoyi-mall/src/main/java/com/cyl/h5/service/H5MemberAddressService.java b/ruoyi-mall/src/main/java/com/cyl/h5/service/H5MemberAddressService.java new file mode 100644 index 0000000..5d40cba --- /dev/null +++ b/ruoyi-mall/src/main/java/com/cyl/h5/service/H5MemberAddressService.java @@ -0,0 +1,111 @@ +package com.cyl.h5.service; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.cyl.ums.domain.Member; +import com.cyl.ums.domain.MemberAddress; +import com.cyl.ums.mapper.MemberAddressMapper; +import com.ruoyi.common.constant.Constants; +import com.ruoyi.framework.config.LocalDataUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; + +import java.time.LocalDateTime; +import java.util.Arrays; +import java.util.List; + +/** + * 会员收货地址Service业务层处理 + * + * @author sjm + */ +@Service +@Transactional +public class H5MemberAddressService { + @Autowired + private MemberAddressMapper memberAddressMapper; + + /** + * 查询会员收货地址 + * + * @param id 会员收货地址主键 + * @return 会员收货地址 + */ + + public MemberAddress selectById(Long id) { + return memberAddressMapper.selectById(id); + } + + public List selectList() { + Member member = (Member) LocalDataUtil.getVar(Constants.MEMBER_INFO); + MemberAddress memberAddress = new MemberAddress(); + memberAddress.setMemberId(member.getId()); + return memberAddressMapper.selectByEntity(memberAddress); + } + + /** + * 新增会员收货地址 + * + * @param memberAddress 会员收货地址 + * @return 结果 + */ + public int insert(MemberAddress memberAddress) { + Member member = (Member) LocalDataUtil.getVar(Constants.MEMBER_INFO); + if (memberAddress.getIsDefault() == 1) { + //将别的设置为0 + memberAddressMapper.updateDefault(0,member.getId()); + } + memberAddress.setMemberId(member.getId()); + memberAddress.setCreateTime(LocalDateTime.now()); + return memberAddressMapper.insert(memberAddress); + } + + /** + * 修改会员收货地址 + * + * @param memberAddress 会员收货地址 + * @return 结果 + */ + + public int update(MemberAddress memberAddress) { + Member member = (Member) LocalDataUtil.getVar(Constants.MEMBER_INFO); + if (memberAddress.getIsDefault() == 1) { + //将别的设置为0 + memberAddressMapper.updateDefault(0,member.getId()); + } + memberAddress.setUpdateTime(LocalDateTime.now()); + return memberAddressMapper.updateById(memberAddress); + } + + /** + * 批量删除会员收货地址 + * + * @param ids 需要删除的会员收货地址主键 + * @return 结果 + */ + + public int deleteByIds(Long[] ids) { + return memberAddressMapper.deleteBatchIds(Arrays.asList(ids)); + } + + /** + * 删除会员收货地址信息 + * + * @param id 会员收货地址主键 + * @return 结果 + */ + + public int deleteById(Long id) { + return memberAddressMapper.deleteById(id); + } + + public MemberAddress getDefault() { + Member member = (Member) LocalDataUtil.getVar(Constants.MEMBER_INFO); + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("member_id",member.getId()); + queryWrapper.eq("is_default",1); + List list = memberAddressMapper.selectList(queryWrapper); + return CollectionUtils.isEmpty(list) ? null : list.get(0); + } +} diff --git a/ruoyi-mall/src/main/java/com/cyl/ums/domain/Address.java b/ruoyi-mall/src/main/java/com/cyl/ums/domain/Address.java new file mode 100644 index 0000000..3d8f74f --- /dev/null +++ b/ruoyi-mall/src/main/java/com/cyl/ums/domain/Address.java @@ -0,0 +1,50 @@ +package com.cyl.ums.domain; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.ruoyi.common.annotation.Excel; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 地址对象 + * + */ +@ApiModel(description="地址对象") +@Data +@TableName("address") +public class Address { + private static final long serialVersionUID = 1L; + + @ApiModelProperty("ID") + private Integer id; + + @ApiModelProperty("地区邮编") + @Excel(name = "地区邮编") + private Long code; + + @ApiModelProperty("父地区邮编") + @Excel(name = "父地区邮编") + private Long parentCode; + + @ApiModelProperty("地区名") + @Excel(name = "地区名") + private String name; + + @ApiModelProperty("地区层级") + @Excel(name = "地区层级") + private Integer level; + + @ApiModelProperty("CREATED_AT") + @Excel(name = "CREATED_AT") + private String createdAt; + + @ApiModelProperty("UPDATED_AT") + @Excel(name = "UPDATED_AT") + private String updatedAt; + + @ApiModelProperty("DELETED_AT") + @Excel(name = "DELETED_AT") + private String deletedAt; + +} diff --git a/ruoyi-mall/src/main/java/com/cyl/ums/mapper/AddressMapper.java b/ruoyi-mall/src/main/java/com/cyl/ums/mapper/AddressMapper.java new file mode 100644 index 0000000..d187b6e --- /dev/null +++ b/ruoyi-mall/src/main/java/com/cyl/ums/mapper/AddressMapper.java @@ -0,0 +1,22 @@ +package com.cyl.ums.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.cyl.ums.domain.Address; + +import java.util.List; + +/** + * 【请填写功能名称】Mapper接口 + * + * @author sjm + */ +public interface AddressMapper extends BaseMapper
{ + /** + * 查询【请填写功能名称】列表 + * + * @param address 【请填写功能名称】 + * @return 【请填写功能名称】集合 + */ + List
selectByEntity(Address address); + +} diff --git a/ruoyi-mall/src/main/java/com/cyl/ums/mapper/MemberAddressMapper.java b/ruoyi-mall/src/main/java/com/cyl/ums/mapper/MemberAddressMapper.java index a42f48c..2762e78 100644 --- a/ruoyi-mall/src/main/java/com/cyl/ums/mapper/MemberAddressMapper.java +++ b/ruoyi-mall/src/main/java/com/cyl/ums/mapper/MemberAddressMapper.java @@ -20,4 +20,6 @@ public interface MemberAddressMapper extends BaseMapper { List selectByEntity(MemberAddress memberAddress); int updateByPrimaryKeySelective(MemberAddress address); + + void updateDefault(int IsDefault, Long id); } diff --git a/ruoyi-mall/src/main/java/com/cyl/ums/pojo/dto/AddressDTO.java b/ruoyi-mall/src/main/java/com/cyl/ums/pojo/dto/AddressDTO.java new file mode 100644 index 0000000..8a7e121 --- /dev/null +++ b/ruoyi-mall/src/main/java/com/cyl/ums/pojo/dto/AddressDTO.java @@ -0,0 +1,19 @@ +package com.cyl.ums.pojo.dto; + +import lombok.Data; + +import java.util.List; + +/** + * 【请填写功能名称】 DTO 对象 + * + * @author sjm + */ +@Data +public class AddressDTO { + private Long id; + private Long pid; + private String name; + private String level; + private List children; +} diff --git a/ruoyi-mall/src/main/resources/mapper/ums/AddressMapper.xml b/ruoyi-mall/src/main/resources/mapper/ums/AddressMapper.xml new file mode 100644 index 0000000..9d5a70c --- /dev/null +++ b/ruoyi-mall/src/main/resources/mapper/ums/AddressMapper.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + select id, code, parent_code, name, level, created_at, updated_at, deleted_at from address + + + + diff --git a/ruoyi-mall/src/main/resources/mapper/ums/MemberAddressMapper.xml b/ruoyi-mall/src/main/resources/mapper/ums/MemberAddressMapper.xml index 1cce875..473f047 100644 --- a/ruoyi-mall/src/main/resources/mapper/ums/MemberAddressMapper.xml +++ b/ruoyi-mall/src/main/resources/mapper/ums/MemberAddressMapper.xml @@ -94,4 +94,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" where id = #{id, jdbcType=BIGINT} + + update ums_member_address + set is_default = #{param1} + where member_id = #{param2} +