Merge remote-tracking branch 'origin/master'

pull/1/head
zccbbg 2 years ago
commit d9eabb541b

@ -33,6 +33,8 @@
<jwt.version>0.9.1</jwt.version>
<lombok.version>1.16.20</lombok.version>
<mybatis.plus.version>3.3.2</mybatis.plus.version>
<!-- SMS 配置 -->
<aliyun.sms.version>2.0.23</aliyun.sms.version>
</properties>
<!-- 依赖声明 -->
@ -231,6 +233,11 @@
<artifactId>mapstruct</artifactId>
<version>1.4.2.Final</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>dysmsapi20170525</artifactId>
<version>${aliyun.sms.version}</version>
</dependency>
</dependencies>
</dependencyManagement>

@ -91,6 +91,13 @@
<artifactId>mapstruct</artifactId>
<version>1.4.2.Final</version>
</dependency>
<!-- aliyun sms -->
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>dysmsapi20170525</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
<build>

@ -1,8 +1,14 @@
package com.ruoyi.web.controller.common;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.cyl.manager.ums.domain.Address;
import com.cyl.manager.ums.mapper.AddressMapper;
import com.cyl.manager.ums.pojo.dto.AddressDTO;
import com.ruoyi.common.config.RuoYiConfig;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.redis.RedisService;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.file.FileUploadUtils;
import com.ruoyi.common.utils.file.FileUtils;
@ -19,6 +25,8 @@ import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.*;
import java.util.stream.Collectors;
/**
*
@ -33,6 +41,12 @@ public class CommonController
@Autowired
private ServerConfig serverConfig;
@Autowired
private RedisService redisService;
@Autowired
private AddressMapper addressMapper;
/**
*
*
@ -117,4 +131,50 @@ public class CommonController
log.error("下载文件失败", e);
}
}
@GetMapping("/common/area")
public AjaxResult getAddressList() {
String addresses = redisService.getAddressList();
if (org.apache.commons.lang3.StringUtils.isNotEmpty(addresses)) {
return AjaxResult.success(JSON.parseArray(addresses, AddressDTO.class));
}
QueryWrapper<Address> addressQueryWrapper = new QueryWrapper<>();
addressQueryWrapper.in("level", Arrays.asList(0,1,2));
List<Address> addressList = addressMapper.selectList(addressQueryWrapper);
Map<Long, List<Address>> cityMap = addressList.stream().filter(it -> it.getLevel() == 1).collect(Collectors.groupingBy(it -> it.getParentCode()));
Map<Long, List<Address>> districtMap = addressList.stream().filter(it -> it.getLevel() == 2).collect(Collectors.groupingBy(it -> it.getParentCode()));
List<AddressDTO> 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<AddressDTO> 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);
}
}

@ -0,0 +1,68 @@
package com.ruoyi.web.core.config;
import com.cyl.manager.ums.domain.Member;
import com.cyl.manager.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);
}
}

@ -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());
}
}

@ -45,3 +45,16 @@ aliyun:
wechat:
appId: 你的微信服务号信息
secret: 你的微信服务号信息
sms:
enabled: true
# 阿里云 dysmsapi.aliyuncs.com
endpoint: dysmsapi.aliyuncs.com
accessKeyId: 你的accessKeyId #阿里云短信服务控制台查看
accessKeySecret: 你的accessKeySecret #同上
signName: 签名
templateId: 模板id
# 腾讯专用
sdkAppId:
aes:
# aes的密钥
key: 1111111111

@ -121,6 +121,7 @@ token:
secret: abcdefghijkomnopqrstuvwxyx
# 令牌有效期默认30分钟
expireTime: 30
memberExpireTime: 30
# mybatis-plus 配置
mybatis-plus:
# 搜索指定包别名

@ -67,9 +67,9 @@
<logger name="com.ruoyi" level="info" />
<!-- Spring日志级别控制 -->
<logger name="org.springframework" level="warn" />
<logger name="com.cyl.pms.mapper" level="debug" />
<logger name="com.cyl.ums.mapper" level="debug" />
<logger name="com.cyl.oms.mapper" level="debug" />
<logger name="com.cyl.manager.pms.mapper" level="debug" />
<logger name="com.cyl.manager.ums.mapper" level="debug" />
<logger name="com.cyl.manager.oms.mapper" level="debug" />
<logger name="com.ruoyi.framework.aspectj.LoggingAspect" level="info" />
<root level="info">
<appender-ref ref="console" />

@ -1,22 +1,65 @@
package com.fjp.lc.test.service;
import com.cyl.ums.service.MemberCartService;
import cn.hutool.core.util.CharsetUtil;
import cn.hutool.crypto.SecureUtil;
import cn.hutool.crypto.symmetric.AES;
import com.cyl.manager.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 lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
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;
@Value("${aes.key}")
private String key;
@Test
public void test1() {
memberCartService.mineCartNum();
}
@Test
public void test2(){
System.out.println(smsProperties);
if (!smsProperties.getEnabled()) {
throw new RuntimeException("没有开启短信服务");
}
Map<String, String> map = new HashMap<>(1);
map.put("code", "1234");
SmsTemplate smsTemplate = new AliyunSmsTemplate(smsProperties);
Object send = smsTemplate.send("15706259078", "SMS_146125046", map);
log.info("短信发送结果:" + send);
}
@Test
public void test3(){
String content = "test中文";
AES aes = SecureUtil.aes(key.getBytes());
byte[] encrypt = aes.encrypt(content);
byte[] decrypt = aes.decrypt(encrypt);
String encryptHex = aes.encryptHex(content);
System.out.println("加密后16进制" + encryptHex);
String decryptStr = aes.decryptStr(encryptHex, CharsetUtil.CHARSET_UTF_8);
System.out.println("解密:" + decryptStr);
}
}

@ -1,7 +1,7 @@
package com.fjp.lc.test.service;
import com.cyl.h5.pojo.vo.form.WechatLoginForm;
import com.cyl.ums.service.MemberWechatService;
import com.cyl.manager.ums.service.MemberWechatService;
import com.ruoyi.RuoYiApplication;
import org.junit.Test;
import org.junit.runner.RunWith;

@ -130,6 +130,12 @@
<artifactId>javax.servlet-api</artifactId>
</dependency>
<!-- aliyun sms -->
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>dysmsapi20170525</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
</project>

@ -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);
}
}
}

@ -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;
}

@ -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

@ -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;
}

@ -0,0 +1,35 @@
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;
/**
*
* <p>
* SDK SendSmsResponse
*/
private String response;
/**
* uuid
*/
private String uuid;
}

@ -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));
}
}
}

@ -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<String, String> 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());
}
}
}

@ -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<String, String> param);
}

@ -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);
}
}

@ -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);
}
}

@ -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();
}
}

@ -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> T parseObject(String text, Class<T> clazz) {
if (StringUtils.isEmpty(text)) {
return null;
}
try {
return OBJECT_MAPPER.readValue(text, clazz);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
public static <T> T parseObject(byte[] bytes, Class<T> clazz) {
if (ArrayUtil.isEmpty(bytes)) {
return null;
}
try {
return OBJECT_MAPPER.readValue(bytes, clazz);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
public static <T> T parseObject(String text, TypeReference<T> 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<Dict> 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 <T> List<T> parseArray(String text, Class<T> 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);
}
}
}

@ -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);
}
}

@ -0,0 +1,26 @@
package com.ruoyi.common.utils;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.util.MultiValueMap;
import java.util.ArrayList;
import java.util.List;
public class ResponseUtils {
private static final String MESSAGE = "msg";
private static final String CODE = "code";
private static final String DATA = "data";
private ResponseUtils(){}
private static ResponseEntity<Object> getEntity(Object body, HttpStatus statusCode){
MultiValueMap<String, String> headers = new HttpHeaders();
List<String> contentType = new ArrayList<String>();
contentType.add("application/json;charset=utf-8");
headers.put("Content-Type", contentType);
return new ResponseEntity<Object>(body, headers, statusCode);
}
}

@ -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;
}
}

@ -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()

@ -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<String, Object> 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);
}
/**
*
*

@ -27,7 +27,7 @@ gen:
# 作者
author: zcc
# 默认生成包路径 system 需改成自己的模块名称 如 system monitor tool
packageName: com.cyl.pms
packageName: com.cyl.manager.pms
# 自动去除表前缀默认是false
autoRemovePre: true
# 表前缀(生成类名不会包含表前缀,多个用逗号分隔)

@ -0,0 +1,16 @@
package com.cyl.h5.config;
import com.cyl.manager.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;
}
}

@ -1,21 +1,18 @@
package com.cyl.h5.controller;
import com.cyl.pms.pojo.dto.MemberCartDTO;
import com.cyl.ums.convert.MemberCartConvert;
import com.cyl.ums.domain.MemberCart;
import com.cyl.ums.pojo.query.MemberCartQuery;
import com.cyl.ums.pojo.vo.form.AddMemberCartForm;
import com.cyl.ums.pojo.vo.form.UpdateMemberCartForm;
import com.cyl.ums.service.MemberCartService;
import com.cyl.manager.ums.convert.MemberCartConvert;
import com.cyl.manager.ums.domain.Member;
import com.cyl.manager.ums.domain.MemberCart;
import com.cyl.manager.ums.pojo.query.MemberCartQuery;
import com.cyl.manager.ums.pojo.vo.MemberCartVO;
import com.cyl.manager.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;
import org.springframework.data.domain.Pageable;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
import java.util.ArrayList;
import java.util.List;
@RestController
@ -51,8 +48,8 @@ public class CartController {
* @return
*/
@PostMapping("add")
public ResponseEntity<MemberCart> add(@Valid @RequestBody AddMemberCartForm form) {
return ResponseEntity.ok(memberCartService.insert(form));
public ResponseEntity<Integer> add(@RequestBody MemberCart memberCart) {
return ResponseEntity.ok(memberCartService.insert(memberCart));
}
/**
@ -61,8 +58,8 @@ public class CartController {
* @return
*/
@PostMapping("modify")
public ResponseEntity<Integer> modify(@Valid @RequestBody UpdateMemberCartForm form) {
return ResponseEntity.ok(memberCartService.update(form));
public ResponseEntity<Integer> modify(@Valid @RequestBody MemberCart memberCart) {
return ResponseEntity.ok(memberCartService.update(memberCart));
}
/**
@ -71,7 +68,7 @@ public class CartController {
* @return
*/
@DeleteMapping("remove")
public ResponseEntity<Integer> remove(@RequestBody List<Long> ids) {
public ResponseEntity<Integer> remove(@RequestBody String ids) {
return ResponseEntity.ok(memberCartService.deleteByIds(ids));
}
@ -80,12 +77,11 @@ public class CartController {
*
* @return
*/
@PostMapping("list")
public ResponseEntity<Page<MemberCartDTO>> remove(@RequestBody MemberCartQuery query, Pageable pageable) {
List<MemberCart> list = memberCartService.selectList(query, pageable);
com.github.pagehelper.Page<?> p = (com.github.pagehelper.Page<?>)list;
List<MemberCartDTO> resList = memberCartConvert.dos2Dtos(list);
memberCartService.injectSku(resList);
return ResponseEntity.ok(new PageImpl<>(resList, pageable, p.getTotal()));
@GetMapping("list")
public ResponseEntity<List<MemberCartVO>> remove() {
Member member = (Member) LocalDataUtil.getVar(Constants.MEMBER_INFO);
MemberCartQuery query = new MemberCartQuery();
query.setMemberId(member.getId());
return ResponseEntity.ok(memberCartService.selectList(query, null));
}
}

@ -1,7 +1,7 @@
package com.cyl.h5.controller;
import com.cyl.pms.domain.ProductCategory;
import com.cyl.pms.service.ProductCategoryService;
import com.cyl.manager.pms.domain.ProductCategory;
import com.cyl.manager.pms.service.ProductCategoryService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;

@ -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.manager.ums.domain.Address;
import com.cyl.manager.ums.mapper.AddressMapper;
import com.cyl.manager.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<Address> addressQueryWrapper = new QueryWrapper<>();
addressQueryWrapper.in("level", Arrays.asList(0,1,2));
List<Address> addressList = addressMapper.selectList(addressQueryWrapper);
Map<Long, List<Address>> cityMap = addressList.stream().filter(it -> it.getLevel() == 1).collect(Collectors.groupingBy(it -> it.getParentCode()));
Map<Long, List<Address>> districtMap = addressList.stream().filter(it -> it.getLevel() == 2).collect(Collectors.groupingBy(it -> it.getParentCode()));
List<AddressDTO> 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<AddressDTO> 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);
}
}

@ -0,0 +1,48 @@
package com.cyl.h5.controller;
import com.cyl.h5.service.H5MemberAddressService;
import com.cyl.manager.ums.pojo.dto.MemberAddressDTO;
import com.cyl.manager.ums.pojo.vo.MemberAddressVO;
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 {
@Autowired
private H5MemberAddressService h5MemberAddressService;
@GetMapping("/list")
public ResponseEntity<List<MemberAddressVO>> getList(){
return ResponseEntity.ok(h5MemberAddressService.selectList());
}
@GetMapping("/default")
public ResponseEntity<MemberAddressVO> getDefault(){
return ResponseEntity.ok(h5MemberAddressService.getDefault());
}
@PostMapping("/create")
public ResponseEntity<Integer> create(@RequestBody MemberAddressDTO memberAddressDTO){
return ResponseEntity.ok(h5MemberAddressService.insert(memberAddressDTO));
}
@PutMapping("/update")
public ResponseEntity<Integer> update(@RequestBody MemberAddressDTO memberAddressDTO){
return ResponseEntity.ok(h5MemberAddressService.update(memberAddressDTO));
}
@GetMapping("/{id}")
public ResponseEntity<MemberAddressVO> getInfo(@PathVariable Long id){
return ResponseEntity.ok(h5MemberAddressService.selectById(id));
}
@DeleteMapping("/{id}")
public ResponseEntity<Integer> remove(@PathVariable Long id) {
return ResponseEntity.ok(h5MemberAddressService.deleteById(id));
}
}

@ -0,0 +1,50 @@
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.manager.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("/h5")
public class H5MemberController {
@Autowired
private H5MemberService service;
@ApiOperation("会员注册")
@PostMapping("/register")
public ResponseEntity<RegisterResponse> register(@RequestBody RegisterRequest request){
return ResponseEntity.ok(service.register(request));
}
@ApiOperation("注册验证码校验手机号")
@GetMapping("/validate/{phone}")
public ResponseEntity<ValidatePhoneResponse> validate(@PathVariable String phone){
return ResponseEntity.ok(service.validate(phone));
}
@ApiOperation("手机号密码登录")
@PostMapping("/account/login")
public ResponseEntity<H5LoginResponse> accountLogin(@RequestBody String data){
return ResponseEntity.ok(service.accountLogin(data));
}
@ApiOperation("sms登录")
@PostMapping("/sms/login")
public ResponseEntity<H5LoginResponse> smsLogin(@RequestBody String data){
return ResponseEntity.ok(service.smsLogin(data));
}
@ApiOperation("获取会员信息")
@GetMapping("/member/info")
public ResponseEntity<MemberVO> getMemberInfo(){
return ResponseEntity.ok(service.getMemberInfo());
}
}

@ -0,0 +1,63 @@
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.manager.oms.pojo.vo.OrderVO;
import com.cyl.manager.oms.service.OrderService;
import com.cyl.manager.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;
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;
@RestController
@RequestMapping("/h5/order")
@Slf4j
public class H5OrderController {
@Autowired
private OrderService orderService;
@Autowired
private RedisService redisService;
@PostMapping("/add")
public ResponseEntity<Long> 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<Page<OrderVO>> queryOrderPage(@RequestBody OrderH5Query query, Pageable pageReq) {
return ResponseEntity.ok(orderService.queryOrderPage(query, pageReq));
}
@ApiOperation("下单前校验")
@PostMapping("/addOrderCheck")
public ResponseEntity<OrderCalcVO> addOrderCheck(@RequestBody OrderCreateDTO orderCreateDTO){
return ResponseEntity.ok(orderService.addOrderCheck(orderCreateDTO));
}
}

@ -2,10 +2,10 @@ package com.cyl.h5.controller;
import com.cyl.h5.pojo.dto.ProductDTO;
import com.cyl.h5.pojo.vo.ProductDetail;
import com.cyl.pms.convert.ProductConvert;
import com.cyl.pms.domain.Product;
import com.cyl.pms.pojo.query.ProductQuery;
import com.cyl.pms.service.ProductService;
import com.cyl.manager.pms.convert.ProductConvert;
import com.cyl.manager.pms.domain.Product;
import com.cyl.manager.pms.pojo.query.ProductQuery;
import com.cyl.manager.pms.service.ProductService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;
@ -28,8 +28,8 @@ public class H5ProductController {
List<Product> pageRes = productService.selectList(query, page);
return ResponseEntity.ok(new PageImpl<>(productConvert.dos2dtos(pageRes), page, ((com.github.pagehelper.Page) pageRes).getTotal()));
}
@GetMapping("/detail")
public ResponseEntity<ProductDetail> queryDetail(@RequestParam Long id) {
@GetMapping("/detail/{id}")
public ResponseEntity<ProductDetail> queryDetail(@PathVariable Long id) {
ProductDetail detail = productService.queryDetail(id);
return ResponseEntity.ok(detail);
}

@ -1,7 +1,7 @@
package com.cyl.h5.controller;
import com.cyl.h5.pojo.vo.HomeConfigVO;
import com.cyl.pms.service.ProductCategoryService;
import com.cyl.manager.pms.service.ProductCategoryService;
import com.ruoyi.system.service.ISysConfigService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;

@ -1,31 +0,0 @@
package com.cyl.h5.controller;
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 org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
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 java.util.List;
@RestController
@RequestMapping("/h5-order")
public class Order1Controller {
@Autowired
private OrderService orderService;
@PostMapping("submit")
public ResponseEntity<OrderVO> submit(@RequestBody OrderSubmitForm form) {
return ResponseEntity.ok(orderService.submit(form));
}
@PostMapping("orders")
public ResponseEntity<Page<OrderVO>> queryOrderPage(@RequestBody OrderH5Query query, Pageable pageReq) {
return ResponseEntity.ok(orderService.queryOrderPage(query, pageReq));
}
}

@ -1,8 +1,8 @@
package com.cyl.h5.controller;
import com.cyl.ums.domain.MemberAddress;
import com.cyl.ums.pojo.query.MemberAddressQuery;
import com.cyl.ums.service.MemberAddressService;
import com.cyl.manager.ums.domain.MemberAddress;
import com.cyl.manager.ums.pojo.query.MemberAddressQuery;
import com.cyl.manager.ums.service.MemberAddressService;
import com.ruoyi.common.utils.SecurityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;

@ -2,7 +2,7 @@ package com.cyl.h5.controller;
import com.cyl.external.WechatUtil;
import com.cyl.h5.pojo.vo.form.WechatLoginForm;
import com.cyl.ums.service.MemberWechatService;
import com.cyl.manager.ums.service.MemberWechatService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

@ -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;
}

@ -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<OrderProductListDTO> 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;
}

@ -0,0 +1,42 @@
package com.cyl.h5.pojo.dto;
import com.cyl.manager.pms.domain.Product;
import com.cyl.manager.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;
}

@ -0,0 +1,9 @@
package com.cyl.h5.pojo.request;
import lombok.Data;
@Data
public class H5AccountLoginRequest extends H5LoginRequest{
/** 密码 */
private String password;
}

@ -0,0 +1,9 @@
package com.cyl.h5.pojo.request;
import lombok.Data;
@Data
public class H5LoginRequest {
/** 账号即手机号 */
private String mobile;
}

@ -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;
}

@ -0,0 +1,27 @@
package com.cyl.h5.pojo.request;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
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;
}

@ -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;
}

@ -0,0 +1,9 @@
package com.cyl.h5.pojo.response;
import lombok.Data;
@Data
public class RegisterResponse {
/** token */
private String token;
}

@ -0,0 +1,11 @@
package com.cyl.h5.pojo.response;
import lombok.Data;
@Data
public class ValidatePhoneResponse {
/** 是否成功 */
private boolean ifSuccess;
/** 消息 */
private String message;
}

@ -0,0 +1,19 @@
package com.cyl.h5.pojo.vo;
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<SkuViewDTO> skuList;
@ApiModelProperty("商品总金额")
private BigDecimal productTotalAmount;
@ApiModelProperty("订单总金额")
private BigDecimal orderTotalAmount;
}

@ -1,8 +1,8 @@
package com.cyl.h5.pojo.vo;
import com.cyl.pms.domain.Brand;
import com.cyl.pms.domain.Product;
import com.cyl.pms.domain.Sku;
import com.cyl.manager.pms.domain.Brand;
import com.cyl.manager.pms.domain.Product;
import com.cyl.manager.pms.domain.Sku;
import lombok.Data;
import java.util.List;

@ -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;
}

@ -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<SkuParam> skus;
private List<OrderProductListDTO> skuList;
@Data
public static class SkuParam {
private Long skuId;

@ -0,0 +1,146 @@
package com.cyl.h5.service;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.cyl.manager.ums.domain.Member;
import com.cyl.manager.ums.domain.MemberAddress;
import com.cyl.manager.ums.mapper.MemberAddressMapper;
import com.cyl.manager.ums.pojo.dto.MemberAddressDTO;
import com.cyl.manager.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.Arrays;
import java.util.List;
import java.util.stream.Collectors;
/**
* Service
*
* @author sjm
*/
@Service
@Transactional
public class H5MemberAddressService {
@Autowired
private MemberAddressMapper memberAddressMapper;
@Value("${aes.key}")
private String aesKey;
/**
*
*
* @param id
* @return
*/
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<MemberAddressVO> selectList() {
Member member = (Member) LocalDataUtil.getVar(Constants.MEMBER_INFO);
MemberAddress memberAddress = new MemberAddress();
memberAddress.setMemberId(member.getId());
List<MemberAddress> 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 memberAddressDTO
* @return
*/
public int insert(MemberAddressDTO memberAddressDTO) {
Member member = (Member) LocalDataUtil.getVar(Constants.MEMBER_INFO);
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);
}
/**
*
*
* @param memberAddressDTO
* @return
*/
public int update(MemberAddressDTO memberAddressDTO) {
Member member = (Member) LocalDataUtil.getVar(Constants.MEMBER_INFO);
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);
}
/**
*
*
* @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 MemberAddressVO getDefault() {
Member member = (Member) LocalDataUtil.getVar(Constants.MEMBER_INFO);
QueryWrapper<MemberAddress> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("member_id",member.getId());
queryWrapper.eq("is_default",1);
List<MemberAddress> list = memberAddressMapper.selectList(queryWrapper);
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;
}
}

@ -0,0 +1,184 @@
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.manager.ums.domain.Member;
import com.cyl.manager.ums.mapper.MemberMapper;
import com.cyl.manager.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;
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;
import java.time.LocalDateTime;
import java.util.Base64;
@Service
@Slf4j
public class H5MemberService {
@Autowired
private MemberMapper memberMapper;
@Autowired
private RedisCache redisCache;
@Autowired
private TokenService tokenService;
@Value("${aes.key}")
private String aesKey;
/**
*
* @param request
* @return
*/
public RegisterResponse register(RegisterRequest request){
RegisterResponse response = new RegisterResponse();
//校验验证码
this.validateVerifyCode(request.getUuid(), request.getMobile(), request.getCode());
//创建会员
Member member = new Member();
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);
member.setGender(0);
member.setCreateTime(LocalDateTime.now());
memberMapper.insert(member);
//注册成功直接返回token了
H5LoginResponse loginResponse = getLoginResponse(member.getId());
response.setToken(loginResponse.getToken());
return response;
}
public ValidatePhoneResponse validate(String phone) {
ValidatePhoneResponse response = new ValidatePhoneResponse();
byte[] decodedBytes = Base64.getDecoder().decode(phone);
phone = new String(decodedBytes);
QueryWrapper<Member> qw = new QueryWrapper<>();
qw.eq("phone_encrypted", AesCryptoUtils.encrypt(aesKey, phone));
Member member = memberMapper.selectOne(qw);
if (member != null){
throw new RuntimeException("该手机号已被占用");
}
response.setIfSuccess(true);
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<Member> qw = new QueryWrapper<>();
qw.eq("phone_encrypted", AesCryptoUtils.encrypt(aesKey, 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<Member> qw = new QueryWrapper<>();
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);
}
//校验会员状态
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);
memberVO.setPhone(AesCryptoUtils.decrypt(aesKey, member.getPhoneEncrypted()));
return memberVO;
}
}

@ -1,4 +1,4 @@
package com.cyl.oms.controller;
package com.cyl.manager.oms.controller;
import java.util.List;
@ -21,11 +21,11 @@ import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.enums.BusinessType;
import com.cyl.oms.convert.AftersaleConvert;
import com.cyl.oms.domain.Aftersale;
import com.cyl.oms.pojo.query.AftersaleQuery;
import com.cyl.oms.service.AftersaleService;
import com.cyl.oms.pojo.vo.AftersaleVO;
import com.cyl.manager.oms.convert.AftersaleConvert;
import com.cyl.manager.oms.domain.Aftersale;
import com.cyl.manager.oms.pojo.query.AftersaleQuery;
import com.cyl.manager.oms.service.AftersaleService;
import com.cyl.manager.oms.pojo.vo.AftersaleVO;
import com.ruoyi.common.utils.poi.ExcelUtil;
/**
* Controller

@ -1,4 +1,4 @@
package com.cyl.oms.controller;
package com.cyl.manager.oms.controller;
import java.util.List;
@ -21,11 +21,11 @@ import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.enums.BusinessType;
import com.cyl.oms.convert.AftersaleItemConvert;
import com.cyl.oms.domain.AftersaleItem;
import com.cyl.oms.pojo.query.AftersaleItemQuery;
import com.cyl.oms.service.AftersaleItemService;
import com.cyl.oms.pojo.vo.AftersaleItemVO;
import com.cyl.manager.oms.convert.AftersaleItemConvert;
import com.cyl.manager.oms.domain.AftersaleItem;
import com.cyl.manager.oms.pojo.query.AftersaleItemQuery;
import com.cyl.manager.oms.service.AftersaleItemService;
import com.cyl.manager.oms.pojo.vo.AftersaleItemVO;
import com.ruoyi.common.utils.poi.ExcelUtil;
/**
* Controller

@ -1,7 +1,9 @@
package com.cyl.oms.controller;
package com.cyl.manager.oms.controller;
import java.util.List;
import com.cyl.manager.oms.pojo.request.ManagerOrderQueryRequest;
import com.cyl.manager.oms.pojo.vo.ManagerOrderVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.data.domain.PageImpl;
@ -21,11 +23,11 @@ import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.enums.BusinessType;
import com.cyl.oms.convert.OrderConvert;
import com.cyl.oms.domain.Order;
import com.cyl.oms.pojo.query.OrderQuery;
import com.cyl.oms.service.OrderService;
import com.cyl.oms.pojo.vo.OrderVO;
import com.cyl.manager.oms.convert.OrderConvert;
import com.cyl.manager.oms.domain.Order;
import com.cyl.manager.oms.pojo.query.OrderQuery;
import com.cyl.manager.oms.service.OrderService;
import com.cyl.manager.oms.pojo.vo.OrderVO;
import com.ruoyi.common.utils.poi.ExcelUtil;
/**
* Controller
@ -45,8 +47,8 @@ public class OrderController extends BaseController {
@ApiOperation("查询订单表列表")
@PreAuthorize("@ss.hasPermi('oms:order:list')")
@PostMapping("/list")
public ResponseEntity<Page<Order>> list(@RequestBody OrderQuery query, Pageable page) {
List<Order> list = service.selectList(query, page);
public ResponseEntity<Page<ManagerOrderVO>> list(@RequestBody ManagerOrderQueryRequest query, Pageable page) {
List<ManagerOrderVO> list = service.selectList(query, page);
return ResponseEntity.ok(new PageImpl<>(list, page, ((com.github.pagehelper.Page)list).getTotal()));
}
@ -55,9 +57,10 @@ public class OrderController extends BaseController {
@Log(title = "订单表", businessType = BusinessType.EXPORT)
@GetMapping("/export")
public ResponseEntity<String> export(OrderQuery query) {
List<Order> list = service.selectList(query, null);
ExcelUtil<OrderVO> util = new ExcelUtil<>(OrderVO.class);
return ResponseEntity.ok(util.writeExcel(convert.dos2vos(list), "订单表数据"));
// List<Order> list = service.selectList(query, null);
// ExcelUtil<OrderVO> util = new ExcelUtil<>(OrderVO.class);
// return ResponseEntity.ok(util.writeExcel(convert.dos2vos(list), "订单表数据"));
return null;
}
@ApiOperation("获取订单表详细信息")

@ -1,4 +1,4 @@
package com.cyl.oms.controller;
package com.cyl.manager.oms.controller;
import java.util.List;
@ -21,11 +21,11 @@ import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.enums.BusinessType;
import com.cyl.oms.convert.OrderDeliveryHistoryConvert;
import com.cyl.oms.domain.OrderDeliveryHistory;
import com.cyl.oms.pojo.query.OrderDeliveryHistoryQuery;
import com.cyl.oms.service.OrderDeliveryHistoryService;
import com.cyl.oms.pojo.vo.OrderDeliveryHistoryVO;
import com.cyl.manager.oms.convert.OrderDeliveryHistoryConvert;
import com.cyl.manager.oms.domain.OrderDeliveryHistory;
import com.cyl.manager.oms.pojo.query.OrderDeliveryHistoryQuery;
import com.cyl.manager.oms.service.OrderDeliveryHistoryService;
import com.cyl.manager.oms.pojo.vo.OrderDeliveryHistoryVO;
import com.ruoyi.common.utils.poi.ExcelUtil;
/**
* Controller

@ -1,4 +1,4 @@
package com.cyl.oms.controller;
package com.cyl.manager.oms.controller;
import java.util.List;
@ -21,11 +21,11 @@ import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.enums.BusinessType;
import com.cyl.oms.convert.OrderItemConvert;
import com.cyl.oms.domain.OrderItem;
import com.cyl.oms.pojo.query.OrderItemQuery;
import com.cyl.oms.service.OrderItemService;
import com.cyl.oms.pojo.vo.OrderItemVO;
import com.cyl.manager.oms.convert.OrderItemConvert;
import com.cyl.manager.oms.domain.OrderItem;
import com.cyl.manager.oms.pojo.query.OrderItemQuery;
import com.cyl.manager.oms.service.OrderItemService;
import com.cyl.manager.oms.pojo.vo.OrderItemVO;
import com.ruoyi.common.utils.poi.ExcelUtil;
/**
* Controller

@ -1,4 +1,4 @@
package com.cyl.oms.controller;
package com.cyl.manager.oms.controller;
import java.util.List;
@ -21,11 +21,11 @@ import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.enums.BusinessType;
import com.cyl.oms.convert.OrderOperateHistoryConvert;
import com.cyl.oms.domain.OrderOperateHistory;
import com.cyl.oms.pojo.query.OrderOperateHistoryQuery;
import com.cyl.oms.service.OrderOperateHistoryService;
import com.cyl.oms.pojo.vo.OrderOperateHistoryVO;
import com.cyl.manager.oms.convert.OrderOperateHistoryConvert;
import com.cyl.manager.oms.domain.OrderOperateHistory;
import com.cyl.manager.oms.pojo.query.OrderOperateHistoryQuery;
import com.cyl.manager.oms.service.OrderOperateHistoryService;
import com.cyl.manager.oms.pojo.vo.OrderOperateHistoryVO;
import com.ruoyi.common.utils.poi.ExcelUtil;
/**
* Controller

@ -1,8 +1,8 @@
package com.cyl.oms.convert;
package com.cyl.manager.oms.convert;
import org.mapstruct.Mapper;
import com.cyl.oms.domain.Aftersale;
import com.cyl.oms.pojo.vo.AftersaleVO;
import com.cyl.manager.oms.domain.Aftersale;
import com.cyl.manager.oms.pojo.vo.AftersaleVO;
import java.util.List;
/**
* DO <=> DTO <=> VO / BO / Query

@ -1,8 +1,8 @@
package com.cyl.oms.convert;
package com.cyl.manager.oms.convert;
import org.mapstruct.Mapper;
import com.cyl.oms.domain.AftersaleItem;
import com.cyl.oms.pojo.vo.AftersaleItemVO;
import com.cyl.manager.oms.domain.AftersaleItem;
import com.cyl.manager.oms.pojo.vo.AftersaleItemVO;
import java.util.List;
/**
* DO <=> DTO <=> VO / BO / Query

@ -1,8 +1,8 @@
package com.cyl.oms.convert;
package com.cyl.manager.oms.convert;
import org.mapstruct.Mapper;
import com.cyl.oms.domain.Order;
import com.cyl.oms.pojo.vo.OrderVO;
import com.cyl.manager.oms.domain.Order;
import com.cyl.manager.oms.pojo.vo.OrderVO;
import java.util.List;
/**
* DO <=> DTO <=> VO / BO / Query

@ -1,8 +1,8 @@
package com.cyl.oms.convert;
package com.cyl.manager.oms.convert;
import org.mapstruct.Mapper;
import com.cyl.oms.domain.OrderDeliveryHistory;
import com.cyl.oms.pojo.vo.OrderDeliveryHistoryVO;
import com.cyl.manager.oms.domain.OrderDeliveryHistory;
import com.cyl.manager.oms.pojo.vo.OrderDeliveryHistoryVO;
import java.util.List;
/**
* DO <=> DTO <=> VO / BO / Query

@ -1,8 +1,8 @@
package com.cyl.oms.convert;
package com.cyl.manager.oms.convert;
import org.mapstruct.Mapper;
import com.cyl.oms.domain.OrderItem;
import com.cyl.oms.pojo.vo.OrderItemVO;
import com.cyl.manager.oms.domain.OrderItem;
import com.cyl.manager.oms.pojo.vo.OrderItemVO;
import java.util.List;
/**
* DO <=> DTO <=> VO / BO / Query

@ -1,8 +1,8 @@
package com.cyl.oms.convert;
package com.cyl.manager.oms.convert;
import org.mapstruct.Mapper;
import com.cyl.oms.domain.OrderOperateHistory;
import com.cyl.oms.pojo.vo.OrderOperateHistoryVO;
import com.cyl.manager.oms.domain.OrderOperateHistory;
import com.cyl.manager.oms.pojo.vo.OrderOperateHistoryVO;
import java.util.List;
/**
* DO <=> DTO <=> VO / BO / Query

@ -1,4 +1,4 @@
package com.cyl.oms.domain;
package com.cyl.manager.oms.domain;
import java.math.BigDecimal;
import java.time.LocalDateTime;

@ -1,4 +1,4 @@
package com.cyl.oms.domain;
package com.cyl.manager.oms.domain;
import java.math.BigDecimal;
import com.ruoyi.common.annotation.Excel;

@ -1,7 +1,10 @@
package com.cyl.oms.domain;
package com.cyl.manager.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")

@ -1,4 +1,4 @@
package com.cyl.oms.domain;
package com.cyl.manager.oms.domain;
import com.ruoyi.common.annotation.Excel;
import io.swagger.annotations.ApiModel;

@ -1,6 +1,9 @@
package com.cyl.oms.domain;
package com.cyl.manager.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")

@ -1,4 +1,4 @@
package com.cyl.oms.domain;
package com.cyl.manager.oms.domain;
import com.ruoyi.common.annotation.Excel;
import io.swagger.annotations.ApiModel;

@ -1,9 +1,8 @@
package com.cyl.oms.mapper;
package com.cyl.manager.oms.mapper;
import java.util.List;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
import com.cyl.oms.domain.AftersaleItem;
import com.cyl.manager.oms.domain.AftersaleItem;
/**
* Mapper

@ -1,9 +1,8 @@
package com.cyl.oms.mapper;
package com.cyl.manager.oms.mapper;
import java.util.List;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
import com.cyl.oms.domain.Aftersale;
import com.cyl.manager.oms.domain.Aftersale;
/**
* Mapper

@ -1,9 +1,8 @@
package com.cyl.oms.mapper;
package com.cyl.manager.oms.mapper;
import java.util.List;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
import com.cyl.oms.domain.OrderDeliveryHistory;
import com.cyl.manager.oms.domain.OrderDeliveryHistory;
/**
* Mapper

@ -1,9 +1,8 @@
package com.cyl.oms.mapper;
package com.cyl.manager.oms.mapper;
import java.util.List;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
import com.cyl.oms.domain.OrderItem;
import com.cyl.manager.oms.domain.OrderItem;
/**
* Mapper

@ -1,9 +1,10 @@
package com.cyl.oms.mapper;
package com.cyl.manager.oms.mapper;
import java.util.List;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
import com.cyl.oms.domain.Order;
import com.cyl.manager.oms.domain.Order;
import com.cyl.manager.oms.pojo.request.ManagerOrderQueryRequest;
import com.cyl.manager.oms.pojo.vo.ManagerOrderVO;
/**
* Mapper
@ -18,4 +19,6 @@ public interface OrderMapper extends BaseMapper<Order> {
* @return
*/
List<Order> selectByEntity(Order order);
List<ManagerOrderVO> selectManagerOrderPage(ManagerOrderQueryRequest request);
}

@ -1,9 +1,8 @@
package com.cyl.oms.mapper;
package com.cyl.manager.oms.mapper;
import java.util.List;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
import com.cyl.oms.domain.OrderOperateHistory;
import com.cyl.manager.oms.domain.OrderOperateHistory;
/**
* Mapper

@ -0,0 +1,4 @@
package com.cyl.manager.oms.pojo.dto;
public class SaveOrderItemDTO {
}

@ -1,4 +1,4 @@
package com.cyl.oms.pojo.query;
package com.cyl.manager.oms.pojo.query;
import java.math.BigDecimal;
import lombok.Data;

@ -1,4 +1,4 @@
package com.cyl.oms.pojo.query;
package com.cyl.manager.oms.pojo.query;
import java.math.BigDecimal;
import java.time.LocalDateTime;

@ -1,4 +1,4 @@
package com.cyl.oms.pojo.query;
package com.cyl.manager.oms.pojo.query;
import lombok.Data;
import io.swagger.annotations.ApiModel;

@ -1,4 +1,4 @@
package com.cyl.oms.pojo.query;
package com.cyl.manager.oms.pojo.query;
import java.math.BigDecimal;
import lombok.Data;

@ -1,4 +1,4 @@
package com.cyl.oms.pojo.query;
package com.cyl.manager.oms.pojo.query;
import lombok.Data;
import io.swagger.annotations.ApiModel;

@ -1,4 +1,4 @@
package com.cyl.oms.pojo.query;
package com.cyl.manager.oms.pojo.query;
import java.math.BigDecimal;
import java.time.LocalDateTime;
@ -98,4 +98,9 @@ public class OrderQuery {
@ApiModelProperty("确认收货时间 精确匹配")
private LocalDateTime receiveTime;
@ApiModelProperty("创建订单开始时间")
private LocalDateTime startTime;
@ApiModelProperty("创建订单结束时间")
private LocalDateTime endTime;
}

@ -0,0 +1,50 @@
package com.cyl.manager.oms.pojo.request;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
@Data
@ApiModel("后台订单查询请求体")
public class ManagerOrderQueryRequest {
@ApiModelProperty(name = "orderId", value = "订单id", required = true, dataType = "String")
private Long orderId;
@ApiModelProperty(name = "productId", value = "商品id", required = true, dataType = "Long")
private Long productId;
@ApiModelProperty(name = "productName", value = "商品名称", required = true, dataType = "String")
private String productName;
@ApiModelProperty(name = "userPhone", value = "用户名称(手机号)", required = true, dataType = "String")
private String userPhone;
@ApiModelProperty(name = "payType", value = "支付方式 0->未支付1->支付宝2->微信", required = true, dataType = "Integer")
private Integer payType;
@ApiModelProperty(name = "status", value = "订单状态0->待付款1->待发货2->已发货3->已完成4->已关闭5->无效订单", required = true, dataType = "String")
private Integer status;
@ApiModelProperty("省份/直辖市id 精确匹配")
private Long receiverProvinceId;
@ApiModelProperty("城市id 精确匹配")
private Long receiverCityId;
@ApiModelProperty("区id 精确匹配")
private Long receiverDistrictId;
@ApiModelProperty(name = "startTime", value = "开始时间", required = true, dataType = "Date")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date startTime;
@ApiModelProperty(name = "endTime", value = "结束时间", required = true, dataType = "Date")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date endTime;
}

@ -1,8 +1,7 @@
package com.cyl.oms.pojo.vo;
package com.cyl.manager.oms.pojo.vo;
import java.math.BigDecimal;
import com.ruoyi.common.annotation.Excel;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.common.core.domain.BaseAudit;
import lombok.Data;
/**

@ -1,4 +1,4 @@
package com.cyl.oms.pojo.vo;
package com.cyl.manager.oms.pojo.vo;
import java.math.BigDecimal;
import java.time.LocalDateTime;

@ -0,0 +1,81 @@
package com.cyl.manager.oms.pojo.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
@Data
@ApiModel(value = "管理后台订单VO")
public class ManagerOrderVO {
@ApiModelProperty(name = "id",value = "订单id",required = true,dataType = "String")
private String id;
@ApiModelProperty(name = "productId",value = "商品id",required = true,dataType = "Long")
private Long productId;
@ApiModelProperty(name = "productName",value = "商品名称",required = true,dataType = "String")
private String productName;
@ApiModelProperty(name = "userPhone",value = "用户账号",required = true,dataType = "String")
private String userPhone;
@ApiModelProperty(name = "nickName",value = "用户昵称",required = true,dataType = "String")
private String nickName;
@ApiModelProperty(name = "avatar",value = "用户头像",required = true,dataType = "String")
private String avatar;
@ApiModelProperty(name = "status",value = "订单状态0->待付款1->待发货2->已发货3->已完成4->已关闭5->无效订单",required = true,dataType = "Integer")
private Integer status;
@ApiModelProperty("退款状态枚举值1无售后或售后关闭2售后处理中3退款中4 退款成功")
private Integer aftersaleStatus;
@ApiModelProperty(name = "pic",value = "商品图片",required = true,dataType = "String")
private String pic;
@ApiModelProperty(name = "userName",value = "用户名称",required = true,dataType = "String")
private String userName;
@ApiModelProperty(name = "buyNum",value = "购买数量",required = true,dataType = "Integer")
private Integer buyNum;
@ApiModelProperty(name = "totalAmount",value = "订单总金额",required = true,dataType = "BigDecimal")
private BigDecimal totalAmount;
@ApiModelProperty(name = "payAmount",value = "应付金额",required = true,dataType = "BigDecimal")
private BigDecimal payAmount;
@ApiModelProperty(name = "createTime",value = "下单时间",required = true,dataType = "Date")
private Date createTime;
@ApiModelProperty(name = "payTime",value = "支付时间",required = true,dataType = "Date")
private Date payTime;
@ApiModelProperty(name = "payType",value = "支付方式 支付方式0->未支付1->支付宝2->微信",required = true,dataType = "Integer")
private Integer payType;
@ApiModelProperty(name = "receiveTime",value = "确认收货时间",required = true,dataType = "Date")
private Date receiveTime;
@ApiModelProperty(name = "note",value = "备注",required = true,dataType = "String")
private String note;
@ApiModelProperty(name = "spData",value = "商品sku属性",required = true,dataType = "String")
private String spData;
private String receiverName;
private String receiverPhone;
private String receiverProvince;
private String receiverCity;
private String receiverDistrict;
private String receiverDetailAddress;
}

@ -1,7 +1,6 @@
package com.cyl.oms.pojo.vo;
package com.cyl.manager.oms.pojo.vo;
import com.ruoyi.common.annotation.Excel;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.common.core.domain.BaseAudit;
import lombok.Data;
/**

@ -1,8 +1,7 @@
package com.cyl.oms.pojo.vo;
package com.cyl.manager.oms.pojo.vo;
import java.math.BigDecimal;
import com.ruoyi.common.annotation.Excel;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.common.core.domain.BaseAudit;
import lombok.Data;
/**

@ -1,7 +1,6 @@
package com.cyl.oms.pojo.vo;
package com.cyl.manager.oms.pojo.vo;
import com.ruoyi.common.annotation.Excel;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.common.core.domain.BaseAudit;
import lombok.Data;
/**

@ -1,12 +1,10 @@
package com.cyl.oms.pojo.vo;
package com.cyl.manager.oms.pojo.vo;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
import com.cyl.oms.domain.OrderItem;
import com.cyl.pay.domain.PayOrder;
import com.cyl.pay.pojo.vo.PayOrderVO;
import com.cyl.manager.oms.domain.OrderItem;
import com.ruoyi.common.annotation.Excel;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.common.core.domain.BaseAudit;
@ -108,5 +106,4 @@ public class OrderVO extends BaseAudit {
@Excel(name = "确认收货时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime receiveTime;
private List<OrderItem> items;
private PayOrderVO payOrder;
}

@ -1,18 +1,16 @@
package com.cyl.oms.service;
package com.cyl.manager.oms.service;
import java.math.BigDecimal;
import java.util.Arrays;
import java.util.List;
import java.time.LocalDateTime;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.github.pagehelper.PageHelper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Pageable;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import com.cyl.oms.mapper.AftersaleItemMapper;
import com.cyl.oms.domain.AftersaleItem;
import com.cyl.oms.pojo.query.AftersaleItemQuery;
import com.cyl.manager.oms.mapper.AftersaleItemMapper;
import com.cyl.manager.oms.domain.AftersaleItem;
import com.cyl.manager.oms.pojo.query.AftersaleItemQuery;
/**
* Service

@ -1,19 +1,18 @@
package com.cyl.oms.service;
package com.cyl.manager.oms.service;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.List;
import java.time.LocalDateTime;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.github.pagehelper.PageHelper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Pageable;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import com.cyl.oms.mapper.AftersaleMapper;
import com.cyl.oms.domain.Aftersale;
import com.cyl.oms.pojo.query.AftersaleQuery;
import com.cyl.manager.oms.mapper.AftersaleMapper;
import com.cyl.manager.oms.domain.Aftersale;
import com.cyl.manager.oms.pojo.query.AftersaleQuery;
/**
* Service

@ -1,6 +1,5 @@
package com.cyl.oms.service;
package com.cyl.manager.oms.service;
import java.util.Arrays;
import java.util.List;
import java.time.LocalDateTime;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@ -9,9 +8,9 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Pageable;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import com.cyl.oms.mapper.OrderDeliveryHistoryMapper;
import com.cyl.oms.domain.OrderDeliveryHistory;
import com.cyl.oms.pojo.query.OrderDeliveryHistoryQuery;
import com.cyl.manager.oms.mapper.OrderDeliveryHistoryMapper;
import com.cyl.manager.oms.domain.OrderDeliveryHistory;
import com.cyl.manager.oms.pojo.query.OrderDeliveryHistoryQuery;
/**
* Service

@ -1,18 +1,23 @@
package com.cyl.oms.service;
package com.cyl.manager.oms.service;
import java.math.BigDecimal;
import java.util.Arrays;
import java.util.ArrayList;
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.manager.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;
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 com.cyl.manager.oms.mapper.OrderItemMapper;
import com.cyl.manager.oms.domain.OrderItem;
import com.cyl.manager.oms.pojo.query.OrderItemQuery;
import org.springframework.transaction.annotation.Transactional;
/**
* Service
@ -21,7 +26,7 @@ import com.cyl.oms.pojo.query.OrderItemQuery;
* @author zcc
*/
@Service
public class OrderItemService {
public class OrderItemService extends ServiceImpl<OrderItemMapper, OrderItem> {
@Autowired
private OrderItemMapper orderItemMapper;
@ -136,4 +141,32 @@ public class OrderItemService {
public int deleteById(Long id) {
return orderItemMapper.deleteById(id);
}
@Transactional
public void saveOrderItem(Member member, LocalDateTime optTime,
Long orderId, List<OrderProductListDTO> list){
List<OrderItem> 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失败");
}
}
}

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save