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}
+