From 60460eb04678ff10c605e043d43e35df769aa1cf Mon Sep 17 00:00:00 2001 From: chuzhichao Date: Fri, 16 Jun 2023 10:27:15 +0800 Subject: [PATCH 01/18] =?UTF-8?q?=E5=95=86=E5=93=81=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E3=80=81=E5=95=86=E5=93=81=E8=AF=A6=E6=83=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../h5/controller/H5ProductController.java | 4 +- .../com/cyl/pms/pojo/query/ProductQuery.java | 9 +++ .../pms/service/ProductCategoryService.java | 2 +- .../com/cyl/pms/service/ProductService.java | 64 ++++--------------- 4 files changed, 24 insertions(+), 55 deletions(-) diff --git a/ruoyi-mall/src/main/java/com/cyl/h5/controller/H5ProductController.java b/ruoyi-mall/src/main/java/com/cyl/h5/controller/H5ProductController.java index 19edace..f12f47a 100644 --- a/ruoyi-mall/src/main/java/com/cyl/h5/controller/H5ProductController.java +++ b/ruoyi-mall/src/main/java/com/cyl/h5/controller/H5ProductController.java @@ -28,8 +28,8 @@ public class H5ProductController { List pageRes = productService.selectList(query, page); return ResponseEntity.ok(new PageImpl<>(productConvert.dos2dtos(pageRes), page, ((com.github.pagehelper.Page) pageRes).getTotal())); } - @GetMapping("/detail") - public ResponseEntity queryDetail(@RequestParam Long id) { + @GetMapping("/detail/{id}") + public ResponseEntity queryDetail(@PathVariable Long id) { ProductDetail detail = productService.queryDetail(id); return ResponseEntity.ok(detail); } diff --git a/ruoyi-mall/src/main/java/com/cyl/pms/pojo/query/ProductQuery.java b/ruoyi-mall/src/main/java/com/cyl/pms/pojo/query/ProductQuery.java index cd567e3..cd4d692 100644 --- a/ruoyi-mall/src/main/java/com/cyl/pms/pojo/query/ProductQuery.java +++ b/ruoyi-mall/src/main/java/com/cyl/pms/pojo/query/ProductQuery.java @@ -63,4 +63,13 @@ public class ProductQuery { @ApiModelProperty("商品分类名称 精确匹配") private String productCategoryNameLike; + @ApiModelProperty("排序字段") + private String orderField = "sort"; + + @ApiModelProperty("排序规则") + private String orderSort = "desc"; + + @ApiModelProperty("搜索关键字") + private String search; + } diff --git a/ruoyi-mall/src/main/java/com/cyl/pms/service/ProductCategoryService.java b/ruoyi-mall/src/main/java/com/cyl/pms/service/ProductCategoryService.java index b4d16ff..5baeab6 100644 --- a/ruoyi-mall/src/main/java/com/cyl/pms/service/ProductCategoryService.java +++ b/ruoyi-mall/src/main/java/com/cyl/pms/service/ProductCategoryService.java @@ -215,7 +215,7 @@ public class ProductCategoryService { QueryWrapper qw = new QueryWrapper<>(); qw.select("id", "parent_id", "name", "level", "sort", "icon"); qw.eq("show_status", 1); - qw.le("level", 2); +// qw.le("level", 2); return productCategoryMapper.selectList(qw); } diff --git a/ruoyi-mall/src/main/java/com/cyl/pms/service/ProductService.java b/ruoyi-mall/src/main/java/com/cyl/pms/service/ProductService.java index 697e455..e0e4678 100644 --- a/ruoyi-mall/src/main/java/com/cyl/pms/service/ProductService.java +++ b/ruoyi-mall/src/main/java/com/cyl/pms/service/ProductService.java @@ -72,67 +72,27 @@ public class ProductService { PageHelper.startPage(page.getPageNumber() + 1, page.getPageSize()); } QueryWrapper qw = new QueryWrapper<>(); - qw.orderByDesc("publish_status"); - qw.orderByAsc("sort"); - Long brandId = query.getBrandId(); - if (brandId != null) { - qw.eq("brand_id", brandId); + if (StringUtils.isNoneEmpty(query.getOrderField())){ + if (StringUtils.isNotEmpty(query.getOrderSort()) && "desc".equalsIgnoreCase(query.getOrderSort())) { + qw.orderByDesc(query.getOrderField()); + } else { + qw.orderByAsc(query.getOrderField()); + } + }else { + qw.orderByDesc("publish_status"); + qw.orderByAsc("sort"); } Long categoryId = query.getCategoryId(); if (categoryId != null) { qw.eq("category_id", categoryId); } - String outProductId = query.getOutProductId(); - if (!StringUtils.isEmpty(outProductId)) { - qw.eq("out_product_id", outProductId); - } - String nameLike = query.getNameLike(); - if (!StringUtils.isEmpty(nameLike)) { - qw.like("name", nameLike); - } - String pic = query.getPic(); - if (!StringUtils.isEmpty(pic)) { - qw.eq("pic", pic); - } - String albumPics = query.getAlbumPics(); - if (!StringUtils.isEmpty(albumPics)) { - qw.eq("album_pics", albumPics); - } Integer publishStatus = query.getPublishStatus(); if (publishStatus != null) { qw.eq("publish_status", publishStatus); } - Integer sort = query.getSort(); - if (sort != null) { - qw.eq("sort", sort); - } - BigDecimal price = query.getPrice(); - if (price != null) { - qw.eq("price", price); - } - String unit = query.getUnit(); - if (!StringUtils.isEmpty(unit)) { - qw.eq("unit", unit); - } - BigDecimal weight = query.getWeight(); - if (weight != null) { - qw.eq("weight", weight); - } - String detailHtml = query.getDetailHtml(); - if (!StringUtils.isEmpty(detailHtml)) { - qw.eq("detail_html", detailHtml); - } - String detailMobileHtml = query.getDetailMobileHtml(); - if (!StringUtils.isEmpty(detailMobileHtml)) { - qw.eq("detail_mobile_html", detailMobileHtml); - } - String brandNameLike = query.getBrandNameLike(); - if (!StringUtils.isEmpty(brandNameLike)) { - qw.like("brand_name", brandNameLike); - } - String productCategoryNameLike = query.getProductCategoryNameLike(); - if (!StringUtils.isEmpty(productCategoryNameLike)) { - qw.like("product_category_name", productCategoryNameLike); + String search = query.getSearch(); + if (StringUtils.isNoneEmpty(search)){ + qw.like("name", "%".concat(query.getSearch().trim()).concat("%")); } return productMapper.selectList(qw); } From 2d2e1b3921eebedb6f1838bfc079719ab7b7cb82 Mon Sep 17 00:00:00 2001 From: chuzhichao Date: Fri, 16 Jun 2023 18:35:50 +0800 Subject: [PATCH 02/18] =?UTF-8?q?=E9=98=BF=E9=87=8C=E4=BA=91sms=E9=85=8D?= =?UTF-8?q?=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 7 ++ ruoyi-admin/pom.xml | 7 ++ .../src/main/resources/application-druid.yml | 12 +- ruoyi-common/pom.xml | 6 + .../com/ruoyi/common/config/SmsConfig.java | 34 ++++++ .../config/properties/SmsProperties.java | 46 +++++++ .../common/core/domain/model/SmsResult.java | 31 +++++ .../common/core/sms/AliyunSmsTemplate.java | 71 +++++++++++ .../ruoyi/common/core/sms/SmsTemplate.java | 26 ++++ .../common/exception/sms/SmsException.java | 17 +++ .../com/ruoyi/common/utils/JsonUtils.java | 112 ++++++++++++++++++ .../java/com/ruoyi/common/utils/SmsUtils.java | 33 ++++++ 12 files changed, 401 insertions(+), 1 deletion(-) create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/config/SmsConfig.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/config/properties/SmsProperties.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/SmsResult.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/core/sms/AliyunSmsTemplate.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/core/sms/SmsTemplate.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/exception/sms/SmsException.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/JsonUtils.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/SmsUtils.java diff --git a/pom.xml b/pom.xml index c786873..84213e8 100644 --- a/pom.xml +++ b/pom.xml @@ -33,6 +33,8 @@ 0.9.1 1.16.20 3.3.2 + + 2.0.23 @@ -231,6 +233,11 @@ mapstruct 1.4.2.Final + + com.aliyun + dysmsapi20170525 + ${aliyun.sms.version} + diff --git a/ruoyi-admin/pom.xml b/ruoyi-admin/pom.xml index 49f09fb..4a473df 100644 --- a/ruoyi-admin/pom.xml +++ b/ruoyi-admin/pom.xml @@ -91,6 +91,13 @@ mapstruct 1.4.2.Final + + + + com.aliyun + dysmsapi20170525 + true + diff --git a/ruoyi-admin/src/main/resources/application-druid.yml b/ruoyi-admin/src/main/resources/application-druid.yml index bbbed63..723505a 100644 --- a/ruoyi-admin/src/main/resources/application-druid.yml +++ b/ruoyi-admin/src/main/resources/application-druid.yml @@ -44,4 +44,14 @@ aliyun: bucketName: 你的bucketName # bucket 名称 wechat: appId: 你的微信服务号信息 - secret: 你的微信服务号信息 \ No newline at end of file + secret: 你的微信服务号信息 +sms: + enabled: true + # 阿里云 dysmsapi.aliyuncs.com + endpoint: dysmsapi.aliyuncs.com + accessKeyId: 你的accessKeyId #阿里云短信服务控制台查看 + accessKeySecret: 你的accessKeySecret #同上 + signName: 签名 + templateId: 模板id + # 腾讯专用 + sdkAppId: \ No newline at end of file diff --git a/ruoyi-common/pom.xml b/ruoyi-common/pom.xml index 4afb743..4d43a46 100644 --- a/ruoyi-common/pom.xml +++ b/ruoyi-common/pom.xml @@ -130,6 +130,12 @@ javax.servlet-api + + + com.aliyun + dysmsapi20170525 + true + diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/config/SmsConfig.java b/ruoyi-common/src/main/java/com/ruoyi/common/config/SmsConfig.java new file mode 100644 index 0000000..b540ddf --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/config/SmsConfig.java @@ -0,0 +1,34 @@ +package com.ruoyi.common.config; + +import com.ruoyi.common.config.properties.SmsProperties; +import com.ruoyi.common.core.sms.AliyunSmsTemplate; +import com.ruoyi.common.core.sms.SmsTemplate; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.stereotype.Component; + +/** + * 短信配置类 + * + * @author Lion Li + * @version 4.2.0 + */ +@EnableConfigurationProperties(SmsProperties.class) +public class SmsConfig { + + @Configuration + @ConditionalOnProperty(value = "sms.enabled", havingValue = "true") + @ConditionalOnClass(com.aliyun.dysmsapi20170525.Client.class) + static class AliyunSmsConfig { + + @Bean + public SmsTemplate aliyunSmsTemplate(SmsProperties smsProperties) { + return new AliyunSmsTemplate(smsProperties); + } + + } + +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/config/properties/SmsProperties.java b/ruoyi-common/src/main/java/com/ruoyi/common/config/properties/SmsProperties.java new file mode 100644 index 0000000..2c93b39 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/config/properties/SmsProperties.java @@ -0,0 +1,46 @@ +package com.ruoyi.common.config.properties; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +/** + * SMS短信 配置属性 + * + * @author Lion Li + * @version 4.2.0 + */ +@Data +@ConfigurationProperties(prefix = "sms") +@Component +public class SmsProperties { + + private Boolean enabled; + + /** + * 配置节点 + * 阿里云 dysmsapi.aliyuncs.com + */ + private String endpoint; + + /** + * key + */ + private String accessKeyId; + + /** + * 密匙 + */ + private String accessKeySecret; + + /* + * 短信签名 + */ + private String signName; + + /** + * 短信应用ID (腾讯专属) + */ + private String sdkAppId; + +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/SmsResult.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/SmsResult.java new file mode 100644 index 0000000..7910299 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/SmsResult.java @@ -0,0 +1,31 @@ +package com.ruoyi.common.core.domain.model; + +import lombok.Builder; +import lombok.Data; + +/** + * 上传返回体 + * + * @author Lion Li + */ +@Data +@Builder +public class SmsResult { + + /** + * 是否成功 + */ + private boolean isSuccess; + + /** + * 响应消息 + */ + private String message; + + /** + * 实际响应体 + *

+ * 可自行转换为 SDK 对应的 SendSmsResponse + */ + private String response; +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/sms/AliyunSmsTemplate.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/sms/AliyunSmsTemplate.java new file mode 100644 index 0000000..a795ffa --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/sms/AliyunSmsTemplate.java @@ -0,0 +1,71 @@ +package com.ruoyi.common.core.sms; + +import com.aliyun.dysmsapi20170525.Client; +import com.aliyun.dysmsapi20170525.models.SendSmsRequest; +import com.aliyun.dysmsapi20170525.models.SendSmsResponse; +import com.aliyun.teaopenapi.models.Config; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.ruoyi.common.config.properties.SmsProperties; +import com.ruoyi.common.core.domain.model.SmsResult; +import com.ruoyi.common.exception.sms.SmsException; +import com.ruoyi.common.utils.JsonUtils; +import com.ruoyi.common.utils.StringUtils; +import lombok.SneakyThrows; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.stereotype.Service; + +import java.util.Map; + +/** + * Aliyun 短信模板 + * + * @author Lion Li + * @version 4.2.0 + */ +public class AliyunSmsTemplate implements SmsTemplate { + + @Autowired + private SmsProperties properties; + + private Client client; + + @SneakyThrows(Exception.class) + public AliyunSmsTemplate(SmsProperties smsProperties) { + this.properties = smsProperties; + Config config = new Config() + // 您的AccessKey ID + .setAccessKeyId(smsProperties.getAccessKeyId()) + // 您的AccessKey Secret + .setAccessKeySecret(smsProperties.getAccessKeySecret()) + // 访问的域名 + .setEndpoint(smsProperties.getEndpoint()); + this.client = new Client(config); + } + + @Override + public SmsResult send(String phones, String templateId, Map param) { + if (StringUtils.isBlank(phones)) { + throw new SmsException("手机号不能为空"); + } + if (StringUtils.isBlank(templateId)) { + throw new SmsException("模板ID不能为空"); + } + SendSmsRequest req = new SendSmsRequest() + .setPhoneNumbers(phones) + .setSignName(properties.getSignName()) + .setTemplateCode(templateId) + .setTemplateParam(JsonUtils.toJsonString(param)); + try { + SendSmsResponse resp = client.sendSms(req); + return SmsResult.builder() + .isSuccess("OK".equals(resp.getBody().getCode())) + .message(resp.getBody().getMessage()) + .response(JsonUtils.toJsonString(resp)) + .build(); + } catch (Exception e) { + throw new SmsException(e.getMessage()); + } + } + +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/sms/SmsTemplate.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/sms/SmsTemplate.java new file mode 100644 index 0000000..ee6064b --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/sms/SmsTemplate.java @@ -0,0 +1,26 @@ +package com.ruoyi.common.core.sms; + +import com.ruoyi.common.core.domain.model.SmsResult; + +import java.util.Map; + +/** + * 短信模板 + * + * @author Lion Li + * @version 4.2.0 + */ +public interface SmsTemplate { + + /** + * 发送短信 + * + * @param phones 电话号(多个逗号分割) + * @param templateId 模板id + * @param param 模板对应参数 + * 阿里 需使用 模板变量名称对应内容 例如: code=1234 + * 腾讯 需使用 模板变量顺序对应内容 例如: 1=1234, 1为模板内第一个参数 + */ + SmsResult send(String phones, String templateId, Map param); + +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/exception/sms/SmsException.java b/ruoyi-common/src/main/java/com/ruoyi/common/exception/sms/SmsException.java new file mode 100644 index 0000000..9d66156 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/exception/sms/SmsException.java @@ -0,0 +1,17 @@ +package com.ruoyi.common.exception.sms; + + +/** + * Sms异常类 + * + * @author Lion Li + */ +public class SmsException extends RuntimeException { + + private static final long serialVersionUID = 1L; + + public SmsException(String msg) { + super(msg); + } + +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/JsonUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/JsonUtils.java new file mode 100644 index 0000000..e5c471e --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/JsonUtils.java @@ -0,0 +1,112 @@ +package com.ruoyi.common.utils; + +import cn.hutool.core.lang.Dict; +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.ObjectUtil; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.exc.MismatchedInputException; +import com.ruoyi.common.utils.spring.SpringUtils; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +/** + * JSON 工具类 + * + * @author 芋道源码 + */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class JsonUtils { + + private static final ObjectMapper OBJECT_MAPPER = SpringUtils.getBean(ObjectMapper.class); + + public static ObjectMapper getObjectMapper() { + return OBJECT_MAPPER; + } + + public static String toJsonString(Object object) { + if (ObjectUtil.isNull(object)) { + return null; + } + try { + return OBJECT_MAPPER.writeValueAsString(object); + } catch (JsonProcessingException e) { + throw new RuntimeException(e); + } + } + + public static T parseObject(String text, Class clazz) { + if (StringUtils.isEmpty(text)) { + return null; + } + try { + return OBJECT_MAPPER.readValue(text, clazz); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + public static T parseObject(byte[] bytes, Class clazz) { + if (ArrayUtil.isEmpty(bytes)) { + return null; + } + try { + return OBJECT_MAPPER.readValue(bytes, clazz); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + public static T parseObject(String text, TypeReference typeReference) { + if (StringUtils.isBlank(text)) { + return null; + } + try { + return OBJECT_MAPPER.readValue(text, typeReference); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + public static Dict parseMap(String text) { + if (StringUtils.isBlank(text)) { + return null; + } + try { + return OBJECT_MAPPER.readValue(text, OBJECT_MAPPER.getTypeFactory().constructType(Dict.class)); + } catch (MismatchedInputException e) { + // 类型不匹配说明不是json + return null; + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + public static List parseArrayMap(String text) { + if (StringUtils.isBlank(text)) { + return null; + } + try { + return OBJECT_MAPPER.readValue(text, OBJECT_MAPPER.getTypeFactory().constructCollectionType(List.class, Dict.class)); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + public static List parseArray(String text, Class clazz) { + if (StringUtils.isEmpty(text)) { + return new ArrayList<>(); + } + try { + return OBJECT_MAPPER.readValue(text, OBJECT_MAPPER.getTypeFactory().constructCollectionType(List.class, clazz)); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/SmsUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/SmsUtils.java new file mode 100644 index 0000000..beffc1e --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/SmsUtils.java @@ -0,0 +1,33 @@ +package com.ruoyi.common.utils; + +/** + * @Author: czc + * @Description: TODO + * @DateTime: 2023/6/16 17:50 + **/ +public class SmsUtils { + + public static String createRandom(boolean numberFlag, int length) { + String retStr = ""; + String strTable = numberFlag ? "1234567890" : "1234567890abcdefghijkmnpqrstuvwxyz"; + int len = strTable.length(); + boolean bDone = true; + do { + retStr = ""; + int count = 0; + for (int i = 0; i < length; i++) { + double dblR = Math.random() * len; + int intR = (int) Math.floor(dblR); + char c = strTable.charAt(intR); + if (('0' <= c) && (c <= '9')) { + count++; + } + retStr += strTable.charAt(intR); + } + if (count >= 2) { + bDone = false; + } + } while (bDone); + return retStr; + } +} From d7ee61b113fb995bce324c2936288c986d86c1f0 Mon Sep 17 00:00:00 2001 From: chuzhichao Date: Mon, 19 Jun 2023 18:02:13 +0800 Subject: [PATCH 03/18] =?UTF-8?q?sms=E3=80=81=E4=BC=9A=E5=91=98=E6=B3=A8?= =?UTF-8?q?=E5=86=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/core/domain/model/SmsResult.java | 4 + .../cyl/h5/controller/H5MemberController.java | 31 ++++++++ .../java/com/cyl/h5/pojo/dto/LoginDTO.java | 14 ++++ .../cyl/h5/pojo/request/RegisterRequest.java | 26 ++++++ .../h5/pojo/response/RegisterResponse.java | 21 +++++ .../com/cyl/h5/service/H5MemberService.java | 77 ++++++++++++++++++ .../main/java/com/cyl/sms/SmsController.java | 30 +++++++ .../java/com/cyl/sms/service/SmsService.java | 79 +++++++++++++++++++ 8 files changed, 282 insertions(+) create mode 100644 ruoyi-mall/src/main/java/com/cyl/h5/controller/H5MemberController.java create mode 100644 ruoyi-mall/src/main/java/com/cyl/h5/pojo/dto/LoginDTO.java create mode 100644 ruoyi-mall/src/main/java/com/cyl/h5/pojo/request/RegisterRequest.java create mode 100644 ruoyi-mall/src/main/java/com/cyl/h5/pojo/response/RegisterResponse.java create mode 100644 ruoyi-mall/src/main/java/com/cyl/h5/service/H5MemberService.java create mode 100644 ruoyi-mall/src/main/java/com/cyl/sms/SmsController.java create mode 100644 ruoyi-mall/src/main/java/com/cyl/sms/service/SmsService.java diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/SmsResult.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/SmsResult.java index 7910299..a273374 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/SmsResult.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/SmsResult.java @@ -28,4 +28,8 @@ public class SmsResult { * 可自行转换为 SDK 对应的 SendSmsResponse */ private String response; + /** + * uuid + */ + private String uuid; } diff --git a/ruoyi-mall/src/main/java/com/cyl/h5/controller/H5MemberController.java b/ruoyi-mall/src/main/java/com/cyl/h5/controller/H5MemberController.java new file mode 100644 index 0000000..72e94dc --- /dev/null +++ b/ruoyi-mall/src/main/java/com/cyl/h5/controller/H5MemberController.java @@ -0,0 +1,31 @@ +package com.cyl.h5.controller; + +import com.cyl.h5.pojo.dto.LoginDTO; +import com.cyl.h5.pojo.request.RegisterRequest; +import com.cyl.h5.pojo.response.RegisterResponse; +import com.cyl.h5.pojo.vo.LoginResVO; +import com.cyl.h5.service.H5MemberService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +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; + +/** + * @Author: czc + * @Description: TODO + * @DateTime: 2023/6/16 14:52 + **/ +@RestController +@RequestMapping() +public class H5MemberController { + + @Autowired + private H5MemberService service; + + @PostMapping("/no-auth/h5/member/register") + public ResponseEntity register(@RequestBody RegisterRequest request){ + return ResponseEntity.ok(service.register(request)); + } +} diff --git a/ruoyi-mall/src/main/java/com/cyl/h5/pojo/dto/LoginDTO.java b/ruoyi-mall/src/main/java/com/cyl/h5/pojo/dto/LoginDTO.java new file mode 100644 index 0000000..9778b48 --- /dev/null +++ b/ruoyi-mall/src/main/java/com/cyl/h5/pojo/dto/LoginDTO.java @@ -0,0 +1,14 @@ +package com.cyl.h5.pojo.dto; + +import lombok.Data; + +/** + * @Author: czc + * @Description: TODO + * @DateTime: 2023/6/16 14:58 + **/ +@Data +public class LoginDTO { + private String account; + private String password; +} diff --git a/ruoyi-mall/src/main/java/com/cyl/h5/pojo/request/RegisterRequest.java b/ruoyi-mall/src/main/java/com/cyl/h5/pojo/request/RegisterRequest.java new file mode 100644 index 0000000..38a4eca --- /dev/null +++ b/ruoyi-mall/src/main/java/com/cyl/h5/pojo/request/RegisterRequest.java @@ -0,0 +1,26 @@ +package com.cyl.h5.pojo.request; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Author: czc + * @Description: TODO + * @DateTime: 2023/6/19 16:31 + **/ +@Data +public class RegisterRequest { + + @ApiModelProperty("手机号") + private String mobile; + + @ApiModelProperty("密码") + private String password; + + @ApiModelProperty("uuid") + private String uuid; + + @ApiModelProperty("验证码") + private String code; + +} diff --git a/ruoyi-mall/src/main/java/com/cyl/h5/pojo/response/RegisterResponse.java b/ruoyi-mall/src/main/java/com/cyl/h5/pojo/response/RegisterResponse.java new file mode 100644 index 0000000..a4e630f --- /dev/null +++ b/ruoyi-mall/src/main/java/com/cyl/h5/pojo/response/RegisterResponse.java @@ -0,0 +1,21 @@ +package com.cyl.h5.pojo.response; + +import com.cyl.ums.domain.Member; +import lombok.Data; + +/** + * @Author: czc + * @Description: TODO + * @DateTime: 2023/6/19 16:38 + **/ +@Data +public class RegisterResponse { + + private boolean result; + + private String message; + + private String token; + + private Member member; +} diff --git a/ruoyi-mall/src/main/java/com/cyl/h5/service/H5MemberService.java b/ruoyi-mall/src/main/java/com/cyl/h5/service/H5MemberService.java new file mode 100644 index 0000000..39fc824 --- /dev/null +++ b/ruoyi-mall/src/main/java/com/cyl/h5/service/H5MemberService.java @@ -0,0 +1,77 @@ +package com.cyl.h5.service; + +import com.cyl.h5.pojo.request.RegisterRequest; +import com.cyl.h5.pojo.response.RegisterResponse; +import com.cyl.ums.domain.Member; +import com.cyl.ums.mapper.MemberMapper; +import com.ruoyi.common.core.redis.RedisCache; +import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.common.utils.StringUtils; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.time.LocalDateTime; + +/** + * @Author: czc + * @Description: TODO + * @DateTime: 2023/6/16 15:01 + **/ +@Service +@Slf4j +public class H5MemberService { + + @Autowired + private MemberMapper memberMapper; + + @Autowired + private RedisCache redisCache; + + /** + * 注册 + * @param request 注册请求体 + * @return 结果 + */ + public RegisterResponse register(RegisterRequest request){ + log.info("request:{}", request); + RegisterResponse response = new RegisterResponse(); + response.setResult(false); + if (StringUtils.isEmpty(request.getMobile())){ + response.setMessage("手机号不能为空"); + return response; + } + if (StringUtils.isEmpty(request.getPassword())){ + response.setMessage("密码不能为空"); + return response; + } + int len = request.getPassword().length(); + if (len < 8 || len > 20){ + response.setMessage("密码长度为8-20位"); + return response; + } + //校验 验证码 + String key = request.getUuid() + "_" + request.getMobile(); + String code = redisCache.getCacheObject(key); + log.info("code:{}", code); + if (null == code){ + response.setMessage("验证码已过期"); + return response; + }else if (!code.equals(request.getCode())){ + response.setMessage("验证码错误"); + return response; + } + //删除缓存 + redisCache.deleteObject(key); + //创建会员 + Member member = new Member(); + member.setPhone(request.getMobile()); + member.setPassword(SecurityUtils.encryptPassword(request.getPassword())); + member.setNickname("用户" + request.getMobile()); + member.setCreateTime(LocalDateTime.now()); + memberMapper.insert(member); + response.setResult(true); + response.setMessage("注册成功"); + return response; + } +} diff --git a/ruoyi-mall/src/main/java/com/cyl/sms/SmsController.java b/ruoyi-mall/src/main/java/com/cyl/sms/SmsController.java new file mode 100644 index 0000000..6c26ab1 --- /dev/null +++ b/ruoyi-mall/src/main/java/com/cyl/sms/SmsController.java @@ -0,0 +1,30 @@ +package com.cyl.sms; + +import com.cyl.sms.service.SmsService; +import com.ruoyi.common.core.domain.model.SmsResult; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + + +/** + * @Author: czc + * @Description: TODO + * @DateTime: 2023/6/19 15:39 + **/ +@RestController +@RequestMapping("/no-auth/sms") +public class SmsController { + + @Autowired + private SmsService smsService; + + /** + * 阿里云短信服务 + */ + @GetMapping("/sendAliyun/{phones}") + public ResponseEntity sendAliyun(@PathVariable String phones){ + return smsService.sendAliyun(phones); + } + +} diff --git a/ruoyi-mall/src/main/java/com/cyl/sms/service/SmsService.java b/ruoyi-mall/src/main/java/com/cyl/sms/service/SmsService.java new file mode 100644 index 0000000..c43c5b2 --- /dev/null +++ b/ruoyi-mall/src/main/java/com/cyl/sms/service/SmsService.java @@ -0,0 +1,79 @@ +package com.cyl.sms.service; + +import com.ruoyi.common.config.properties.SmsProperties; +import com.ruoyi.common.core.domain.model.SmsResult; +import com.ruoyi.common.core.redis.RedisCache; +import com.ruoyi.common.core.sms.AliyunSmsTemplate; +import com.ruoyi.common.core.sms.SmsTemplate; +import com.ruoyi.common.utils.SmsUtils; +import com.ruoyi.common.utils.StringUtils; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Service; + +import java.util.Base64; +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; +import java.util.concurrent.TimeUnit; + +/** + * @Author: czc + * @Description: TODO + * @DateTime: 2023/6/19 16:28 + **/ +@Service +@Slf4j +public class SmsService { + + @Autowired + private RedisCache redisCache; + + @Autowired + private SmsProperties smsProperties; + + private final String templateId = "SMS_146125046"; + + public ResponseEntity sendAliyun(String phones){ + if (!smsProperties.getEnabled()){ + return ResponseEntity.ok( + SmsResult.builder() + .isSuccess(false) + .message("当前系统没有开启短信服务") + .build() + ); + + } + if (StringUtils.isEmpty(phones)){ + return ResponseEntity.ok( + SmsResult.builder() + .isSuccess(false) + .message("手机号不能为空") + .build() + ); + } + byte[] decodedBytes = Base64.getDecoder().decode(phones); + phones = new String(decodedBytes); + log.info("base64解码后的手机号为:{}", phones); + String code = SmsUtils.createRandom(true, 4); + Map map = new HashMap<>(); + map.put("code", code); + SmsTemplate smsTemplate = new AliyunSmsTemplate(smsProperties); + SmsResult send = smsTemplate.send(phones, templateId, map); + // 验证码存redis,当前只用于注册和登录,手机号只有一个 + String uuid = UUID.randomUUID().toString().replaceAll("-", ""); + send.setUuid(uuid); + try{ + redisCache.setCacheObject(uuid + "_" + phones, code, 5, TimeUnit.MINUTES); + }catch (Exception e){ + return ResponseEntity.ok( + SmsResult.builder() + .isSuccess(false) + .message("服务繁忙,请稍后再试") + .build() + ); + } + return ResponseEntity.ok(send); + } +} From 387fadce7058943d71a164e45493f8db79de5b4f Mon Sep 17 00:00:00 2001 From: chuzhichao Date: Tue, 20 Jun 2023 09:40:23 +0800 Subject: [PATCH 04/18] =?UTF-8?q?=E6=B3=A8=E5=86=8C=E6=89=8B=E6=9C=BA?= =?UTF-8?q?=E5=8F=B7=E6=A0=A1=E9=AA=8C=E3=80=81=E4=BB=A3=E7=A0=81=E4=BC=98?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cyl/h5/controller/H5MemberController.java | 25 ++++++----- .../cyl/h5/pojo/request/RegisterRequest.java | 11 ++--- .../h5/pojo/response/RegisterResponse.java | 7 +-- .../pojo/response/ValidatePhoneResponse.java | 11 +++++ .../com/cyl/h5/service/H5MemberService.java | 43 ++++++++++--------- .../main/java/com/cyl/sms/SmsController.java | 6 +-- .../java/com/cyl/sms/service/SmsService.java | 15 ------- 7 files changed, 54 insertions(+), 64 deletions(-) create mode 100644 ruoyi-mall/src/main/java/com/cyl/h5/pojo/response/ValidatePhoneResponse.java diff --git a/ruoyi-mall/src/main/java/com/cyl/h5/controller/H5MemberController.java b/ruoyi-mall/src/main/java/com/cyl/h5/controller/H5MemberController.java index 72e94dc..f730e1e 100644 --- a/ruoyi-mall/src/main/java/com/cyl/h5/controller/H5MemberController.java +++ b/ruoyi-mall/src/main/java/com/cyl/h5/controller/H5MemberController.java @@ -1,31 +1,30 @@ package com.cyl.h5.controller; -import com.cyl.h5.pojo.dto.LoginDTO; import com.cyl.h5.pojo.request.RegisterRequest; import com.cyl.h5.pojo.response.RegisterResponse; -import com.cyl.h5.pojo.vo.LoginResVO; +import com.cyl.h5.pojo.response.ValidatePhoneResponse; import com.cyl.h5.service.H5MemberService; +import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; -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: czc - * @Description: TODO - * @DateTime: 2023/6/16 14:52 - **/ @RestController -@RequestMapping() +@RequestMapping("/no-auth/h5/member") public class H5MemberController { @Autowired private H5MemberService service; - @PostMapping("/no-auth/h5/member/register") + @ApiOperation("会员注册") + @PostMapping("/register") public ResponseEntity register(@RequestBody RegisterRequest request){ return ResponseEntity.ok(service.register(request)); } + + @ApiOperation("注册验证码校验手机号") + @GetMapping("/validate/{phone}") + public ResponseEntity validate(@PathVariable String phone){ + return ResponseEntity.ok(service.validate(phone)); + } } diff --git a/ruoyi-mall/src/main/java/com/cyl/h5/pojo/request/RegisterRequest.java b/ruoyi-mall/src/main/java/com/cyl/h5/pojo/request/RegisterRequest.java index 38a4eca..2d90442 100644 --- a/ruoyi-mall/src/main/java/com/cyl/h5/pojo/request/RegisterRequest.java +++ b/ruoyi-mall/src/main/java/com/cyl/h5/pojo/request/RegisterRequest.java @@ -3,24 +3,25 @@ package com.cyl.h5.pojo.request; import io.swagger.annotations.ApiModelProperty; import lombok.Data; -/** - * @Author: czc - * @Description: TODO - * @DateTime: 2023/6/19 16:31 - **/ +import javax.validation.constraints.NotBlank; + @Data public class RegisterRequest { @ApiModelProperty("手机号") + @NotBlank private String mobile; @ApiModelProperty("密码") + @NotBlank private String password; @ApiModelProperty("uuid") + @NotBlank private String uuid; @ApiModelProperty("验证码") + @NotBlank private String code; } diff --git a/ruoyi-mall/src/main/java/com/cyl/h5/pojo/response/RegisterResponse.java b/ruoyi-mall/src/main/java/com/cyl/h5/pojo/response/RegisterResponse.java index a4e630f..1b18391 100644 --- a/ruoyi-mall/src/main/java/com/cyl/h5/pojo/response/RegisterResponse.java +++ b/ruoyi-mall/src/main/java/com/cyl/h5/pojo/response/RegisterResponse.java @@ -3,15 +3,10 @@ package com.cyl.h5.pojo.response; import com.cyl.ums.domain.Member; import lombok.Data; -/** - * @Author: czc - * @Description: TODO - * @DateTime: 2023/6/19 16:38 - **/ @Data public class RegisterResponse { - private boolean result; + private boolean ifSuccess; private String message; diff --git a/ruoyi-mall/src/main/java/com/cyl/h5/pojo/response/ValidatePhoneResponse.java b/ruoyi-mall/src/main/java/com/cyl/h5/pojo/response/ValidatePhoneResponse.java new file mode 100644 index 0000000..523de06 --- /dev/null +++ b/ruoyi-mall/src/main/java/com/cyl/h5/pojo/response/ValidatePhoneResponse.java @@ -0,0 +1,11 @@ +package com.cyl.h5.pojo.response; + +import lombok.Data; + +@Data +public class ValidatePhoneResponse { + /** 是否成功 */ + private boolean ifSuccess; + /** 消息 */ + private String message; +} diff --git a/ruoyi-mall/src/main/java/com/cyl/h5/service/H5MemberService.java b/ruoyi-mall/src/main/java/com/cyl/h5/service/H5MemberService.java index 39fc824..2e97d68 100644 --- a/ruoyi-mall/src/main/java/com/cyl/h5/service/H5MemberService.java +++ b/ruoyi-mall/src/main/java/com/cyl/h5/service/H5MemberService.java @@ -1,7 +1,9 @@ package com.cyl.h5.service; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.cyl.h5.pojo.request.RegisterRequest; import com.cyl.h5.pojo.response.RegisterResponse; +import com.cyl.h5.pojo.response.ValidatePhoneResponse; import com.cyl.ums.domain.Member; import com.cyl.ums.mapper.MemberMapper; import com.ruoyi.common.core.redis.RedisCache; @@ -9,15 +11,12 @@ import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.StringUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Service; import java.time.LocalDateTime; +import java.util.Base64; -/** - * @Author: czc - * @Description: TODO - * @DateTime: 2023/6/16 15:01 - **/ @Service @Slf4j public class H5MemberService { @@ -36,20 +35,7 @@ public class H5MemberService { public RegisterResponse register(RegisterRequest request){ log.info("request:{}", request); RegisterResponse response = new RegisterResponse(); - response.setResult(false); - if (StringUtils.isEmpty(request.getMobile())){ - response.setMessage("手机号不能为空"); - return response; - } - if (StringUtils.isEmpty(request.getPassword())){ - response.setMessage("密码不能为空"); - return response; - } - int len = request.getPassword().length(); - if (len < 8 || len > 20){ - response.setMessage("密码长度为8-20位"); - return response; - } + response.setIfSuccess(false); //校验 验证码 String key = request.getUuid() + "_" + request.getMobile(); String code = redisCache.getCacheObject(key); @@ -70,8 +56,25 @@ public class H5MemberService { member.setNickname("用户" + request.getMobile()); member.setCreateTime(LocalDateTime.now()); memberMapper.insert(member); - response.setResult(true); + response.setIfSuccess(true); response.setMessage("注册成功"); return response; } + + public ValidatePhoneResponse validate(String phone) { + ValidatePhoneResponse response = new ValidatePhoneResponse(); + response.setIfSuccess(false); + byte[] decodedBytes = Base64.getDecoder().decode(phone); + phone = new String(decodedBytes); + QueryWrapper qw = new QueryWrapper<>(); + qw.eq("phone", phone); + Member member = memberMapper.selectOne(qw); + if (member != null){ + response.setMessage("该手机号已被占用"); + return response; + } + response.setIfSuccess(true); + response.setMessage("该手机号可用"); + return response; + } } diff --git a/ruoyi-mall/src/main/java/com/cyl/sms/SmsController.java b/ruoyi-mall/src/main/java/com/cyl/sms/SmsController.java index 6c26ab1..1e32169 100644 --- a/ruoyi-mall/src/main/java/com/cyl/sms/SmsController.java +++ b/ruoyi-mall/src/main/java/com/cyl/sms/SmsController.java @@ -7,11 +7,7 @@ import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; -/** - * @Author: czc - * @Description: TODO - * @DateTime: 2023/6/19 15:39 - **/ + @RestController @RequestMapping("/no-auth/sms") public class SmsController { diff --git a/ruoyi-mall/src/main/java/com/cyl/sms/service/SmsService.java b/ruoyi-mall/src/main/java/com/cyl/sms/service/SmsService.java index c43c5b2..ec3885d 100644 --- a/ruoyi-mall/src/main/java/com/cyl/sms/service/SmsService.java +++ b/ruoyi-mall/src/main/java/com/cyl/sms/service/SmsService.java @@ -6,7 +6,6 @@ import com.ruoyi.common.core.redis.RedisCache; import com.ruoyi.common.core.sms.AliyunSmsTemplate; import com.ruoyi.common.core.sms.SmsTemplate; import com.ruoyi.common.utils.SmsUtils; -import com.ruoyi.common.utils.StringUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; @@ -18,11 +17,6 @@ import java.util.Map; import java.util.UUID; import java.util.concurrent.TimeUnit; -/** - * @Author: czc - * @Description: TODO - * @DateTime: 2023/6/19 16:28 - **/ @Service @Slf4j public class SmsService { @@ -45,17 +39,8 @@ public class SmsService { ); } - if (StringUtils.isEmpty(phones)){ - return ResponseEntity.ok( - SmsResult.builder() - .isSuccess(false) - .message("手机号不能为空") - .build() - ); - } byte[] decodedBytes = Base64.getDecoder().decode(phones); phones = new String(decodedBytes); - log.info("base64解码后的手机号为:{}", phones); String code = SmsUtils.createRandom(true, 4); Map map = new HashMap<>(); map.put("code", code); From fe1a2b1cdffdbbac0e7b3574adc7089de496afa1 Mon Sep 17 00:00:00 2001 From: chuzhichao Date: Tue, 20 Jun 2023 12:04:36 +0800 Subject: [PATCH 05/18] =?UTF-8?q?=E6=B3=A8=E5=86=8C=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cyl/h5/pojo/response/RegisterResponse.java | 8 ++------ .../java/com/cyl/h5/service/H5MemberService.java | 15 ++++----------- 2 files changed, 6 insertions(+), 17 deletions(-) diff --git a/ruoyi-mall/src/main/java/com/cyl/h5/pojo/response/RegisterResponse.java b/ruoyi-mall/src/main/java/com/cyl/h5/pojo/response/RegisterResponse.java index 1b18391..f6a0572 100644 --- a/ruoyi-mall/src/main/java/com/cyl/h5/pojo/response/RegisterResponse.java +++ b/ruoyi-mall/src/main/java/com/cyl/h5/pojo/response/RegisterResponse.java @@ -5,12 +5,8 @@ import lombok.Data; @Data public class RegisterResponse { - - private boolean ifSuccess; - - private String message; - + /** token */ private String token; - + /** 会员信息 */ private Member member; } diff --git a/ruoyi-mall/src/main/java/com/cyl/h5/service/H5MemberService.java b/ruoyi-mall/src/main/java/com/cyl/h5/service/H5MemberService.java index 2e97d68..8f2ab52 100644 --- a/ruoyi-mall/src/main/java/com/cyl/h5/service/H5MemberService.java +++ b/ruoyi-mall/src/main/java/com/cyl/h5/service/H5MemberService.java @@ -33,19 +33,15 @@ public class H5MemberService { * @return 结果 */ public RegisterResponse register(RegisterRequest request){ - log.info("request:{}", request); RegisterResponse response = new RegisterResponse(); - response.setIfSuccess(false); //校验 验证码 String key = request.getUuid() + "_" + request.getMobile(); String code = redisCache.getCacheObject(key); log.info("code:{}", code); if (null == code){ - response.setMessage("验证码已过期"); - return response; + throw new RuntimeException("验证码已过期"); }else if (!code.equals(request.getCode())){ - response.setMessage("验证码错误"); - return response; + throw new RuntimeException("验证码错误"); } //删除缓存 redisCache.deleteObject(key); @@ -56,22 +52,19 @@ public class H5MemberService { member.setNickname("用户" + request.getMobile()); member.setCreateTime(LocalDateTime.now()); memberMapper.insert(member); - response.setIfSuccess(true); - response.setMessage("注册成功"); + //TODO 返回封装了token和member信息的response return response; } public ValidatePhoneResponse validate(String phone) { ValidatePhoneResponse response = new ValidatePhoneResponse(); - response.setIfSuccess(false); byte[] decodedBytes = Base64.getDecoder().decode(phone); phone = new String(decodedBytes); QueryWrapper qw = new QueryWrapper<>(); qw.eq("phone", phone); Member member = memberMapper.selectOne(qw); if (member != null){ - response.setMessage("该手机号已被占用"); - return response; + throw new RuntimeException("该手机号已被占用"); } response.setIfSuccess(true); response.setMessage("该手机号可用"); From 525dc60d3c79ede0513cbfde071a6b70b70075a3 Mon Sep 17 00:00:00 2001 From: chuzhichao Date: Tue, 20 Jun 2023 17:48:24 +0800 Subject: [PATCH 06/18] =?UTF-8?q?H5=E7=9A=84=E7=99=BB=E5=BD=95=E3=80=81?= =?UTF-8?q?=E6=B3=A8=E5=86=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web/core/config/H5MemberInterceptor.java | 68 +++++++++ .../com/ruoyi/web/core/config/MvcConfig.java | 23 ++++ .../src/main/resources/application.yml | 1 + .../com/fjp/lc/test/service/ServiceTest.java | 26 ++++ .../com/ruoyi/common/constant/Constants.java | 3 + .../common/core/domain/model/LoginMember.java | 13 ++ .../framework/config/SecurityConfig.java | 1 + .../framework/web/service/TokenService.java | 47 +++++++ .../java/com/cyl/h5/config/SecurityUtil.java | 17 +++ .../cyl/h5/controller/H5MemberController.java | 22 ++- .../pojo/request/H5AccountLoginRequest.java | 9 ++ .../cyl/h5/pojo/request/H5LoginRequest.java | 9 ++ .../h5/pojo/request/H5SmsLoginRequest.java | 11 ++ .../cyl/h5/pojo/response/H5LoginResponse.java | 13 ++ .../h5/pojo/response/RegisterResponse.java | 3 - .../com/cyl/h5/service/H5MemberService.java | 130 ++++++++++++++++-- .../java/com/cyl/ums/pojo/vo/MemberVO.java | 3 - 17 files changed, 378 insertions(+), 21 deletions(-) create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/core/config/H5MemberInterceptor.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/core/config/MvcConfig.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/LoginMember.java create mode 100644 ruoyi-mall/src/main/java/com/cyl/h5/config/SecurityUtil.java create mode 100644 ruoyi-mall/src/main/java/com/cyl/h5/pojo/request/H5AccountLoginRequest.java create mode 100644 ruoyi-mall/src/main/java/com/cyl/h5/pojo/request/H5LoginRequest.java create mode 100644 ruoyi-mall/src/main/java/com/cyl/h5/pojo/request/H5SmsLoginRequest.java create mode 100644 ruoyi-mall/src/main/java/com/cyl/h5/pojo/response/H5LoginResponse.java diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/core/config/H5MemberInterceptor.java b/ruoyi-admin/src/main/java/com/ruoyi/web/core/config/H5MemberInterceptor.java new file mode 100644 index 0000000..8ad40f2 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/core/config/H5MemberInterceptor.java @@ -0,0 +1,68 @@ +package com.ruoyi.web.core.config; + +import com.cyl.ums.domain.Member; +import com.cyl.ums.service.MemberService; +import com.ruoyi.common.constant.Constants; +import com.ruoyi.common.constant.HttpStatus; +import com.ruoyi.common.core.domain.model.LoginMember; +import com.ruoyi.common.exception.ServiceException; +import com.ruoyi.framework.config.LocalDataUtil; +import com.ruoyi.framework.web.service.TokenService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +@Configuration +public class H5MemberInterceptor extends HandlerInterceptorAdapter { + + @Autowired + private TokenService tokenService; + @Autowired + private MemberService memberService; + + private static String[] WHITE_PATHS = { + "/h5/sms/login", + "/h5/account/login", + "/h5/register", + "/h5/validate" + }; + + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { + String requestUri = request.getRequestURI(); + boolean flag = true; + if (!requestUri.startsWith("/h5/")) { + return super.preHandle(request, response, handler); + } + + for (String s : WHITE_PATHS) { + if (requestUri.startsWith(s)) { + flag = false; + break; + } + } + if (!flag) { + return super.preHandle(request, response, handler); + } + LoginMember loginMember = tokenService.getLoginMember(request); + if (loginMember == null) { + throw new ServiceException("获取用户ID异常", HttpStatus.UNAUTHORIZED); + } + tokenService.verifyMemberToken(loginMember); + //获取会员信息 + Member member = memberService.selectById(loginMember.getMemberId()); + if (member == null || member.getStatus() == 0) { + throw new ServiceException("获取用户ID异常", HttpStatus.UNAUTHORIZED); + } + //将会员信息存放至全局 + LocalDataUtil.setVar(Constants.MEMBER_INFO, member); + + return super.preHandle(request, response, handler); + } + + + +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/core/config/MvcConfig.java b/ruoyi-admin/src/main/java/com/ruoyi/web/core/config/MvcConfig.java new file mode 100644 index 0000000..dc8ca76 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/core/config/MvcConfig.java @@ -0,0 +1,23 @@ +package com.ruoyi.web.core.config; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; + +@Configuration +@Slf4j +public class MvcConfig extends WebMvcConfigurerAdapter { + + @Bean + public H5MemberInterceptor memberInterceptor() { + return new H5MemberInterceptor(); + } + + + @Override + public void addInterceptors(InterceptorRegistry registry) { + registry.addInterceptor(memberInterceptor()); + } +} diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml index 7ae7707..dbb6af2 100644 --- a/ruoyi-admin/src/main/resources/application.yml +++ b/ruoyi-admin/src/main/resources/application.yml @@ -121,6 +121,7 @@ token: secret: abcdefghijkomnopqrstuvwxyx # 令牌有效期(默认30分钟) expireTime: 30 + memberExpireTime: 30 # mybatis-plus 配置 mybatis-plus: # 搜索指定包别名 diff --git a/ruoyi-admin/src/test/java/com/fjp/lc/test/service/ServiceTest.java b/ruoyi-admin/src/test/java/com/fjp/lc/test/service/ServiceTest.java index 9518cde..2c7f6f3 100644 --- a/ruoyi-admin/src/test/java/com/fjp/lc/test/service/ServiceTest.java +++ b/ruoyi-admin/src/test/java/com/fjp/lc/test/service/ServiceTest.java @@ -2,6 +2,11 @@ package com.fjp.lc.test.service; import com.cyl.ums.service.MemberCartService; import com.ruoyi.RuoYiApplication; +import com.ruoyi.common.config.properties.SmsProperties; +import com.ruoyi.common.core.sms.AliyunSmsTemplate; +import com.ruoyi.common.core.sms.SmsTemplate; +import com.ruoyi.common.utils.spring.SpringUtils; +import lombok.extern.slf4j.Slf4j; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; @@ -9,14 +14,35 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.ActiveProfiles; import org.springframework.test.context.junit4.SpringRunner; +import java.util.HashMap; +import java.util.Map; + @RunWith(SpringRunner.class) @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE, classes = RuoYiApplication.class) @ActiveProfiles("dev") +@Slf4j public class ServiceTest { @Autowired private MemberCartService memberCartService; + + @Autowired + private SmsProperties smsProperties; + @Test public void test1() { memberCartService.mineCartNum(); } + + @Test + public void test2(){ + System.out.println(smsProperties); + if (!smsProperties.getEnabled()) { + throw new RuntimeException("没有开启短信服务"); + } + Map map = new HashMap<>(1); + map.put("code", "1234"); + SmsTemplate smsTemplate = new AliyunSmsTemplate(smsProperties); + Object send = smsTemplate.send("15706259078", "SMS_146125046", map); + log.info("短信发送结果:" + send); + } } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/constant/Constants.java b/ruoyi-common/src/main/java/com/ruoyi/common/constant/Constants.java index f41bf11..33e4af3 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/constant/Constants.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/constant/Constants.java @@ -68,6 +68,8 @@ public class Constants * 登录用户 redis key */ public static final String LOGIN_TOKEN_KEY = "login_tokens:"; + public static final String LOGIN_MEMBER_TOKEN_KEY = "login_member_tokens:"; + public static final String MEMBER_INFO = "member_info"; /** * 防重提交 redis key @@ -98,6 +100,7 @@ public class Constants * 令牌前缀 */ public static final String LOGIN_USER_KEY = "login_user_key"; + public static final String LOGIN_MEMBER_KEY = "login_member_key"; /** * 用户ID diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/LoginMember.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/LoginMember.java new file mode 100644 index 0000000..50b4ebc --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/LoginMember.java @@ -0,0 +1,13 @@ +package com.ruoyi.common.core.domain.model; + +import lombok.Data; + +@Data +public class LoginMember { + + private Long memberId; + private String token; + private Long loginTime; + private Long expireTime; + +} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java index 9474d4f..ec958b5 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java @@ -107,6 +107,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter "/**/*.js", "/profile/**" ).permitAll() + .antMatchers("/h5/**").permitAll() .antMatchers("/no-auth/**").permitAll() .antMatchers("/common/download**").anonymous() .antMatchers("/common/download/resource**").anonymous() diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/TokenService.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/TokenService.java index bf28e0f..844f779 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/TokenService.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/TokenService.java @@ -4,6 +4,8 @@ import java.util.HashMap; import java.util.Map; import java.util.concurrent.TimeUnit; import javax.servlet.http.HttpServletRequest; + +import com.ruoyi.common.core.domain.model.LoginMember; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; @@ -40,6 +42,10 @@ public class TokenService @Value("${token.expireTime}") private int expireTime; + //单位 天 + @Value("${token.memberExpireTime}") + private int memberExpireTime; + protected static final long MILLIS_SECOND = 1000; protected static final long MILLIS_MINUTE = 60 * MILLIS_SECOND; @@ -76,6 +82,22 @@ public class TokenService return null; } + public LoginMember getLoginMember(HttpServletRequest request) { + // 获取请求携带的令牌 + String token = getToken(request); + if (StringUtils.isNotEmpty(token)) { + try { + Claims claims = parseToken(token); + // 解析对应的权限以及用户信息 + String uuid = (String) claims.get(Constants.LOGIN_MEMBER_KEY); + String userKey = Constants.LOGIN_MEMBER_TOKEN_KEY + uuid; + return redisCache.getCacheObject(userKey); + } catch (Exception e) { + } + } + return null; + } + /** * 设置用户身份信息 */ @@ -117,6 +139,15 @@ public class TokenService return createToken(claims); } + public String createMemberToken(LoginMember loginMember){ + String token = IdUtils.fastUUID(); + loginMember.setToken(token); + refreshMemberToken(loginMember); + Map claims = new HashMap<>(); + claims.put(Constants.LOGIN_MEMBER_KEY, token); + return createToken(claims); + } + /** * 验证令牌有效期,相差不足20分钟,自动刷新缓存 * @@ -133,6 +164,14 @@ public class TokenService } } + public void verifyMemberToken(LoginMember loginUser) { + long expireTime = loginUser.getExpireTime(); + long currentTime = System.currentTimeMillis(); + if (expireTime - currentTime <= MILLIS_MINUTE_TEN) { + refreshMemberToken(loginUser); + } + } + /** * 刷新令牌有效期 * @@ -147,6 +186,14 @@ public class TokenService redisCache.setCacheObject(userKey, loginUser, expireTime, TimeUnit.MINUTES); } + public void refreshMemberToken(LoginMember loginUser) { + loginUser.setLoginTime(System.currentTimeMillis()); + loginUser.setExpireTime(loginUser.getLoginTime() + memberExpireTime * 24 * 60 * MILLIS_MINUTE); + // 根据uuid将loginUser缓存 + String userKey = Constants.LOGIN_MEMBER_TOKEN_KEY + loginUser.getToken(); + redisCache.setCacheObject(userKey, loginUser, memberExpireTime, TimeUnit.DAYS); + } + /** * 设置用户代理信息 * diff --git a/ruoyi-mall/src/main/java/com/cyl/h5/config/SecurityUtil.java b/ruoyi-mall/src/main/java/com/cyl/h5/config/SecurityUtil.java new file mode 100644 index 0000000..f14cd9e --- /dev/null +++ b/ruoyi-mall/src/main/java/com/cyl/h5/config/SecurityUtil.java @@ -0,0 +1,17 @@ +package com.cyl.h5.config; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.cyl.ums.domain.Member; +import com.ruoyi.common.constant.Constants; +import com.ruoyi.framework.config.LocalDataUtil; +import org.springframework.stereotype.Service; + +@Service +public class SecurityUtil { + + public static Member getLocalMember() { + Member member = (Member) LocalDataUtil.getVar(Constants.MEMBER_INFO); + return member; + } + +} diff --git a/ruoyi-mall/src/main/java/com/cyl/h5/controller/H5MemberController.java b/ruoyi-mall/src/main/java/com/cyl/h5/controller/H5MemberController.java index f730e1e..7849e50 100644 --- a/ruoyi-mall/src/main/java/com/cyl/h5/controller/H5MemberController.java +++ b/ruoyi-mall/src/main/java/com/cyl/h5/controller/H5MemberController.java @@ -3,14 +3,16 @@ package com.cyl.h5.controller; import com.cyl.h5.pojo.request.RegisterRequest; import com.cyl.h5.pojo.response.RegisterResponse; import com.cyl.h5.pojo.response.ValidatePhoneResponse; +import com.cyl.h5.pojo.response.H5LoginResponse; import com.cyl.h5.service.H5MemberService; +import com.cyl.ums.pojo.vo.MemberVO; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @RestController -@RequestMapping("/no-auth/h5/member") +@RequestMapping("/h5") public class H5MemberController { @Autowired @@ -27,4 +29,22 @@ public class H5MemberController { public ResponseEntity validate(@PathVariable String phone){ return ResponseEntity.ok(service.validate(phone)); } + + @ApiOperation("手机号密码登录") + @PostMapping("/account/login") + public ResponseEntity accountLogin(@RequestBody String data){ + return ResponseEntity.ok(service.accountLogin(data)); + } + + @ApiOperation("sms登录") + @PostMapping("/sms/login") + public ResponseEntity smsLogin(@RequestBody String data){ + return ResponseEntity.ok(service.smsLogin(data)); + } + + @ApiOperation("获取会员信息") + @GetMapping("/member/info") + public ResponseEntity getMemberInfo(){ + return ResponseEntity.ok(service.getMemberInfo()); + } } diff --git a/ruoyi-mall/src/main/java/com/cyl/h5/pojo/request/H5AccountLoginRequest.java b/ruoyi-mall/src/main/java/com/cyl/h5/pojo/request/H5AccountLoginRequest.java new file mode 100644 index 0000000..e4ed87a --- /dev/null +++ b/ruoyi-mall/src/main/java/com/cyl/h5/pojo/request/H5AccountLoginRequest.java @@ -0,0 +1,9 @@ +package com.cyl.h5.pojo.request; + +import lombok.Data; + +@Data +public class H5AccountLoginRequest extends H5LoginRequest{ + /** 密码 */ + private String password; +} diff --git a/ruoyi-mall/src/main/java/com/cyl/h5/pojo/request/H5LoginRequest.java b/ruoyi-mall/src/main/java/com/cyl/h5/pojo/request/H5LoginRequest.java new file mode 100644 index 0000000..557b207 --- /dev/null +++ b/ruoyi-mall/src/main/java/com/cyl/h5/pojo/request/H5LoginRequest.java @@ -0,0 +1,9 @@ +package com.cyl.h5.pojo.request; + +import lombok.Data; + +@Data +public class H5LoginRequest { + /** 账号即手机号 */ + private String mobile; +} diff --git a/ruoyi-mall/src/main/java/com/cyl/h5/pojo/request/H5SmsLoginRequest.java b/ruoyi-mall/src/main/java/com/cyl/h5/pojo/request/H5SmsLoginRequest.java new file mode 100644 index 0000000..4655ec1 --- /dev/null +++ b/ruoyi-mall/src/main/java/com/cyl/h5/pojo/request/H5SmsLoginRequest.java @@ -0,0 +1,11 @@ +package com.cyl.h5.pojo.request; + +import lombok.Data; + +@Data +public class H5SmsLoginRequest extends H5LoginRequest { + /** 验证码 */ + private String code; + /** uuid */ + private String uuid; +} diff --git a/ruoyi-mall/src/main/java/com/cyl/h5/pojo/response/H5LoginResponse.java b/ruoyi-mall/src/main/java/com/cyl/h5/pojo/response/H5LoginResponse.java new file mode 100644 index 0000000..7273f5d --- /dev/null +++ b/ruoyi-mall/src/main/java/com/cyl/h5/pojo/response/H5LoginResponse.java @@ -0,0 +1,13 @@ +package com.cyl.h5.pojo.response; + +import lombok.Data; + +/** + * @Author: czc + * @Description: TODO + * @DateTime: 2023/6/16 14:54 + **/ +@Data +public class H5LoginResponse { + private String token; +} diff --git a/ruoyi-mall/src/main/java/com/cyl/h5/pojo/response/RegisterResponse.java b/ruoyi-mall/src/main/java/com/cyl/h5/pojo/response/RegisterResponse.java index f6a0572..8d6a854 100644 --- a/ruoyi-mall/src/main/java/com/cyl/h5/pojo/response/RegisterResponse.java +++ b/ruoyi-mall/src/main/java/com/cyl/h5/pojo/response/RegisterResponse.java @@ -1,12 +1,9 @@ package com.cyl.h5.pojo.response; -import com.cyl.ums.domain.Member; import lombok.Data; @Data public class RegisterResponse { /** token */ private String token; - /** 会员信息 */ - private Member member; } diff --git a/ruoyi-mall/src/main/java/com/cyl/h5/service/H5MemberService.java b/ruoyi-mall/src/main/java/com/cyl/h5/service/H5MemberService.java index 8f2ab52..4d9905a 100644 --- a/ruoyi-mall/src/main/java/com/cyl/h5/service/H5MemberService.java +++ b/ruoyi-mall/src/main/java/com/cyl/h5/service/H5MemberService.java @@ -1,18 +1,29 @@ package com.cyl.h5.service; +import cn.hutool.json.JSONUtil; +import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.cyl.h5.pojo.request.H5AccountLoginRequest; +import com.cyl.h5.pojo.request.H5SmsLoginRequest; import com.cyl.h5.pojo.request.RegisterRequest; import com.cyl.h5.pojo.response.RegisterResponse; import com.cyl.h5.pojo.response.ValidatePhoneResponse; +import com.cyl.h5.pojo.response.H5LoginResponse; import com.cyl.ums.domain.Member; import com.cyl.ums.mapper.MemberMapper; +import com.cyl.ums.pojo.vo.MemberVO; +import com.ruoyi.common.constant.Constants; +import com.ruoyi.common.core.domain.model.LoginMember; import com.ruoyi.common.core.redis.RedisCache; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.framework.config.LocalDataUtil; +import com.ruoyi.framework.web.service.TokenService; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Service; +import org.springframework.util.Base64Utils; import java.time.LocalDateTime; import java.util.Base64; @@ -27,6 +38,9 @@ public class H5MemberService { @Autowired private RedisCache redisCache; + @Autowired + private TokenService tokenService; + /** * 注册 * @param request 注册请求体 @@ -34,25 +48,19 @@ public class H5MemberService { */ public RegisterResponse register(RegisterRequest request){ RegisterResponse response = new RegisterResponse(); - //校验 验证码 - String key = request.getUuid() + "_" + request.getMobile(); - String code = redisCache.getCacheObject(key); - log.info("code:{}", code); - if (null == code){ - throw new RuntimeException("验证码已过期"); - }else if (!code.equals(request.getCode())){ - throw new RuntimeException("验证码错误"); - } - //删除缓存 - redisCache.deleteObject(key); + //校验验证码 + this.validateVerifyCode(request.getUuid(), request.getMobile(), request.getCode()); //创建会员 Member member = new Member(); member.setPhone(request.getMobile()); member.setPassword(SecurityUtils.encryptPassword(request.getPassword())); - member.setNickname("用户" + request.getMobile()); + member.setNickname("用户" + request.getMobile().substring(7,11)); + member.setStatus(Constants.MEMBER_ACCOUNT_STATUS.NORMAL); member.setCreateTime(LocalDateTime.now()); memberMapper.insert(member); - //TODO 返回封装了token和member信息的response + //注册成功直接返回token了 + H5LoginResponse loginResponse = getLoginResponse(member.getId()); + response.setToken(loginResponse.getToken()); return response; } @@ -70,4 +78,98 @@ public class H5MemberService { response.setMessage("该手机号可用"); return response; } + + /** + * 账号密码登录 + * @param data + * @return + */ + public H5LoginResponse accountLogin(String data) { + if (StringUtils.isEmpty(data)){ + throw new RuntimeException(Constants.LOGIN_INFO.WRONG); + } + // 解码 转 对象 + H5AccountLoginRequest request = JSON.parseObject(new String(Base64Utils.decodeFromString(data)), H5AccountLoginRequest.class); + log.info("account login request:{}", JSONUtil.toJsonStr(request)); + QueryWrapper qw = new QueryWrapper<>(); + qw.eq("phone", request.getMobile()); + Member member = memberMapper.selectOne(qw); + if (member == null){ + throw new RuntimeException(Constants.LOGIN_INFO.WRONG); + } + validateMemberStatus(member); + //check 密码 + if (!SecurityUtils.matchesPassword(request.getPassword(), member.getPassword())){ + throw new RuntimeException(Constants.LOGIN_INFO.WRONG); + } + return getLoginResponse(member.getId()); + } + + public H5LoginResponse smsLogin(String data){ + if (StringUtils.isEmpty(data)){ + throw new RuntimeException(Constants.LOGIN_INFO.WRONG); + } + H5SmsLoginRequest request = JSON.parseObject(new String(Base64Utils.decodeFromString(data)), H5SmsLoginRequest.class); + //校验验证码 + this.validateVerifyCode(request.getUuid(), request.getMobile(), request.getCode()); + //查会员 + QueryWrapper qw = new QueryWrapper<>(); + qw.eq("phone", request.getMobile()); + Member member = memberMapper.selectOne(qw); + if (member == null){ + throw new RuntimeException(Constants.LOGIN_INFO.TO_REGISTER); + } + //校验会员状态 + validateMemberStatus(member); + return getLoginResponse(member.getId()); + } + + /** + * 校验会员状态 + * @param member 会员信息 + */ + private void validateMemberStatus(Member member) { + if (Constants.MEMBER_ACCOUNT_STATUS.FORBIDDEN == member.getStatus()){ + throw new RuntimeException(Constants.LOGIN_INFO.FORBIDDEN); + } + } + + /** + * 校验验证码有效性 + * @param uuid 唯一标识 + * @param phone 手机号 + * @param inputCode 输入的验证码 + */ + private void validateVerifyCode(String uuid, String phone, String inputCode){ + String key = uuid + "_" + phone; + String redisCode = redisCache.getCacheObject(key); + if (redisCode == null){ + throw new RuntimeException(Constants.VERIFY_CODE_INFO.EXPIRED); + }else if (!redisCode.equals(inputCode)){ + throw new RuntimeException(Constants.VERIFY_CODE_INFO.WRONG); + } + //删除缓存 + redisCache.deleteObject(key); + } + + /** + * 封装登录响应 + * @param memberId 登录会员id + * @return 结果 + */ + private H5LoginResponse getLoginResponse(Long memberId){ + LoginMember loginMember = new LoginMember(); + loginMember.setMemberId(memberId); + String token = tokenService.createMemberToken(loginMember); + H5LoginResponse response = new H5LoginResponse(); + response.setToken(token); + return response; + } + + public MemberVO getMemberInfo() { + Member member = (Member) LocalDataUtil.getVar(Constants.MEMBER_INFO); + MemberVO memberVO = new MemberVO(); + BeanUtils.copyProperties(member, memberVO); + return memberVO; + } } diff --git a/ruoyi-mall/src/main/java/com/cyl/ums/pojo/vo/MemberVO.java b/ruoyi-mall/src/main/java/com/cyl/ums/pojo/vo/MemberVO.java index 0df9d81..7a25392 100644 --- a/ruoyi-mall/src/main/java/com/cyl/ums/pojo/vo/MemberVO.java +++ b/ruoyi-mall/src/main/java/com/cyl/ums/pojo/vo/MemberVO.java @@ -19,9 +19,6 @@ public class MemberVO extends BaseAudit { /** 昵称 */ @Excel(name = "昵称") private String nickname; - /** 密码 */ - @Excel(name = "密码") - private String password; /** 手机号码 */ @Excel(name = "手机号码") private String phone; From 203a8f33bb8066db90c1f785f4372cf055b83155 Mon Sep 17 00:00:00 2001 From: chuzhichao Date: Wed, 21 Jun 2023 17:25:55 +0800 Subject: [PATCH 07/18] =?UTF-8?q?H5=E8=B4=AD=E7=89=A9=E8=BD=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/cyl/h5/controller/CartController.java | 27 ++-- .../ums/controller/MemberCartController.java | 12 +- .../com/cyl/ums/pojo/vo/MemberCartVO.java | 7 + .../ums/pojo/vo/form/AddMemberCartForm.java | 10 +- .../cyl/ums/service/MemberCartService.java | 129 +++++++++--------- 5 files changed, 99 insertions(+), 86 deletions(-) diff --git a/ruoyi-mall/src/main/java/com/cyl/h5/controller/CartController.java b/ruoyi-mall/src/main/java/com/cyl/h5/controller/CartController.java index dd238b5..cd4f519 100644 --- a/ruoyi-mall/src/main/java/com/cyl/h5/controller/CartController.java +++ b/ruoyi-mall/src/main/java/com/cyl/h5/controller/CartController.java @@ -2,11 +2,15 @@ package com.cyl.h5.controller; import com.cyl.pms.pojo.dto.MemberCartDTO; import com.cyl.ums.convert.MemberCartConvert; +import com.cyl.ums.domain.Member; import com.cyl.ums.domain.MemberCart; import com.cyl.ums.pojo.query.MemberCartQuery; +import com.cyl.ums.pojo.vo.MemberCartVO; import com.cyl.ums.pojo.vo.form.AddMemberCartForm; import com.cyl.ums.pojo.vo.form.UpdateMemberCartForm; import com.cyl.ums.service.MemberCartService; +import com.ruoyi.common.constant.Constants; +import com.ruoyi.framework.config.LocalDataUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageImpl; @@ -51,8 +55,8 @@ public class CartController { * @return 购物车商品 */ @PostMapping("add") - public ResponseEntity add(@Valid @RequestBody AddMemberCartForm form) { - return ResponseEntity.ok(memberCartService.insert(form)); + public ResponseEntity add(@RequestBody MemberCart memberCart) { + return ResponseEntity.ok(memberCartService.insert(memberCart)); } /** @@ -61,8 +65,8 @@ public class CartController { * @return 是否修改 */ @PostMapping("modify") - public ResponseEntity modify(@Valid @RequestBody UpdateMemberCartForm form) { - return ResponseEntity.ok(memberCartService.update(form)); + public ResponseEntity modify(@Valid @RequestBody MemberCart memberCart) { + return ResponseEntity.ok(memberCartService.update(memberCart)); } /** @@ -71,7 +75,7 @@ public class CartController { * @return 是否修改 */ @DeleteMapping("remove") - public ResponseEntity remove(@RequestBody List ids) { + public ResponseEntity remove(@RequestBody String ids) { return ResponseEntity.ok(memberCartService.deleteByIds(ids)); } @@ -80,12 +84,11 @@ public class CartController { * * @return 购物车列表 */ - @PostMapping("list") - public ResponseEntity> remove(@RequestBody MemberCartQuery query, Pageable pageable) { - List list = memberCartService.selectList(query, pageable); - com.github.pagehelper.Page p = (com.github.pagehelper.Page)list; - List resList = memberCartConvert.dos2Dtos(list); - memberCartService.injectSku(resList); - return ResponseEntity.ok(new PageImpl<>(resList, pageable, p.getTotal())); + @GetMapping("list") + public ResponseEntity> remove() { + Member member = (Member) LocalDataUtil.getVar(Constants.MEMBER_INFO); + MemberCartQuery query = new MemberCartQuery(); + query.setMemberId(member.getId()); + return ResponseEntity.ok(memberCartService.selectList(query, null)); } } diff --git a/ruoyi-mall/src/main/java/com/cyl/ums/controller/MemberCartController.java b/ruoyi-mall/src/main/java/com/cyl/ums/controller/MemberCartController.java index 7d0ee6e..ce45d72 100644 --- a/ruoyi-mall/src/main/java/com/cyl/ums/controller/MemberCartController.java +++ b/ruoyi-mall/src/main/java/com/cyl/ums/controller/MemberCartController.java @@ -46,8 +46,9 @@ public class MemberCartController extends BaseController { @PreAuthorize("@ss.hasPermi('ums:memberCart:list')") @PostMapping("/list") public ResponseEntity> list(@RequestBody MemberCartQuery query, Pageable page) { - List list = service.selectList(query, page); - return ResponseEntity.ok(new PageImpl<>(list, page, ((com.github.pagehelper.Page)list).getTotal())); +// List list = service.selectList(query, page); +// return ResponseEntity.ok(new PageImpl<>(list, page, ((com.github.pagehelper.Page)list).getTotal())); + return null; } @ApiOperation("导出购物车列表") @@ -55,9 +56,10 @@ public class MemberCartController extends BaseController { @Log(title = "购物车", businessType = BusinessType.EXPORT) @GetMapping("/export") public ResponseEntity export(MemberCartQuery query) { - List list = service.selectList(query, null); - ExcelUtil util = new ExcelUtil<>(MemberCartVO.class); - return ResponseEntity.ok(util.writeExcel(convert.dos2vos(list), "购物车数据")); +// List list = service.selectList(query, null); +// ExcelUtil util = new ExcelUtil<>(MemberCartVO.class); +// return ResponseEntity.ok(util.writeExcel(convert.dos2vos(list), "购物车数据")); + return null; } @ApiOperation("获取购物车详细信息") diff --git a/ruoyi-mall/src/main/java/com/cyl/ums/pojo/vo/MemberCartVO.java b/ruoyi-mall/src/main/java/com/cyl/ums/pojo/vo/MemberCartVO.java index 3fdcc04..483bf9e 100644 --- a/ruoyi-mall/src/main/java/com/cyl/ums/pojo/vo/MemberCartVO.java +++ b/ruoyi-mall/src/main/java/com/cyl/ums/pojo/vo/MemberCartVO.java @@ -4,6 +4,9 @@ import com.ruoyi.common.annotation.Excel; import com.fasterxml.jackson.annotation.JsonFormat; import com.ruoyi.common.core.domain.BaseAudit; import lombok.Data; + +import java.math.BigDecimal; + /** * 购物车 数据视图对象 * @@ -37,4 +40,8 @@ public class MemberCartVO extends BaseAudit { /** 商品数量 */ @Excel(name = "商品数量") private Integer quantity; + /** sku价格 */ + private BigDecimal price; + /** sku是否存在 */ + private Integer skuIfExist; } diff --git a/ruoyi-mall/src/main/java/com/cyl/ums/pojo/vo/form/AddMemberCartForm.java b/ruoyi-mall/src/main/java/com/cyl/ums/pojo/vo/form/AddMemberCartForm.java index 1c2896a..55f545d 100644 --- a/ruoyi-mall/src/main/java/com/cyl/ums/pojo/vo/form/AddMemberCartForm.java +++ b/ruoyi-mall/src/main/java/com/cyl/ums/pojo/vo/form/AddMemberCartForm.java @@ -16,8 +16,10 @@ public class AddMemberCartForm { /** * 数量 */ - @NotNull(message = "数量必填!") - @Min(value = 1, message = "数量不小于1") - @Max(value = Integer.MAX_VALUE, message = "数量不大于" + Integer.MAX_VALUE) - private Integer num; + private Integer buyNum; + private Long productId; + private String pic; + private String productName; + private String spData; + private Integer quantity; } diff --git a/ruoyi-mall/src/main/java/com/cyl/ums/service/MemberCartService.java b/ruoyi-mall/src/main/java/com/cyl/ums/service/MemberCartService.java index 60040c9..419d3c8 100644 --- a/ruoyi-mall/src/main/java/com/cyl/ums/service/MemberCartService.java +++ b/ruoyi-mall/src/main/java/com/cyl/ums/service/MemberCartService.java @@ -1,32 +1,38 @@ package com.cyl.ums.service; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.cyl.h5.config.SecurityUtil; import com.cyl.pms.domain.Product; import com.cyl.pms.domain.Sku; import com.cyl.pms.mapper.ProductMapper; import com.cyl.pms.mapper.SkuMapper; import com.cyl.pms.pojo.dto.MemberCartDTO; import com.cyl.ums.convert.MemberCartConvert; +import com.cyl.ums.domain.Member; import com.cyl.ums.domain.MemberCart; import com.cyl.ums.mapper.MemberCartMapper; import com.cyl.ums.pojo.query.MemberCartQuery; +import com.cyl.ums.pojo.vo.MemberCartVO; import com.cyl.ums.pojo.vo.form.AddMemberCartForm; import com.cyl.ums.pojo.vo.form.UpdateMemberCartForm; import com.github.pagehelper.PageHelper; +import com.ruoyi.common.constant.Constants; import com.ruoyi.common.exception.base.BaseException; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.SortUtil; +import com.ruoyi.framework.config.LocalDataUtil; import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; import java.time.LocalDateTime; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; /** @@ -62,46 +68,38 @@ public class MemberCartService { * @param page 分页条件 * @return 购物车 */ - public List selectList(MemberCartQuery query, Pageable page) { + public List selectList(MemberCartQuery query, Pageable page) { if (page != null) { PageHelper.startPage(page.getPageNumber() + 1, page.getPageSize(), SortUtil.sort2string(page.getSort(),"id desc")); } QueryWrapper qw = new QueryWrapper<>(); - Integer status = query.getStatus(); - if (status != null) { - qw.eq("status", status); + if (query.getMemberId() != null){ + qw.eq("member_id", query.getMemberId()); } - Long memberId = query.getMemberId(); - if (memberId != null) { - qw.eq("member_id", memberId); - } else { - qw.eq("member_id", SecurityUtils.getUserId()); + List memberCartList = memberCartMapper.selectList(qw); + if (CollectionUtil.isEmpty(memberCartList)){ + return Collections.emptyList(); } - Long productId = query.getProductId(); - if (productId != null) { - qw.eq("product_id", productId); - } - String pic = query.getPic(); - if (!StringUtils.isEmpty(pic)) { - qw.eq("pic", pic); - } - Long skuId = query.getSkuId(); - if (skuId != null) { - qw.eq("sku_id", skuId); - } - String productNameLike = query.getProductNameLike(); - if (!StringUtils.isEmpty(productNameLike)) { - qw.like("product_name", productNameLike); - } - String spData = query.getSpData(); - if (!StringUtils.isEmpty(spData)) { - qw.eq("sp_data", spData); - } - Integer quantity = query.getQuantity(); - if (quantity != null) { - qw.eq("quantity", quantity); - } - return memberCartMapper.selectList(qw); + //查sku + List skuIdList = memberCartList.stream().map(MemberCart::getSkuId).collect(Collectors.toList()); + QueryWrapper skuQw = new QueryWrapper<>(); + skuQw.in("id", skuIdList); + Map skuMap = skuMapper.selectList(skuQw).stream().collect(Collectors.toMap(Sku::getId, it -> it)); + List resList = new ArrayList<>(); + memberCartList.forEach(item -> { + MemberCartVO memberCartVO = new MemberCartVO(); + BeanUtils.copyProperties(item, memberCartVO); + if (!skuMap.containsKey(item.getSkuId())){ + memberCartVO.setStatus(0); + memberCartVO.setSkuIfExist(0); + }else { + Sku sku = skuMap.get(item.getSkuId()); + memberCartVO.setPrice(sku.getPrice()); + memberCartVO.setSkuIfExist(1); + } + resList.add(memberCartVO); + }); + return resList; } /** @@ -111,27 +109,24 @@ public class MemberCartService { * @return 结果 */ public int insert(MemberCart memberCart) { - memberCart.setCreateTime(LocalDateTime.now()); - return memberCartMapper.insert(memberCart); - } - - /** - * 新增购物车 - * - * @param form 添加购物车表单 - * @return 结果 - */ - public MemberCart insert(AddMemberCartForm form) { - // 查询规格 - Sku sku = skuMapper.selectById(form.getSkuId()); - MemberCart memberCart = memberCartConvert.sku2Cart(sku); - Product p = productMapper.selectById(sku.getProductId()); - memberCartConvert.injectProduct(memberCart, p); - memberCart.setQuantity(form.getNum()); - memberCart.setMemberId(SecurityUtils.getUserId()); - memberCart.setStatus(1) ; - memberCartMapper.insert(memberCart); - return memberCart; + Member member = (Member) LocalDataUtil.getVar(Constants.MEMBER_INFO); + memberCart.setMemberId(member.getId()); + //判断cart是否存在 + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("member_id",member.getId()); + queryWrapper.eq("sku_id",memberCart.getSkuId()); + queryWrapper.eq("product_id",memberCart.getProductId()); + List memberCarts = memberCartMapper.selectList(queryWrapper); + if (CollectionUtils.isEmpty(memberCarts)) { + memberCart.setStatus(1); + memberCart.setCreateTime(LocalDateTime.now()); + memberCart.setCreateBy(member.getId()); + return memberCartMapper.insert(memberCart); + } + MemberCart dbCart = memberCarts.get(0); + dbCart.setUpdateTime(LocalDateTime.now()); + dbCart.setQuantity(dbCart.getQuantity() + memberCart.getQuantity()); + return memberCartMapper.updateById(dbCart); } /** @@ -141,7 +136,14 @@ public class MemberCartService { * @return 结果 */ public int update(MemberCart memberCart) { - return memberCartMapper.updateById(memberCart); + MemberCart cart = memberCartMapper.selectById(memberCart.getId()); + if (cart == null){ + return 0; + } + cart.setQuantity(memberCart.getQuantity()); + cart.setUpdateTime(LocalDateTime.now()); + cart.setUpdateBy(SecurityUtil.getLocalMember().getId()); + return memberCartMapper.updateById(cart); } public int update(UpdateMemberCartForm form) { if (form.getNum() == null || form.getId() == null) { @@ -175,12 +177,9 @@ public class MemberCartService { * @param ids 购物车主键 * @return 结果 */ - public int deleteByIds(List ids) { - Long userId = SecurityUtils.getUserId(); - LambdaQueryWrapper qw = new LambdaQueryWrapper<>(); - qw.eq(MemberCart::getMemberId, userId); - qw.in(MemberCart::getId, ids); - return memberCartMapper.delete(qw); + public int deleteByIds(String ids) { + List idList = Arrays.stream(ids.split(",")).map(it -> Long.parseLong(it)).collect(Collectors.toList()); + return memberCartMapper.deleteBatchIds(idList); } public Integer mineCartNum() { From 3d9ee99090efd9f45c429033130cc2b47a3549e1 Mon Sep 17 00:00:00 2001 From: chuzhichao Date: Wed, 21 Jun 2023 18:02:40 +0800 Subject: [PATCH 08/18] =?UTF-8?q?=E4=BC=9A=E5=91=98=E6=B3=A8=E5=86=8C?= =?UTF-8?q?=E9=BB=98=E8=AE=A4=E6=80=A7=E5=88=AB=E4=B8=BA=E6=9C=AA=E7=9F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ruoyi-mall/src/main/java/com/cyl/h5/service/H5MemberService.java | 1 + 1 file changed, 1 insertion(+) diff --git a/ruoyi-mall/src/main/java/com/cyl/h5/service/H5MemberService.java b/ruoyi-mall/src/main/java/com/cyl/h5/service/H5MemberService.java index 4d9905a..7f369d9 100644 --- a/ruoyi-mall/src/main/java/com/cyl/h5/service/H5MemberService.java +++ b/ruoyi-mall/src/main/java/com/cyl/h5/service/H5MemberService.java @@ -56,6 +56,7 @@ public class H5MemberService { member.setPassword(SecurityUtils.encryptPassword(request.getPassword())); member.setNickname("用户" + request.getMobile().substring(7,11)); member.setStatus(Constants.MEMBER_ACCOUNT_STATUS.NORMAL); + member.setGender(0); member.setCreateTime(LocalDateTime.now()); memberMapper.insert(member); //注册成功直接返回token了 From 61e2b33b79ad74f831bbb1445c174d8628a3e44a Mon Sep 17 00:00:00 2001 From: chuzhichao Date: Sun, 25 Jun 2023 13:52:02 +0800 Subject: [PATCH 09/18] =?UTF-8?q?=E4=BC=9A=E5=91=98=E6=94=B6=E8=B4=A7?= =?UTF-8?q?=E5=9C=B0=E5=9D=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ruoyi/common/core/redis/RedisService.java | 45 +++++++ .../cyl/h5/controller/H5CommonController.java | 77 ++++++++++++ .../controller/H5MemberAddressController.java | 45 +++++++ .../h5/service/H5MemberAddressService.java | 111 ++++++++++++++++++ .../main/java/com/cyl/ums/domain/Address.java | 50 ++++++++ .../com/cyl/ums/mapper/AddressMapper.java | 22 ++++ .../cyl/ums/mapper/MemberAddressMapper.java | 2 + .../java/com/cyl/ums/pojo/dto/AddressDTO.java | 19 +++ .../resources/mapper/ums/AddressMapper.xml | 34 ++++++ .../mapper/ums/MemberAddressMapper.xml | 5 + 10 files changed, 410 insertions(+) create mode 100644 ruoyi-mall/src/main/java/com/cyl/h5/controller/H5CommonController.java create mode 100644 ruoyi-mall/src/main/java/com/cyl/h5/controller/H5MemberAddressController.java create mode 100644 ruoyi-mall/src/main/java/com/cyl/h5/service/H5MemberAddressService.java create mode 100644 ruoyi-mall/src/main/java/com/cyl/ums/domain/Address.java create mode 100644 ruoyi-mall/src/main/java/com/cyl/ums/mapper/AddressMapper.java create mode 100644 ruoyi-mall/src/main/java/com/cyl/ums/pojo/dto/AddressDTO.java create mode 100644 ruoyi-mall/src/main/resources/mapper/ums/AddressMapper.xml 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} + From d84285761bfd2ddb83563ad0f3bc8ec19dd25ac0 Mon Sep 17 00:00:00 2001 From: chuzhichao Date: Sun, 25 Jun 2023 16:24:05 +0800 Subject: [PATCH 10/18] =?UTF-8?q?=E4=B8=8B=E5=8D=95=E5=89=8D=E6=A0=A1?= =?UTF-8?q?=E9=AA=8C=E3=80=81=E8=AE=A1=E7=AE=97=E8=AE=A2=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/H5MemberAddressController.java | 5 +- ...Controller.java => H5OrderController.java} | 15 ++++- .../com/cyl/h5/pojo/dto/OrderCreateDTO.java | 36 +++++++++++ .../cyl/h5/pojo/dto/OrderProductListDTO.java | 42 ++++++++++++ .../java/com/cyl/h5/pojo/vo/OrderCalcVO.java | 20 ++++++ .../java/com/cyl/h5/pojo/vo/SkuViewDTO.java | 30 +++++++++ .../com/cyl/oms/service/OrderService.java | 64 +++++++++++++++++++ 7 files changed, 207 insertions(+), 5 deletions(-) rename ruoyi-mall/src/main/java/com/cyl/h5/controller/{Order1Controller.java => H5OrderController.java} (70%) create mode 100644 ruoyi-mall/src/main/java/com/cyl/h5/pojo/dto/OrderCreateDTO.java create mode 100644 ruoyi-mall/src/main/java/com/cyl/h5/pojo/dto/OrderProductListDTO.java create mode 100644 ruoyi-mall/src/main/java/com/cyl/h5/pojo/vo/OrderCalcVO.java create mode 100644 ruoyi-mall/src/main/java/com/cyl/h5/pojo/vo/SkuViewDTO.java 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 index 542001b..0d35fa5 100644 --- a/ruoyi-mall/src/main/java/com/cyl/h5/controller/H5MemberAddressController.java +++ b/ruoyi-mall/src/main/java/com/cyl/h5/controller/H5MemberAddressController.java @@ -4,6 +4,7 @@ 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.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @RestController @@ -19,8 +20,8 @@ public class H5MemberAddressController { } @GetMapping("/default") - public AjaxResult getDefault(){ - return AjaxResult.success(h5MemberAddressService.getDefault()); + public ResponseEntity getDefault(){ + return ResponseEntity.ok(h5MemberAddressService.getDefault()); } @PostMapping("/create") diff --git a/ruoyi-mall/src/main/java/com/cyl/h5/controller/Order1Controller.java b/ruoyi-mall/src/main/java/com/cyl/h5/controller/H5OrderController.java similarity index 70% rename from ruoyi-mall/src/main/java/com/cyl/h5/controller/Order1Controller.java rename to ruoyi-mall/src/main/java/com/cyl/h5/controller/H5OrderController.java index 1a2ee60..40fe10a 100644 --- a/ruoyi-mall/src/main/java/com/cyl/h5/controller/Order1Controller.java +++ b/ruoyi-mall/src/main/java/com/cyl/h5/controller/H5OrderController.java @@ -1,9 +1,12 @@ package com.cyl.h5.controller; +import com.cyl.h5.pojo.dto.OrderCreateDTO; +import com.cyl.h5.pojo.vo.OrderCalcVO; import com.cyl.h5.pojo.vo.form.OrderSubmitForm; import com.cyl.h5.pojo.vo.query.OrderH5Query; import com.cyl.oms.pojo.vo.OrderVO; import com.cyl.oms.service.OrderService; +import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; @@ -16,11 +19,11 @@ import org.springframework.web.bind.annotation.RestController; import java.util.List; @RestController -@RequestMapping("/h5-order") -public class Order1Controller { +@RequestMapping("/h5/order") +public class H5OrderController { @Autowired private OrderService orderService; - @PostMapping("submit") + @PostMapping("/add") public ResponseEntity submit(@RequestBody OrderSubmitForm form) { return ResponseEntity.ok(orderService.submit(form)); } @@ -28,4 +31,10 @@ public class Order1Controller { public ResponseEntity> queryOrderPage(@RequestBody OrderH5Query query, Pageable pageReq) { return ResponseEntity.ok(orderService.queryOrderPage(query, pageReq)); } + + @ApiOperation("下单前校验") + @PostMapping("/addOrderCheck") + public ResponseEntity addOrderCheck(@RequestBody OrderCreateDTO orderCreateDTO){ + return ResponseEntity.ok(orderService.addOrderCheck(orderCreateDTO)); + } } diff --git a/ruoyi-mall/src/main/java/com/cyl/h5/pojo/dto/OrderCreateDTO.java b/ruoyi-mall/src/main/java/com/cyl/h5/pojo/dto/OrderCreateDTO.java new file mode 100644 index 0000000..5b217ce --- /dev/null +++ b/ruoyi-mall/src/main/java/com/cyl/h5/pojo/dto/OrderCreateDTO.java @@ -0,0 +1,36 @@ + package com.cyl.h5.pojo.dto; + + import io.swagger.annotations.ApiModel; + import io.swagger.annotations.ApiModelProperty; + import lombok.Data; + + import java.util.List; + + + /** + * 创建订单请求VO + * @author Jinxin + * + */ + @Data + @ApiModel(value = "创建订单请求VO") + public class OrderCreateDTO { + @ApiModelProperty(value = "商品购买明细",required = true) + private List skuList; + + @ApiModelProperty(value = "收货地址id") + private Long receiveAddressId; + + @ApiModelProperty(value = "收货方式 1:快递 2:自提 代理商只有1", required = false) + private Integer deliveryType = 1; + + @ApiModelProperty(value = "支付方式:1-支付宝,2-微信(默认)", required = false, allowableValues = "1,2") +// @NotNull(message = "支付方式不能为空") + private Integer payType; + + @ApiModelProperty(value = "订单备注") + private String note; + + @ApiModelProperty(value = "订单来源 购物车是 cart") + private String from; + } \ No newline at end of file diff --git a/ruoyi-mall/src/main/java/com/cyl/h5/pojo/dto/OrderProductListDTO.java b/ruoyi-mall/src/main/java/com/cyl/h5/pojo/dto/OrderProductListDTO.java new file mode 100644 index 0000000..ee0d9d3 --- /dev/null +++ b/ruoyi-mall/src/main/java/com/cyl/h5/pojo/dto/OrderProductListDTO.java @@ -0,0 +1,42 @@ + package com.cyl.h5.pojo.dto; + + import com.cyl.pms.domain.Product; + import com.cyl.pms.domain.Sku; + import io.swagger.annotations.ApiModel; + import io.swagger.annotations.ApiModelProperty; + import lombok.Data; + + import javax.validation.constraints.Min; + import javax.validation.constraints.NotNull; + import java.math.BigDecimal; + + + /** + * 创建订单请求VO + * @author Jinxin + * + */ + @Data + @ApiModel(value = "创建订单请求VO") + public class OrderProductListDTO { + @ApiModelProperty(value = "商品skuId", required = true) + @NotNull(message = "商品skuId不能为空") + private Long skuId; + + @ApiModelProperty(value = "数量", required = true) + @NotNull(message = "数量不能为空") + @Min(value = 1, message = "数量不能小于1") + private Integer quantity; + + @ApiModelProperty(value = "消费金", hidden = true) + private BigDecimal consumption; + + @ApiModelProperty(value = "运费", hidden = true) + private BigDecimal freightAmount; + + @ApiModelProperty(value = "隐藏 业务过程中的数据", hidden = true) + private Sku sku; + + @ApiModelProperty(value = "隐藏 业务过程中的数据", hidden = true) + private Product product; + } \ No newline at end of file diff --git a/ruoyi-mall/src/main/java/com/cyl/h5/pojo/vo/OrderCalcVO.java b/ruoyi-mall/src/main/java/com/cyl/h5/pojo/vo/OrderCalcVO.java new file mode 100644 index 0000000..a656ea2 --- /dev/null +++ b/ruoyi-mall/src/main/java/com/cyl/h5/pojo/vo/OrderCalcVO.java @@ -0,0 +1,20 @@ +package com.cyl.h5.pojo.vo; + +import com.cyl.pms.pojo.vo.SkuVO; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.List; + +@Data +@ApiModel("下单前校验返回数据") +public class OrderCalcVO { + @ApiModelProperty("sku数据") + private List skuList; + @ApiModelProperty("商品总金额") + private BigDecimal productTotalAmount; + @ApiModelProperty("订单总金额") + private BigDecimal orderTotalAmount; +} diff --git a/ruoyi-mall/src/main/java/com/cyl/h5/pojo/vo/SkuViewDTO.java b/ruoyi-mall/src/main/java/com/cyl/h5/pojo/vo/SkuViewDTO.java new file mode 100644 index 0000000..95eff74 --- /dev/null +++ b/ruoyi-mall/src/main/java/com/cyl/h5/pojo/vo/SkuViewDTO.java @@ -0,0 +1,30 @@ +package com.cyl.h5.pojo.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; + + +/** + * sku渲染详情 + * + * @author Jinxin + */ +@Data +@ApiModel(value = "sku渲染详情") +public class SkuViewDTO { + private Long productId; + private Long skuId; + @ApiModelProperty(value = "商品名称") + private String productName; + @ApiModelProperty(value = "销售属性") + private String spData; + @ApiModelProperty(value = "购买数量") + private Integer quantity; + @ApiModelProperty(value = "主图") + private String pic; + @ApiModelProperty(value = "售价") + private BigDecimal price; +} \ No newline at end of file diff --git a/ruoyi-mall/src/main/java/com/cyl/oms/service/OrderService.java b/ruoyi-mall/src/main/java/com/cyl/oms/service/OrderService.java index c6c2be2..d483fab 100644 --- a/ruoyi-mall/src/main/java/com/cyl/oms/service/OrderService.java +++ b/ruoyi-mall/src/main/java/com/cyl/oms/service/OrderService.java @@ -7,28 +7,38 @@ import java.time.LocalDateTime; import java.util.stream.Collectors; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.crypto.SecureUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; +import com.cyl.h5.pojo.dto.OrderCreateDTO; +import com.cyl.h5.pojo.dto.OrderProductListDTO; +import com.cyl.h5.pojo.vo.OrderCalcVO; +import com.cyl.h5.pojo.vo.SkuViewDTO; import com.cyl.h5.pojo.vo.form.OrderSubmitForm; import com.cyl.h5.pojo.vo.query.OrderH5Query; import com.cyl.oms.convert.OrderConvert; import com.cyl.oms.domain.OrderItem; import com.cyl.oms.mapper.OrderItemMapper; import com.cyl.oms.pojo.vo.OrderVO; +import com.cyl.pms.convert.SkuConvert; import com.cyl.pms.domain.Product; import com.cyl.pms.domain.Sku; import com.cyl.pms.mapper.ProductMapper; import com.cyl.pms.mapper.SkuMapper; +import com.cyl.pms.pojo.vo.SkuVO; +import com.cyl.ums.domain.Member; import com.cyl.ums.domain.MemberAddress; import com.cyl.ums.mapper.MemberAddressMapper; import com.github.pagehelper.PageHelper; +import com.ruoyi.common.constant.Constants; import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.core.domain.model.LoginUser; import com.ruoyi.common.exception.base.BaseException; import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.framework.config.LocalDataUtil; import com.ruoyi.system.mapper.SysUserMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; @@ -40,6 +50,8 @@ import com.cyl.oms.mapper.OrderMapper; import com.cyl.oms.domain.Order; import com.cyl.oms.pojo.query.OrderQuery; +import javax.validation.constraints.NotNull; + /** * 订单表Service业务层处理 * @@ -60,6 +72,8 @@ public class OrderService { private SkuMapper skuMapper; @Autowired private ProductMapper productMapper; + @Autowired + private SkuConvert skuConvert; /** * 查询订单表 @@ -341,4 +355,54 @@ public class OrderService { }); return new PageImpl<>(res, pageReq, total); } + + public OrderCalcVO addOrderCheck(OrderCreateDTO orderCreateDTO) { + OrderCalcVO res = new OrderCalcVO(); + List skuList = new ArrayList<>(); + List list = orderCreateDTO.getSkuList(); + if (CollectionUtil.isEmpty(list)){ + throw new RuntimeException("商品SKU信息不能为空"); + } + //将购买的sku信息转化为key:skuId value:数量 + Map quantityMap = list.stream(). + collect(Collectors.toMap(OrderProductListDTO::getSkuId, OrderProductListDTO::getQuantity, (v1, v2) -> v2)); + //查询所有sku信息 + Set collect = list.stream().map(OrderProductListDTO::getSkuId).collect(Collectors.toSet()); + Map querySkuMap = skuMapper.selectBatchIds(collect).stream().collect(Collectors.toMap(Sku::getId, it -> it)); + //计算商品总金额、订单总金额 + BigDecimal productTotalAmount = BigDecimal.ZERO; + BigDecimal orderTotalAmount = BigDecimal.ZERO; + for (OrderProductListDTO dto : list){ + if (!querySkuMap.containsKey(dto.getSkuId())){ + throw new RuntimeException("商品SKU不存在"); + } + Sku sku = querySkuMap.get(dto.getSkuId()); + //查product + Product product = productMapper.selectById(sku.getProductId()); + if (product == null){ + throw new RuntimeException("商品不存在"); + } + if (Constants.PublishStatus.UNDERCARRIAGE.equals(product.getPublishStatus())){ + throw new RuntimeException("商品" + product.getName() + "已下架"); + } + BigDecimal addAmount = sku.getPrice().multiply(BigDecimal.valueOf(dto.getQuantity())); + //由于目前没有运费等数据,暂时订单总金额=商品总金额了 + productTotalAmount = productTotalAmount.add(addAmount); + orderTotalAmount = orderTotalAmount.add(addAmount); + //封装sku信息 + SkuViewDTO skuViewDTO = new SkuViewDTO(); + skuViewDTO.setPic(product.getPic()); + skuViewDTO.setPrice(sku.getPrice()); + skuViewDTO.setProductId(product.getId()); + skuViewDTO.setProductName(product.getName()); + skuViewDTO.setQuantity(quantityMap.get(sku.getId())); + skuViewDTO.setSkuId(sku.getId()); + skuViewDTO.setSpData(sku.getSpData()); + skuList.add(skuViewDTO); + } + res.setSkuList(skuList); + res.setOrderTotalAmount(orderTotalAmount); + res.setProductTotalAmount(productTotalAmount); + return res; + } } From 582778b11646d2c27106281c3e443ad5129f6f15 Mon Sep 17 00:00:00 2001 From: chuzhichao Date: Mon, 26 Jun 2023 15:53:50 +0800 Subject: [PATCH 11/18] =?UTF-8?q?H5=E4=B8=8B=E5=8D=95=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/ruoyi/common/utils/IDGenerator.java | 104 +++++++++++ .../cyl/h5/controller/H5OrderController.java | 29 ++- .../cyl/h5/pojo/vo/form/OrderSubmitForm.java | 7 +- .../main/java/com/cyl/oms/domain/Order.java | 4 + .../java/com/cyl/oms/domain/OrderItem.java | 4 + .../cyl/oms/pojo/dto/SaveOrderItemDTO.java | 4 + .../com/cyl/oms/service/OrderItemService.java | 36 +++- .../com/cyl/oms/service/OrderService.java | 169 ++++++++++++------ 8 files changed, 295 insertions(+), 62 deletions(-) create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/IDGenerator.java create mode 100644 ruoyi-mall/src/main/java/com/cyl/oms/pojo/dto/SaveOrderItemDTO.java diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/IDGenerator.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/IDGenerator.java new file mode 100644 index 0000000..133ce2e --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/IDGenerator.java @@ -0,0 +1,104 @@ +package com.ruoyi.common.utils; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Created by yangyincong on 15/8/16. + * ID生成器 workId (1~4) + */ +public class IDGenerator { + private final static Logger logger = LoggerFactory.getLogger(IDGenerator.class); + private final static long twepoch = 1361753741828L; + private final static long workerIdBits = 4L; + private final static long maxWorkerId = -1L ^ -1L << workerIdBits; + private final static long sequenceBits = 10L; + private long workerId; + private long sequence = 0L; + + private final static long workerIdShift = sequenceBits; + private final static long timestampLeftShift = sequenceBits + workerIdBits; + private final static long sequenceMask = -1L ^ -1L << sequenceBits; + + private long lastTimestamp = -1L; + + private IDGenerator(final long workerId) { + super(); + this.workerId = workerId; + } + + public static long generateMinId(int wid, long time) { + return (time - twepoch << timestampLeftShift) | (wid << workerIdShift); + } + + public synchronized long nextId() { + long timestamp = this.timeGen(); + if (this.lastTimestamp == timestamp) { + this.sequence = (this.sequence + 1) & sequenceMask; + if (this.sequence == 0) { + timestamp = this.tilNextMillis(this.lastTimestamp); + } + } else { + this.sequence = 0; + } + if (timestamp < this.lastTimestamp) { + try { + throw new Exception( + String.format( + "Clock moved backwards. Refusing to generate id for %d milliseconds", + this.lastTimestamp - timestamp)); + } catch (Exception e) { + e.printStackTrace(); + } + } + + this.lastTimestamp = timestamp; + long nextId = ((timestamp - twepoch << timestampLeftShift)) + | (this.workerId << workerIdShift) | (this.sequence); + return nextId; + } + + public static long generateMaxId(long wid, long time) { + return (time - twepoch << timestampLeftShift) | (wid << workerIdShift) | sequenceMask; + } + + private long tilNextMillis(final long lastTimestamp) { + long timestamp = this.timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = this.timeGen(); + } + return timestamp; + } + + private long timeGen() { + return System.currentTimeMillis(); + } + + private static IDGenerator generator; + + public static synchronized void init(Long workerId) throws Exception { + workerId = workerId % maxWorkerId; + logger.info("程序中init的workid为:{}", workerId); + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException(String.format( + "worker Id can't be greater than %d or less than 0", + IDGenerator.maxWorkerId)); + } + generator = new IDGenerator(workerId); + } + + public static Long generateId() { + if (null == generator) { + synchronized (IDGenerator.class) { + if (null == generator) { + try { + init(2L); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } + return generator.nextId(); + } +} diff --git a/ruoyi-mall/src/main/java/com/cyl/h5/controller/H5OrderController.java b/ruoyi-mall/src/main/java/com/cyl/h5/controller/H5OrderController.java index 40fe10a..ae8a9b4 100644 --- a/ruoyi-mall/src/main/java/com/cyl/h5/controller/H5OrderController.java +++ b/ruoyi-mall/src/main/java/com/cyl/h5/controller/H5OrderController.java @@ -6,7 +6,12 @@ import com.cyl.h5.pojo.vo.form.OrderSubmitForm; import com.cyl.h5.pojo.vo.query.OrderH5Query; import com.cyl.oms.pojo.vo.OrderVO; import com.cyl.oms.service.OrderService; +import com.cyl.ums.domain.Member; +import com.ruoyi.common.constant.Constants; +import com.ruoyi.common.core.redis.RedisService; +import com.ruoyi.framework.config.LocalDataUtil; import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; @@ -20,12 +25,32 @@ import java.util.List; @RestController @RequestMapping("/h5/order") +@Slf4j public class H5OrderController { @Autowired private OrderService orderService; + @Autowired + private RedisService redisService; + @PostMapping("/add") - public ResponseEntity submit(@RequestBody OrderSubmitForm form) { - return ResponseEntity.ok(orderService.submit(form)); + public ResponseEntity submit(@RequestBody OrderSubmitForm form) { + Member member = (Member) LocalDataUtil.getVar(Constants.MEMBER_INFO); + Long memberId = member.getId(); + String redisKey = "h5_order_add" + memberId; + String redisValue = memberId + "_" + System.currentTimeMillis(); + try{ + redisService.lock(redisKey, redisValue, 60); + return ResponseEntity.ok(orderService.submit(form)); + }catch (Exception e){ + log.info("创建订单方法异常", e); + return null; + }finally { + try { + redisService.unLock(redisKey, redisValue); + } catch (Exception e) { + e.printStackTrace(); + } + } } @PostMapping("orders") public ResponseEntity> queryOrderPage(@RequestBody OrderH5Query query, Pageable pageReq) { diff --git a/ruoyi-mall/src/main/java/com/cyl/h5/pojo/vo/form/OrderSubmitForm.java b/ruoyi-mall/src/main/java/com/cyl/h5/pojo/vo/form/OrderSubmitForm.java index 7230cc1..2a7e21f 100644 --- a/ruoyi-mall/src/main/java/com/cyl/h5/pojo/vo/form/OrderSubmitForm.java +++ b/ruoyi-mall/src/main/java/com/cyl/h5/pojo/vo/form/OrderSubmitForm.java @@ -1,5 +1,6 @@ package com.cyl.h5.pojo.vo.form; +import com.cyl.h5.pojo.dto.OrderProductListDTO; import lombok.Data; import javax.validation.constraints.NotEmpty; @@ -11,8 +12,12 @@ public class OrderSubmitForm { @NotNull private Long addressId; private String note; + /** 支付方式 0:未支付 1:支付宝 2:微信 默认微信 */ + private Integer payType = 2; + /** 订单来源,购物车则为cart */ + private String from; @NotEmpty - private List skus; + private List skuList; @Data public static class SkuParam { private Long skuId; diff --git a/ruoyi-mall/src/main/java/com/cyl/oms/domain/Order.java b/ruoyi-mall/src/main/java/com/cyl/oms/domain/Order.java index 59745ee..0bc4cc9 100644 --- a/ruoyi-mall/src/main/java/com/cyl/oms/domain/Order.java +++ b/ruoyi-mall/src/main/java/com/cyl/oms/domain/Order.java @@ -2,6 +2,9 @@ package com.cyl.oms.domain; import java.math.BigDecimal; import java.time.LocalDateTime; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; import com.ruoyi.common.annotation.Excel; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -20,6 +23,7 @@ public class Order extends BaseAudit { private static final long serialVersionUID = 1L; @ApiModelProperty("订单id") + @TableId(type = IdType.ASSIGN_ID) private Long id; @ApiModelProperty("MEMBER_ID") diff --git a/ruoyi-mall/src/main/java/com/cyl/oms/domain/OrderItem.java b/ruoyi-mall/src/main/java/com/cyl/oms/domain/OrderItem.java index 73ae487..5fff192 100644 --- a/ruoyi-mall/src/main/java/com/cyl/oms/domain/OrderItem.java +++ b/ruoyi-mall/src/main/java/com/cyl/oms/domain/OrderItem.java @@ -1,6 +1,9 @@ package com.cyl.oms.domain; import java.math.BigDecimal; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; import com.ruoyi.common.annotation.Excel; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -19,6 +22,7 @@ public class OrderItem extends BaseAudit { private static final long serialVersionUID = 1L; @ApiModelProperty("ID") + @TableId(type = IdType.ASSIGN_ID) private Long id; @ApiModelProperty("订单id") diff --git a/ruoyi-mall/src/main/java/com/cyl/oms/pojo/dto/SaveOrderItemDTO.java b/ruoyi-mall/src/main/java/com/cyl/oms/pojo/dto/SaveOrderItemDTO.java new file mode 100644 index 0000000..a6b25d9 --- /dev/null +++ b/ruoyi-mall/src/main/java/com/cyl/oms/pojo/dto/SaveOrderItemDTO.java @@ -0,0 +1,4 @@ +package com.cyl.oms.pojo.dto; + +public class SaveOrderItemDTO { +} diff --git a/ruoyi-mall/src/main/java/com/cyl/oms/service/OrderItemService.java b/ruoyi-mall/src/main/java/com/cyl/oms/service/OrderItemService.java index e23d18c..122f639 100644 --- a/ruoyi-mall/src/main/java/com/cyl/oms/service/OrderItemService.java +++ b/ruoyi-mall/src/main/java/com/cyl/oms/service/OrderItemService.java @@ -1,11 +1,16 @@ package com.cyl.oms.service; import java.math.BigDecimal; +import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.time.LocalDateTime; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.cyl.h5.pojo.dto.OrderProductListDTO; +import com.cyl.ums.domain.Member; import com.github.pagehelper.PageHelper; +import com.ruoyi.common.utils.IDGenerator; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Pageable; import org.apache.commons.lang3.StringUtils; @@ -13,6 +18,7 @@ import org.springframework.stereotype.Service; import com.cyl.oms.mapper.OrderItemMapper; import com.cyl.oms.domain.OrderItem; import com.cyl.oms.pojo.query.OrderItemQuery; +import org.springframework.transaction.annotation.Transactional; /** * 订单中所包含的商品Service业务层处理 @@ -21,7 +27,7 @@ import com.cyl.oms.pojo.query.OrderItemQuery; * @author zcc */ @Service -public class OrderItemService { +public class OrderItemService extends ServiceImpl { @Autowired private OrderItemMapper orderItemMapper; @@ -136,4 +142,32 @@ public class OrderItemService { public int deleteById(Long id) { return orderItemMapper.deleteById(id); } + + @Transactional + public void saveOrderItem(Member member, LocalDateTime optTime, + Long orderId, List list){ + List addOrderItemList = new ArrayList<>(); + list.forEach(item -> { + OrderItem orderItem = new OrderItem(); + orderItem.setId(IDGenerator.generateId()); + orderItem.setOrderId(orderId); + orderItem.setProductId(item.getProduct().getId()); + orderItem.setOutProductId(item.getProduct().getOutProductId()); + orderItem.setSkuId(item.getSku().getId()); + orderItem.setOutSkuId(item.getSku().getOutSkuId()); + orderItem.setPic(item.getSku().getPic()); + orderItem.setProductName(item.getProduct().getName()); + orderItem.setSalePrice(item.getSku().getPrice()); + orderItem.setQuantity(item.getQuantity()); + orderItem.setProductCategoryId(item.getProduct().getCategoryId()); + orderItem.setSpData(item.getSku().getSpData()); + orderItem.setCreateBy(member.getId()); + orderItem.setCreateTime(optTime); + addOrderItemList.add(orderItem); + }); + boolean flag = saveBatch(addOrderItemList); + if (!flag){ + throw new RuntimeException("新增订单item失败"); + } + } } diff --git a/ruoyi-mall/src/main/java/com/cyl/oms/service/OrderService.java b/ruoyi-mall/src/main/java/com/cyl/oms/service/OrderService.java index d483fab..79d55c4 100644 --- a/ruoyi-mall/src/main/java/com/cyl/oms/service/OrderService.java +++ b/ruoyi-mall/src/main/java/com/cyl/oms/service/OrderService.java @@ -12,7 +12,9 @@ import cn.hutool.core.util.StrUtil; import cn.hutool.crypto.SecureUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.cyl.h5.pojo.dto.OrderCreateDTO; import com.cyl.h5.pojo.dto.OrderProductListDTO; import com.cyl.h5.pojo.vo.OrderCalcVO; @@ -21,7 +23,9 @@ import com.cyl.h5.pojo.vo.form.OrderSubmitForm; import com.cyl.h5.pojo.vo.query.OrderH5Query; import com.cyl.oms.convert.OrderConvert; import com.cyl.oms.domain.OrderItem; +import com.cyl.oms.domain.OrderOperateHistory; import com.cyl.oms.mapper.OrderItemMapper; +import com.cyl.oms.mapper.OrderOperateHistoryMapper; import com.cyl.oms.pojo.vo.OrderVO; import com.cyl.pms.convert.SkuConvert; import com.cyl.pms.domain.Product; @@ -31,12 +35,15 @@ import com.cyl.pms.mapper.SkuMapper; import com.cyl.pms.pojo.vo.SkuVO; import com.cyl.ums.domain.Member; import com.cyl.ums.domain.MemberAddress; +import com.cyl.ums.domain.MemberCart; import com.cyl.ums.mapper.MemberAddressMapper; +import com.cyl.ums.mapper.MemberCartMapper; import com.github.pagehelper.PageHelper; import com.ruoyi.common.constant.Constants; import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.core.domain.model.LoginUser; import com.ruoyi.common.exception.base.BaseException; +import com.ruoyi.common.utils.IDGenerator; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.framework.config.LocalDataUtil; import com.ruoyi.system.mapper.SysUserMapper; @@ -49,7 +56,10 @@ import org.springframework.stereotype.Service; import com.cyl.oms.mapper.OrderMapper; import com.cyl.oms.domain.Order; import com.cyl.oms.pojo.query.OrderQuery; +import org.springframework.transaction.annotation.Transactional; +import javax.validation.constraints.Min; +import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotNull; /** @@ -74,6 +84,12 @@ public class OrderService { private ProductMapper productMapper; @Autowired private SkuConvert skuConvert; + @Autowired + private OrderItemService orderItemService; + @Autowired + private OrderOperateHistoryMapper orderOperateHistoryMapper; + @Autowired + private MemberCartMapper memberCartMapper; /** * 查询订单表 @@ -243,73 +259,109 @@ public class OrderService { return orderMapper.deleteById(id); } - public OrderVO submit(OrderSubmitForm form) { - MemberAddress addr = memberAddressMapper.selectById(form.getAddressId()); - if (addr == null) { - throw new BaseException("参数错误"); + @Transactional + public Long submit(OrderSubmitForm form) { + Member member = (Member) LocalDataUtil.getVar(Constants.MEMBER_INFO); + //只支持快递 + Long addressId = form.getAddressId(); + if (addressId == null){ + throw new RuntimeException("收获地址不能为空"); + } + MemberAddress memberAddress = memberAddressMapper.selectById(addressId); + if (memberAddress == null){ + throw new RuntimeException("收货地址不能为空"); + } + //sku不能为空 + List skuList = form.getSkuList(); + if (CollectionUtil.isEmpty(skuList)){ + throw new RuntimeException("商品SKU信息不能为空"); } - List skuIds = form.getSkus().stream().map(OrderSubmitForm.SkuParam::getSkuId).distinct().collect(Collectors.toList()); - List skus = skuMapper.selectBatchIds(skuIds); - if (skuIds.size() != skus.size()) { - throw new BaseException("参数错误"); + //将sku信息转换为 key:skuId ,value:购买数量 + Map skuQuantityMap = skuList.stream().collect(Collectors.toMap(OrderProductListDTO::getSkuId, OrderProductListDTO::getQuantity)); + //查询所有sku信息 + Map querySkuMap = skuMapper + .selectBatchIds(skuList.stream().map(OrderProductListDTO::getSkuId).collect(Collectors.toList())) + .stream().collect(Collectors.toMap(Sku::getId, it -> it)); + //计算商品总额、订单总额(订单总金额=商品总金额,因为暂时没有运费等概念) + BigDecimal productTotalAmount = BigDecimal.ZERO; + BigDecimal orderTotalAmount = BigDecimal.ZERO; + for (OrderProductListDTO dto : skuList){ + if (!querySkuMap.containsKey(dto.getSkuId())){ + throw new RuntimeException("商品SKU不存在"); + } + Sku sku = querySkuMap.get(dto.getSkuId()); + Product product = productMapper.selectById(sku.getProductId()); + if (product == null){ + throw new RuntimeException("商品不存在"); + } + if (Constants.PublishStatus.UNDERCARRIAGE.equals(product.getPublishStatus())){ + throw new RuntimeException("商品" + product.getName() + "已下架"); + } + productTotalAmount = productTotalAmount.add(sku.getPrice().multiply(BigDecimal.valueOf(skuQuantityMap.get(sku.getId())))); + orderTotalAmount = orderTotalAmount.add(sku.getPrice().multiply(BigDecimal.valueOf(skuQuantityMap.get(sku.getId())))); + dto.setSku(sku); + dto.setProduct(product); } - Map id2sku = skus.stream().collect(Collectors.toMap(Sku::getId, it -> it)); - - Map id2Product = productMapper.selectBatchIds( - skus.stream().map(Sku::getProductId).distinct().collect(Collectors.toList()) - ).stream().collect(Collectors.toMap(Product::getId, it -> it)); + LocalDateTime optTime = LocalDateTime.now(); - // 1. 生成订单商品快照 + //生成一个统一的订单号 + Long orderId = IDGenerator.generateId(); + //创建订单 Order order = new Order(); - order.setTotalAmount(BigDecimal.ZERO); - List items = new ArrayList<>(); - form.getSkus().forEach(it -> { - Sku s = id2sku.get(it.getSkuId()); - Product p = id2Product.get(s.getProductId()); - - OrderItem item = new OrderItem(); - item.setProductId(s.getProductId()); - item.setOutProductId(p.getOutProductId()); - item.setSkuId(it.getSkuId()); - item.setOutSkuId(s.getOutSkuId()); - item.setProductSnapshotId(p.getId()); - item.setSkuSnapshotId(s.getId()); - item.setPic(StrUtil.isNotEmpty(s.getPic()) ? s.getPic() : p.getPic()); - item.setProductName(p.getName()); - item.setSalePrice(s.getPrice()); - item.setQuantity(it.getQuantity()); - item.setProductCategoryId(p.getCategoryId()); - item.setSpData(s.getSpData()); - items.add(item); - order.setTotalAmount(order.getTotalAmount().add(s.getPrice().multiply(BigDecimal.valueOf(it.getQuantity())))); - }); - LoginUser user = SecurityUtils.getLoginUser(); - - // 2. 生成订单 - order.setMemberId(user.getUserId()); - order.setMemberUsername(user.getUsername()); - order.setStatus(0); + order.setId(orderId); + order.setMemberId(member.getId()); + order.setMemberUsername(member.getNickname()); + order.setPayType(Constants.PayType.WECHAT); + order.setTotalAmount(orderTotalAmount); + order.setPurchasePrice(BigDecimal.ZERO); + order.setFreightAmount(BigDecimal.ZERO); + order.setPayAmount(orderTotalAmount); + //暂时为接入支付,直接设置为待发货 + order.setStatus(Constants.OrderStatus.SEND); order.setAftersaleStatus(1); - order.setAutoConfirmDay(7); - order.setReceiverName(addr.getName()); - order.setReceiverPhone(addr.getPhone()); - order.setReceiverProvince(addr.getProvince()); - order.setReceiverDistrict(addr.getDistrict()); - order.setReceiverDetailAddress(addr.getDetailAddress()); + order.setReceiverName(memberAddress.getName()); + order.setReceiverPhone(memberAddress.getPhone()); + order.setReceiverPostCode(memberAddress.getPostCode()); + order.setReceiverProvince(memberAddress.getProvince()); + order.setReceiverCity(memberAddress.getCity()); + order.setReceiverDistrict(memberAddress.getDistrict()); + order.setReceiverDetailAddress(memberAddress.getDetailAddress()); order.setNote(form.getNote()); order.setConfirmStatus(0); order.setDeleteStatus(0); - orderMapper.insert(order); - items.forEach(it -> it.setOrderId(order.getId())); - items.forEach(orderItemMapper::insert); - - // 3. 判断是否付费,生成支付订单 - if (BigDecimal.ZERO.compareTo(order.getTotalAmount()) > 0) { - // todo 生成支付订单 + order.setPaymentTime(optTime); + order.setCreateTime(optTime); + order.setCreateBy(member.getId()); + int rows = orderMapper.insert(order); + if (rows < 1){ + throw new RuntimeException("订单新增失败"); + } + // 保存orderItem + orderItemService.saveOrderItem(member, optTime, orderId, skuList); + // 保存订单操作记录 + OrderOperateHistory orderOperateHistory = new OrderOperateHistory(); + orderOperateHistory.setOrderId(orderId); + orderOperateHistory.setOperateMan(member.getId() + ""); + orderOperateHistory.setOrderStatus(Constants.OrderStatus.SEND); + orderOperateHistory.setCreateTime(optTime); + orderOperateHistory.setCreateBy(member.getId()); + rows = orderOperateHistoryMapper.insert(orderOperateHistory); + if (rows < 1){ + throw new RuntimeException("保存订单操作记录失败"); + } + //若来源为购物车,删除购物车 + if (Constants.OrderFrom.CART.equals(form.getFrom())){ + List skuIdList = skuList.stream().map(OrderProductListDTO::getSkuId).collect(Collectors.toList()); + LambdaUpdateWrapper wrapper = Wrappers.lambdaUpdate(); + wrapper.eq(MemberCart::getMemberId, member.getId()); + wrapper.in(MemberCart::getSkuId, skuIdList); + rows = memberCartMapper.delete(wrapper); + if (rows < 1){ + throw new RuntimeException("删除购物车失败"); + } } - OrderVO vo = orderConvert.do2vo(order); - vo.setItems(items); - return vo; + //当前返回成功消息,接入支付后可返回payId + return orderId; } public Page queryOrderPage(OrderH5Query query, Pageable pageReq) { @@ -405,4 +457,5 @@ public class OrderService { res.setProductTotalAmount(productTotalAmount); return res; } + } From 314a112bae2de97c7df7dde5b3920b738ae214a4 Mon Sep 17 00:00:00 2001 From: chuzhichao Date: Mon, 26 Jun 2023 17:08:14 +0800 Subject: [PATCH 12/18] =?UTF-8?q?=E4=BC=9A=E5=91=98=E5=88=86=E9=A1=B5?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/cyl/ums/pojo/query/MemberQuery.java | 5 +- .../com/cyl/ums/service/MemberService.java | 56 ++----------------- 2 files changed, 8 insertions(+), 53 deletions(-) diff --git a/ruoyi-mall/src/main/java/com/cyl/ums/pojo/query/MemberQuery.java b/ruoyi-mall/src/main/java/com/cyl/ums/pojo/query/MemberQuery.java index 7bcce38..9208f8e 100644 --- a/ruoyi-mall/src/main/java/com/cyl/ums/pojo/query/MemberQuery.java +++ b/ruoyi-mall/src/main/java/com/cyl/ums/pojo/query/MemberQuery.java @@ -16,7 +16,7 @@ import io.swagger.annotations.ApiModelProperty; @Data public class MemberQuery { @ApiModelProperty("昵称 精确匹配") - private String nicknameLike; + private String nickname; @ApiModelProperty("密码 精确匹配") private String password; @@ -60,4 +60,7 @@ public class MemberQuery { @ApiModelProperty("用户剩余积分 精确匹配") private BigDecimal integral; + private String beginTime; + + private String endTime; } diff --git a/ruoyi-mall/src/main/java/com/cyl/ums/service/MemberService.java b/ruoyi-mall/src/main/java/com/cyl/ums/service/MemberService.java index 096011a..6a89bc7 100644 --- a/ruoyi-mall/src/main/java/com/cyl/ums/service/MemberService.java +++ b/ruoyi-mall/src/main/java/com/cyl/ums/service/MemberService.java @@ -50,65 +50,17 @@ public class MemberService { PageHelper.startPage(page.getPageNumber() + 1, page.getPageSize()); } QueryWrapper qw = new QueryWrapper<>(); - String nicknameLike = query.getNicknameLike(); + String nicknameLike = query.getNickname(); if (!StringUtils.isEmpty(nicknameLike)) { qw.like("nickname", nicknameLike); } - String password = query.getPassword(); - if (!StringUtils.isEmpty(password)) { - qw.eq("password", password); - } String phone = query.getPhone(); if (!StringUtils.isEmpty(phone)) { qw.eq("phone", phone); } - String mark = query.getMark(); - if (!StringUtils.isEmpty(mark)) { - qw.eq("mark", mark); - } - Integer status = query.getStatus(); - if (status != null) { - qw.eq("status", status); - } - String avatar = query.getAvatar(); - if (!StringUtils.isEmpty(avatar)) { - qw.eq("avatar", avatar); - } - Integer gender = query.getGender(); - if (gender != null) { - qw.eq("gender", gender); - } - String city = query.getCity(); - if (!StringUtils.isEmpty(city)) { - qw.eq("city", city); - } - String province = query.getProvince(); - if (!StringUtils.isEmpty(province)) { - qw.eq("province", province); - } - String country = query.getCountry(); - if (!StringUtils.isEmpty(country)) { - qw.eq("country", country); - } - LocalDate birthday = query.getBirthday(); - if (birthday != null) { - qw.eq("birthday", birthday); - } - Long spreadUid = query.getSpreadUid(); - if (spreadUid != null) { - qw.eq("spread_uid", spreadUid); - } - LocalDateTime spreadTime = query.getSpreadTime(); - if (spreadTime != null) { - qw.eq("spread_time", spreadTime); - } - Integer level = query.getLevel(); - if (level != null) { - qw.eq("level", level); - } - BigDecimal integral = query.getIntegral(); - if (integral != null) { - qw.eq("integral", integral); + if (!StringUtils.isEmpty(query.getBeginTime()) && !StringUtils.isEmpty(query.getEndTime())){ + qw.ge("create_time", query.getBeginTime()); + qw.lt("create_time", query.getEndTime()); } return memberMapper.selectList(qw); } From ec58bf197f4ea8e83105f3150133cab27a716a75 Mon Sep 17 00:00:00 2001 From: chuzhichao Date: Mon, 26 Jun 2023 18:44:58 +0800 Subject: [PATCH 13/18] =?UTF-8?q?=E7=94=A8=E6=88=B7=E6=89=8B=E6=9C=BA?= =?UTF-8?q?=E5=8F=B7=E5=8A=A0=E5=AF=86=E3=80=81=E7=99=BB=E5=BD=95=E6=B3=A8?= =?UTF-8?q?=E5=86=8C=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ruoyi/common/utils/AesCryptoUtils.java | 28 +++++++++++++++++++ .../com/ruoyi/common/utils/PhoneUtils.java | 14 ++++++++++ .../com/cyl/h5/service/H5MemberService.java | 14 ++++++++-- .../main/java/com/cyl/ums/domain/Member.java | 6 ++++ 4 files changed, 59 insertions(+), 3 deletions(-) create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/AesCryptoUtils.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/PhoneUtils.java diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/AesCryptoUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/AesCryptoUtils.java new file mode 100644 index 0000000..e509e42 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/AesCryptoUtils.java @@ -0,0 +1,28 @@ +package com.ruoyi.common.utils; + +import cn.hutool.core.util.CharsetUtil; +import cn.hutool.crypto.SecureUtil; +import cn.hutool.crypto.symmetric.AES; + +/** + * aes加密工具 + */ +public class AesCryptoUtils { + + public static String encrypt(String key, String content){ + if (StringUtils.isBlank(key) || StringUtils.isBlank(content)){ + throw new RuntimeException("错误"); + } + AES aes = SecureUtil.aes(key.getBytes()); + byte[] encrypt = aes.encrypt(content); + return aes.encryptHex(content); + } + + public static String decrypt(String key, String content){ + if (StringUtils.isBlank(key) || StringUtils.isBlank(content)){ + throw new RuntimeException("错误"); + } + AES aes = SecureUtil.aes(key.getBytes()); + return aes.decryptStr(content, CharsetUtil.CHARSET_UTF_8); + } +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/PhoneUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/PhoneUtils.java new file mode 100644 index 0000000..f2fd5bd --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/PhoneUtils.java @@ -0,0 +1,14 @@ +package com.ruoyi.common.utils; + +/** + * 手机号工具类 + */ +public class PhoneUtils { + + public static String hidePhone(String phone){ + if (StringUtils.isEmpty(phone) || phone.length() < 11){ + throw new RuntimeException("手机号格式错误"); + } + return phone.substring(0, 3) + "****" + phone.substring(7, 11); + } +} diff --git a/ruoyi-mall/src/main/java/com/cyl/h5/service/H5MemberService.java b/ruoyi-mall/src/main/java/com/cyl/h5/service/H5MemberService.java index 7f369d9..327adba 100644 --- a/ruoyi-mall/src/main/java/com/cyl/h5/service/H5MemberService.java +++ b/ruoyi-mall/src/main/java/com/cyl/h5/service/H5MemberService.java @@ -15,6 +15,8 @@ import com.cyl.ums.pojo.vo.MemberVO; import com.ruoyi.common.constant.Constants; import com.ruoyi.common.core.domain.model.LoginMember; import com.ruoyi.common.core.redis.RedisCache; +import com.ruoyi.common.utils.AesCryptoUtils; +import com.ruoyi.common.utils.PhoneUtils; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.framework.config.LocalDataUtil; @@ -22,6 +24,7 @@ import com.ruoyi.framework.web.service.TokenService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.util.Base64Utils; @@ -41,6 +44,9 @@ public class H5MemberService { @Autowired private TokenService tokenService; + @Value("${aes.key}") + private String aesKey; + /** * 注册 * @param request 注册请求体 @@ -53,6 +59,8 @@ public class H5MemberService { //创建会员 Member member = new Member(); member.setPhone(request.getMobile()); + member.setPhoneEncrypted(AesCryptoUtils.encrypt(aesKey, request.getMobile())); + member.setPhoneHidden(PhoneUtils.hidePhone(request.getMobile())); member.setPassword(SecurityUtils.encryptPassword(request.getPassword())); member.setNickname("用户" + request.getMobile().substring(7,11)); member.setStatus(Constants.MEMBER_ACCOUNT_STATUS.NORMAL); @@ -70,7 +78,7 @@ public class H5MemberService { byte[] decodedBytes = Base64.getDecoder().decode(phone); phone = new String(decodedBytes); QueryWrapper qw = new QueryWrapper<>(); - qw.eq("phone", phone); + qw.eq("phone_encrypted", AesCryptoUtils.encrypt(aesKey, phone)); Member member = memberMapper.selectOne(qw); if (member != null){ throw new RuntimeException("该手机号已被占用"); @@ -93,7 +101,7 @@ public class H5MemberService { H5AccountLoginRequest request = JSON.parseObject(new String(Base64Utils.decodeFromString(data)), H5AccountLoginRequest.class); log.info("account login request:{}", JSONUtil.toJsonStr(request)); QueryWrapper qw = new QueryWrapper<>(); - qw.eq("phone", request.getMobile()); + qw.eq("phone_encrypted", AesCryptoUtils.encrypt(aesKey, request.getMobile())); Member member = memberMapper.selectOne(qw); if (member == null){ throw new RuntimeException(Constants.LOGIN_INFO.WRONG); @@ -115,7 +123,7 @@ public class H5MemberService { this.validateVerifyCode(request.getUuid(), request.getMobile(), request.getCode()); //查会员 QueryWrapper qw = new QueryWrapper<>(); - qw.eq("phone", request.getMobile()); + qw.eq("phone_encrypted", AesCryptoUtils.encrypt(aesKey, request.getMobile())); Member member = memberMapper.selectOne(qw); if (member == null){ throw new RuntimeException(Constants.LOGIN_INFO.TO_REGISTER); diff --git a/ruoyi-mall/src/main/java/com/cyl/ums/domain/Member.java b/ruoyi-mall/src/main/java/com/cyl/ums/domain/Member.java index 2d75d50..a35cadd 100644 --- a/ruoyi-mall/src/main/java/com/cyl/ums/domain/Member.java +++ b/ruoyi-mall/src/main/java/com/cyl/ums/domain/Member.java @@ -35,6 +35,12 @@ public class Member extends BaseAudit { @Excel(name = "手机号码") private String phone; + @ApiModelProperty("加密手机号") + private String phoneEncrypted; + + @ApiModelProperty("隐藏前三位后四位的手机号") + private String phoneHidden; + @ApiModelProperty("用户备注") @Excel(name = "用户备注") private String mark; From 2a2cbb19e50d3ddf6df5eac43592ab56beb099a4 Mon Sep 17 00:00:00 2001 From: chuzhichao Date: Mon, 26 Jun 2023 18:53:10 +0800 Subject: [PATCH 14/18] =?UTF-8?q?aes=E5=8A=A0=E5=AF=86=E5=AF=86=E9=92=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ruoyi-admin/src/main/resources/application-druid.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/ruoyi-admin/src/main/resources/application-druid.yml b/ruoyi-admin/src/main/resources/application-druid.yml index 723505a..9e41d8a 100644 --- a/ruoyi-admin/src/main/resources/application-druid.yml +++ b/ruoyi-admin/src/main/resources/application-druid.yml @@ -54,4 +54,7 @@ sms: signName: 签名 templateId: 模板id # 腾讯专用 - sdkAppId: \ No newline at end of file + sdkAppId: +aes: + # aes的密钥 + key: 1111111111 \ No newline at end of file From 27b7accbbc58c4b55e5e9d91f0e67e4b519c0cdf Mon Sep 17 00:00:00 2001 From: chuzhichao Date: Tue, 27 Jun 2023 10:33:03 +0800 Subject: [PATCH 15/18] =?UTF-8?q?=E4=BC=9A=E5=91=98=E5=9C=B0=E5=9D=80?= =?UTF-8?q?=E6=89=8B=E6=9C=BA=E5=8F=B7=E5=8A=A0=E5=AF=86H5=E5=A4=84?= =?UTF-8?q?=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/H5MemberAddressController.java | 26 ++++---- .../h5/service/H5MemberAddressService.java | 60 +++++++++++++++---- .../com/cyl/h5/service/H5MemberService.java | 2 +- .../main/java/com/cyl/ums/domain/Member.java | 4 -- .../com/cyl/ums/domain/MemberAddress.java | 10 +++- .../cyl/ums/pojo/dto/MemberAddressDTO.java | 18 ++++++ .../com/cyl/ums/pojo/vo/MemberAddressVO.java | 2 + .../java/com/cyl/ums/pojo/vo/MemberVO.java | 6 +- .../mapper/ums/MemberAddressMapper.xml | 6 +- 9 files changed, 98 insertions(+), 36 deletions(-) create mode 100644 ruoyi-mall/src/main/java/com/cyl/ums/pojo/dto/MemberAddressDTO.java 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 index 0d35fa5..26f3414 100644 --- a/ruoyi-mall/src/main/java/com/cyl/h5/controller/H5MemberAddressController.java +++ b/ruoyi-mall/src/main/java/com/cyl/h5/controller/H5MemberAddressController.java @@ -2,11 +2,15 @@ package com.cyl.h5.controller; import com.cyl.h5.service.H5MemberAddressService; import com.cyl.ums.domain.MemberAddress; +import com.cyl.ums.pojo.dto.MemberAddressDTO; +import com.cyl.ums.pojo.vo.MemberAddressVO; import com.ruoyi.common.core.domain.AjaxResult; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; +import java.util.List; + @RestController @RequestMapping("/h5/member/address") public class H5MemberAddressController { @@ -15,32 +19,32 @@ public class H5MemberAddressController { private H5MemberAddressService h5MemberAddressService; @GetMapping("/list") - public AjaxResult getList(){ - return AjaxResult.success(h5MemberAddressService.selectList()); + public ResponseEntity> getList(){ + return ResponseEntity.ok(h5MemberAddressService.selectList()); } @GetMapping("/default") - public ResponseEntity getDefault(){ + public ResponseEntity getDefault(){ return ResponseEntity.ok(h5MemberAddressService.getDefault()); } @PostMapping("/create") - public AjaxResult create(@RequestBody MemberAddress memberAddress){ - return AjaxResult.success(h5MemberAddressService.insert(memberAddress)); + public ResponseEntity create(@RequestBody MemberAddressDTO memberAddressDTO){ + return ResponseEntity.ok(h5MemberAddressService.insert(memberAddressDTO)); } @PutMapping("/update") - public AjaxResult update(@RequestBody MemberAddress memberAddress){ - return AjaxResult.success(h5MemberAddressService.update(memberAddress)); + public ResponseEntity update(@RequestBody MemberAddressDTO memberAddressDTO){ + return ResponseEntity.ok(h5MemberAddressService.update(memberAddressDTO)); } @GetMapping("/{id}") - public AjaxResult getInfo(@PathVariable Long id){ - return AjaxResult.success(h5MemberAddressService.selectById(id)); + public ResponseEntity getInfo(@PathVariable Long id){ + return ResponseEntity.ok(h5MemberAddressService.selectById(id)); } @DeleteMapping("/{id}") - public AjaxResult remove(@PathVariable Long id) { - return AjaxResult.success(h5MemberAddressService.deleteById(id)); + public ResponseEntity remove(@PathVariable Long id) { + return ResponseEntity.ok(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 index 5d40cba..c7be2b8 100644 --- a/ruoyi-mall/src/main/java/com/cyl/h5/service/H5MemberAddressService.java +++ b/ruoyi-mall/src/main/java/com/cyl/h5/service/H5MemberAddressService.java @@ -4,16 +4,24 @@ 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.cyl.ums.pojo.dto.MemberAddressDTO; +import com.cyl.ums.pojo.vo.MemberAddressVO; import com.ruoyi.common.constant.Constants; +import com.ruoyi.common.utils.AesCryptoUtils; +import com.ruoyi.common.utils.PhoneUtils; import com.ruoyi.framework.config.LocalDataUtil; +import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; import java.time.LocalDateTime; +import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.stream.Collectors; /** * 会员收货地址Service业务层处理 @@ -26,6 +34,9 @@ public class H5MemberAddressService { @Autowired private MemberAddressMapper memberAddressMapper; + @Value("${aes.key}") + private String aesKey; + /** * 查询会员收货地址 * @@ -33,29 +44,43 @@ public class H5MemberAddressService { * @return 会员收货地址 */ - public MemberAddress selectById(Long id) { - return memberAddressMapper.selectById(id); + public MemberAddressVO selectById(Long id) { + MemberAddress memberAddress = memberAddressMapper.selectById(id); + MemberAddressVO memberAddressVO = new MemberAddressVO(); + BeanUtils.copyProperties(memberAddress, memberAddressVO); + memberAddressVO.setPhone(AesCryptoUtils.decrypt(aesKey, memberAddress.getPhoneEncrypted())); + return memberAddressVO; } - public List selectList() { + public List selectList() { Member member = (Member) LocalDataUtil.getVar(Constants.MEMBER_INFO); MemberAddress memberAddress = new MemberAddress(); memberAddress.setMemberId(member.getId()); - return memberAddressMapper.selectByEntity(memberAddress); + List memberAddressesList = memberAddressMapper.selectByEntity(memberAddress); + return memberAddressesList.stream().map(it -> { + MemberAddressVO vo = new MemberAddressVO(); + BeanUtils.copyProperties(it, vo); + vo.setPhone(AesCryptoUtils.decrypt(aesKey, it.getPhoneEncrypted())); + return vo; + }).collect(Collectors.toList()); } /** * 新增会员收货地址 * - * @param memberAddress 会员收货地址 + * @param memberAddressDTO 会员收货地址 * @return 结果 */ - public int insert(MemberAddress memberAddress) { + public int insert(MemberAddressDTO memberAddressDTO) { Member member = (Member) LocalDataUtil.getVar(Constants.MEMBER_INFO); - if (memberAddress.getIsDefault() == 1) { + if (memberAddressDTO.getIsDefault() == 1) { //将别的设置为0 memberAddressMapper.updateDefault(0,member.getId()); } + MemberAddress memberAddress = new MemberAddress(); + BeanUtils.copyProperties(memberAddressDTO, memberAddress); + memberAddress.setPhoneHidden(PhoneUtils.hidePhone(memberAddressDTO.getPhone())); + memberAddress.setPhoneEncrypted(AesCryptoUtils.encrypt(aesKey, memberAddressDTO.getPhone())); memberAddress.setMemberId(member.getId()); memberAddress.setCreateTime(LocalDateTime.now()); return memberAddressMapper.insert(memberAddress); @@ -64,17 +89,22 @@ public class H5MemberAddressService { /** * 修改会员收货地址 * - * @param memberAddress 会员收货地址 + * @param memberAddressDTO 会员收货地址 * @return 结果 */ - public int update(MemberAddress memberAddress) { + public int update(MemberAddressDTO memberAddressDTO) { Member member = (Member) LocalDataUtil.getVar(Constants.MEMBER_INFO); - if (memberAddress.getIsDefault() == 1) { + if (memberAddressDTO.getIsDefault() == 1) { //将别的设置为0 memberAddressMapper.updateDefault(0,member.getId()); } + MemberAddress memberAddress = new MemberAddress(); + BeanUtils.copyProperties(memberAddressDTO, memberAddress); + memberAddress.setPhoneHidden(PhoneUtils.hidePhone(memberAddressDTO.getPhone())); + memberAddress.setPhoneEncrypted(AesCryptoUtils.encrypt(aesKey, memberAddressDTO.getPhone())); memberAddress.setUpdateTime(LocalDateTime.now()); + memberAddress.setUpdateBy(member.getId()); return memberAddressMapper.updateById(memberAddress); } @@ -100,12 +130,18 @@ public class H5MemberAddressService { return memberAddressMapper.deleteById(id); } - public MemberAddress getDefault() { + public MemberAddressVO 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); + if (CollectionUtils.isEmpty(list)){ + return null; + } + MemberAddressVO memberAddressVO = new MemberAddressVO(); + BeanUtils.copyProperties(list.get(0), memberAddressVO); + memberAddressVO.setPhone(AesCryptoUtils.decrypt(aesKey, list.get(0).getPhoneEncrypted())); + return memberAddressVO; } } diff --git a/ruoyi-mall/src/main/java/com/cyl/h5/service/H5MemberService.java b/ruoyi-mall/src/main/java/com/cyl/h5/service/H5MemberService.java index 327adba..41f6802 100644 --- a/ruoyi-mall/src/main/java/com/cyl/h5/service/H5MemberService.java +++ b/ruoyi-mall/src/main/java/com/cyl/h5/service/H5MemberService.java @@ -58,7 +58,6 @@ public class H5MemberService { this.validateVerifyCode(request.getUuid(), request.getMobile(), request.getCode()); //创建会员 Member member = new Member(); - member.setPhone(request.getMobile()); member.setPhoneEncrypted(AesCryptoUtils.encrypt(aesKey, request.getMobile())); member.setPhoneHidden(PhoneUtils.hidePhone(request.getMobile())); member.setPassword(SecurityUtils.encryptPassword(request.getPassword())); @@ -179,6 +178,7 @@ public class H5MemberService { Member member = (Member) LocalDataUtil.getVar(Constants.MEMBER_INFO); MemberVO memberVO = new MemberVO(); BeanUtils.copyProperties(member, memberVO); + memberVO.setPhone(AesCryptoUtils.decrypt(aesKey, member.getPhoneEncrypted())); return memberVO; } } diff --git a/ruoyi-mall/src/main/java/com/cyl/ums/domain/Member.java b/ruoyi-mall/src/main/java/com/cyl/ums/domain/Member.java index a35cadd..03059e9 100644 --- a/ruoyi-mall/src/main/java/com/cyl/ums/domain/Member.java +++ b/ruoyi-mall/src/main/java/com/cyl/ums/domain/Member.java @@ -31,10 +31,6 @@ public class Member extends BaseAudit { @Excel(name = "密码") private String password; - @ApiModelProperty("手机号码") - @Excel(name = "手机号码") - private String phone; - @ApiModelProperty("加密手机号") private String phoneEncrypted; diff --git a/ruoyi-mall/src/main/java/com/cyl/ums/domain/MemberAddress.java b/ruoyi-mall/src/main/java/com/cyl/ums/domain/MemberAddress.java index b561ddf..d0496ba 100644 --- a/ruoyi-mall/src/main/java/com/cyl/ums/domain/MemberAddress.java +++ b/ruoyi-mall/src/main/java/com/cyl/ums/domain/MemberAddress.java @@ -28,9 +28,13 @@ public class MemberAddress extends BaseAudit { @Excel(name = "收货人名称") private String name; - @ApiModelProperty("PHONE") - @Excel(name = "PHONE") - private String phone; + @ApiModelProperty("隐藏前三位后四位的手机号") + @Excel(name = "隐藏前三位后四位的手机号") + private String phoneHidden; + + @ApiModelProperty("加密的手机号") + @Excel(name = "加密的手机号") + private String phoneEncrypted; @ApiModelProperty("是否为默认") @Excel(name = "是否为默认") diff --git a/ruoyi-mall/src/main/java/com/cyl/ums/pojo/dto/MemberAddressDTO.java b/ruoyi-mall/src/main/java/com/cyl/ums/pojo/dto/MemberAddressDTO.java new file mode 100644 index 0000000..68bbb60 --- /dev/null +++ b/ruoyi-mall/src/main/java/com/cyl/ums/pojo/dto/MemberAddressDTO.java @@ -0,0 +1,18 @@ +package com.cyl.ums.pojo.dto; + +import lombok.Data; + +@Data +public class MemberAddressDTO { + private Long id; + private Long memberId; + private String name; + private String phone; + private Integer defaultStatus; + private String postCode; + private String province; + private String city; + private String district; + private String detailAddress; + private Integer isDefault; +} diff --git a/ruoyi-mall/src/main/java/com/cyl/ums/pojo/vo/MemberAddressVO.java b/ruoyi-mall/src/main/java/com/cyl/ums/pojo/vo/MemberAddressVO.java index be11b6e..43f0e0e 100644 --- a/ruoyi-mall/src/main/java/com/cyl/ums/pojo/vo/MemberAddressVO.java +++ b/ruoyi-mall/src/main/java/com/cyl/ums/pojo/vo/MemberAddressVO.java @@ -22,6 +22,8 @@ public class MemberAddressVO extends BaseAudit { /** PHONE */ @Excel(name = "PHONE") private String phone; + @Excel(name = "隐藏前三位后四位的手机号") + private String phoneHidden; /** 是否为默认 */ @Excel(name = "是否为默认") private Integer defaultStatus; diff --git a/ruoyi-mall/src/main/java/com/cyl/ums/pojo/vo/MemberVO.java b/ruoyi-mall/src/main/java/com/cyl/ums/pojo/vo/MemberVO.java index 7a25392..10ab9ef 100644 --- a/ruoyi-mall/src/main/java/com/cyl/ums/pojo/vo/MemberVO.java +++ b/ruoyi-mall/src/main/java/com/cyl/ums/pojo/vo/MemberVO.java @@ -6,6 +6,7 @@ import java.time.LocalDateTime; import com.ruoyi.common.annotation.Excel; import com.fasterxml.jackson.annotation.JsonFormat; import com.ruoyi.common.core.domain.BaseAudit; +import io.swagger.annotations.ApiModelProperty; import lombok.Data; /** * 会员信息 数据视图对象 @@ -19,9 +20,10 @@ public class MemberVO extends BaseAudit { /** 昵称 */ @Excel(name = "昵称") private String nickname; - /** 手机号码 */ - @Excel(name = "手机号码") + /** 手机号 */ private String phone; + /** 隐藏前三位后四位的手机号 */ + private String phoneHidden; /** 用户备注 */ @Excel(name = "用户备注") private String mark; diff --git a/ruoyi-mall/src/main/resources/mapper/ums/MemberAddressMapper.xml b/ruoyi-mall/src/main/resources/mapper/ums/MemberAddressMapper.xml index 473f047..b71180c 100644 --- a/ruoyi-mall/src/main/resources/mapper/ums/MemberAddressMapper.xml +++ b/ruoyi-mall/src/main/resources/mapper/ums/MemberAddressMapper.xml @@ -8,7 +8,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - + + @@ -27,7 +28,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - select id, member_id, name, phone, default_status, post_code, province, city, district, detail_address, is_default, create_by, create_time, update_by, update_time from ums_member_address + select id, member_id, name, phone_hidden,phone_encrypted, default_status, post_code, province, city, district, detail_address, is_default, create_by, create_time, update_by, update_time from ums_member_address +