commit cb862d512f6db92e1fca19e3f388270b193768c6 Author: Sun. <1196069847@qq.com> Date: Wed Nov 13 08:59:04 2024 +0800 提交 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3df42cc --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +**/target/ +.idea +*.iml +*.class +*Test.java +**/test/ \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..b10da2e --- /dev/null +++ b/pom.xml @@ -0,0 +1,127 @@ + + + 4.0.0 + + spring-boot-starter-parent + org.springframework.boot + 2.7.3 + + com.sky + sky-take-out + pom + 1.0-SNAPSHOT + + sky-common + sky-pojo + sky-server + + + 2.2.0 + 1.18.20 + 1.2.76 + 2.6 + 1.2.1 + 1.3.0 + 3.10.2 + 3.0.2 + 1.9.4 + 0.9.1 + 2.3.1 + 3.16 + + + + + org.mybatis.spring.boot + mybatis-spring-boot-starter + ${mybatis.spring} + + + + org.projectlombok + lombok + ${lombok} + + + + com.alibaba + fastjson + ${fastjson} + + + + commons-lang + commons-lang + ${commons.lang} + + + + com.alibaba + druid-spring-boot-starter + ${druid} + + + + com.github.pagehelper + pagehelper-spring-boot-starter + ${pagehelper} + + + + com.github.xiaoymin + knife4j-spring-boot-starter + ${knife4j} + + + + org.aspectj + aspectjrt + ${aspectj} + + + + org.aspectj + aspectjweaver + ${aspectj} + + + + io.jsonwebtoken + jjwt + ${jjwt} + + + + com.aliyun.oss + aliyun-sdk-oss + ${aliyun.sdk.oss} + + + + javax.xml.bind + jaxb-api + ${jaxb-api} + + + + + org.apache.poi + poi + ${poi} + + + org.apache.poi + poi-ooxml + ${poi} + + + + com.github.wechatpay-apiv3 + wechatpay-apache-httpclient + 0.4.8 + + + + diff --git a/sky-common/pom.xml b/sky-common/pom.xml new file mode 100644 index 0000000..3a374b4 --- /dev/null +++ b/sky-common/pom.xml @@ -0,0 +1,53 @@ + + + + sky-take-out + com.sky + 1.0-SNAPSHOT + + 4.0.0 + sky-common + + + org.projectlombok + lombok + + + com.alibaba + fastjson + + + commons-lang + commons-lang + + + org.springframework.boot + spring-boot-starter-json + + + io.jsonwebtoken + jjwt + + + + org.springframework.boot + spring-boot-configuration-processor + true + + + com.aliyun.oss + aliyun-sdk-oss + + + javax.xml.bind + jaxb-api + + + + com.github.wechatpay-apiv3 + wechatpay-apache-httpclient + + + diff --git a/sky-common/src/main/java/com/sky/constant/AutoFillConstant.java b/sky-common/src/main/java/com/sky/constant/AutoFillConstant.java new file mode 100644 index 0000000..7d5caf1 --- /dev/null +++ b/sky-common/src/main/java/com/sky/constant/AutoFillConstant.java @@ -0,0 +1,14 @@ +package com.sky.constant; + +/** + * 公共字段自动填充相关常量 + */ +public class AutoFillConstant { + /** + * 实体类中的方法名称 + */ + public static final String SET_CREATE_TIME = "setCreateTime"; + public static final String SET_UPDATE_TIME = "setUpdateTime"; + public static final String SET_CREATE_USER = "setCreateUser"; + public static final String SET_UPDATE_USER = "setUpdateUser"; +} diff --git a/sky-common/src/main/java/com/sky/constant/JwtClaimsConstant.java b/sky-common/src/main/java/com/sky/constant/JwtClaimsConstant.java new file mode 100644 index 0000000..ae2507e --- /dev/null +++ b/sky-common/src/main/java/com/sky/constant/JwtClaimsConstant.java @@ -0,0 +1,11 @@ +package com.sky.constant; + +public class JwtClaimsConstant { + + public static final String EMP_ID = "empId"; + public static final String USER_ID = "userId"; + public static final String PHONE = "phone"; + public static final String USERNAME = "username"; + public static final String NAME = "name"; + +} diff --git a/sky-common/src/main/java/com/sky/constant/MessageConstant.java b/sky-common/src/main/java/com/sky/constant/MessageConstant.java new file mode 100644 index 0000000..9372410 --- /dev/null +++ b/sky-common/src/main/java/com/sky/constant/MessageConstant.java @@ -0,0 +1,28 @@ +package com.sky.constant; + +/** + * 信息提示常量类 + */ +public class MessageConstant { + + public static final String PASSWORD_ERROR = "密码错误"; + public static final String ACCOUNT_NOT_FOUND = "账号不存在"; + public static final String ACCOUNT_LOCKED = "账号被锁定"; + public static final String UNKNOWN_ERROR = "未知错误"; + public static final String USER_NOT_LOGIN = "用户未登录"; + public static final String CATEGORY_BE_RELATED_BY_SETMEAL = "当前分类关联了套餐,不能删除"; + public static final String CATEGORY_BE_RELATED_BY_DISH = "当前分类关联了菜品,不能删除"; + public static final String SHOPPING_CART_IS_NULL = "购物车数据为空,不能下单"; + public static final String ADDRESS_BOOK_IS_NULL = "用户地址为空,不能下单"; + public static final String LOGIN_FAILED = "登录失败"; + public static final String UPLOAD_FAILED = "文件上传失败"; + public static final String SETMEAL_ENABLE_FAILED = "套餐内包含未启售菜品,无法启售"; + public static final String PASSWORD_EDIT_FAILED = "密码修改失败"; + public static final String DISH_ON_SALE = "起售中的菜品不能删除"; + public static final String SETMEAL_ON_SALE = "起售中的套餐不能删除"; + public static final String DISH_BE_RELATED_BY_SETMEAL = "当前菜品关联了套餐,不能删除"; + public static final String ORDER_STATUS_ERROR = "订单状态错误"; + public static final String ORDER_NOT_FOUND = "订单不存在"; + + public static final String ALREADY_EXISTS = "已存在"; +} diff --git a/sky-common/src/main/java/com/sky/constant/PasswordConstant.java b/sky-common/src/main/java/com/sky/constant/PasswordConstant.java new file mode 100644 index 0000000..752f81c --- /dev/null +++ b/sky-common/src/main/java/com/sky/constant/PasswordConstant.java @@ -0,0 +1,10 @@ +package com.sky.constant; + +/** + * 密码常量 + */ +public class PasswordConstant { + + public static final String DEFAULT_PASSWORD = "123456"; + +} diff --git a/sky-common/src/main/java/com/sky/constant/StatusConstant.java b/sky-common/src/main/java/com/sky/constant/StatusConstant.java new file mode 100644 index 0000000..e575372 --- /dev/null +++ b/sky-common/src/main/java/com/sky/constant/StatusConstant.java @@ -0,0 +1,13 @@ +package com.sky.constant; + +/** + * 状态常量,启用或者禁用 + */ +public class StatusConstant { + + //启用 + public static final Integer ENABLE = 1; + + //禁用 + public static final Integer DISABLE = 0; +} diff --git a/sky-common/src/main/java/com/sky/context/BaseContext.java b/sky-common/src/main/java/com/sky/context/BaseContext.java new file mode 100644 index 0000000..f76b305 --- /dev/null +++ b/sky-common/src/main/java/com/sky/context/BaseContext.java @@ -0,0 +1,19 @@ +package com.sky.context; + +public class BaseContext { + + public static ThreadLocal threadLocal = new ThreadLocal<>(); + + public static void setCurrentId(Long id) { + threadLocal.set(id); + } + + public static Long getCurrentId() { + return threadLocal.get(); + } + + public static void removeCurrentId() { + threadLocal.remove(); + } + +} diff --git a/sky-common/src/main/java/com/sky/enumeration/OperationType.java b/sky-common/src/main/java/com/sky/enumeration/OperationType.java new file mode 100644 index 0000000..99e5795 --- /dev/null +++ b/sky-common/src/main/java/com/sky/enumeration/OperationType.java @@ -0,0 +1,18 @@ +package com.sky.enumeration; + +/** + * 数据库操作类型 + */ +public enum OperationType { + + /** + * 更新操作 + */ + UPDATE, + + /** + * 插入操作 + */ + INSERT + +} diff --git a/sky-common/src/main/java/com/sky/exception/AccountLockedException.java b/sky-common/src/main/java/com/sky/exception/AccountLockedException.java new file mode 100644 index 0000000..ded9040 --- /dev/null +++ b/sky-common/src/main/java/com/sky/exception/AccountLockedException.java @@ -0,0 +1,15 @@ +package com.sky.exception; + +/** + * 账号被锁定异常 + */ +public class AccountLockedException extends BaseException { + + public AccountLockedException() { + } + + public AccountLockedException(String msg) { + super(msg); + } + +} diff --git a/sky-common/src/main/java/com/sky/exception/AccountNotFoundException.java b/sky-common/src/main/java/com/sky/exception/AccountNotFoundException.java new file mode 100644 index 0000000..147f9f7 --- /dev/null +++ b/sky-common/src/main/java/com/sky/exception/AccountNotFoundException.java @@ -0,0 +1,15 @@ +package com.sky.exception; + +/** + * 账号不存在异常 + */ +public class AccountNotFoundException extends BaseException { + + public AccountNotFoundException() { + } + + public AccountNotFoundException(String msg) { + super(msg); + } + +} diff --git a/sky-common/src/main/java/com/sky/exception/AddressBookBusinessException.java b/sky-common/src/main/java/com/sky/exception/AddressBookBusinessException.java new file mode 100644 index 0000000..a8ce784 --- /dev/null +++ b/sky-common/src/main/java/com/sky/exception/AddressBookBusinessException.java @@ -0,0 +1,9 @@ +package com.sky.exception; + +public class AddressBookBusinessException extends BaseException { + + public AddressBookBusinessException(String msg) { + super(msg); + } + +} diff --git a/sky-common/src/main/java/com/sky/exception/BaseException.java b/sky-common/src/main/java/com/sky/exception/BaseException.java new file mode 100644 index 0000000..572801b --- /dev/null +++ b/sky-common/src/main/java/com/sky/exception/BaseException.java @@ -0,0 +1,15 @@ +package com.sky.exception; + +/** + * 业务异常 + */ +public class BaseException extends RuntimeException { + + public BaseException() { + } + + public BaseException(String msg) { + super(msg); + } + +} diff --git a/sky-common/src/main/java/com/sky/exception/DeletionNotAllowedException.java b/sky-common/src/main/java/com/sky/exception/DeletionNotAllowedException.java new file mode 100644 index 0000000..126c3b3 --- /dev/null +++ b/sky-common/src/main/java/com/sky/exception/DeletionNotAllowedException.java @@ -0,0 +1,9 @@ +package com.sky.exception; + +public class DeletionNotAllowedException extends BaseException { + + public DeletionNotAllowedException(String msg) { + super(msg); + } + +} diff --git a/sky-common/src/main/java/com/sky/exception/LoginFailedException.java b/sky-common/src/main/java/com/sky/exception/LoginFailedException.java new file mode 100644 index 0000000..6aa80a6 --- /dev/null +++ b/sky-common/src/main/java/com/sky/exception/LoginFailedException.java @@ -0,0 +1,10 @@ +package com.sky.exception; + +/** + * 登录失败 + */ +public class LoginFailedException extends BaseException{ + public LoginFailedException(String msg){ + super(msg); + } +} diff --git a/sky-common/src/main/java/com/sky/exception/OrderBusinessException.java b/sky-common/src/main/java/com/sky/exception/OrderBusinessException.java new file mode 100644 index 0000000..b4221b8 --- /dev/null +++ b/sky-common/src/main/java/com/sky/exception/OrderBusinessException.java @@ -0,0 +1,9 @@ +package com.sky.exception; + +public class OrderBusinessException extends BaseException { + + public OrderBusinessException(String msg) { + super(msg); + } + +} diff --git a/sky-common/src/main/java/com/sky/exception/PasswordEditFailedException.java b/sky-common/src/main/java/com/sky/exception/PasswordEditFailedException.java new file mode 100644 index 0000000..adf47d9 --- /dev/null +++ b/sky-common/src/main/java/com/sky/exception/PasswordEditFailedException.java @@ -0,0 +1,12 @@ +package com.sky.exception; + +/** + * 密码修改失败异常 + */ +public class PasswordEditFailedException extends BaseException{ + + public PasswordEditFailedException(String msg){ + super(msg); + } + +} diff --git a/sky-common/src/main/java/com/sky/exception/PasswordErrorException.java b/sky-common/src/main/java/com/sky/exception/PasswordErrorException.java new file mode 100644 index 0000000..c0f150d --- /dev/null +++ b/sky-common/src/main/java/com/sky/exception/PasswordErrorException.java @@ -0,0 +1,15 @@ +package com.sky.exception; + +/** + * 密码错误异常 + */ +public class PasswordErrorException extends BaseException { + + public PasswordErrorException() { + } + + public PasswordErrorException(String msg) { + super(msg); + } + +} diff --git a/sky-common/src/main/java/com/sky/exception/SetmealEnableFailedException.java b/sky-common/src/main/java/com/sky/exception/SetmealEnableFailedException.java new file mode 100644 index 0000000..a9925ba --- /dev/null +++ b/sky-common/src/main/java/com/sky/exception/SetmealEnableFailedException.java @@ -0,0 +1,13 @@ +package com.sky.exception; + +/** + * 套餐启用失败异常 + */ +public class SetmealEnableFailedException extends BaseException { + + public SetmealEnableFailedException(){} + + public SetmealEnableFailedException(String msg){ + super(msg); + } +} diff --git a/sky-common/src/main/java/com/sky/exception/ShoppingCartBusinessException.java b/sky-common/src/main/java/com/sky/exception/ShoppingCartBusinessException.java new file mode 100644 index 0000000..7f05e20 --- /dev/null +++ b/sky-common/src/main/java/com/sky/exception/ShoppingCartBusinessException.java @@ -0,0 +1,9 @@ +package com.sky.exception; + +public class ShoppingCartBusinessException extends BaseException { + + public ShoppingCartBusinessException(String msg) { + super(msg); + } + +} diff --git a/sky-common/src/main/java/com/sky/exception/UserNotLoginException.java b/sky-common/src/main/java/com/sky/exception/UserNotLoginException.java new file mode 100644 index 0000000..746b557 --- /dev/null +++ b/sky-common/src/main/java/com/sky/exception/UserNotLoginException.java @@ -0,0 +1,12 @@ +package com.sky.exception; + +public class UserNotLoginException extends BaseException { + + public UserNotLoginException() { + } + + public UserNotLoginException(String msg) { + super(msg); + } + +} diff --git a/sky-common/src/main/java/com/sky/json/JacksonObjectMapper.java b/sky-common/src/main/java/com/sky/json/JacksonObjectMapper.java new file mode 100644 index 0000000..c181eda --- /dev/null +++ b/sky-common/src/main/java/com/sky/json/JacksonObjectMapper.java @@ -0,0 +1,51 @@ +package com.sky.json; + +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.module.SimpleModule; +import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer; +import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; +import com.fasterxml.jackson.datatype.jsr310.deser.LocalTimeDeserializer; +import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer; +import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; +import com.fasterxml.jackson.datatype.jsr310.ser.LocalTimeSerializer; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; + +import static com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES; + +/** + * 对象映射器:基于jackson将Java对象转为json,或者将json转为Java对象 + * 将JSON解析为Java对象的过程称为 [从JSON反序列化Java对象] + * 从Java对象生成JSON的过程称为 [序列化Java对象到JSON] + */ +public class JacksonObjectMapper extends ObjectMapper { + + public static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd"; + //public static final String DEFAULT_DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss"; + public static final String DEFAULT_DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm"; + public static final String DEFAULT_TIME_FORMAT = "HH:mm:ss"; + + public JacksonObjectMapper() { + super(); + //收到未知属性时不报异常 + this.configure(FAIL_ON_UNKNOWN_PROPERTIES, false); + + //反序列化时,属性不存在的兼容处理 + this.getDeserializationConfig().withoutFeatures(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); + + SimpleModule simpleModule = new SimpleModule() + .addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT))) + .addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT))) + .addDeserializer(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT))) + .addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT))) + .addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT))) + .addSerializer(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT))); + + //注册功能模块 例如,可以添加自定义序列化器和反序列化器 + this.registerModule(simpleModule); + } +} diff --git a/sky-common/src/main/java/com/sky/properties/AliOssProperties.java b/sky-common/src/main/java/com/sky/properties/AliOssProperties.java new file mode 100644 index 0000000..4e6c625 --- /dev/null +++ b/sky-common/src/main/java/com/sky/properties/AliOssProperties.java @@ -0,0 +1,17 @@ +package com.sky.properties; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Component +@ConfigurationProperties(prefix = "sky.alioss") +@Data +public class AliOssProperties { + + private String endpoint; + private String accessKeyId; + private String accessKeySecret; + private String bucketName; + +} diff --git a/sky-common/src/main/java/com/sky/properties/JwtProperties.java b/sky-common/src/main/java/com/sky/properties/JwtProperties.java new file mode 100644 index 0000000..c2c7525 --- /dev/null +++ b/sky-common/src/main/java/com/sky/properties/JwtProperties.java @@ -0,0 +1,26 @@ +package com.sky.properties; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Component +@ConfigurationProperties(prefix = "sky.jwt") +@Data +public class JwtProperties { + + /** + * 管理端员工生成jwt令牌相关配置 + */ + private String adminSecretKey; + private long adminTtl; + private String adminTokenName; + + /** + * 用户端微信用户生成jwt令牌相关配置 + */ + private String userSecretKey; + private long userTtl; + private String userTokenName; + +} diff --git a/sky-common/src/main/java/com/sky/properties/WeChatProperties.java b/sky-common/src/main/java/com/sky/properties/WeChatProperties.java new file mode 100644 index 0000000..06a9fa2 --- /dev/null +++ b/sky-common/src/main/java/com/sky/properties/WeChatProperties.java @@ -0,0 +1,23 @@ +package com.sky.properties; + +import lombok.Data; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Component +@ConfigurationProperties(prefix = "sky.wechat") +@Data +public class WeChatProperties { + + private String appid; //小程序的appid + private String secret; //小程序的秘钥 + private String mchid; //商户号 + private String mchSerialNo; //商户API证书的证书序列号 + private String privateKeyFilePath; //商户私钥文件 + private String apiV3Key; //证书解密的密钥 + private String weChatPayCertFilePath; //平台证书 + private String notifyUrl; //支付成功的回调地址 + private String refundNotifyUrl; //退款成功的回调地址 + +} diff --git a/sky-common/src/main/java/com/sky/result/PageResult.java b/sky-common/src/main/java/com/sky/result/PageResult.java new file mode 100644 index 0000000..4da4d7a --- /dev/null +++ b/sky-common/src/main/java/com/sky/result/PageResult.java @@ -0,0 +1,22 @@ +package com.sky.result; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.List; + +/** + * 封装分页查询结果 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class PageResult implements Serializable { + + private long total; //总记录数 + + private List records; //当前页数据集合 + +} diff --git a/sky-common/src/main/java/com/sky/result/Result.java b/sky-common/src/main/java/com/sky/result/Result.java new file mode 100644 index 0000000..9cb3762 --- /dev/null +++ b/sky-common/src/main/java/com/sky/result/Result.java @@ -0,0 +1,38 @@ +package com.sky.result; + +import lombok.Data; + +import java.io.Serializable; + +/** + * 后端统一返回结果 + * @param + */ +@Data +public class Result implements Serializable { + + private Integer code; //编码:1成功,0和其它数字为失败 + private String msg; //错误信息 + private T data; //数据 + + public static Result success() { + Result result = new Result(); + result.code = 1; + return result; + } + + public static Result success(T object) { + Result result = new Result(); + result.data = object; + result.code = 1; + return result; + } + + public static Result error(String msg) { + Result result = new Result(); + result.msg = msg; + result.code = 0; + return result; + } + +} diff --git a/sky-common/src/main/java/com/sky/utils/AliOssUtil.java b/sky-common/src/main/java/com/sky/utils/AliOssUtil.java new file mode 100644 index 0000000..c53114d --- /dev/null +++ b/sky-common/src/main/java/com/sky/utils/AliOssUtil.java @@ -0,0 +1,68 @@ +package com.sky.utils; + +import com.aliyun.oss.ClientException; +import com.aliyun.oss.OSS; +import com.aliyun.oss.OSSClientBuilder; +import com.aliyun.oss.OSSException; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; +import java.io.ByteArrayInputStream; + +@Data +@AllArgsConstructor +@Slf4j +public class AliOssUtil { + + private String endpoint; + private String accessKeyId; + private String accessKeySecret; + private String bucketName; + + /** + * 文件上传 + * + * @param bytes + * @param objectName + * @return + */ + public String upload(byte[] bytes, String objectName) { + + // 创建OSSClient实例。 + OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret); + + try { + // 创建PutObject请求。 + ossClient.putObject(bucketName, objectName, new ByteArrayInputStream(bytes)); + } catch (OSSException oe) { + System.out.println("Caught an OSSException, which means your request made it to OSS, " + + "but was rejected with an error response for some reason."); + System.out.println("Error Message:" + oe.getErrorMessage()); + System.out.println("Error Code:" + oe.getErrorCode()); + System.out.println("Request ID:" + oe.getRequestId()); + System.out.println("Host ID:" + oe.getHostId()); + } catch (ClientException ce) { + System.out.println("Caught an ClientException, which means the client encountered " + + "a serious internal problem while trying to communicate with OSS, " + + "such as not being able to access the network."); + System.out.println("Error Message:" + ce.getMessage()); + } finally { + if (ossClient != null) { + ossClient.shutdown(); + } + } + + //文件访问路径规则 https://BucketName.Endpoint/ObjectName + StringBuilder stringBuilder = new StringBuilder("https://"); + stringBuilder + .append(bucketName) + .append(".") + .append(endpoint) + .append("/") + .append(objectName); + + log.info("文件上传到:{}", stringBuilder.toString()); + + return stringBuilder.toString(); + } +} diff --git a/sky-common/src/main/java/com/sky/utils/HttpClientUtil.java b/sky-common/src/main/java/com/sky/utils/HttpClientUtil.java new file mode 100644 index 0000000..a10dbc4 --- /dev/null +++ b/sky-common/src/main/java/com/sky/utils/HttpClientUtil.java @@ -0,0 +1,179 @@ +package com.sky.utils; + +import com.alibaba.fastjson.JSONObject; +import org.apache.http.NameValuePair; +import org.apache.http.client.config.RequestConfig; +import org.apache.http.client.entity.UrlEncodedFormEntity; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.client.utils.URIBuilder; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.message.BasicNameValuePair; +import org.apache.http.util.EntityUtils; + +import java.io.IOException; +import java.net.URI; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * Http工具类 + */ +public class HttpClientUtil { + + static final int TIMEOUT_MSEC = 5 * 1000; + + /** + * 发送GET方式请求 + * @param url + * @param paramMap + * @return + */ + public static String doGet(String url,Map paramMap){ + // 创建Httpclient对象 + CloseableHttpClient httpClient = HttpClients.createDefault(); + + String result = ""; + CloseableHttpResponse response = null; + + try{ + URIBuilder builder = new URIBuilder(url); + if(paramMap != null){ + for (String key : paramMap.keySet()) { + builder.addParameter(key,paramMap.get(key)); + } + } + URI uri = builder.build(); + + //创建GET请求 + HttpGet httpGet = new HttpGet(uri); + + //发送请求 + response = httpClient.execute(httpGet); + + //判断响应状态 + if(response.getStatusLine().getStatusCode() == 200){ + result = EntityUtils.toString(response.getEntity(),"UTF-8"); + } + }catch (Exception e){ + e.printStackTrace(); + }finally { + try { + response.close(); + httpClient.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + return result; + } + + /** + * 发送POST方式请求 + * @param url + * @param paramMap + * @return + * @throws IOException + */ + public static String doPost(String url, Map paramMap) throws IOException { + // 创建Httpclient对象 + CloseableHttpClient httpClient = HttpClients.createDefault(); + CloseableHttpResponse response = null; + String resultString = ""; + + try { + // 创建Http Post请求 + HttpPost httpPost = new HttpPost(url); + + // 创建参数列表 + if (paramMap != null) { + List paramList = new ArrayList(); + for (Map.Entry param : paramMap.entrySet()) { + paramList.add(new BasicNameValuePair(param.getKey(), param.getValue())); + } + // 模拟表单 + UrlEncodedFormEntity entity = new UrlEncodedFormEntity(paramList); + httpPost.setEntity(entity); + } + + httpPost.setConfig(builderRequestConfig()); + + // 执行http请求 + response = httpClient.execute(httpPost); + + resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); + } catch (Exception e) { + throw e; + } finally { + try { + response.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + return resultString; + } + + /** + * 发送POST方式请求 + * @param url + * @param paramMap + * @return + * @throws IOException + */ + public static String doPost4Json(String url, Map paramMap) throws IOException { + // 创建Httpclient对象 + CloseableHttpClient httpClient = HttpClients.createDefault(); + CloseableHttpResponse response = null; + String resultString = ""; + + try { + // 创建Http Post请求 + HttpPost httpPost = new HttpPost(url); + + if (paramMap != null) { + //构造json格式数据 + JSONObject jsonObject = new JSONObject(); + for (Map.Entry param : paramMap.entrySet()) { + jsonObject.put(param.getKey(),param.getValue()); + } + StringEntity entity = new StringEntity(jsonObject.toString(),"utf-8"); + //设置请求编码 + entity.setContentEncoding("utf-8"); + //设置数据类型 + entity.setContentType("application/json"); + httpPost.setEntity(entity); + } + + httpPost.setConfig(builderRequestConfig()); + + // 执行http请求 + response = httpClient.execute(httpPost); + + resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); + } catch (Exception e) { + throw e; + } finally { + try { + response.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + return resultString; + } + private static RequestConfig builderRequestConfig() { + return RequestConfig.custom() + .setConnectTimeout(TIMEOUT_MSEC) + .setConnectionRequestTimeout(TIMEOUT_MSEC) + .setSocketTimeout(TIMEOUT_MSEC).build(); + } + +} diff --git a/sky-common/src/main/java/com/sky/utils/JwtUtil.java b/sky-common/src/main/java/com/sky/utils/JwtUtil.java new file mode 100644 index 0000000..3ebf2f4 --- /dev/null +++ b/sky-common/src/main/java/com/sky/utils/JwtUtil.java @@ -0,0 +1,58 @@ +package com.sky.utils; + +import io.jsonwebtoken.Claims; +import io.jsonwebtoken.JwtBuilder; +import io.jsonwebtoken.Jwts; +import io.jsonwebtoken.SignatureAlgorithm; +import java.nio.charset.StandardCharsets; +import java.util.Date; +import java.util.Map; + +public class JwtUtil { + /** + * 生成jwt + * 使用Hs256算法, 私匙使用固定秘钥 + * + * @param secretKey jwt秘钥 + * @param ttlMillis jwt过期时间(毫秒) + * @param claims 设置的信息 + * @return + */ + public static String createJWT(String secretKey, long ttlMillis, Map claims) { + // 指定签名的时候使用的签名算法,也就是header那部分 + SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256; + + // 生成JWT的时间 + long expMillis = System.currentTimeMillis() + ttlMillis; + Date exp = new Date(expMillis); + + // 设置jwt的body + JwtBuilder builder = Jwts.builder() + // 如果有私有声明,一定要先设置这个自己创建的私有的声明,这个是给builder的claim赋值,一旦写在标准的声明赋值之后,就是覆盖了那些标准的声明的 + .setClaims(claims) + // 设置签名使用的签名算法和签名使用的秘钥 + .signWith(signatureAlgorithm, secretKey.getBytes(StandardCharsets.UTF_8)) + // 设置过期时间 + .setExpiration(exp); + + return builder.compact(); + } + + /** + * Token解密 + * + * @param secretKey jwt秘钥 此秘钥一定要保留好在服务端, 不能暴露出去, 否则sign就可以被伪造, 如果对接多个客户端建议改造成多个 + * @param token 加密后的token + * @return + */ + public static Claims parseJWT(String secretKey, String token) { + // 得到DefaultJwtParser + Claims claims = Jwts.parser() + // 设置签名的秘钥 + .setSigningKey(secretKey.getBytes(StandardCharsets.UTF_8)) + // 设置需要解析的jwt + .parseClaimsJws(token).getBody(); + return claims; + } + +} diff --git a/sky-common/src/main/java/com/sky/utils/WeChatPayUtil.java b/sky-common/src/main/java/com/sky/utils/WeChatPayUtil.java new file mode 100644 index 0000000..804d7ed --- /dev/null +++ b/sky-common/src/main/java/com/sky/utils/WeChatPayUtil.java @@ -0,0 +1,235 @@ +package com.sky.utils; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.sky.properties.WeChatProperties; +import com.wechat.pay.contrib.apache.httpclient.WechatPayHttpClientBuilder; +import com.wechat.pay.contrib.apache.httpclient.util.PemUtil; +import org.apache.commons.lang.RandomStringUtils; +import org.apache.http.HttpHeaders; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.ContentType; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.util.EntityUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.math.BigDecimal; +import java.security.PrivateKey; +import java.security.Signature; +import java.security.cert.X509Certificate; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Base64; +import java.util.List; + +/** + * 微信支付工具类 + */ +@Component +public class WeChatPayUtil { + + //微信支付下单接口地址 + public static final String JSAPI = "https://api.mch.weixin.qq.com/v3/pay/transactions/jsapi"; + + //申请退款接口地址 + public static final String REFUNDS = "https://api.mch.weixin.qq.com/v3/refund/domestic/refunds"; + + @Autowired + private WeChatProperties weChatProperties; + + /** + * 获取调用微信接口的客户端工具对象 + * + * @return + */ + private CloseableHttpClient getClient() { + PrivateKey merchantPrivateKey = null; + try { + //merchantPrivateKey商户API私钥,如何加载商户API私钥请看常见问题 + merchantPrivateKey = PemUtil.loadPrivateKey(new FileInputStream(new File(weChatProperties.getPrivateKeyFilePath()))); + //加载平台证书文件 + X509Certificate x509Certificate = PemUtil.loadCertificate(new FileInputStream(new File(weChatProperties.getWeChatPayCertFilePath()))); + //wechatPayCertificates微信支付平台证书列表。你也可以使用后面章节提到的“定时更新平台证书功能”,而不需要关心平台证书的来龙去脉 + List wechatPayCertificates = Arrays.asList(x509Certificate); + + WechatPayHttpClientBuilder builder = WechatPayHttpClientBuilder.create() + .withMerchant(weChatProperties.getMchid(), weChatProperties.getMchSerialNo(), merchantPrivateKey) + .withWechatPay(wechatPayCertificates); + + // 通过WechatPayHttpClientBuilder构造的HttpClient,会自动的处理签名和验签 + CloseableHttpClient httpClient = builder.build(); + return httpClient; + } catch (FileNotFoundException e) { + e.printStackTrace(); + return null; + } + } + + /** + * 发送post方式请求 + * + * @param url + * @param body + * @return + */ + private String post(String url, String body) throws Exception { + CloseableHttpClient httpClient = getClient(); + + HttpPost httpPost = new HttpPost(url); + httpPost.addHeader(HttpHeaders.ACCEPT, ContentType.APPLICATION_JSON.toString()); + httpPost.addHeader(HttpHeaders.CONTENT_TYPE, ContentType.APPLICATION_JSON.toString()); + httpPost.addHeader("Wechatpay-Serial", weChatProperties.getMchSerialNo()); + httpPost.setEntity(new StringEntity(body, "UTF-8")); + + CloseableHttpResponse response = httpClient.execute(httpPost); + try { + String bodyAsString = EntityUtils.toString(response.getEntity()); + return bodyAsString; + } finally { + httpClient.close(); + response.close(); + } + } + + /** + * 发送get方式请求 + * + * @param url + * @return + */ + private String get(String url) throws Exception { + CloseableHttpClient httpClient = getClient(); + + HttpGet httpGet = new HttpGet(url); + httpGet.addHeader(HttpHeaders.ACCEPT, ContentType.APPLICATION_JSON.toString()); + httpGet.addHeader(HttpHeaders.CONTENT_TYPE, ContentType.APPLICATION_JSON.toString()); + httpGet.addHeader("Wechatpay-Serial", weChatProperties.getMchSerialNo()); + + CloseableHttpResponse response = httpClient.execute(httpGet); + try { + String bodyAsString = EntityUtils.toString(response.getEntity()); + return bodyAsString; + } finally { + httpClient.close(); + response.close(); + } + } + + /** + * jsapi下单 + * + * @param orderNum 商户订单号 + * @param total 总金额 + * @param description 商品描述 + * @param openid 微信用户的openid + * @return + */ + private String jsapi(String orderNum, BigDecimal total, String description, String openid) throws Exception { + JSONObject jsonObject = new JSONObject(); + jsonObject.put("appid", weChatProperties.getAppid()); + jsonObject.put("mchid", weChatProperties.getMchid()); + jsonObject.put("description", description); + jsonObject.put("out_trade_no", orderNum); + jsonObject.put("notify_url", weChatProperties.getNotifyUrl()); + + JSONObject amount = new JSONObject(); + amount.put("total", total.multiply(new BigDecimal(100)).setScale(2, BigDecimal.ROUND_HALF_UP).intValue()); + amount.put("currency", "CNY"); + + jsonObject.put("amount", amount); + + JSONObject payer = new JSONObject(); + payer.put("openid", openid); + + jsonObject.put("payer", payer); + + String body = jsonObject.toJSONString(); + return post(JSAPI, body); + } + + /** + * 小程序支付 + * + * @param orderNum 商户订单号 + * @param total 金额,单位 元 + * @param description 商品描述 + * @param openid 微信用户的openid + * @return + */ + public JSONObject pay(String orderNum, BigDecimal total, String description, String openid) throws Exception { + //统一下单,生成预支付交易单 + String bodyAsString = jsapi(orderNum, total, description, openid); + //解析返回结果 + JSONObject jsonObject = JSON.parseObject(bodyAsString); + System.out.println(jsonObject); + + String prepayId = jsonObject.getString("prepay_id"); + if (prepayId != null) { + String timeStamp = String.valueOf(System.currentTimeMillis() / 1000); + String nonceStr = RandomStringUtils.randomNumeric(32); + ArrayList list = new ArrayList<>(); + list.add(weChatProperties.getAppid()); + list.add(timeStamp); + list.add(nonceStr); + list.add("prepay_id=" + prepayId); + //二次签名,调起支付需要重新签名 + StringBuilder stringBuilder = new StringBuilder(); + for (Object o : list) { + stringBuilder.append(o).append("\n"); + } + String signMessage = stringBuilder.toString(); + byte[] message = signMessage.getBytes(); + + Signature signature = Signature.getInstance("SHA256withRSA"); + signature.initSign(PemUtil.loadPrivateKey(new FileInputStream(new File(weChatProperties.getPrivateKeyFilePath())))); + signature.update(message); + String packageSign = Base64.getEncoder().encodeToString(signature.sign()); + + //构造数据给微信小程序,用于调起微信支付 + JSONObject jo = new JSONObject(); + jo.put("timeStamp", timeStamp); + jo.put("nonceStr", nonceStr); + jo.put("package", "prepay_id=" + prepayId); + jo.put("signType", "RSA"); + jo.put("paySign", packageSign); + + return jo; + } + return jsonObject; + } + + /** + * 申请退款 + * + * @param outTradeNo 商户订单号 + * @param outRefundNo 商户退款单号 + * @param refund 退款金额 + * @param total 原订单金额 + * @return + */ + public String refund(String outTradeNo, String outRefundNo, BigDecimal refund, BigDecimal total) throws Exception { + JSONObject jsonObject = new JSONObject(); + jsonObject.put("out_trade_no", outTradeNo); + jsonObject.put("out_refund_no", outRefundNo); + + JSONObject amount = new JSONObject(); + amount.put("refund", refund.multiply(new BigDecimal(100)).setScale(2, BigDecimal.ROUND_HALF_UP).intValue()); + amount.put("total", total.multiply(new BigDecimal(100)).setScale(2, BigDecimal.ROUND_HALF_UP).intValue()); + amount.put("currency", "CNY"); + + jsonObject.put("amount", amount); + jsonObject.put("notify_url", weChatProperties.getRefundNotifyUrl()); + + String body = jsonObject.toJSONString(); + + //调用申请退款接口 + return post(REFUNDS, body); + } +} diff --git a/sky-pojo/pom.xml b/sky-pojo/pom.xml new file mode 100644 index 0000000..3f8fa51 --- /dev/null +++ b/sky-pojo/pom.xml @@ -0,0 +1,27 @@ + + + + sky-take-out + com.sky + 1.0-SNAPSHOT + + 4.0.0 + sky-pojo + + + org.projectlombok + lombok + + + com.fasterxml.jackson.core + jackson-databind + 2.9.2 + + + com.github.xiaoymin + knife4j-spring-boot-starter + + + diff --git a/sky-pojo/src/main/java/com/sky/dto/CategoryDTO.java b/sky-pojo/src/main/java/com/sky/dto/CategoryDTO.java new file mode 100644 index 0000000..ce3bfcf --- /dev/null +++ b/sky-pojo/src/main/java/com/sky/dto/CategoryDTO.java @@ -0,0 +1,22 @@ +package com.sky.dto; + +import lombok.Data; + +import java.io.Serializable; + +@Data +public class CategoryDTO implements Serializable { + + //主键 + private Long id; + + //类型 1 菜品分类 2 套餐分类 + private Integer type; + + //分类名称 + private String name; + + //排序 + private Integer sort; + +} diff --git a/sky-pojo/src/main/java/com/sky/dto/CategoryPageQueryDTO.java b/sky-pojo/src/main/java/com/sky/dto/CategoryPageQueryDTO.java new file mode 100644 index 0000000..0e0cf95 --- /dev/null +++ b/sky-pojo/src/main/java/com/sky/dto/CategoryPageQueryDTO.java @@ -0,0 +1,22 @@ +package com.sky.dto; + +import lombok.Data; + +import java.io.Serializable; + +@Data +public class CategoryPageQueryDTO implements Serializable { + + //页码 + private int page; + + //每页记录数 + private int pageSize; + + //分类名称 + private String name; + + //分类类型 1菜品分类 2套餐分类 + private Integer type; + +} diff --git a/sky-pojo/src/main/java/com/sky/dto/DataOverViewQueryDTO.java b/sky-pojo/src/main/java/com/sky/dto/DataOverViewQueryDTO.java new file mode 100644 index 0000000..03a11b3 --- /dev/null +++ b/sky-pojo/src/main/java/com/sky/dto/DataOverViewQueryDTO.java @@ -0,0 +1,21 @@ +package com.sky.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.time.LocalDateTime; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class DataOverViewQueryDTO implements Serializable { + + private LocalDateTime begin; + + private LocalDateTime end; + +} diff --git a/sky-pojo/src/main/java/com/sky/dto/DishDTO.java b/sky-pojo/src/main/java/com/sky/dto/DishDTO.java new file mode 100644 index 0000000..33901cc --- /dev/null +++ b/sky-pojo/src/main/java/com/sky/dto/DishDTO.java @@ -0,0 +1,29 @@ +package com.sky.dto; + +import com.sky.entity.DishFlavor; +import lombok.Data; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; + +@Data +public class DishDTO implements Serializable { + + private Long id; + //菜品名称 + private String name; + //菜品分类id + private Long categoryId; + //菜品价格 + private BigDecimal price; + //图片 + private String image; + //描述信息 + private String description; + //0 停售 1 起售 + private Integer status; + //口味 + private List flavors = new ArrayList<>(); + +} diff --git a/sky-pojo/src/main/java/com/sky/dto/DishPageQueryDTO.java b/sky-pojo/src/main/java/com/sky/dto/DishPageQueryDTO.java new file mode 100644 index 0000000..bd57500 --- /dev/null +++ b/sky-pojo/src/main/java/com/sky/dto/DishPageQueryDTO.java @@ -0,0 +1,22 @@ +package com.sky.dto; + +import lombok.Data; + +import java.io.Serializable; + +@Data +public class DishPageQueryDTO implements Serializable { + + private int page; + + private int pageSize; + + private String name; + + //分类id + private Integer categoryId; + + //状态 0表示禁用 1表示启用 + private Integer status; + +} diff --git a/sky-pojo/src/main/java/com/sky/dto/EmployeeDTO.java b/sky-pojo/src/main/java/com/sky/dto/EmployeeDTO.java new file mode 100644 index 0000000..766e37d --- /dev/null +++ b/sky-pojo/src/main/java/com/sky/dto/EmployeeDTO.java @@ -0,0 +1,22 @@ +package com.sky.dto; + +import lombok.Data; + +import java.io.Serializable; + +@Data +public class EmployeeDTO implements Serializable { + + private Long id; + + private String username; + + private String name; + + private String phone; + + private String sex; + + private String idNumber; + +} diff --git a/sky-pojo/src/main/java/com/sky/dto/EmployeeLoginDTO.java b/sky-pojo/src/main/java/com/sky/dto/EmployeeLoginDTO.java new file mode 100644 index 0000000..176470a --- /dev/null +++ b/sky-pojo/src/main/java/com/sky/dto/EmployeeLoginDTO.java @@ -0,0 +1,19 @@ +package com.sky.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +@ApiModel(description = "员工登录时传递的数据模型") +public class EmployeeLoginDTO implements Serializable { + + @ApiModelProperty("用户名") + private String username; + + @ApiModelProperty("密码") + private String password; + +} diff --git a/sky-pojo/src/main/java/com/sky/dto/EmployeePageQueryDTO.java b/sky-pojo/src/main/java/com/sky/dto/EmployeePageQueryDTO.java new file mode 100644 index 0000000..8c3dcf6 --- /dev/null +++ b/sky-pojo/src/main/java/com/sky/dto/EmployeePageQueryDTO.java @@ -0,0 +1,19 @@ +package com.sky.dto; + +import lombok.Data; + +import java.io.Serializable; + +@Data +public class EmployeePageQueryDTO implements Serializable { + + //员工姓名 + private String name; + + //页码 + private int page; + + //每页显示记录数 + private int pageSize; + +} diff --git a/sky-pojo/src/main/java/com/sky/dto/GoodsSalesDTO.java b/sky-pojo/src/main/java/com/sky/dto/GoodsSalesDTO.java new file mode 100644 index 0000000..e52a21d --- /dev/null +++ b/sky-pojo/src/main/java/com/sky/dto/GoodsSalesDTO.java @@ -0,0 +1,20 @@ +package com.sky.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class GoodsSalesDTO implements Serializable { + //商品名称 + private String name; + + //销量 + private Integer number; +} diff --git a/sky-pojo/src/main/java/com/sky/dto/OrdersCancelDTO.java b/sky-pojo/src/main/java/com/sky/dto/OrdersCancelDTO.java new file mode 100644 index 0000000..1e48a98 --- /dev/null +++ b/sky-pojo/src/main/java/com/sky/dto/OrdersCancelDTO.java @@ -0,0 +1,14 @@ +package com.sky.dto; + +import lombok.Data; + +import java.io.Serializable; + +@Data +public class OrdersCancelDTO implements Serializable { + + private Long id; + //订单取消原因 + private String cancelReason; + +} diff --git a/sky-pojo/src/main/java/com/sky/dto/OrdersConfirmDTO.java b/sky-pojo/src/main/java/com/sky/dto/OrdersConfirmDTO.java new file mode 100644 index 0000000..964543e --- /dev/null +++ b/sky-pojo/src/main/java/com/sky/dto/OrdersConfirmDTO.java @@ -0,0 +1,14 @@ +package com.sky.dto; + +import lombok.Data; + +import java.io.Serializable; + +@Data +public class OrdersConfirmDTO implements Serializable { + + private Long id; + //订单状态 1待付款 2待接单 3 已接单 4 派送中 5 已完成 6 已取消 7 退款 + private Integer status; + +} diff --git a/sky-pojo/src/main/java/com/sky/dto/OrdersDTO.java b/sky-pojo/src/main/java/com/sky/dto/OrdersDTO.java new file mode 100644 index 0000000..f3bd20e --- /dev/null +++ b/sky-pojo/src/main/java/com/sky/dto/OrdersDTO.java @@ -0,0 +1,56 @@ +package com.sky.dto; + +import com.sky.entity.OrderDetail; +import lombok.Data; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; + +@Data +public class OrdersDTO implements Serializable { + + private Long id; + + //订单号 + private String number; + + //订单状态 1待付款,2待派送,3已派送,4已完成,5已取消 + private Integer status; + + //下单用户id + private Long userId; + + //地址id + private Long addressBookId; + + //下单时间 + private LocalDateTime orderTime; + + //结账时间 + private LocalDateTime checkoutTime; + + //支付方式 1微信,2支付宝 + private Integer payMethod; + + //实收金额 + private BigDecimal amount; + + //备注 + private String remark; + + //用户名 + private String userName; + + //手机号 + private String phone; + + //地址 + private String address; + + //收货人 + private String consignee; + + private List orderDetails; + +} diff --git a/sky-pojo/src/main/java/com/sky/dto/OrdersPageQueryDTO.java b/sky-pojo/src/main/java/com/sky/dto/OrdersPageQueryDTO.java new file mode 100644 index 0000000..eac827a --- /dev/null +++ b/sky-pojo/src/main/java/com/sky/dto/OrdersPageQueryDTO.java @@ -0,0 +1,30 @@ +package com.sky.dto; + +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.time.LocalDateTime; + +@Data +public class OrdersPageQueryDTO implements Serializable { + + private int page; + + private int pageSize; + + private String number; + + private String phone; + + private Integer status; + + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime beginTime; + + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime endTime; + + private Long userId; + +} diff --git a/sky-pojo/src/main/java/com/sky/dto/OrdersPaymentDTO.java b/sky-pojo/src/main/java/com/sky/dto/OrdersPaymentDTO.java new file mode 100644 index 0000000..da02b63 --- /dev/null +++ b/sky-pojo/src/main/java/com/sky/dto/OrdersPaymentDTO.java @@ -0,0 +1,14 @@ +package com.sky.dto; + +import lombok.Data; +import java.io.Serializable; + +@Data +public class OrdersPaymentDTO implements Serializable { + //订单号 + private String orderNumber; + + //付款方式 + private Integer payMethod; + +} diff --git a/sky-pojo/src/main/java/com/sky/dto/OrdersRejectionDTO.java b/sky-pojo/src/main/java/com/sky/dto/OrdersRejectionDTO.java new file mode 100644 index 0000000..ce6d03c --- /dev/null +++ b/sky-pojo/src/main/java/com/sky/dto/OrdersRejectionDTO.java @@ -0,0 +1,15 @@ +package com.sky.dto; + +import lombok.Data; + +import java.io.Serializable; + +@Data +public class OrdersRejectionDTO implements Serializable { + + private Long id; + + //订单拒绝原因 + private String rejectionReason; + +} diff --git a/sky-pojo/src/main/java/com/sky/dto/OrdersSubmitDTO.java b/sky-pojo/src/main/java/com/sky/dto/OrdersSubmitDTO.java new file mode 100644 index 0000000..da73773 --- /dev/null +++ b/sky-pojo/src/main/java/com/sky/dto/OrdersSubmitDTO.java @@ -0,0 +1,31 @@ +package com.sky.dto; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +@Data +public class OrdersSubmitDTO implements Serializable { + //地址簿id + private Long addressBookId; + //付款方式 + private int payMethod; + //备注 + private String remark; + //预计送达时间 + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime estimatedDeliveryTime; + //配送状态 1立即送出 0选择具体时间 + private Integer deliveryStatus; + //餐具数量 + private Integer tablewareNumber; + //餐具数量状态 1按餐量提供 0选择具体数量 + private Integer tablewareStatus; + //打包费 + private Integer packAmount; + //总金额 + private BigDecimal amount; +} diff --git a/sky-pojo/src/main/java/com/sky/dto/PasswordEditDTO.java b/sky-pojo/src/main/java/com/sky/dto/PasswordEditDTO.java new file mode 100644 index 0000000..303d678 --- /dev/null +++ b/sky-pojo/src/main/java/com/sky/dto/PasswordEditDTO.java @@ -0,0 +1,19 @@ +package com.sky.dto; + +import lombok.Data; + +import java.io.Serializable; + +@Data +public class PasswordEditDTO implements Serializable { + + //员工id + private Long empId; + + //旧密码 + private String oldPassword; + + //新密码 + private String newPassword; + +} diff --git a/sky-pojo/src/main/java/com/sky/dto/SetmealDTO.java b/sky-pojo/src/main/java/com/sky/dto/SetmealDTO.java new file mode 100644 index 0000000..3754aca --- /dev/null +++ b/sky-pojo/src/main/java/com/sky/dto/SetmealDTO.java @@ -0,0 +1,36 @@ +package com.sky.dto; + +import com.sky.entity.SetmealDish; +import lombok.Data; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; + +@Data +public class SetmealDTO implements Serializable { + + private Long id; + + //分类id + private Long categoryId; + + //套餐名称 + private String name; + + //套餐价格 + private BigDecimal price; + + //状态 0:停用 1:启用 + private Integer status; + + //描述信息 + private String description; + + //图片 + private String image; + + //套餐菜品关系 + private List setmealDishes = new ArrayList<>(); + +} diff --git a/sky-pojo/src/main/java/com/sky/dto/SetmealPageQueryDTO.java b/sky-pojo/src/main/java/com/sky/dto/SetmealPageQueryDTO.java new file mode 100644 index 0000000..8d66fee --- /dev/null +++ b/sky-pojo/src/main/java/com/sky/dto/SetmealPageQueryDTO.java @@ -0,0 +1,22 @@ +package com.sky.dto; + +import lombok.Data; + +import java.io.Serializable; + +@Data +public class SetmealPageQueryDTO implements Serializable { + + private int page; + + private int pageSize; + + private String name; + + //分类id + private Integer categoryId; + + //状态 0表示禁用 1表示启用 + private Integer status; + +} diff --git a/sky-pojo/src/main/java/com/sky/dto/ShoppingCartDTO.java b/sky-pojo/src/main/java/com/sky/dto/ShoppingCartDTO.java new file mode 100644 index 0000000..51286a2 --- /dev/null +++ b/sky-pojo/src/main/java/com/sky/dto/ShoppingCartDTO.java @@ -0,0 +1,13 @@ +package com.sky.dto; + +import lombok.Data; +import java.io.Serializable; + +@Data +public class ShoppingCartDTO implements Serializable { + + private Long dishId; + private Long setmealId; + private String dishFlavor; + +} diff --git a/sky-pojo/src/main/java/com/sky/dto/UserLoginDTO.java b/sky-pojo/src/main/java/com/sky/dto/UserLoginDTO.java new file mode 100644 index 0000000..e1f6959 --- /dev/null +++ b/sky-pojo/src/main/java/com/sky/dto/UserLoginDTO.java @@ -0,0 +1,15 @@ +package com.sky.dto; + +import lombok.Data; + +import java.io.Serializable; + +/** + * C端用户登录 + */ +@Data +public class UserLoginDTO implements Serializable { + + private String code; + +} diff --git a/sky-pojo/src/main/java/com/sky/entity/AddressBook.java b/sky-pojo/src/main/java/com/sky/entity/AddressBook.java new file mode 100644 index 0000000..845903c --- /dev/null +++ b/sky-pojo/src/main/java/com/sky/entity/AddressBook.java @@ -0,0 +1,61 @@ +package com.sky.entity; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +/** + * 地址簿 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class AddressBook implements Serializable { + + private static final long serialVersionUID = 1L; + + private Long id; + + //用户id + private Long userId; + + //收货人 + private String consignee; + + //手机号 + private String phone; + + //性别 0 女 1 男 + private String sex; + + //省级区划编号 + private String provinceCode; + + //省级名称 + private String provinceName; + + //市级区划编号 + private String cityCode; + + //市级名称 + private String cityName; + + //区级区划编号 + private String districtCode; + + //区级名称 + private String districtName; + + //详细地址 + private String detail; + + //标签 + private String label; + + //是否默认 0否 1是 + private Integer isDefault; +} diff --git a/sky-pojo/src/main/java/com/sky/entity/Category.java b/sky-pojo/src/main/java/com/sky/entity/Category.java new file mode 100644 index 0000000..3ddb205 --- /dev/null +++ b/sky-pojo/src/main/java/com/sky/entity/Category.java @@ -0,0 +1,43 @@ +package com.sky.entity; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import java.io.Serializable; +import java.time.LocalDateTime; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class Category implements Serializable { + + private static final long serialVersionUID = 1L; + + private Long id; + + //类型: 1菜品分类 2套餐分类 + private Integer type; + + //分类名称 + private String name; + + //顺序 + private Integer sort; + + //分类状态 0标识禁用 1表示启用 + private Integer status; + + //创建时间 + private LocalDateTime createTime; + + //更新时间 + private LocalDateTime updateTime; + + //创建人 + private Long createUser; + + //修改人 + private Long updateUser; +} diff --git a/sky-pojo/src/main/java/com/sky/entity/Dish.java b/sky-pojo/src/main/java/com/sky/entity/Dish.java new file mode 100644 index 0000000..f62329d --- /dev/null +++ b/sky-pojo/src/main/java/com/sky/entity/Dish.java @@ -0,0 +1,50 @@ +package com.sky.entity; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +/** + * 菜品 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class Dish implements Serializable { + + private static final long serialVersionUID = 1L; + + private Long id; + + //菜品名称 + private String name; + + //菜品分类id + private Long categoryId; + + //菜品价格 + private BigDecimal price; + + //图片 + private String image; + + //描述信息 + private String description; + + //0 停售 1 起售 + private Integer status; + + private LocalDateTime createTime; + + private LocalDateTime updateTime; + + private Long createUser; + + private Long updateUser; + +} diff --git a/sky-pojo/src/main/java/com/sky/entity/DishFlavor.java b/sky-pojo/src/main/java/com/sky/entity/DishFlavor.java new file mode 100644 index 0000000..c6d448e --- /dev/null +++ b/sky-pojo/src/main/java/com/sky/entity/DishFlavor.java @@ -0,0 +1,31 @@ +package com.sky.entity; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +/** + * 菜品口味 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class DishFlavor implements Serializable { + + private static final long serialVersionUID = 1L; + + private Long id; + //菜品id + private Long dishId; + + //口味名称 + private String name; + + //口味数据list + private String value; + +} diff --git a/sky-pojo/src/main/java/com/sky/entity/Employee.java b/sky-pojo/src/main/java/com/sky/entity/Employee.java new file mode 100644 index 0000000..c9fe288 --- /dev/null +++ b/sky-pojo/src/main/java/com/sky/entity/Employee.java @@ -0,0 +1,46 @@ +package com.sky.entity; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.time.LocalDateTime; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class Employee implements Serializable { + + private static final long serialVersionUID = 1L; + + private Long id; + + private String username; + + private String name; + + private String password; + + private String phone; + + private String sex; + + private String idNumber; + + private Integer status; + +// @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createTime; + + //@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime updateTime; + + private Long createUser; + + private Long updateUser; + +} diff --git a/sky-pojo/src/main/java/com/sky/entity/OrderDetail.java b/sky-pojo/src/main/java/com/sky/entity/OrderDetail.java new file mode 100644 index 0000000..18334dc --- /dev/null +++ b/sky-pojo/src/main/java/com/sky/entity/OrderDetail.java @@ -0,0 +1,47 @@ +package com.sky.entity; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 订单明细 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class OrderDetail implements Serializable { + + private static final long serialVersionUID = 1L; + + private Long id; + + //名称 + private String name; + + //订单id + private Long orderId; + + //菜品id + private Long dishId; + + //套餐id + private Long setmealId; + + //口味 + private String dishFlavor; + + //数量 + private Integer number; + + //金额 + private BigDecimal amount; + + //图片 + private String image; +} diff --git a/sky-pojo/src/main/java/com/sky/entity/Orders.java b/sky-pojo/src/main/java/com/sky/entity/Orders.java new file mode 100644 index 0000000..22b7805 --- /dev/null +++ b/sky-pojo/src/main/java/com/sky/entity/Orders.java @@ -0,0 +1,110 @@ +package com.sky.entity; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +/** + * 订单 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class Orders implements Serializable { + + /** + * 订单状态 1待付款 2待接单 3已接单 4派送中 5已完成 6已取消 + */ + public static final Integer PENDING_PAYMENT = 1; + public static final Integer TO_BE_CONFIRMED = 2; + public static final Integer CONFIRMED = 3; + public static final Integer DELIVERY_IN_PROGRESS = 4; + public static final Integer COMPLETED = 5; + public static final Integer CANCELLED = 6; + + /** + * 支付状态 0未支付 1已支付 2退款 + */ + public static final Integer UN_PAID = 0; + public static final Integer PAID = 1; + public static final Integer REFUND = 2; + + private static final long serialVersionUID = 1L; + + private Long id; + + //订单号 + private String number; + + //订单状态 1待付款 2待接单 3已接单 4派送中 5已完成 6已取消 7退款 + private Integer status; + + //下单用户id + private Long userId; + + //地址id + private Long addressBookId; + + //下单时间 + private LocalDateTime orderTime; + + //结账时间 + private LocalDateTime checkoutTime; + + //支付方式 1微信,2支付宝 + private Integer payMethod; + + //支付状态 0未支付 1已支付 2退款 + private Integer payStatus; + + //实收金额 + private BigDecimal amount; + + //备注 + private String remark; + + //用户名 + private String userName; + + //手机号 + private String phone; + + //地址 + private String address; + + //收货人 + private String consignee; + + //订单取消原因 + private String cancelReason; + + //订单拒绝原因 + private String rejectionReason; + + //订单取消时间 + private LocalDateTime cancelTime; + + //预计送达时间 + private LocalDateTime estimatedDeliveryTime; + + //配送状态 1立即送出 0选择具体时间 + private Integer deliveryStatus; + + //送达时间 + private LocalDateTime deliveryTime; + + //打包费 + private int packAmount; + + //餐具数量 + private int tablewareNumber; + + //餐具数量状态 1按餐量提供 0选择具体数量 + private Integer tablewareStatus; +} diff --git a/sky-pojo/src/main/java/com/sky/entity/Setmeal.java b/sky-pojo/src/main/java/com/sky/entity/Setmeal.java new file mode 100644 index 0000000..7049eed --- /dev/null +++ b/sky-pojo/src/main/java/com/sky/entity/Setmeal.java @@ -0,0 +1,49 @@ +package com.sky.entity; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +/** + * 套餐 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class Setmeal implements Serializable { + + private static final long serialVersionUID = 1L; + + private Long id; + + //分类id + private Long categoryId; + + //套餐名称 + private String name; + + //套餐价格 + private BigDecimal price; + + //状态 0:停用 1:启用 + private Integer status; + + //描述信息 + private String description; + + //图片 + private String image; + + private LocalDateTime createTime; + + private LocalDateTime updateTime; + + private Long createUser; + + private Long updateUser; +} diff --git a/sky-pojo/src/main/java/com/sky/entity/SetmealDish.java b/sky-pojo/src/main/java/com/sky/entity/SetmealDish.java new file mode 100644 index 0000000..b3baaee --- /dev/null +++ b/sky-pojo/src/main/java/com/sky/entity/SetmealDish.java @@ -0,0 +1,38 @@ +package com.sky.entity; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 套餐菜品关系 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class SetmealDish implements Serializable { + + private static final long serialVersionUID = 1L; + + private Long id; + + //套餐id + private Long setmealId; + + //菜品id + private Long dishId; + + //菜品名称 (冗余字段) + private String name; + + //菜品原价 + private BigDecimal price; + + //份数 + private Integer copies; +} diff --git a/sky-pojo/src/main/java/com/sky/entity/ShoppingCart.java b/sky-pojo/src/main/java/com/sky/entity/ShoppingCart.java new file mode 100644 index 0000000..a2c6d57 --- /dev/null +++ b/sky-pojo/src/main/java/com/sky/entity/ShoppingCart.java @@ -0,0 +1,50 @@ +package com.sky.entity; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +/** + * 购物车 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class ShoppingCart implements Serializable { + + private static final long serialVersionUID = 1L; + + private Long id; + + //名称 + private String name; + + //用户id + private Long userId; + + //菜品id + private Long dishId; + + //套餐id + private Long setmealId; + + //口味 + private String dishFlavor; + + //数量 + private Integer number; + + //金额 + private BigDecimal amount; + + //图片 + private String image; + + private LocalDateTime createTime; +} diff --git a/sky-pojo/src/main/java/com/sky/entity/User.java b/sky-pojo/src/main/java/com/sky/entity/User.java new file mode 100644 index 0000000..6d39c46 --- /dev/null +++ b/sky-pojo/src/main/java/com/sky/entity/User.java @@ -0,0 +1,42 @@ +package com.sky.entity; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.time.LocalDate; +import java.time.LocalDateTime; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class User implements Serializable { + + private static final long serialVersionUID = 1L; + + private Long id; + + //微信用户唯一标识 + private String openid; + + //姓名 + private String name; + + //手机号 + private String phone; + + //性别 0 女 1 男 + private String sex; + + //身份证号 + private String idNumber; + + //头像 + private String avatar; + + //注册时间 + private LocalDateTime createTime; +} diff --git a/sky-pojo/src/main/java/com/sky/vo/BusinessDataVO.java b/sky-pojo/src/main/java/com/sky/vo/BusinessDataVO.java new file mode 100644 index 0000000..50e8bc6 --- /dev/null +++ b/sky-pojo/src/main/java/com/sky/vo/BusinessDataVO.java @@ -0,0 +1,29 @@ +package com.sky.vo; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +/** + * 数据概览 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class BusinessDataVO implements Serializable { + + private Double turnover;//营业额 + + private Integer validOrderCount;//有效订单数 + + private Double orderCompletionRate;//订单完成率 + + private Double unitPrice;//平均客单价 + + private Integer newUsers;//新增用户数 + +} diff --git a/sky-pojo/src/main/java/com/sky/vo/DishItemVO.java b/sky-pojo/src/main/java/com/sky/vo/DishItemVO.java new file mode 100644 index 0000000..0b36866 --- /dev/null +++ b/sky-pojo/src/main/java/com/sky/vo/DishItemVO.java @@ -0,0 +1,27 @@ +package com.sky.vo; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class DishItemVO implements Serializable { + + //菜品名称 + private String name; + + //份数 + private Integer copies; + + //菜品图片 + private String image; + + //菜品描述 + private String description; +} diff --git a/sky-pojo/src/main/java/com/sky/vo/DishOverViewVO.java b/sky-pojo/src/main/java/com/sky/vo/DishOverViewVO.java new file mode 100644 index 0000000..6e55d64 --- /dev/null +++ b/sky-pojo/src/main/java/com/sky/vo/DishOverViewVO.java @@ -0,0 +1,23 @@ +package com.sky.vo; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +/** + * 菜品总览 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class DishOverViewVO implements Serializable { + // 已启售数量 + private Integer sold; + + // 已停售数量 + private Integer discontinued; +} diff --git a/sky-pojo/src/main/java/com/sky/vo/DishVO.java b/sky-pojo/src/main/java/com/sky/vo/DishVO.java new file mode 100644 index 0000000..9923d3a --- /dev/null +++ b/sky-pojo/src/main/java/com/sky/vo/DishVO.java @@ -0,0 +1,41 @@ +package com.sky.vo; + +import com.sky.entity.DishFlavor; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class DishVO implements Serializable { + + private Long id; + //菜品名称 + private String name; + //菜品分类id + private Long categoryId; + //菜品价格 + private BigDecimal price; + //图片 + private String image; + //描述信息 + private String description; + //0 停售 1 起售 + private Integer status; + //更新时间 + private LocalDateTime updateTime; + //分类名称 + private String categoryName; + //菜品关联的口味 + private List flavors = new ArrayList<>(); + + //private Integer copies; +} diff --git a/sky-pojo/src/main/java/com/sky/vo/EmployeeLoginVO.java b/sky-pojo/src/main/java/com/sky/vo/EmployeeLoginVO.java new file mode 100644 index 0000000..55624b9 --- /dev/null +++ b/sky-pojo/src/main/java/com/sky/vo/EmployeeLoginVO.java @@ -0,0 +1,31 @@ +package com.sky.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@ApiModel(description = "员工登录返回的数据格式") +public class EmployeeLoginVO implements Serializable { + + @ApiModelProperty("主键值") + private Long id; + + @ApiModelProperty("用户名") + private String userName; + + @ApiModelProperty("姓名") + private String name; + + @ApiModelProperty("jwt令牌") + private String token; + +} diff --git a/sky-pojo/src/main/java/com/sky/vo/OrderOverViewVO.java b/sky-pojo/src/main/java/com/sky/vo/OrderOverViewVO.java new file mode 100644 index 0000000..0dfd103 --- /dev/null +++ b/sky-pojo/src/main/java/com/sky/vo/OrderOverViewVO.java @@ -0,0 +1,32 @@ +package com.sky.vo; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +/** + * 订单概览数据 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class OrderOverViewVO implements Serializable { + //待接单数量 + private Integer waitingOrders; + + //待派送数量 + private Integer deliveredOrders; + + //已完成数量 + private Integer completedOrders; + + //已取消数量 + private Integer cancelledOrders; + + //全部订单 + private Integer allOrders; +} diff --git a/sky-pojo/src/main/java/com/sky/vo/OrderPaymentVO.java b/sky-pojo/src/main/java/com/sky/vo/OrderPaymentVO.java new file mode 100644 index 0000000..169e6b1 --- /dev/null +++ b/sky-pojo/src/main/java/com/sky/vo/OrderPaymentVO.java @@ -0,0 +1,23 @@ +package com.sky.vo; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.time.LocalDateTime; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class OrderPaymentVO implements Serializable { + + private String nonceStr; //随机字符串 + private String paySign; //签名 + private String timeStamp; //时间戳 + private String signType; //签名算法 + private String packageStr; //统一下单接口返回的 prepay_id 参数值 + +} diff --git a/sky-pojo/src/main/java/com/sky/vo/OrderReportVO.java b/sky-pojo/src/main/java/com/sky/vo/OrderReportVO.java new file mode 100644 index 0000000..fe0a574 --- /dev/null +++ b/sky-pojo/src/main/java/com/sky/vo/OrderReportVO.java @@ -0,0 +1,34 @@ +package com.sky.vo; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class OrderReportVO implements Serializable { + + //日期,以逗号分隔,例如:2022-10-01,2022-10-02,2022-10-03 + private String dateList; + + //每日订单数,以逗号分隔,例如:260,210,215 + private String orderCountList; + + //每日有效订单数,以逗号分隔,例如:20,21,10 + private String validOrderCountList; + + //订单总数 + private Integer totalOrderCount; + + //有效订单数 + private Integer validOrderCount; + + //订单完成率 + private Double orderCompletionRate; + +} diff --git a/sky-pojo/src/main/java/com/sky/vo/OrderStatisticsVO.java b/sky-pojo/src/main/java/com/sky/vo/OrderStatisticsVO.java new file mode 100644 index 0000000..bb005ff --- /dev/null +++ b/sky-pojo/src/main/java/com/sky/vo/OrderStatisticsVO.java @@ -0,0 +1,16 @@ +package com.sky.vo; + +import lombok.Data; +import java.io.Serializable; + +@Data +public class OrderStatisticsVO implements Serializable { + //待接单数量 + private Integer toBeConfirmed; + + //待派送数量 + private Integer confirmed; + + //派送中数量 + private Integer deliveryInProgress; +} diff --git a/sky-pojo/src/main/java/com/sky/vo/OrderSubmitVO.java b/sky-pojo/src/main/java/com/sky/vo/OrderSubmitVO.java new file mode 100644 index 0000000..8334fcd --- /dev/null +++ b/sky-pojo/src/main/java/com/sky/vo/OrderSubmitVO.java @@ -0,0 +1,25 @@ +package com.sky.vo; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class OrderSubmitVO implements Serializable { + //订单id + private Long id; + //订单号 + private String orderNumber; + //订单金额 + private BigDecimal orderAmount; + //下单时间 + private LocalDateTime orderTime; +} diff --git a/sky-pojo/src/main/java/com/sky/vo/OrderVO.java b/sky-pojo/src/main/java/com/sky/vo/OrderVO.java new file mode 100644 index 0000000..59715de --- /dev/null +++ b/sky-pojo/src/main/java/com/sky/vo/OrderVO.java @@ -0,0 +1,22 @@ +package com.sky.vo; + +import com.sky.entity.OrderDetail; +import com.sky.entity.Orders; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import java.io.Serializable; +import java.util.List; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class OrderVO extends Orders implements Serializable { + + //订单菜品信息 + private String orderDishes; + + //订单详情 + private List orderDetailList; + +} diff --git a/sky-pojo/src/main/java/com/sky/vo/SalesTop10ReportVO.java b/sky-pojo/src/main/java/com/sky/vo/SalesTop10ReportVO.java new file mode 100644 index 0000000..bdbaa3c --- /dev/null +++ b/sky-pojo/src/main/java/com/sky/vo/SalesTop10ReportVO.java @@ -0,0 +1,22 @@ +package com.sky.vo; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class SalesTop10ReportVO implements Serializable { + + //商品名称列表,以逗号分隔,例如:鱼香肉丝,宫保鸡丁,水煮鱼 + private String nameList; + + //销量列表,以逗号分隔,例如:260,215,200 + private String numberList; + +} diff --git a/sky-pojo/src/main/java/com/sky/vo/SetmealOverViewVO.java b/sky-pojo/src/main/java/com/sky/vo/SetmealOverViewVO.java new file mode 100644 index 0000000..7d46db5 --- /dev/null +++ b/sky-pojo/src/main/java/com/sky/vo/SetmealOverViewVO.java @@ -0,0 +1,23 @@ +package com.sky.vo; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +/** + * 套餐总览 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class SetmealOverViewVO implements Serializable { + // 已启售数量 + private Integer sold; + + // 已停售数量 + private Integer discontinued; +} diff --git a/sky-pojo/src/main/java/com/sky/vo/SetmealVO.java b/sky-pojo/src/main/java/com/sky/vo/SetmealVO.java new file mode 100644 index 0000000..3b32b78 --- /dev/null +++ b/sky-pojo/src/main/java/com/sky/vo/SetmealVO.java @@ -0,0 +1,48 @@ +package com.sky.vo; + +import com.sky.entity.SetmealDish; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class SetmealVO implements Serializable { + + private Long id; + + //分类id + private Long categoryId; + + //套餐名称 + private String name; + + //套餐价格 + private BigDecimal price; + + //状态 0:停用 1:启用 + private Integer status; + + //描述信息 + private String description; + + //图片 + private String image; + + //更新时间 + private LocalDateTime updateTime; + + //分类名称 + private String categoryName; + + //套餐和菜品的关联关系 + private List setmealDishes = new ArrayList<>(); +} diff --git a/sky-pojo/src/main/java/com/sky/vo/TurnoverReportVO.java b/sky-pojo/src/main/java/com/sky/vo/TurnoverReportVO.java new file mode 100644 index 0000000..c345bff --- /dev/null +++ b/sky-pojo/src/main/java/com/sky/vo/TurnoverReportVO.java @@ -0,0 +1,22 @@ +package com.sky.vo; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class TurnoverReportVO implements Serializable { + + //日期,以逗号分隔,例如:2022-10-01,2022-10-02,2022-10-03 + private String dateList; + + //营业额,以逗号分隔,例如:406.0,1520.0,75.0 + private String turnoverList; + +} diff --git a/sky-pojo/src/main/java/com/sky/vo/UserLoginVO.java b/sky-pojo/src/main/java/com/sky/vo/UserLoginVO.java new file mode 100644 index 0000000..3ad83a8 --- /dev/null +++ b/sky-pojo/src/main/java/com/sky/vo/UserLoginVO.java @@ -0,0 +1,20 @@ +package com.sky.vo; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class UserLoginVO implements Serializable { + + private Long id; + private String openid; + private String token; + +} diff --git a/sky-pojo/src/main/java/com/sky/vo/UserReportVO.java b/sky-pojo/src/main/java/com/sky/vo/UserReportVO.java new file mode 100644 index 0000000..4c017f4 --- /dev/null +++ b/sky-pojo/src/main/java/com/sky/vo/UserReportVO.java @@ -0,0 +1,25 @@ +package com.sky.vo; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class UserReportVO implements Serializable { + + //日期,以逗号分隔,例如:2022-10-01,2022-10-02,2022-10-03 + private String dateList; + + //用户总量,以逗号分隔,例如:200,210,220 + private String totalUserList; + + //新增用户,以逗号分隔,例如:20,21,10 + private String newUserList; + +} diff --git a/sky-server/pom.xml b/sky-server/pom.xml new file mode 100644 index 0000000..6172153 --- /dev/null +++ b/sky-server/pom.xml @@ -0,0 +1,129 @@ + + + + sky-take-out + com.sky + 1.0-SNAPSHOT + + 4.0.0 + sky-server + + + + com.sky + sky-common + 1.0-SNAPSHOT + + + + com.sky + sky-pojo + 1.0-SNAPSHOT + + + + org.springframework.boot + spring-boot-starter + + + + org.springframework.boot + spring-boot-starter-test + test + + + + org.springframework.boot + spring-boot-starter-web + compile + + + + mysql + mysql-connector-java + runtime + + + + org.mybatis.spring.boot + mybatis-spring-boot-starter + + + + org.projectlombok + lombok + + + + com.alibaba + fastjson + + + + com.alibaba + druid-spring-boot-starter + + + + com.github.pagehelper + pagehelper-spring-boot-starter + + + + org.aspectj + aspectjrt + + + + org.aspectj + aspectjweaver + + + + com.github.xiaoymin + knife4j-spring-boot-starter + + + + org.springframework.boot + spring-boot-starter-data-redis + + + + org.springframework.boot + spring-boot-starter-cache + + + + org.springframework.boot + spring-boot-starter-websocket + + + + javax.xml.bind + jaxb-api + + + + + org.apache.poi + poi + + + org.apache.poi + poi-ooxml + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/sky-server/src/main/java/com/sky/SkyApplication.java b/sky-server/src/main/java/com/sky/SkyApplication.java new file mode 100644 index 0000000..05e74ac --- /dev/null +++ b/sky-server/src/main/java/com/sky/SkyApplication.java @@ -0,0 +1,19 @@ +package com.sky; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +@SpringBootApplication +@EnableTransactionManagement //开启注解方式的事务管理 +@Slf4j +@EnableCaching +public class SkyApplication { + public static void main(String[] args) { + SpringApplication.run(SkyApplication.class, args); + log.info("server started"); + } +} diff --git a/sky-server/src/main/java/com/sky/annotation/AutoFill.java b/sky-server/src/main/java/com/sky/annotation/AutoFill.java new file mode 100644 index 0000000..15dbab4 --- /dev/null +++ b/sky-server/src/main/java/com/sky/annotation/AutoFill.java @@ -0,0 +1,18 @@ +package com.sky.annotation; + +import com.sky.enumeration.OperationType; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 自定义注解,用于标识某个方法需要进行功能字段自动填充处理 + */ +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +public @interface AutoFill { + //数据库操作类型: UPDATE INSERT + OperationType value(); +} diff --git a/sky-server/src/main/java/com/sky/aspect/AutoFillAspect.java b/sky-server/src/main/java/com/sky/aspect/AutoFillAspect.java new file mode 100644 index 0000000..d98e5c6 --- /dev/null +++ b/sky-server/src/main/java/com/sky/aspect/AutoFillAspect.java @@ -0,0 +1,97 @@ +package com.sky.aspect; + +import com.sky.annotation.AutoFill; +import com.sky.constant.AutoFillConstant; +import com.sky.context.BaseContext; +import com.sky.enumeration.OperationType; +import lombok.extern.slf4j.Slf4j; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.Signature; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Before; +import org.aspectj.lang.annotation.Pointcut; +import org.aspectj.lang.reflect.MethodSignature; +import org.springframework.stereotype.Component; + +import java.lang.reflect.Method; +import java.time.LocalDateTime; + +import static com.sky.constant.AutoFillConstant.*; + +/** + * 自定义切面,实现公共字段自动填充处理逻辑 + */ +@Aspect +@Component +@Slf4j +public class AutoFillAspect { + + /** + * 切入点 + */ + @Pointcut("execution(* com.sky.mapper.*.*(..)) && @annotation(com.sky.annotation.AutoFill)") + public void autoFillPointCut(){} + + /** + * 前置通知,在通知中进行公共字段的赋值 + */ + @Before("autoFillPointCut()") + public void autoFill(JoinPoint joinPoint) throws Exception { + log.info("开始进行公共字段自动填充..."); + + //获取到当前被拦截的方法上的数据库操作类型 + MethodSignature signature = (MethodSignature) joinPoint.getSignature(); //方法签名对象 + AutoFill autoFill = signature.getMethod().getAnnotation(AutoFill.class); //获得方法上的注解对象 + OperationType operationType = autoFill.value(); //获得数据库操作类型 + + //获取到当前被拦截的方法的参数--实体对象 + Object[] args = joinPoint.getArgs(); + if (args == null || args.length == 0){ + return; + } + + Object entity = args[0]; + + //准备赋值的数据 + LocalDateTime now = LocalDateTime.now(); + Long currentId = BaseContext.getCurrentId(); + + //根据当前不同的操作类型,为对应的属性通过反射来赋值 + if (operationType == OperationType.INSERT){ + //为4个公共字段赋值 + try { + Method setCreateTime = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_CREATE_TIME, LocalDateTime.class); + Method setCreateUser = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_CREATE_USER, Long.class); + Method setUpdateTime = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_TIME, LocalDateTime.class); + Method setUpdateUser = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_USER, Long.class); + + //通过反射为对象属性赋值 + setCreateTime.invoke(entity,now); + setCreateUser.invoke(entity,currentId); + setUpdateTime.invoke(entity,now); + setUpdateUser.invoke(entity,currentId); + + + } catch (Exception e) { +// throw new Exception(e); + e.printStackTrace(); + } + + }else if (operationType == OperationType.UPDATE){ + //为2个公共字段赋值 + try { + Method setUpdateTime = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_TIME, LocalDateTime.class); + Method setUpdateUser = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_USER, Long.class); + + //通过反射为对象属性赋值 + setUpdateTime.invoke(entity,now); + setUpdateUser.invoke(entity,currentId); + + } catch (Exception e) { +// throw new Exception(e); + e.printStackTrace(); + } + } + } +} diff --git a/sky-server/src/main/java/com/sky/config/OssConfiguration.java b/sky-server/src/main/java/com/sky/config/OssConfiguration.java new file mode 100644 index 0000000..7a0cc91 --- /dev/null +++ b/sky-server/src/main/java/com/sky/config/OssConfiguration.java @@ -0,0 +1,26 @@ +package com.sky.config; + +import com.sky.properties.AliOssProperties; +import com.sky.utils.AliOssUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * 配置类,用于创建AliOssUtil对象 + */ +@Configuration +@Slf4j +public class OssConfiguration { + + @Bean + @ConditionalOnMissingBean + public AliOssUtil aliOssUtil(AliOssProperties aliOssProperties){ + log.info("开始创建阿里云文件上传对象:{}",aliOssProperties); + return new AliOssUtil(aliOssProperties.getEndpoint(), + aliOssProperties.getAccessKeyId(), + aliOssProperties.getAccessKeySecret(), + aliOssProperties.getBucketName()); + } +} diff --git a/sky-server/src/main/java/com/sky/config/RedisConfiguration.java b/sky-server/src/main/java/com/sky/config/RedisConfiguration.java new file mode 100644 index 0000000..a93b2b2 --- /dev/null +++ b/sky-server/src/main/java/com/sky/config/RedisConfiguration.java @@ -0,0 +1,25 @@ +package com.sky.config; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.serializer.StringRedisSerializer; + +@Configuration +@Slf4j +public class RedisConfiguration { + + @Bean + public RedisTemplate redisTemplate(RedisConnectionFactory connectionFactory){ + log.info("开始创建redis模板对象..."); + RedisTemplate redisTemplate = new RedisTemplate(); + //设置redis连接工厂对象 + redisTemplate.setConnectionFactory(connectionFactory); + //设置redis key的序列化器 + redisTemplate.setKeySerializer(new StringRedisSerializer()); + return redisTemplate; + + } +} diff --git a/sky-server/src/main/java/com/sky/config/WebMvcConfiguration.java b/sky-server/src/main/java/com/sky/config/WebMvcConfiguration.java new file mode 100644 index 0000000..08faeff --- /dev/null +++ b/sky-server/src/main/java/com/sky/config/WebMvcConfiguration.java @@ -0,0 +1,121 @@ +package com.sky.config; + +import com.sky.interceptor.JwtTokenAdminInterceptor; +import com.sky.interceptor.JwtTokenUserInterceptor; +import com.sky.json.JacksonObjectMapper; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.converter.HttpMessageConverter; +import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport; +import springfox.documentation.builders.ApiInfoBuilder; +import springfox.documentation.builders.PathSelectors; +import springfox.documentation.builders.RequestHandlerSelectors; +import springfox.documentation.service.ApiInfo; +import springfox.documentation.spi.DocumentationType; +import springfox.documentation.spring.web.plugins.Docket; + +import java.util.List; + +/** + * 配置类,注册web层相关组件 + */ +@Configuration +@Slf4j +public class WebMvcConfiguration extends WebMvcConfigurationSupport { + + @Autowired + private JwtTokenAdminInterceptor jwtTokenAdminInterceptor; + + @Autowired + private JwtTokenUserInterceptor jwtTokenUserInterceptor; + + /** + * 注册自定义拦截器 + * + * @param registry + */ + protected void addInterceptors(InterceptorRegistry registry) { + log.info("开始注册自定义拦截器..."); + registry.addInterceptor(jwtTokenAdminInterceptor) + .addPathPatterns("/admin/**") + .excludePathPatterns("/admin/employee/login"); + + registry.addInterceptor(jwtTokenUserInterceptor) + .addPathPatterns("/user/**") + .excludePathPatterns("/user/user/login") + .excludePathPatterns("/user/shop/status"); + } + + /** + * 通过knife4j生成管理端接口文档 + * @return + */ + @Bean + public Docket docket1() { + log.info("准备生成接口文档..."); + ApiInfo apiInfo = new ApiInfoBuilder() + .title("苍穹外卖项目接口文档") + .version("2.0") + .description("苍穹外卖项目接口文档") + .build(); + Docket docket = new Docket(DocumentationType.SWAGGER_2) + .groupName("管理端接口") + .apiInfo(apiInfo) + .select() + .apis(RequestHandlerSelectors.basePackage("com.sky.controller.admin")) + .paths(PathSelectors.any()) + .build(); + return docket; + } + /** + * 通过knife4j生成用户端接口文档 + * @return + */ + @Bean + public Docket docket2() { + log.info("准备生成接口文档..."); + ApiInfo apiInfo = new ApiInfoBuilder() + .title("苍穹外卖项目接口文档") + .version("2.0") + .description("苍穹外卖项目接口文档") + .build(); + Docket docket = new Docket(DocumentationType.SWAGGER_2) + .groupName("用户端接口") + .apiInfo(apiInfo) + .select() + .apis(RequestHandlerSelectors.basePackage("com.sky.controller.user")) + .paths(PathSelectors.any()) + .build(); + return docket; + } + + /** + * 设置静态资源映射 + * @param registry + */ + protected void addResourceHandlers(ResourceHandlerRegistry registry) { + log.info("开始设置静态资源映射..."); + registry.addResourceHandler("/doc.html").addResourceLocations("classpath:/META-INF/resources/"); + registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/"); + } + + /** + * 扩展Spring MVC框架的消息转化器 + * @param converters + */ + @Override + protected void extendMessageConverters(List> converters) { + log.info("扩展消息转换器..."); + MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(); + //需要为消息转换器设置一个对象转换器,对象转换器可以将Java对象序列化为json数据 + converter.setObjectMapper(new JacksonObjectMapper()); + //将自己的消息转换器加入容器中 + converters.add(0,converter); + + } +} diff --git a/sky-server/src/main/java/com/sky/controller/admin/CategoryController.java b/sky-server/src/main/java/com/sky/controller/admin/CategoryController.java new file mode 100644 index 0000000..3ed6cc9 --- /dev/null +++ b/sky-server/src/main/java/com/sky/controller/admin/CategoryController.java @@ -0,0 +1,103 @@ +package com.sky.controller.admin; + +import com.sky.dto.CategoryDTO; +import com.sky.dto.CategoryPageQueryDTO; +import com.sky.entity.Category; +import com.sky.result.PageResult; +import com.sky.result.Result; +import com.sky.service.CategoryService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import java.util.List; + +/** + * 分类管理 + */ +@RestController +@RequestMapping("/admin/category") +@Api(tags = "分类相关接口") +@Slf4j +public class CategoryController { + + @Autowired + private CategoryService categoryService; + + /** + * 新增分类 + * @param categoryDTO + * @return + */ + @PostMapping + @ApiOperation("新增分类") + public Result save(@RequestBody CategoryDTO categoryDTO){ + log.info("新增分类:{}", categoryDTO); + categoryService.save(categoryDTO); + return Result.success(); + } + + /** + * 分类分页查询 + * @param categoryPageQueryDTO + * @return + */ + @GetMapping("/page") + @ApiOperation("分类分页查询") + public Result page(CategoryPageQueryDTO categoryPageQueryDTO){ + log.info("分页查询:{}", categoryPageQueryDTO); + PageResult pageResult = categoryService.pageQuery(categoryPageQueryDTO); + return Result.success(pageResult); + } + + /** + * 删除分类 + * @param id + * @return + */ + @DeleteMapping + @ApiOperation("删除分类") + public Result deleteById(Long id){ + log.info("删除分类:{}", id); + categoryService.deleteById(id); + return Result.success(); + } + + /** + * 修改分类 + * @param categoryDTO + * @return + */ + @PutMapping + @ApiOperation("修改分类") + public Result update(@RequestBody CategoryDTO categoryDTO){ + categoryService.update(categoryDTO); + return Result.success(); + } + + /** + * 启用、禁用分类 + * @param status + * @param id + * @return + */ + @PostMapping("/status/{status}") + @ApiOperation("启用禁用分类") + public Result startOrStop(@PathVariable("status") Integer status, Long id){ + categoryService.startOrStop(status,id); + return Result.success(); + } + + /** + * 根据类型查询分类 + * @param type + * @return + */ + @GetMapping("/list") + @ApiOperation("根据类型查询分类") + public Result> list(Integer type){ + List list = categoryService.list(type); + return Result.success(list); + } +} diff --git a/sky-server/src/main/java/com/sky/controller/admin/CommonController.java b/sky-server/src/main/java/com/sky/controller/admin/CommonController.java new file mode 100644 index 0000000..b50bade --- /dev/null +++ b/sky-server/src/main/java/com/sky/controller/admin/CommonController.java @@ -0,0 +1,55 @@ +package com.sky.controller.admin; + +import com.sky.constant.MessageConstant; +import com.sky.result.Result; +import com.sky.utils.AliOssUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.util.UUID; + +/** + * 通用接口 + */ +@RestController +@RequestMapping("/admin/common") +@Api(tags = "通用接口") +@Slf4j +public class CommonController { + + @Autowired + private AliOssUtil aliOssUtil; + /** + * 文件上传 + * @param file + * @return + */ + @PostMapping("/upload") + @ApiOperation("文件上传") + public Result upload(MultipartFile file){ + log.info("文件上传:{}",file); + + try { + //原始文件名 + String originalFilename = file.getOriginalFilename(); + //截取原始文件名后缀 sdfs.png + String extension = originalFilename.substring(originalFilename.lastIndexOf(".")); + //构造新文件名称 + String objectName = UUID.randomUUID().toString() + extension; + + //文件的请求路径 + String filePath = aliOssUtil.upload(file.getBytes(), objectName); + return Result.success(filePath); + } catch (IOException e) { + log.error("文件上传失败:{}",e); + } + return Result.error(MessageConstant.UPLOAD_FAILED); + } +} diff --git a/sky-server/src/main/java/com/sky/controller/admin/DishController.java b/sky-server/src/main/java/com/sky/controller/admin/DishController.java new file mode 100644 index 0000000..a475bec --- /dev/null +++ b/sky-server/src/main/java/com/sky/controller/admin/DishController.java @@ -0,0 +1,150 @@ +package com.sky.controller.admin; + +import com.sky.dto.DishDTO; +import com.sky.dto.DishPageQueryDTO; +import com.sky.entity.Dish; +import com.sky.result.PageResult; +import com.sky.result.Result; +import com.sky.service.DishService; +import com.sky.vo.DishVO; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.apache.ibatis.annotations.Delete; +import org.apache.ibatis.io.ResolverUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Set; + +/** + * 菜品管理 + */ +@RestController +@RequestMapping("/admin/dish") +@Api(tags = "菜品相关接口") +@Slf4j +public class DishController { + + @Autowired + private DishService dishService; + @Autowired + private RedisTemplate redisTemplate; + /** + * 新增菜品 + * @param dishDTO + * @return + */ + @PostMapping + @ApiOperation("新增菜品") + public Result save(@RequestBody DishDTO dishDTO) { + log.info("新增菜品:{}",dishDTO); + dishService.saveWithFlavor(dishDTO); + + //清理缓存数据 + String key = "dish:" + dishDTO.getCategoryId(); + cleanCache(key); + + return Result.success(); + } + + /** + * 菜品分页查询 + * @param dishPageQueryDTO + * @return + */ + @GetMapping("/page") + @ApiOperation("菜品分页查询") + public Result page(DishPageQueryDTO dishPageQueryDTO) { + log.info("菜品分页查询:{}",dishPageQueryDTO); + PageResult pageResult = dishService.pageQuery(dishPageQueryDTO); + return Result.success(pageResult); + } + + /** + * 菜品批量删除 + * @param ids + * @return + */ + @DeleteMapping + @ApiOperation("菜品批量删除") + public Result delete(@RequestParam List ids){ + log.info("菜品批量删除:{}",ids); + dishService.deleteBatch(ids); + + //清理缓存数据,将所有缓存数据都清理掉 dish_开头 + cleanCache("dish_*"); + + return Result.success(); + } + + /** + * 根据id查询菜品 + * @param id + * @return + */ + @GetMapping("/{id}") + @ApiOperation("根据id查询菜品") + public Result getById(@PathVariable Long id) { + log.info("根据id查询菜品:{}",id); + DishVO dishVO = dishService.getByIdWithFlavor(id); + return Result.success(dishVO); + } + + /** + * 菜品起售停售 + * @param status + * @param id + * @return + */ + @PostMapping("/status/{status}") + @ApiOperation("菜品起售停售") + public Result startOrStop(@PathVariable Integer status,Long id){ + dishService.startOrStop(status,id); + + //清理缓存数据,将所有缓存数据都清理掉 dish_开头 + cleanCache("dish_*"); + + return Result.success(); + } + + /** + * 根据分类id查询菜品 + * @param categoryId + * @return + */ + @GetMapping("/list") + @ApiOperation("根据分类id查询菜品") + public Result> list(Long categoryId){ + List list = dishService.list(categoryId); + return Result.success(list); + } + + /** + * 修改菜品 + * @param dishDTO + * @return + */ + @PutMapping + @ApiOperation("修改菜品") + public Result update(@RequestBody DishDTO dishDTO){ + log.info("修改菜品"); + dishService.updateWithFlavor(dishDTO); + + //清理缓存数据,将所有缓存数据都清理掉 dish_开头 + cleanCache("dish_*"); + + return Result.success(); + } + + /** + * 清理缓存数据 + * @param pattern + */ + private void cleanCache(String pattern){ + Set keys = redisTemplate.keys(pattern); + redisTemplate.delete(keys); + } +} diff --git a/sky-server/src/main/java/com/sky/controller/admin/EmployeeController.java b/sky-server/src/main/java/com/sky/controller/admin/EmployeeController.java new file mode 100644 index 0000000..457e144 --- /dev/null +++ b/sky-server/src/main/java/com/sky/controller/admin/EmployeeController.java @@ -0,0 +1,125 @@ +package com.sky.controller.admin; + +import com.sky.constant.JwtClaimsConstant; +import com.sky.dto.EmployeeDTO; +import com.sky.dto.EmployeeLoginDTO; +import com.sky.dto.EmployeePageQueryDTO; +import com.sky.entity.Employee; +import com.sky.properties.JwtProperties; +import com.sky.result.PageResult; +import com.sky.result.Result; +import com.sky.service.EmployeeService; +import com.sky.utils.JwtUtil; +import com.sky.vo.EmployeeLoginVO; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.HashMap; +import java.util.Map; + +/** + * 员工管理 + */ +@RestController +@RequestMapping("/admin/employee") +@Slf4j +@Api(tags = "员工相关接口") +public class EmployeeController { + + @Autowired + private EmployeeService employeeService; + @Autowired + private JwtProperties jwtProperties; + + /** + * 登录 + * + * @param employeeLoginDTO + * @return + */ + @PostMapping("/login") + @ApiOperation(value = "员工登录") + public Result login(@RequestBody EmployeeLoginDTO employeeLoginDTO) { + log.info("员工登录:{}", employeeLoginDTO); + + Employee employee = employeeService.login(employeeLoginDTO); + + //登录成功后,生成jwt令牌 + Map claims = new HashMap<>(); + claims.put(JwtClaimsConstant.EMP_ID, employee.getId()); + String token = JwtUtil.createJWT( + jwtProperties.getAdminSecretKey(), + jwtProperties.getAdminTtl(), + claims); + + EmployeeLoginVO employeeLoginVO = EmployeeLoginVO.builder() + .id(employee.getId()) + .userName(employee.getUsername()) + .name(employee.getName()) + .token(token) + .build(); + + return Result.success(employeeLoginVO); + } + + /** + * 退出 + * + * @return + */ + @PostMapping("/logout") + @ApiOperation(value = "员工退出") + public Result logout() { + return Result.success(); + } + + @PostMapping + @ApiOperation("新增员工") + public Result save(@RequestBody EmployeeDTO employeeDTO){ + log.info("新增员工:{}", employeeDTO); +// System.out.println("当前线程的id" + Thread.currentThread().getId()); + employeeService.save(employeeDTO); + return Result.success(); + } + + + /** + * 员工分页查询 + * @param employeePageQueryDTO + * @return + */ + @GetMapping("/page") + @ApiOperation("员工分页查询") + public Result page(EmployeePageQueryDTO employeePageQueryDTO){ + log.info("员工分页查询,参数为:{}", employeePageQueryDTO); + PageResult pageResult = employeeService.pageQuery(employeePageQueryDTO); + return Result.success(pageResult); + } + + @PostMapping("/status/{status}") + @ApiOperation("启用禁用员工账号") + public Result startOrStop(@PathVariable Integer status,Long id){ + log.info("启用禁用员工账号:{},{}", status, id); + employeeService.startOrStop(status,id); + return Result.success(); + } + + @GetMapping("/{id}") + @ApiOperation("根据id查询员工信息") + public Result getById(@PathVariable Long id){ + Employee employee = employeeService.getById(id); + return Result.success(employee); + } + + @PutMapping() + @ApiOperation("编辑员工信息") + public Result update(@RequestBody EmployeeDTO employeeDTO){ + log.info("编辑员工信息:{}", employeeDTO); + employeeService.update(employeeDTO); + return Result.success(); + } + +} diff --git a/sky-server/src/main/java/com/sky/controller/admin/SetmealController.java b/sky-server/src/main/java/com/sky/controller/admin/SetmealController.java new file mode 100644 index 0000000..5419b0b --- /dev/null +++ b/sky-server/src/main/java/com/sky/controller/admin/SetmealController.java @@ -0,0 +1,106 @@ +package com.sky.controller.admin; + +import com.sky.dto.SetmealDTO; +import com.sky.dto.SetmealPageQueryDTO; +import com.sky.result.PageResult; +import com.sky.result.Result; +import com.sky.service.SetmealService; +import com.sky.vo.SetmealVO; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.web.bind.annotation.*; + +import javax.websocket.server.PathParam; +import java.util.List; + +/** + * 套餐管理 + */ +@RestController +@RequestMapping("/admin/setmeal") +@Api(tags = "套餐相关接口") +@Slf4j +public class SetmealController { + + @Autowired + private SetmealService setmealService; + + /** + * 新增套餐 + * @param setmealDTO + * @return + */ + @PostMapping + @ApiOperation("新增套餐") + @CacheEvict(cacheNames = "setmealCache",key = "#setmealDTO.categoryId") //key setmealCache::categoryId + public Result save(@RequestBody SetmealDTO setmealDTO) { + setmealService.saveWithDish(setmealDTO); + return Result.success(); + } + + /** + * 分页查询 + * @param setmealPageQueryDTO + * @return + */ + @GetMapping("/page") + @ApiOperation("分页查询") + public Result page(SetmealPageQueryDTO setmealPageQueryDTO){ + PageResult pageResult = setmealService.pageQuery(setmealPageQueryDTO); + return Result.success(pageResult); + } + + /** + * 批量删除套餐 + * @param ids + * @return + */ + @DeleteMapping + @ApiOperation("批量删除套餐") + @CacheEvict(cacheNames = "setmealCache",allEntries = true) + public Result delete(@RequestParam List ids){ + setmealService.deleteBatch(ids); + return Result.success(); + } + + /** + * 根据id查询套餐,用于修改页面回显数据 + * @param id + * @return + */ + @GetMapping("/{id}") + @ApiOperation("根据id查询套餐") + public Result getById(@PathVariable Long id){ + SetmealVO setmealVO = setmealService.getByIdWithDish(id); + return Result.success(setmealVO); + } + + /** + * 修改套餐 + * @param setmealDTO + * @return + */ + @PutMapping + @ApiOperation("修改套餐") + @CacheEvict(cacheNames = "setmealCache",allEntries = true) + public Result update(@RequestBody SetmealDTO setmealDTO){ + setmealService.update(setmealDTO); + return Result.success(); + } + + /** + * 套餐起售停售 + * @param status + * @param id + * @return + */ + @PostMapping("/status/{status}") + @CacheEvict(cacheNames = "setmealCache",allEntries = true) + public Result startOrStop(@PathVariable Integer status,Long id){ + setmealService.startOrStop(status,id); + return Result.success(); + } +} \ No newline at end of file diff --git a/sky-server/src/main/java/com/sky/controller/admin/ShopController.java b/sky-server/src/main/java/com/sky/controller/admin/ShopController.java new file mode 100644 index 0000000..c9d5935 --- /dev/null +++ b/sky-server/src/main/java/com/sky/controller/admin/ShopController.java @@ -0,0 +1,46 @@ +package com.sky.controller.admin; + +import com.sky.result.Result; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.web.bind.annotation.*; + +@RestController("adminShopController") +@RequestMapping("/admin/shop") +@Api(tags = "店铺相关接口") +@Slf4j +public class ShopController { + + public static final String KEY = "SHOP_STATUS"; + + @Autowired + private RedisTemplate redisTemplate; + + /** + * 设置店铺的营业状态 + * @param status + * @return + */ + @PutMapping("/{status}") + @ApiOperation("设置店铺营业状态") + public Result setStatus(@PathVariable Integer status){ + log.info("设置店铺的营业时间为:{}",status == 1 ? "营业中":"打烊中"); + redisTemplate.opsForValue().set(KEY,status); + return Result.success(); + } + + /** + * 获取店铺的营业状态 + * @return + */ + @GetMapping("/status") + @ApiOperation("获取店铺的营业状态") + public Result getStatus(){ + Integer status = (Integer)redisTemplate.opsForValue().get(KEY); + log.info("获取到店铺的营业状态为:{}",status == 1 ? "营业中":"打烊中"); + return Result.success(status); + } +} diff --git a/sky-server/src/main/java/com/sky/controller/notify/PayNotifyController.java b/sky-server/src/main/java/com/sky/controller/notify/PayNotifyController.java new file mode 100644 index 0000000..df59cf4 --- /dev/null +++ b/sky-server/src/main/java/com/sky/controller/notify/PayNotifyController.java @@ -0,0 +1,117 @@ +package com.sky.controller.notify; + +import com.alibaba.druid.support.json.JSONUtils; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.sky.properties.WeChatProperties; +import com.sky.service.OrderService; +import com.wechat.pay.contrib.apache.httpclient.util.AesUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.http.entity.ContentType; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.BufferedReader; +import java.nio.charset.StandardCharsets; +import java.util.HashMap; + +/** + * 支付回调相关接口 + */ +@RestController +@RequestMapping("/notify") +@Slf4j +public class PayNotifyController { + @Autowired + private OrderService orderService; + @Autowired + private WeChatProperties weChatProperties; + + /** + * 支付成功回调 + * + * @param request + */ + @RequestMapping("/paySuccess") + public void paySuccessNotify(HttpServletRequest request, HttpServletResponse response) throws Exception { + //读取数据 + String body = readData(request); + log.info("支付成功回调:{}", body); + + //数据解密 + String plainText = decryptData(body); + log.info("解密后的文本:{}", plainText); + + JSONObject jsonObject = JSON.parseObject(plainText); + String outTradeNo = jsonObject.getString("out_trade_no");//商户平台订单号 + String transactionId = jsonObject.getString("transaction_id");//微信支付交易号 + + log.info("商户平台订单号:{}", outTradeNo); + log.info("微信支付交易号:{}", transactionId); + + //业务处理,修改订单状态、来单提醒 + orderService.paySuccess(outTradeNo); + + //给微信响应 + responseToWeixin(response); + } + + /** + * 读取数据 + * + * @param request + * @return + * @throws Exception + */ + private String readData(HttpServletRequest request) throws Exception { + BufferedReader reader = request.getReader(); + StringBuilder result = new StringBuilder(); + String line = null; + while ((line = reader.readLine()) != null) { + if (result.length() > 0) { + result.append("\n"); + } + result.append(line); + } + return result.toString(); + } + + /** + * 数据解密 + * + * @param body + * @return + * @throws Exception + */ + private String decryptData(String body) throws Exception { + JSONObject resultObject = JSON.parseObject(body); + JSONObject resource = resultObject.getJSONObject("resource"); + String ciphertext = resource.getString("ciphertext"); + String nonce = resource.getString("nonce"); + String associatedData = resource.getString("associated_data"); + + AesUtil aesUtil = new AesUtil(weChatProperties.getApiV3Key().getBytes(StandardCharsets.UTF_8)); + //密文解密 + String plainText = aesUtil.decryptToString(associatedData.getBytes(StandardCharsets.UTF_8), + nonce.getBytes(StandardCharsets.UTF_8), + ciphertext); + + return plainText; + } + + /** + * 给微信响应 + * @param response + */ + private void responseToWeixin(HttpServletResponse response) throws Exception{ + response.setStatus(200); + HashMap map = new HashMap<>(); + map.put("code", "SUCCESS"); + map.put("message", "SUCCESS"); + response.setHeader("Content-type", ContentType.APPLICATION_JSON.toString()); + response.getOutputStream().write(JSONUtils.toJSONString(map).getBytes(StandardCharsets.UTF_8)); + response.flushBuffer(); + } +} diff --git a/sky-server/src/main/java/com/sky/controller/user/AddressBookController.java b/sky-server/src/main/java/com/sky/controller/user/AddressBookController.java new file mode 100644 index 0000000..1940482 --- /dev/null +++ b/sky-server/src/main/java/com/sky/controller/user/AddressBookController.java @@ -0,0 +1,113 @@ +package com.sky.controller.user; + +import com.sky.context.BaseContext; +import com.sky.entity.AddressBook; +import com.sky.result.Result; +import com.sky.service.AddressBookService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import java.util.List; + +@RestController +@RequestMapping("/user/addressBook") +@Api(tags = "C端地址簿接口") +public class AddressBookController { + + @Autowired + private AddressBookService addressBookService; + + /** + * 查询当前登录用户的所有地址信息 + * @return + */ + @GetMapping("/list") + @ApiOperation("查询当前登录用户的所有地址信息") + public Result> list() { + AddressBook addressBook = new AddressBook(); + addressBook.setUserId(BaseContext.getCurrentId()); + List list = addressBookService.list(addressBook); + return Result.success(list); + } + + /** + * 新增地址 + * @param addressBook + * @return + */ + @PostMapping + @ApiOperation("新增地址") + public Result save(@RequestBody AddressBook addressBook) { + addressBookService.save(addressBook); + return Result.success(); + } + + /** + * 根据id查询 + * @param id + * @return + */ + @GetMapping("/{id}") + @ApiOperation("根据id查询地址") + public Result getById(@PathVariable Long id) { + AddressBook addressBook = addressBookService.getById(id); + return Result.success(addressBook); + } + + /** + * 根据id修改地址 + * @param addressBook + * @return + */ + @PutMapping + @ApiOperation("根据id修改地址") + public Result update(@RequestBody AddressBook addressBook) { + addressBookService.update(addressBook); + return Result.success(); + } + + /** + * 设置默认地址 + * @param addressBook + * @return + */ + @PutMapping("/default") + @ApiOperation("设置默认地址") + public Result setDefault(@RequestBody AddressBook addressBook) { + addressBookService.setDefault(addressBook); + return Result.success(); + } + + /** + * 根据id删除地址 + * @param id + * @return + */ + @DeleteMapping + @ApiOperation("根据id删除地址") + public Result deleteById(Long id) { + addressBookService.deleteById(id); + return Result.success(); + } + + /** + * 查询默认地址 + */ + @GetMapping("default") + @ApiOperation("查询默认地址") + public Result getDefault() { + //SQL:select * from address_book where user_id = ? and is_default = 1 + AddressBook addressBook = new AddressBook(); + addressBook.setIsDefault(1); + addressBook.setUserId(BaseContext.getCurrentId()); + List list = addressBookService.list(addressBook); + + if (list != null && list.size() == 1) { + return Result.success(list.get(0)); + } + + return Result.error("没有查询到默认地址"); + } + +} diff --git a/sky-server/src/main/java/com/sky/controller/user/CategoryController.java b/sky-server/src/main/java/com/sky/controller/user/CategoryController.java new file mode 100644 index 0000000..ab80e1f --- /dev/null +++ b/sky-server/src/main/java/com/sky/controller/user/CategoryController.java @@ -0,0 +1,33 @@ +package com.sky.controller.user; + +import com.sky.entity.Category; +import com.sky.result.Result; +import com.sky.service.CategoryService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +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.List; + +@RestController("userCategoryController") +@RequestMapping("/user/category") +@Api(tags = "C端-分类接口") +public class CategoryController { + + @Autowired + private CategoryService categoryService; + + /** + * 查询分类 + * @param type + * @return + */ + @GetMapping("/list") + @ApiOperation("查询分类") + public Result> list(Integer type) { + List list = categoryService.list(type); + return Result.success(list); + } +} diff --git a/sky-server/src/main/java/com/sky/controller/user/DishController.java b/sky-server/src/main/java/com/sky/controller/user/DishController.java new file mode 100644 index 0000000..e678bb0 --- /dev/null +++ b/sky-server/src/main/java/com/sky/controller/user/DishController.java @@ -0,0 +1,59 @@ +package com.sky.controller.user; + +import com.sky.constant.StatusConstant; +import com.sky.entity.Dish; +import com.sky.result.Result; +import com.sky.service.DishService; +import com.sky.vo.DishVO; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import java.util.List; + +@RestController("userDishController") +@RequestMapping("/user/dish") +@Slf4j +@Api(tags = "C端-菜品浏览接口") +public class DishController { + @Autowired + private DishService dishService; + @Autowired + private RedisTemplate redisTemplate; + + /** + * 根据分类id查询菜品 + * + * @param categoryId + * @return + */ + @GetMapping("/list") + @ApiOperation("根据分类id查询菜品") + public Result> list(Long categoryId) { + + //构造redis中的key,规则:dish_分类id + String key = "dish_" + categoryId; + + //查询redis中是否存在菜品数据 + List list = (List) redisTemplate.opsForValue().get(key); + if (list != null && list.size() > 0) { + //如果存在,直接返回,无需查询数据库 + return Result.success(list); + } + + Dish dish = new Dish(); + dish.setCategoryId(categoryId); + dish.setStatus(StatusConstant.ENABLE);//查询起售中的菜品 + + //如果不存在,查询数据库,将查询到的数据放入redis中 + list = dishService.listWithFlavor(dish); + redisTemplate.opsForValue().set(key, list); + + return Result.success(list); + } + +} diff --git a/sky-server/src/main/java/com/sky/controller/user/OrderController.java b/sky-server/src/main/java/com/sky/controller/user/OrderController.java new file mode 100644 index 0000000..6da9a1b --- /dev/null +++ b/sky-server/src/main/java/com/sky/controller/user/OrderController.java @@ -0,0 +1,51 @@ +package com.sky.controller.user; + +import com.sky.dto.OrdersPaymentDTO; +import com.sky.dto.OrdersSubmitDTO; +import com.sky.result.Result; +import com.sky.service.OrderService; +import com.sky.vo.OrderPaymentVO; +import com.sky.vo.OrderSubmitVO; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +@RestController("userOrderController") +@RequestMapping("/user/order") +@Api(tags = "用户端订单相关接口") +@Slf4j +public class OrderController { + + @Autowired + private OrderService orderService; + + /** + * 用户下单 + * @param ordersSubmitDTO + * @return + */ + @PostMapping("/submit") + @ApiOperation("用户下单") + public Result submit(@RequestBody OrdersSubmitDTO ordersSubmitDTO){ + log.info("用户下单,参数为:{}",ordersSubmitDTO); + OrderSubmitVO orderSubmitVO = orderService.submitOrder(ordersSubmitDTO); + return Result.success(orderSubmitVO); + } + + /** + * 订单支付 + * + * @param ordersPaymentDTO + * @return + */ + @PutMapping("/payment") + @ApiOperation("订单支付") + public Result payment(@RequestBody OrdersPaymentDTO ordersPaymentDTO) throws Exception { + log.info("订单支付:{}", ordersPaymentDTO); + OrderPaymentVO orderPaymentVO = orderService.payment(ordersPaymentDTO); + log.info("生成预支付交易单:{}", orderPaymentVO); + return Result.success(orderPaymentVO); + } +} diff --git a/sky-server/src/main/java/com/sky/controller/user/SetmealController.java b/sky-server/src/main/java/com/sky/controller/user/SetmealController.java new file mode 100644 index 0000000..9b1f9ce --- /dev/null +++ b/sky-server/src/main/java/com/sky/controller/user/SetmealController.java @@ -0,0 +1,55 @@ +package com.sky.controller.user; + +import com.sky.constant.StatusConstant; +import com.sky.entity.Setmeal; +import com.sky.result.Result; +import com.sky.service.SetmealService; +import com.sky.vo.DishItemVO; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import java.util.List; + +@RestController("userSetmealController") +@RequestMapping("/user/setmeal") +@Api(tags = "C端-套餐浏览接口") +public class SetmealController { + @Autowired + private SetmealService setmealService; + + /** + * 条件查询 + * + * @param categoryId + * @return + */ + @GetMapping("/list") + @ApiOperation("根据分类id查询套餐") + @Cacheable(cacheNames = "setmealCache",key = "#categoryId") //key setmealCache::categoryId + public Result> list(Long categoryId) { + Setmeal setmeal = new Setmeal(); + setmeal.setCategoryId(categoryId); + setmeal.setStatus(StatusConstant.ENABLE); + + List list = setmealService.list(setmeal); + return Result.success(list); + } + + /** + * 根据套餐id查询包含的菜品列表 + * + * @param id + * @return + */ + @GetMapping("/dish/{id}") + @ApiOperation("根据套餐id查询包含的菜品列表") + public Result> dishList(@PathVariable("id") Long id) { + List list = setmealService.getDishItemById(id); + return Result.success(list); + } +} diff --git a/sky-server/src/main/java/com/sky/controller/user/ShopController.java b/sky-server/src/main/java/com/sky/controller/user/ShopController.java new file mode 100644 index 0000000..859aaaf --- /dev/null +++ b/sky-server/src/main/java/com/sky/controller/user/ShopController.java @@ -0,0 +1,33 @@ +package com.sky.controller.user; + +import com.sky.result.Result; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.web.bind.annotation.*; + +@RestController("userShopController") +@RequestMapping("/user/shop") +@Api(tags = "店铺相关接口") +@Slf4j +public class ShopController { + + public static final String KEY = "SHOP_STATUS"; + + @Autowired + private RedisTemplate redisTemplate; + + /** + * 获取店铺的营业状态 + * @return + */ + @GetMapping("/status") + @ApiOperation("获取店铺的营业状态") + public Result getStatus(){ + Integer status = (Integer)redisTemplate.opsForValue().get(KEY); + log.info("获取到店铺的营业状态为:{}",status == 1 ? "营业中":"打烊中"); + return Result.success(status); + } +} diff --git a/sky-server/src/main/java/com/sky/controller/user/ShoppingCartController.java b/sky-server/src/main/java/com/sky/controller/user/ShoppingCartController.java new file mode 100644 index 0000000..92a5e87 --- /dev/null +++ b/sky-server/src/main/java/com/sky/controller/user/ShoppingCartController.java @@ -0,0 +1,73 @@ +package com.sky.controller.user; + +import com.sky.dto.ShoppingCartDTO; +import com.sky.entity.ShoppingCart; +import com.sky.result.Result; +import com.sky.service.ShoppingCartService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.apache.ibatis.annotations.Delete; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.DomainEvents; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping("user/shoppingCart") +@Slf4j +@Api(tags = "C端购物车相关接口") +public class ShoppingCartController { + + @Autowired + private ShoppingCartService shoppingCartService; + + /** + * 添加购物车 + * @param shoppingCartDTO + * @return + */ + @PostMapping("/add") + @ApiOperation("添加购物车") + public Result add(@RequestBody ShoppingCartDTO shoppingCartDTO){ + log.info("添加购物车,商品信息为:{}", shoppingCartDTO); + shoppingCartService.addShoppingCart(shoppingCartDTO); + return Result.success(); + } + + /** + * 查看购物车 + * @return + */ + @GetMapping("/list") + @ApiOperation("查看购物车") + public Result> list(){ + List list= shoppingCartService.showShoppingCart(); + return Result.success(list); + } + + /** + * 清空购物车 + * @return + */ + @DeleteMapping("/clean") + @ApiOperation("清空购物车") + public Result clean(){ + shoppingCartService.cleanShoppingCart(); + return Result.success(); + } + + /** + * 删除购物车中一个商品 + * @param shoppingCartDTO + * @return + */ + @PostMapping("/sub") + @ApiOperation("删除购物车中一个商品") + public Result sub(@RequestBody ShoppingCartDTO shoppingCartDTO){ + log.info("删除购物车中一个商品,商品:{}", shoppingCartDTO); + shoppingCartService.subShoppingCart(shoppingCartDTO); + return Result.success(); + } +} diff --git a/sky-server/src/main/java/com/sky/controller/user/UserController.java b/sky-server/src/main/java/com/sky/controller/user/UserController.java new file mode 100644 index 0000000..fc35cd8 --- /dev/null +++ b/sky-server/src/main/java/com/sky/controller/user/UserController.java @@ -0,0 +1,59 @@ +package com.sky.controller.user; + +import com.sky.constant.JwtClaimsConstant; +import com.sky.dto.UserLoginDTO; +import com.sky.entity.User; +import com.sky.properties.JwtProperties; +import com.sky.result.Result; +import com.sky.service.UserService; +import com.sky.utils.JwtUtil; +import com.sky.vo.UserLoginVO; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +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.HashMap; +import java.util.Map; + +@RestController +@RequestMapping("/user/user") +@Api(tags = "C端用户相关接口") +@Slf4j +public class UserController { + + @Autowired + private UserService userService; + + @Autowired + private JwtProperties jwtProperties; + /** + * 微信登录 + * @param userLoginDTO + * @return + */ + @PostMapping("/login") + @ApiOperation("微信登录") + public Result login(@RequestBody UserLoginDTO userLoginDTO){ + log.info("微信用户登录:{}", userLoginDTO.getCode()); + + //微信登录 + User user = userService.wxLogin(userLoginDTO); + + //为微信用户生成jwt令牌 + Map claims = new HashMap<>(); + claims.put(JwtClaimsConstant.USER_ID, user.getId()); + String token = JwtUtil.createJWT(jwtProperties.getUserSecretKey(),jwtProperties.getUserTtl(),claims); + + UserLoginVO userLoginVO = UserLoginVO.builder() + .id(user.getId()) + .openid(user.getOpenid()) + .token(token) + .build(); + return Result.success(userLoginVO); + } +} diff --git a/sky-server/src/main/java/com/sky/handler/GlobalExceptionHandler.java b/sky-server/src/main/java/com/sky/handler/GlobalExceptionHandler.java new file mode 100644 index 0000000..caa4d3d --- /dev/null +++ b/sky-server/src/main/java/com/sky/handler/GlobalExceptionHandler.java @@ -0,0 +1,48 @@ +package com.sky.handler; + +import com.sky.constant.MessageConstant; +import com.sky.exception.BaseException; +import com.sky.result.Result; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RestControllerAdvice; + +import java.sql.SQLIntegrityConstraintViolationException; + +/** + * 全局异常处理器,处理项目中抛出的业务异常 + */ +@RestControllerAdvice +@Slf4j +public class GlobalExceptionHandler { + + /** + * 捕获业务异常 + * @param ex + * @return + */ + @ExceptionHandler + public Result exceptionHandler(BaseException ex){ + log.error("异常信息:{}", ex.getMessage()); + return Result.error(ex.getMessage()); + } + + /** + * 处理SQL异常 + * @param ex + * @return + */ + @ExceptionHandler + public Result exceptionHandler(SQLIntegrityConstraintViolationException ex){ + //Duplicate entry 'zhangsan' for key 'employee.idx_username' + String message = ex.getMessage(); + if (message.contains("Duplicate entry")){ + String[] split = message.split(" "); + String username = split[2]; + String msg = username + MessageConstant.ALREADY_EXISTS; + return Result.error(msg); + }else{ + return Result.error(MessageConstant.UNKNOWN_ERROR); + } + } +} diff --git a/sky-server/src/main/java/com/sky/interceptor/JwtTokenAdminInterceptor.java b/sky-server/src/main/java/com/sky/interceptor/JwtTokenAdminInterceptor.java new file mode 100644 index 0000000..39d82b2 --- /dev/null +++ b/sky-server/src/main/java/com/sky/interceptor/JwtTokenAdminInterceptor.java @@ -0,0 +1,63 @@ +package com.sky.interceptor; + +import com.sky.constant.JwtClaimsConstant; +import com.sky.context.BaseContext; +import com.sky.properties.JwtProperties; +import com.sky.utils.JwtUtil; +import io.jsonwebtoken.Claims; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.web.method.HandlerMethod; +import org.springframework.web.servlet.HandlerInterceptor; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * jwt令牌校验的拦截器 + */ +@Component +@Slf4j +public class JwtTokenAdminInterceptor implements HandlerInterceptor { + + @Autowired + private JwtProperties jwtProperties; + + /** + * 校验jwt + * + * @param request + * @param response + * @param handler + * @return + * @throws Exception + */ + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { + +// System.out.println("当前线程的id" + Thread.currentThread().getId()); + + //判断当前拦截到的是Controller的方法还是其他资源 + if (!(handler instanceof HandlerMethod)) { + //当前拦截到的不是动态方法,直接放行 + return true; + } + + //1、从请求头中获取令牌 + String token = request.getHeader(jwtProperties.getAdminTokenName()); + + //2、校验令牌 + try { + log.info("jwt校验:{}", token); + Claims claims = JwtUtil.parseJWT(jwtProperties.getAdminSecretKey(), token); + Long empId = Long.valueOf(claims.get(JwtClaimsConstant.EMP_ID).toString()); + log.info("当前员工id:", empId); + BaseContext.setCurrentId(empId); + //3、通过,放行 + return true; + } catch (Exception ex) { + //4、不通过,响应401状态码 + response.setStatus(401); + return false; + } + } +} diff --git a/sky-server/src/main/java/com/sky/interceptor/JwtTokenUserInterceptor.java b/sky-server/src/main/java/com/sky/interceptor/JwtTokenUserInterceptor.java new file mode 100644 index 0000000..0175abe --- /dev/null +++ b/sky-server/src/main/java/com/sky/interceptor/JwtTokenUserInterceptor.java @@ -0,0 +1,63 @@ +package com.sky.interceptor; + +import com.sky.constant.JwtClaimsConstant; +import com.sky.context.BaseContext; +import com.sky.properties.JwtProperties; +import com.sky.utils.JwtUtil; +import io.jsonwebtoken.Claims; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.web.method.HandlerMethod; +import org.springframework.web.servlet.HandlerInterceptor; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * jwt令牌校验的拦截器 + */ +@Component +@Slf4j +public class JwtTokenUserInterceptor implements HandlerInterceptor { + + @Autowired + private JwtProperties jwtProperties; + + /** + * 校验jwt + * @param request + * @param response + * @param handler + * @return + * @throws Exception + */ + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { + +// System.out.println("当前线程的id" + Thread.currentThread().getId()); + + //判断当前拦截到的是Controller的方法还是其他资源 + if (!(handler instanceof HandlerMethod)) { + //当前拦截到的不是动态方法,直接放行 + return true; + } + + //1、从请求头中获取令牌 + String token = request.getHeader(jwtProperties.getUserTokenName()); + + //2、校验令牌 + try { + log.info("jwt校验:{}", token); + Claims claims = JwtUtil.parseJWT(jwtProperties.getUserSecretKey(), token); + Long userId = Long.valueOf(claims.get(JwtClaimsConstant.USER_ID).toString()); + log.info("当前用户id:", userId); + BaseContext.setCurrentId(userId); + //3、通过,放行 + return true; + } catch (Exception ex) { + //4、不通过,响应401状态码 + response.setStatus(401); + return false; + } + } +} diff --git a/sky-server/src/main/java/com/sky/mapper/AddressBookMapper.java b/sky-server/src/main/java/com/sky/mapper/AddressBookMapper.java new file mode 100644 index 0000000..b4fc021 --- /dev/null +++ b/sky-server/src/main/java/com/sky/mapper/AddressBookMapper.java @@ -0,0 +1,56 @@ +package com.sky.mapper; + +import com.sky.entity.AddressBook; +import org.apache.ibatis.annotations.*; +import java.util.List; + +@Mapper +public interface AddressBookMapper { + + /** + * 条件查询 + * @param addressBook + * @return + */ + List list(AddressBook addressBook); + + /** + * 新增 + * @param addressBook + */ + @Insert("insert into address_book" + + " (user_id, consignee, phone, sex, province_code, province_name, city_code, city_name, district_code," + + " district_name, detail, label, is_default)" + + " values (#{userId}, #{consignee}, #{phone}, #{sex}, #{provinceCode}, #{provinceName}, #{cityCode}, #{cityName}," + + " #{districtCode}, #{districtName}, #{detail}, #{label}, #{isDefault})") + void insert(AddressBook addressBook); + + /** + * 根据id查询 + * @param id + * @return + */ + @Select("select * from address_book where id = #{id}") + AddressBook getById(Long id); + + /** + * 根据id修改 + * @param addressBook + */ + void update(AddressBook addressBook); + + /** + * 根据 用户id修改 是否默认地址 + * @param addressBook + */ + @Update("update address_book set is_default = #{isDefault} where user_id = #{userId}") + void updateIsDefaultByUserId(AddressBook addressBook); + + /** + * 根据id删除地址 + * @param id + */ + @Delete("delete from address_book where id = #{id}") + void deleteById(Long id); + +} diff --git a/sky-server/src/main/java/com/sky/mapper/CategoryMapper.java b/sky-server/src/main/java/com/sky/mapper/CategoryMapper.java new file mode 100644 index 0000000..ad2c36f --- /dev/null +++ b/sky-server/src/main/java/com/sky/mapper/CategoryMapper.java @@ -0,0 +1,53 @@ +package com.sky.mapper; + +import com.github.pagehelper.Page; +import com.sky.annotation.AutoFill; +import com.sky.enumeration.OperationType; +import com.sky.dto.CategoryPageQueryDTO; +import com.sky.entity.Category; +import org.apache.ibatis.annotations.Delete; +import org.apache.ibatis.annotations.Insert; +import org.apache.ibatis.annotations.Mapper; +import java.util.List; + +@Mapper +public interface CategoryMapper { + + /** + * 插入数据 + * @param category + */ + @Insert("insert into category(type, name, sort, status, create_time, update_time, create_user, update_user)" + + " VALUES" + + " (#{type}, #{name}, #{sort}, #{status}, #{createTime}, #{updateTime}, #{createUser}, #{updateUser})") + @AutoFill(value = OperationType.INSERT) + void insert(Category category); + + /** + * 分页查询 + * @param categoryPageQueryDTO + * @return + */ + Page pageQuery(CategoryPageQueryDTO categoryPageQueryDTO); + + /** + * 根据id删除分类 + * @param id + */ + @Delete("delete from category where id = #{id}") + void deleteById(Long id); + + /** + * 根据id修改分类 + * @param category + */ + @AutoFill(value = OperationType.UPDATE) + void update(Category category); + + /** + * 根据类型查询分类 + * @param type + * @return + */ + List list(Integer type); +} diff --git a/sky-server/src/main/java/com/sky/mapper/DishFlavorMapper.java b/sky-server/src/main/java/com/sky/mapper/DishFlavorMapper.java new file mode 100644 index 0000000..577830e --- /dev/null +++ b/sky-server/src/main/java/com/sky/mapper/DishFlavorMapper.java @@ -0,0 +1,38 @@ +package com.sky.mapper; + +import com.sky.entity.DishFlavor; +import org.apache.ibatis.annotations.Delete; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Select; + +import java.util.List; + +@Mapper +public interface DishFlavorMapper { + /** + * 批量插入口味数据 + * @param flavors + */ + void insertBatch(List flavors); + + /** + * 根据菜品id删除对应的口味数据 + * @param dishId + */ + @Delete("delete from dish_flavor where dish_id = #{dishId}") + void deleteByDishId(Long dishId); + + /** + * 根据菜品id集合批量删除关联的口味数据 + * @param dishIds + */ + void deleteByDishIds(List dishIds); + + /** + * 根据菜品数据查询对应的口味数据 + * @param dishId + * @return + */ + @Select("select * from dish_flavor where dish_id = #{dishId}") + List getByDishId(Long dishId); +} diff --git a/sky-server/src/main/java/com/sky/mapper/DishMapper.java b/sky-server/src/main/java/com/sky/mapper/DishMapper.java new file mode 100644 index 0000000..c75eb59 --- /dev/null +++ b/sky-server/src/main/java/com/sky/mapper/DishMapper.java @@ -0,0 +1,83 @@ +package com.sky.mapper; + +import com.github.pagehelper.Page; +import com.sky.annotation.AutoFill; +import com.sky.dto.DishPageQueryDTO; +import com.sky.entity.Dish; +import com.sky.enumeration.OperationType; +import com.sky.vo.DishVO; +import org.apache.ibatis.annotations.Delete; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Select; + +import java.util.List; + +@Mapper +public interface DishMapper { + + /** + * 根据分类id查询菜品数量 + * @param categoryId + * @return + */ + @Select("select count(id) from dish where category_id = #{categoryId}") + Integer countByCategoryId(Long categoryId); + + /** + * 插入菜品数据 + * @param dish + */ + @AutoFill(value = OperationType.INSERT) + void insert(Dish dish); + + /** + * 菜品分页查询 + * @param dishPageQueryDTO + * @return + */ + Page pageQuery(DishPageQueryDTO dishPageQueryDTO); + + /** + * 根据主键查询菜品 + * @param id + * @return + */ + @Select("select * from dish where id = #{id}") + Dish getById(Long id); + + /** + *根据主键删除菜品数据 + * @param id + */ + @Delete("delete from dish where id = #{id}") + void deleteById(Long id); + + /** + * 根据菜品id集合批量删除菜品 + * @param ids + */ + void deleteByIds(List ids); + + /** + * 根据id动态修改菜品数据 + * @param dish + */ + @AutoFill(value = OperationType.UPDATE) + void update(Dish dish); + + /** + * 动态条件查询菜品 + * @param dish + * @return + */ + List list(Dish dish); + + + /** + * 根据套餐id查询菜品 + * @param setmealId + * @return + */ + @Select("select a.* from dish a left join setmeal_dish b on a.id = b.dish_id where b.setmeal_id = #{setmealId}") + List getBySetmealId(Long setmealId); +} diff --git a/sky-server/src/main/java/com/sky/mapper/EmployeeMapper.java b/sky-server/src/main/java/com/sky/mapper/EmployeeMapper.java new file mode 100644 index 0000000..0bf41a5 --- /dev/null +++ b/sky-server/src/main/java/com/sky/mapper/EmployeeMapper.java @@ -0,0 +1,53 @@ +package com.sky.mapper; + +import com.github.pagehelper.Page; +import com.sky.annotation.AutoFill; +import com.sky.dto.EmployeePageQueryDTO; +import com.sky.entity.Employee; +import com.sky.enumeration.OperationType; +import org.apache.ibatis.annotations.Insert; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Select; + +@Mapper +public interface EmployeeMapper { + + /** + * 根据用户名查询员工 + * @param username + * @return + */ + @Select("select * from employee where username = #{username}") + Employee getByUsername(String username); + + /** + * 插入员工数据 + * @param employee + */ + @Insert("insert into employee (name, username, password, phone, sex, id_number, create_time, update_time, create_user, update_user) " + + "VALUES (#{name},#{username},#{password},#{phone},#{sex},#{idNumber},#{createTime},#{updateTime},#{createUser},#{updateUser})") + @AutoFill(value = OperationType.INSERT) + void insert(Employee employee); + + /** + * 分页查询 + * @param employeePageQueryDTO + * @return + */ + Page pageQuery(EmployeePageQueryDTO employeePageQueryDTO); + + /** + * 根据主键动态修改属性 + * @param employee + */ + @AutoFill(value = OperationType.UPDATE) + void update(Employee employee); + + /** + * 根据id查询员工 + * @param id + * @return + */ + @Select("select * from employee where id = #{id}") + Employee getById(Long id); +} diff --git a/sky-server/src/main/java/com/sky/mapper/OrderDetailMapper.java b/sky-server/src/main/java/com/sky/mapper/OrderDetailMapper.java new file mode 100644 index 0000000..a327724 --- /dev/null +++ b/sky-server/src/main/java/com/sky/mapper/OrderDetailMapper.java @@ -0,0 +1,15 @@ +package com.sky.mapper; + +import com.sky.entity.OrderDetail; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +@Mapper +public interface OrderDetailMapper { + /** + * 批量插入订单明细数据 + * @param orderDetailList + */ + void insertBatch(List orderDetailList); +} diff --git a/sky-server/src/main/java/com/sky/mapper/OrderMapper.java b/sky-server/src/main/java/com/sky/mapper/OrderMapper.java new file mode 100644 index 0000000..e434483 --- /dev/null +++ b/sky-server/src/main/java/com/sky/mapper/OrderMapper.java @@ -0,0 +1,33 @@ +package com.sky.mapper; + +import com.sky.entity.Orders; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Select; + +@Mapper +public interface OrderMapper { + + /** + * 插入订单数据 + * @param orders + */ + void insert(Orders orders); + + + @Select("select * from orders where number = #{orderNumber}") + Orders getByNumber(String orderNumber); + + /** + * 根据订单号查询订单 + * @param orderNumber + * @param userId + */ + @Select("select * from orders where number = #{orderNumber} and user_id = #{userId}") + Orders getByNumberAndUserId(String orderNumber, Long userId); + + /** + * 修改订单信息 + * @param orders + */ + void update(Orders orders); +} diff --git a/sky-server/src/main/java/com/sky/mapper/SetmealDishMapper.java b/sky-server/src/main/java/com/sky/mapper/SetmealDishMapper.java new file mode 100644 index 0000000..bd595dc --- /dev/null +++ b/sky-server/src/main/java/com/sky/mapper/SetmealDishMapper.java @@ -0,0 +1,42 @@ +package com.sky.mapper; + +import com.sky.entity.SetmealDish; +import org.apache.ibatis.annotations.Delete; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Select; + +import java.util.List; + +@Mapper +public interface SetmealDishMapper { + + /** + * 根据菜品id查询对应的套餐id + * @param dishIds + * @return + */ + //select setmeal_id from setmeal dish where dish_id in {1,2,3,4} + List getSetmealIdsByDishIds(List dishIds); + + /** + * 批量保存套餐和菜品的关联关系 + * @param setmealDishes + */ + void insertBatch(List setmealDishes); + + /** + * 根据套餐id删除套餐和菜品的关联关系 + * @param setmealId + */ + @Delete("delete from setmeal_dish where setmeal_id = #{setmealId}") + void deleteBySetmealId(Long setmealId); + + /** + * 根据id查询套餐和套餐菜品关系 + * + * @param setmealId + * @return + */ + @Select("select * from setmeal_dish where setmeal_id = #{setmealId}") + List getBySetmealId(Long setmealId); +} diff --git a/sky-server/src/main/java/com/sky/mapper/SetmealMapper.java b/sky-server/src/main/java/com/sky/mapper/SetmealMapper.java new file mode 100644 index 0000000..efc843c --- /dev/null +++ b/sky-server/src/main/java/com/sky/mapper/SetmealMapper.java @@ -0,0 +1,79 @@ +package com.sky.mapper; + +import com.github.pagehelper.Page; +import com.sky.annotation.AutoFill; +import com.sky.dto.SetmealPageQueryDTO; +import com.sky.entity.Setmeal; +import com.sky.enumeration.OperationType; +import com.sky.vo.DishItemVO; +import com.sky.vo.SetmealVO; +import org.apache.ibatis.annotations.Delete; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Select; + +import java.util.List; + +@Mapper +public interface SetmealMapper { + + /** + * 根据分类id查询套餐的数量 + * @param id + * @return + */ + @Select("select count(id) from setmeal where category_id = #{categoryId}") + Integer countByCategoryId(Long id); + + /** + * 新增套餐 + * @param setmeal + */ + @AutoFill(OperationType.INSERT) + void insert(Setmeal setmeal); + + /** + * 分页查询 + * @param setmealPageQueryDTO + * @return + */ + Page pageQuery(SetmealPageQueryDTO setmealPageQueryDTO); + + /** + * 根据id查询套餐 + * @param id + * @return + */ + @Select("select * from setmeal where id = #{id}") + Setmeal getById(Long id); + + + /** + * 根据id删除套餐 + * @param setmealId + */ + @Delete("delete from setmeal where id =#{id}") + void deleteById(Long setmealId); + + /** + * 修改套餐 + * @param setmeal + */ + void update(Setmeal setmeal); + + /** + * 动态条件查询套餐 + * @param setmeal + * @return + */ + List list(Setmeal setmeal); + + /** + * 根据套餐id查询菜品选项 + * @param setmealId + * @return + */ + @Select("select sd.name, sd.copies, d.image, d.description " + + "from setmeal_dish sd left join dish d on sd.dish_id = d.id " + + "where sd.setmeal_id = #{setmealId}") + List getDishItemBySetmealId(Long setmealId); +} diff --git a/sky-server/src/main/java/com/sky/mapper/ShoppingCartMapper.java b/sky-server/src/main/java/com/sky/mapper/ShoppingCartMapper.java new file mode 100644 index 0000000..a136374 --- /dev/null +++ b/sky-server/src/main/java/com/sky/mapper/ShoppingCartMapper.java @@ -0,0 +1,52 @@ +package com.sky.mapper; + +import com.sky.entity.ShoppingCart; +import org.apache.ibatis.annotations.Delete; +import org.apache.ibatis.annotations.Insert; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Update; +import org.springframework.web.bind.annotation.DeleteMapping; + +import java.util.List; + +@Mapper + +public interface ShoppingCartMapper { + + /** + * 动态条件查询 + * @param shoppingCart + * @return + */ + List list(ShoppingCart shoppingCart); + + /** + * 根据id修改商品数据 + * @param shoppingCart + */ + @Update("update shopping_cart set number = #{number} where id = #{id}") + void updateNumberById(ShoppingCart shoppingCart); + + /** + * 插入购物车数据 + * @param shoppingCart + */ + @Insert("insert into shopping_cart (name, user_id, dish_id, setmeal_id, dish_flavor, number, amount, image, create_time)" + + "values (#{name},#{userId},#{dishId},#{setmealId},#{dishFlavor},#{number},#{amount},#{image},#{createTime})") + void insert(ShoppingCart shoppingCart); + + /** + * 根据用户id清空购物车 + * @param userId + */ + @Delete("delete from shopping_cart where user_id = #{userId}") + void deleteByUserId(Long userId); + + /** + * 根据id删除购物车数据 + * @param id + */ + @Delete("delete from shopping_cart where id = #{id}") + void deleteById(Long id); +} + diff --git a/sky-server/src/main/java/com/sky/mapper/UserMapper.java b/sky-server/src/main/java/com/sky/mapper/UserMapper.java new file mode 100644 index 0000000..61cd5a7 --- /dev/null +++ b/sky-server/src/main/java/com/sky/mapper/UserMapper.java @@ -0,0 +1,29 @@ +package com.sky.mapper; + +import com.sky.entity.User; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Select; + +@Mapper +public interface UserMapper { + + /** + * 根据openid查询用户 + * @param openid + */ + @Select("select * from user where openid = #{openid}") + User getByOpenId(String openid); + + /** + * 插入数据 + * @param user + */ + void insert(User user); + + /** + * 获取当前登录用户id + * @param userId + */ + @Select("select * from user where id = #{userId}") + User getById(Long userId); +} diff --git a/sky-server/src/main/java/com/sky/service/AddressBookService.java b/sky-server/src/main/java/com/sky/service/AddressBookService.java new file mode 100644 index 0000000..84afd77 --- /dev/null +++ b/sky-server/src/main/java/com/sky/service/AddressBookService.java @@ -0,0 +1,20 @@ +package com.sky.service; + +import com.sky.entity.AddressBook; +import java.util.List; + +public interface AddressBookService { + + List list(AddressBook addressBook); + + void save(AddressBook addressBook); + + AddressBook getById(Long id); + + void update(AddressBook addressBook); + + void setDefault(AddressBook addressBook); + + void deleteById(Long id); + +} diff --git a/sky-server/src/main/java/com/sky/service/CategoryService.java b/sky-server/src/main/java/com/sky/service/CategoryService.java new file mode 100644 index 0000000..85ecfd1 --- /dev/null +++ b/sky-server/src/main/java/com/sky/service/CategoryService.java @@ -0,0 +1,49 @@ +package com.sky.service; + +import com.sky.dto.CategoryDTO; +import com.sky.dto.CategoryPageQueryDTO; +import com.sky.entity.Category; +import com.sky.result.PageResult; +import java.util.List; + +public interface CategoryService { + + /** + * 新增分类 + * @param categoryDTO + */ + void save(CategoryDTO categoryDTO); + + /** + * 分页查询 + * @param categoryPageQueryDTO + * @return + */ + PageResult pageQuery(CategoryPageQueryDTO categoryPageQueryDTO); + + /** + * 根据id删除分类 + * @param id + */ + void deleteById(Long id); + + /** + * 修改分类 + * @param categoryDTO + */ + void update(CategoryDTO categoryDTO); + + /** + * 启用、禁用分类 + * @param status + * @param id + */ + void startOrStop(Integer status, Long id); + + /** + * 根据类型查询分类 + * @param type + * @return + */ + List list(Integer type); +} diff --git a/sky-server/src/main/java/com/sky/service/DishService.java b/sky-server/src/main/java/com/sky/service/DishService.java new file mode 100644 index 0000000..b555e72 --- /dev/null +++ b/sky-server/src/main/java/com/sky/service/DishService.java @@ -0,0 +1,65 @@ +package com.sky.service; + +import com.sky.dto.DishDTO; +import com.sky.dto.DishPageQueryDTO; +import com.sky.entity.Dish; +import com.sky.result.PageResult; +import com.sky.vo.DishVO; +import java.util.List; + +public interface DishService { + + /** + * 新增菜品和对应的口味 + * @param dishDTO + */ + void saveWithFlavor(DishDTO dishDTO); + + /** + * 菜品分页查询 + * @param dishPageQueryDTO + * @return + */ + PageResult pageQuery(DishPageQueryDTO dishPageQueryDTO); + + /** + * 菜品批量删除 + * @param ids + */ + void deleteBatch(List ids); + + /** + * 根据id查询菜品和对应的口味数据 + * @param id + * @return + */ + DishVO getByIdWithFlavor(Long id); + + /** + * 根据id修改菜品基本信息和对应的口味信息 + * @param dishDTO + */ + void updateWithFlavor(DishDTO dishDTO); + + /** + * 根据分类id查询菜品 + * @param categoryId + * @return + */ + List list(Long categoryId); + + /** + * 条件查询菜品和口味 + * @param dish + * @return + */ + List listWithFlavor(Dish dish); + + /** + * 菜品起售停售 + * @param status + * @param id + * @return + */ + void startOrStop(Integer status, Long id); +} diff --git a/sky-server/src/main/java/com/sky/service/EmployeeService.java b/sky-server/src/main/java/com/sky/service/EmployeeService.java new file mode 100644 index 0000000..993c490 --- /dev/null +++ b/sky-server/src/main/java/com/sky/service/EmployeeService.java @@ -0,0 +1,50 @@ +package com.sky.service; + +import com.sky.dto.EmployeeDTO; +import com.sky.dto.EmployeeLoginDTO; +import com.sky.dto.EmployeePageQueryDTO; +import com.sky.entity.Employee; +import com.sky.result.PageResult; + +public interface EmployeeService { + + /** + * 员工登录 + * @param employeeLoginDTO + * @return + */ + Employee login(EmployeeLoginDTO employeeLoginDTO); + + /** + * 新增员工 + * @param employeeDTO + */ + void save(EmployeeDTO employeeDTO); + + /** + * 分页查询 + * @param employeePageQueryDTO + * @return + */ + PageResult pageQuery(EmployeePageQueryDTO employeePageQueryDTO); + + /** + * 启用禁用员工账号 + * @param status + * @param id + */ + void startOrStop(Integer status, Long id); + + /** + * 根据id查询员工 + * @param id + * @return + */ + Employee getById(Long id); + + /** + * 编辑员工信息 + * @param employeeDTO + */ + void update(EmployeeDTO employeeDTO); +} diff --git a/sky-server/src/main/java/com/sky/service/OrderService.java b/sky-server/src/main/java/com/sky/service/OrderService.java new file mode 100644 index 0000000..b80536b --- /dev/null +++ b/sky-server/src/main/java/com/sky/service/OrderService.java @@ -0,0 +1,29 @@ +package com.sky.service; + +import com.sky.dto.OrdersPaymentDTO; +import com.sky.dto.OrdersSubmitDTO; +import com.sky.vo.OrderPaymentVO; +import com.sky.vo.OrderSubmitVO; + +public interface OrderService { + + /** + * 用户下单 + * @param ordersSubmitDTO + * @return + */ + OrderSubmitVO submitOrder(OrdersSubmitDTO ordersSubmitDTO); + + /** + * 订单支付 + * @param ordersPaymentDTO + * @return + */ + OrderPaymentVO payment(OrdersPaymentDTO ordersPaymentDTO) throws Exception; + + /** + * 支付成功,修改订单状态 + * @param outTradeNo + */ + void paySuccess(String outTradeNo); +} diff --git a/sky-server/src/main/java/com/sky/service/SetmealService.java b/sky-server/src/main/java/com/sky/service/SetmealService.java new file mode 100644 index 0000000..0652be9 --- /dev/null +++ b/sky-server/src/main/java/com/sky/service/SetmealService.java @@ -0,0 +1,68 @@ +package com.sky.service; + +import com.sky.dto.SetmealDTO; +import com.sky.dto.SetmealPageQueryDTO; +import com.sky.entity.Setmeal; +import com.sky.result.PageResult; +import com.sky.vo.DishItemVO; +import com.sky.vo.SetmealVO; + +import java.util.List; + +public interface SetmealService { + + /** + * 新增套餐,同时需要保存套餐和菜品的关联关系 + * @param setmealDTO + */ + void saveWithDish(SetmealDTO setmealDTO); + + + /** + * 分页查询 + * @param setmealPageQueryDTO + * @return + */ + PageResult pageQuery(SetmealPageQueryDTO setmealPageQueryDTO); + + /** + * 批量删除套餐 + * @param ids + */ + void deleteBatch(List ids); + + /** + * 根据id查询套餐和关联的菜品数据 + * @param id + * @return + */ + SetmealVO getByIdWithDish(Long id); + + /** + * 修改套餐 + * @param setmealDTO + */ + void update(SetmealDTO setmealDTO); + + /** + * 套餐起售停售 + * @param status + * @param id + * @return + */ + void startOrStop(Integer status, Long id); + + /** + * 条件查询 + * @param setmeal + * @return + */ + List list(Setmeal setmeal); + + /** + * 根据id查询菜品选项 + * @param id + * @return + */ + List getDishItemById(Long id); +} \ No newline at end of file diff --git a/sky-server/src/main/java/com/sky/service/ShoppingCartService.java b/sky-server/src/main/java/com/sky/service/ShoppingCartService.java new file mode 100644 index 0000000..e8bbe23 --- /dev/null +++ b/sky-server/src/main/java/com/sky/service/ShoppingCartService.java @@ -0,0 +1,34 @@ +package com.sky.service; + +import com.sky.dto.ShoppingCartDTO; +import com.sky.entity.ShoppingCart; +import org.springframework.context.annotation.Bean; + +import java.util.List; + + +public interface ShoppingCartService { + + /** + * 添加购物车 + * @param shoppingCartDTO + */ + void addShoppingCart(ShoppingCartDTO shoppingCartDTO); + + /** + * 查看购物车 + * @return + */ + List showShoppingCart(); + + /** + * 清空购物车 + */ + void cleanShoppingCart(); + + /** + * 删除购物车中一个商品 + * @param shoppingCartDTO + */ + void subShoppingCart(ShoppingCartDTO shoppingCartDTO); +} diff --git a/sky-server/src/main/java/com/sky/service/UserService.java b/sky-server/src/main/java/com/sky/service/UserService.java new file mode 100644 index 0000000..b200d67 --- /dev/null +++ b/sky-server/src/main/java/com/sky/service/UserService.java @@ -0,0 +1,14 @@ +package com.sky.service; + +import com.sky.dto.UserLoginDTO; +import com.sky.entity.User; + +public interface UserService { + + /** + * 微信登录 + * @param userLoginDTO + * @return + */ + User wxLogin(UserLoginDTO userLoginDTO); +} diff --git a/sky-server/src/main/java/com/sky/service/impl/AddressBookServiceImpl.java b/sky-server/src/main/java/com/sky/service/impl/AddressBookServiceImpl.java new file mode 100644 index 0000000..5fd03a9 --- /dev/null +++ b/sky-server/src/main/java/com/sky/service/impl/AddressBookServiceImpl.java @@ -0,0 +1,86 @@ +package com.sky.service.impl; + +import com.sky.context.BaseContext; +import com.sky.entity.AddressBook; +import com.sky.mapper.AddressBookMapper; +import com.sky.service.AddressBookService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import java.util.List; + +@Service +@Slf4j +public class AddressBookServiceImpl implements AddressBookService { + @Autowired + private AddressBookMapper addressBookMapper; + + /** + * 条件查询 + * + * @param addressBook + * @return + */ + public List list(AddressBook addressBook) { + return addressBookMapper.list(addressBook); + } + + /** + * 新增地址 + * + * @param addressBook + */ + public void save(AddressBook addressBook) { + addressBook.setUserId(BaseContext.getCurrentId()); + addressBook.setIsDefault(0); + addressBookMapper.insert(addressBook); + } + + /** + * 根据id查询 + * + * @param id + * @return + */ + public AddressBook getById(Long id) { + AddressBook addressBook = addressBookMapper.getById(id); + return addressBook; + } + + /** + * 根据id修改地址 + * + * @param addressBook + */ + public void update(AddressBook addressBook) { + addressBookMapper.update(addressBook); + } + + /** + * 设置默认地址 + * + * @param addressBook + */ + @Transactional + public void setDefault(AddressBook addressBook) { + //1、将当前用户的所有地址修改为非默认地址 update address_book set is_default = ? where user_id = ? + addressBook.setIsDefault(0); + addressBook.setUserId(BaseContext.getCurrentId()); + addressBookMapper.updateIsDefaultByUserId(addressBook); + + //2、将当前地址改为默认地址 update address_book set is_default = ? where id = ? + addressBook.setIsDefault(1); + addressBookMapper.update(addressBook); + } + + /** + * 根据id删除地址 + * + * @param id + */ + public void deleteById(Long id) { + addressBookMapper.deleteById(id); + } + +} diff --git a/sky-server/src/main/java/com/sky/service/impl/CategoryServiceImpl.java b/sky-server/src/main/java/com/sky/service/impl/CategoryServiceImpl.java new file mode 100644 index 0000000..28b77a8 --- /dev/null +++ b/sky-server/src/main/java/com/sky/service/impl/CategoryServiceImpl.java @@ -0,0 +1,132 @@ +package com.sky.service.impl; + +import com.github.pagehelper.Page; +import com.github.pagehelper.PageHelper; +import com.sky.constant.MessageConstant; +import com.sky.constant.StatusConstant; +import com.sky.context.BaseContext; +import com.sky.dto.CategoryDTO; +import com.sky.dto.CategoryPageQueryDTO; +import com.sky.entity.Category; +import com.sky.exception.DeletionNotAllowedException; +import com.sky.mapper.CategoryMapper; +import com.sky.mapper.DishMapper; +import com.sky.mapper.SetmealMapper; +import com.sky.result.PageResult; +import com.sky.service.CategoryService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import java.time.LocalDateTime; +import java.util.List; + +/** + * 分类业务层 + */ +@Service +@Slf4j +public class CategoryServiceImpl implements CategoryService { + + @Autowired + private CategoryMapper categoryMapper; + @Autowired + private DishMapper dishMapper; + @Autowired + private SetmealMapper setmealMapper; + + /** + * 新增分类 + * @param categoryDTO + */ + public void save(CategoryDTO categoryDTO) { + Category category = new Category(); + //属性拷贝 + BeanUtils.copyProperties(categoryDTO, category); + + //分类状态默认为禁用状态0 + category.setStatus(StatusConstant.DISABLE); + + //设置创建时间、修改时间、创建人、修改人 + //category.setCreateTime(LocalDateTime.now()); + //category.setUpdateTime(LocalDateTime.now()); + //category.setCreateUser(BaseContext.getCurrentId()); + //category.setUpdateUser(BaseContext.getCurrentId()); + + categoryMapper.insert(category); + } + + /** + * 分页查询 + * @param categoryPageQueryDTO + * @return + */ + public PageResult pageQuery(CategoryPageQueryDTO categoryPageQueryDTO) { + PageHelper.startPage(categoryPageQueryDTO.getPage(),categoryPageQueryDTO.getPageSize()); + //下一条sql进行分页,自动加入limit关键字分页 + Page page = categoryMapper.pageQuery(categoryPageQueryDTO); + return new PageResult(page.getTotal(), page.getResult()); + } + + /** + * 根据id删除分类 + * @param id + */ + public void deleteById(Long id) { + //查询当前分类是否关联了菜品,如果关联了就抛出业务异常 + Integer count = dishMapper.countByCategoryId(id); + if(count > 0){ + //当前分类下有菜品,不能删除 + throw new DeletionNotAllowedException(MessageConstant.CATEGORY_BE_RELATED_BY_DISH); + } + + //查询当前分类是否关联了套餐,如果关联了就抛出业务异常 + count = setmealMapper.countByCategoryId(id); + if(count > 0){ + //当前分类下有菜品,不能删除 + throw new DeletionNotAllowedException(MessageConstant.CATEGORY_BE_RELATED_BY_SETMEAL); + } + + //删除分类数据 + categoryMapper.deleteById(id); + } + + /** + * 修改分类 + * @param categoryDTO + */ + public void update(CategoryDTO categoryDTO) { + Category category = new Category(); + BeanUtils.copyProperties(categoryDTO,category); + + //设置修改时间、修改人 + //category.setUpdateTime(LocalDateTime.now()); + //category.setUpdateUser(BaseContext.getCurrentId()); + + categoryMapper.update(category); + } + + /** + * 启用、禁用分类 + * @param status + * @param id + */ + public void startOrStop(Integer status, Long id) { + Category category = Category.builder() + .id(id) + .status(status) + //.updateTime(LocalDateTime.now()) + //.updateUser(BaseContext.getCurrentId()) + .build(); + categoryMapper.update(category); + } + + /** + * 根据类型查询分类 + * @param type + * @return + */ + public List list(Integer type) { + return categoryMapper.list(type); + } +} diff --git a/sky-server/src/main/java/com/sky/service/impl/DishServiceImpl.java b/sky-server/src/main/java/com/sky/service/impl/DishServiceImpl.java new file mode 100644 index 0000000..a4c1ff0 --- /dev/null +++ b/sky-server/src/main/java/com/sky/service/impl/DishServiceImpl.java @@ -0,0 +1,217 @@ +package com.sky.service.impl; + +import com.github.pagehelper.Page; +import com.github.pagehelper.PageHelper; +import com.sky.constant.MessageConstant; +import com.sky.constant.StatusConstant; +import com.sky.dto.DishDTO; +import com.sky.dto.DishPageQueryDTO; +import com.sky.entity.Dish; +import com.sky.entity.DishFlavor; +import com.sky.entity.Setmeal; +import com.sky.exception.DeletionNotAllowedException; +import com.sky.exception.SetmealEnableFailedException; +import com.sky.mapper.DishFlavorMapper; +import com.sky.mapper.DishMapper; +import com.sky.mapper.SetmealDishMapper; +import com.sky.result.PageResult; +import com.sky.service.DishService; +import com.sky.vo.DishVO; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.List; + +@Service +@Slf4j +public class DishServiceImpl implements DishService { + + @Autowired + private DishMapper dishMapper; + + @Autowired + private DishFlavorMapper dishFlavorMapper; + + @Autowired + private SetmealDishMapper setmealDishMapper; + + /** + * 新增菜品和对应的口味 + * @param dishDTO + */ + @Transactional + public void saveWithFlavor(DishDTO dishDTO) { + + Dish dish = new Dish(); + + BeanUtils.copyProperties(dishDTO,dish); + + //向菜品表中插入1条数据 + dishMapper.insert(dish); + + //获取insert语句生成的主键值 + Long dishId = dish.getId(); + + List flavors = dishDTO.getFlavors(); + if (flavors != null && flavors.size() > 0) { + flavors.forEach(dishFlavor -> { + dishFlavor.setDishId(dishId); + }); + //向口味表中插入n条数据 + dishFlavorMapper.insertBatch(flavors); + } + } + + /** + * 菜品分页查询 + * @param dishPageQueryDTO + * @return + */ + public PageResult pageQuery(DishPageQueryDTO dishPageQueryDTO) { + PageHelper.startPage(dishPageQueryDTO.getPage(),dishPageQueryDTO.getPageSize()); + Page page = dishMapper.pageQuery(dishPageQueryDTO); + return new PageResult(page.getTotal(),page.getResult()); + } + + /** + * 菜品批量删除 + * @param ids + */ + @Transactional + public void deleteBatch(List ids) { + //判断当前菜品是否能删除--是否为起售中的菜品 + for (Long id : ids) { + Dish dish = dishMapper.getById(id); + if (dish.getStatus() == StatusConstant.ENABLE){ + //当前处于起售中,不能删除 + throw new DeletionNotAllowedException(MessageConstant.DISH_ON_SALE); + } + } + + //判断当前菜品是否能删除--是否被菜品关联 + List setmealIds = setmealDishMapper.getSetmealIdsByDishIds(ids); + if (setmealIds != null && setmealIds.size() > 0) { + //当前菜品被套餐关联,不能删除 + throw new DeletionNotAllowedException(MessageConstant.DISH_BE_RELATED_BY_SETMEAL); + } + + //删除菜品表中的菜品数据 + for (Long id : ids) { + dishMapper.deleteById(id); + //删除菜品关联的口味数据 + dishFlavorMapper.deleteByDishId(id); + } + + //根据菜品id集合批量删除菜品数据 + //sql: delete from dish where id in (?,?,?) + dishMapper.deleteByIds(ids); + + //根据菜品id集合批量删除关联的口味数据 + //sql: delete from dish_flavor where dish_id in (?,?,?) + dishFlavorMapper.deleteByDishIds(ids); + } + + /** + * 根据id查询菜品和对应的口味数据 + * @param id + * @return + */ + public DishVO getByIdWithFlavor(Long id) { + //根据id查询菜品数据 + Dish dish = dishMapper.getById(id); + + //根据菜品id查询口味数据 + List dishFlavors = dishFlavorMapper.getByDishId(id); + + //将查询到的数据封装到DishVO + DishVO dishVO = new DishVO(); + BeanUtils.copyProperties(dish,dishVO); + dishVO.setFlavors(dishFlavors); + + return dishVO; + } + + /** + * 根据id修改菜品基本信息和对应的口味信息 + * @param dishDTO + */ + public void updateWithFlavor(DishDTO dishDTO) { + Dish dish = new Dish(); + BeanUtils.copyProperties(dishDTO,dish); + + //修改菜品表基本信息 + dishMapper.update(dish); + + //删除原有的口味数据 + dishFlavorMapper.deleteByDishId(dishDTO.getId()); + + //重新插入口味信息 + List flavors = dishDTO.getFlavors(); + if (flavors != null && flavors.size() > 0) { + flavors.forEach(dishFlavor -> { + dishFlavor.setDishId(dishDTO.getId()); + }); + //向口味表中插入n条数据 + dishFlavorMapper.insertBatch(flavors); + } + } + + /** + * 根据分类id查询菜品 + * @param categoryId + * @return + */ + public List list(Long categoryId) { + Dish dish = Dish.builder() + .categoryId(categoryId) + .status(StatusConstant.ENABLE) + .build(); + return dishMapper.list(dish); + } + + + /** + * 条件查询菜品和口味 + * @param dish + * @return + */ + public List listWithFlavor(Dish dish) { + List dishList = dishMapper.list(dish); + + List dishVOList = new ArrayList<>(); + + for (Dish d : dishList) { + DishVO dishVO = new DishVO(); + BeanUtils.copyProperties(d,dishVO); + + //根据菜品id查询对应的口味 + List flavors = dishFlavorMapper.getByDishId(d.getId()); + + dishVO.setFlavors(flavors); + dishVOList.add(dishVO); + } + + return dishVOList; + } + + @Override + public void startOrStop(Integer status, Long id) { + Dish dish = Dish.builder() + .id(id) + .status(status) + .build(); + dishMapper.update(dish); + +// Setmeal setmeal = Setmeal.builder() +// .id(id) +// .status(status) +// .build(); +// setmealMapper.update(setmeal); + } + + +} diff --git a/sky-server/src/main/java/com/sky/service/impl/EmployeeServiceImpl.java b/sky-server/src/main/java/com/sky/service/impl/EmployeeServiceImpl.java new file mode 100644 index 0000000..deccd39 --- /dev/null +++ b/sky-server/src/main/java/com/sky/service/impl/EmployeeServiceImpl.java @@ -0,0 +1,159 @@ +package com.sky.service.impl; + +import com.github.pagehelper.Page; +import com.github.pagehelper.PageHelper; +import com.sky.constant.MessageConstant; +import com.sky.constant.PasswordConstant; +import com.sky.constant.StatusConstant; +import com.sky.context.BaseContext; +import com.sky.dto.EmployeeDTO; +import com.sky.dto.EmployeeLoginDTO; +import com.sky.dto.EmployeePageQueryDTO; +import com.sky.entity.Employee; +import com.sky.exception.AccountLockedException; +import com.sky.exception.AccountNotFoundException; +import com.sky.exception.PasswordErrorException; +import com.sky.mapper.EmployeeMapper; +import com.sky.result.PageResult; +import com.sky.service.EmployeeService; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.DigestUtils; + +import java.time.LocalDateTime; +import java.util.List; + +@Service +public class EmployeeServiceImpl implements EmployeeService { + + @Autowired + private EmployeeMapper employeeMapper; + + /** + * 员工登录 + * + * @param employeeLoginDTO + * @return + */ + public Employee login(EmployeeLoginDTO employeeLoginDTO) { + String username = employeeLoginDTO.getUsername(); + String password = employeeLoginDTO.getPassword(); + + //1、根据用户名查询数据库中的数据 + Employee employee = employeeMapper.getByUsername(username); + + //2、处理各种异常情况(用户名不存在、密码不对、账号被锁定) + if (employee == null) { + //账号不存在 + throw new AccountNotFoundException(MessageConstant.ACCOUNT_NOT_FOUND); + } + + //密码比对 + //对前端传过来的明文密码进行md5加密 + password = DigestUtils.md5DigestAsHex(password.getBytes()); + + if (!password.equals(employee.getPassword())) { + //密码错误 + throw new PasswordErrorException(MessageConstant.PASSWORD_ERROR); + } + + if (employee.getStatus() == StatusConstant.DISABLE) { + //账号被锁定 + throw new AccountLockedException(MessageConstant.ACCOUNT_LOCKED); + } + + //3、返回实体对象 + return employee; + } + + /** + * 新增员工 + * @param employeeDTO + */ + public void save(EmployeeDTO employeeDTO) { +// System.out.println("当前线程的id" + Thread.currentThread().getId()); + Employee employee = new Employee(); + + //对象属性拷贝 + BeanUtils.copyProperties(employeeDTO,employee); + + //设置账号的状态,默认正常状态1正常,0锁定 + employee.setStatus(StatusConstant.ENABLE); + + //设置密码,默认密码123456 + employee.setPassword(DigestUtils.md5DigestAsHex(PasswordConstant.DEFAULT_PASSWORD.getBytes())); + + //设置当前记录的创建时间和修改时间 + //employee.setCreateTime(LocalDateTime.now()); + //employee.setUpdateTime(LocalDateTime.now()); + + //设置当前记录创建人id和修改人id + //employee.setCreateUser(BaseContext.getCurrentId()); + //employee.setUpdateUser(BaseContext.getCurrentId()); + + employeeMapper.insert(employee); + } + + @Override + public PageResult pageQuery(EmployeePageQueryDTO employeePageQueryDTO) { + //select * from employee limit 0,10 + //开始分页查询 + PageHelper.startPage(employeePageQueryDTO.getPage(),employeePageQueryDTO.getPageSize()); + + Page page = employeeMapper.pageQuery(employeePageQueryDTO); + long total = page.getTotal(); + List records = page.getResult(); + + return new PageResult(total,records); + } + + /** + * 启用禁用员工账号 + * @param status + * @param id + */ + @Override + public void startOrStop(Integer status, Long id) { + // update employee set status = ? where id = ? + /*Employee employee = new Employee(); + employee.setStatus(status); + employee.setId(id);*/ + + Employee employee = Employee.builder() + .status(status) + .id(id) + .build(); + + + employeeMapper.update(employee); + } + + /** + * 根据id查询员工 + * @param id + * @return + */ + @Override + public Employee getById(Long id) { + Employee employee = employeeMapper.getById(id); + employee.setPassword("****"); + return employee; + } + + /** + * 编辑员工信息 + * @param employeeDTO + */ + @Override + public void update(EmployeeDTO employeeDTO) { + Employee employee = new Employee(); + BeanUtils.copyProperties(employeeDTO,employee); + + //employee.setUpdateTime(LocalDateTime.now()); + //employee.setUpdateUser(BaseContext.getCurrentId()); + + employeeMapper.update(employee); + } + +} diff --git a/sky-server/src/main/java/com/sky/service/impl/OrderServiceImpl.java b/sky-server/src/main/java/com/sky/service/impl/OrderServiceImpl.java new file mode 100644 index 0000000..3eb53c9 --- /dev/null +++ b/sky-server/src/main/java/com/sky/service/impl/OrderServiceImpl.java @@ -0,0 +1,155 @@ +package com.sky.service.impl; + +import com.alibaba.fastjson.JSONObject; +import com.sky.constant.MessageConstant; +import com.sky.context.BaseContext; +import com.sky.dto.OrdersPaymentDTO; +import com.sky.dto.OrdersSubmitDTO; +import com.sky.entity.*; +import com.sky.exception.AddressBookBusinessException; +import com.sky.exception.OrderBusinessException; +import com.sky.mapper.*; +import com.sky.service.OrderService; +import com.sky.utils.WeChatPayUtil; +import com.sky.vo.OrderPaymentVO; +import com.sky.vo.OrderSubmitVO; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; + +@Service +public class OrderServiceImpl implements OrderService { + + @Autowired + private OrderMapper orderMapper; + @Autowired + private OrderDetailMapper orderDetailMapper; + @Autowired + private AddressBookMapper addressBookMapper; + @Autowired + private ShoppingCartMapper shoppingCartMapper; + @Autowired + private WeChatPayUtil weChatPayUtil; + @Autowired + private UserMapper userMapper; + + /** + * 用户下单 + * @param ordersSubmitDTO + * @return + */ + @Transactional + public OrderSubmitVO submitOrder(OrdersSubmitDTO ordersSubmitDTO) { + + //1.处理各种业务异常(地址簿为空,购物车为空) + AddressBook addressBook = addressBookMapper.getById(ordersSubmitDTO.getAddressBookId()); + if (addressBook == null) { + //抛出业务异常 + throw new AddressBookBusinessException(MessageConstant.ADDRESS_BOOK_IS_NULL); + } + + //查询当前用户的购物车数据 + Long userId = BaseContext.getCurrentId(); + + ShoppingCart shoppingCart = new ShoppingCart(); + shoppingCart.setUserId(userId); + List shoppingCartList = shoppingCartMapper.list(shoppingCart); + + if (shoppingCartList == null || shoppingCartList.size() == 0) { + throw new AddressBookBusinessException(MessageConstant.SHOPPING_CART_IS_NULL); + } + //2.向订单表中插入1条数据 + Orders orders = new Orders(); + BeanUtils.copyProperties(ordersSubmitDTO,orders); + orders.setOrderTime(LocalDateTime.now()); + orders.setPayStatus(Orders.UN_PAID); + orders.setStatus(Orders.PENDING_PAYMENT); + orders.setNumber(String.valueOf(System.currentTimeMillis())); + orders.setPhone(addressBook.getPhone()); + orders.setConsignee(addressBook.getConsignee()); + orders.setUserId(userId); + + orderMapper.insert(orders); + + List orderDetailList = new ArrayList<>(); + //3.向订单表中插入n条数据 + for (ShoppingCart cart : shoppingCartList) { + OrderDetail orderDetail = new OrderDetail(); //订单明细 + BeanUtils.copyProperties(cart,orderDetail); + orderDetail.setOrderId(orders.getId()); //设置当前订单明细关联的订单id + orderDetailList.add(orderDetail); + } + + orderDetailMapper.insertBatch(orderDetailList); + //4.清空当前用户的购物车数据 + shoppingCartMapper.deleteByUserId(userId); + + //5.封装VO返回结果 + OrderSubmitVO orderSubmitVO = OrderSubmitVO.builder() + .id(orders.getId()) + .orderTime(orders.getOrderTime()) + .orderNumber(orders.getNumber()) + .orderAmount(orders.getAmount()) + .build(); + + return orderSubmitVO; + } + + /** + * 订单支付 + * + * @param ordersPaymentDTO + * @return + */ + public OrderPaymentVO payment(OrdersPaymentDTO ordersPaymentDTO) throws Exception { + // 当前登录用户id + Long userId = BaseContext.getCurrentId(); + User user = userMapper.getById(userId); + + //调用微信支付接口,生成预支付交易单 + JSONObject jsonObject = weChatPayUtil.pay( + ordersPaymentDTO.getOrderNumber(), //商户订单号 + new BigDecimal(0.01), //支付金额,单位 元 + "苍穹外卖订单", //商品描述 + user.getOpenid() //微信用户的openid + ); + + if (jsonObject.getString("code") != null && jsonObject.getString("code").equals("ORDERPAID")) { + throw new OrderBusinessException("该订单已支付"); + } + + OrderPaymentVO vo = jsonObject.toJavaObject(OrderPaymentVO.class); + vo.setPackageStr(jsonObject.getString("package")); + + return vo; + } + + /** + * 支付成功,修改订单状态 + * + * @param outTradeNo + */ + public void paySuccess(String outTradeNo) { + //当前登录用户id + Long userId = BaseContext.getCurrentId(); + + // 根据订单号查询当前用户的订单 + Orders ordersDB = orderMapper.getByNumberAndUserId(outTradeNo,userId); + + // 根据订单id更新订单的状态、支付方式、支付状态、结账时间 + Orders orders = Orders.builder() + .id(ordersDB.getId()) + .status(Orders.TO_BE_CONFIRMED) + .payStatus(Orders.PAID) + .checkoutTime(LocalDateTime.now()) + .build(); + + orderMapper.update(orders); + } +} diff --git a/sky-server/src/main/java/com/sky/service/impl/SetmealServiceImpl.java b/sky-server/src/main/java/com/sky/service/impl/SetmealServiceImpl.java new file mode 100644 index 0000000..7619048 --- /dev/null +++ b/sky-server/src/main/java/com/sky/service/impl/SetmealServiceImpl.java @@ -0,0 +1,191 @@ +package com.sky.service.impl; + +import com.github.pagehelper.Page; +import com.github.pagehelper.PageHelper; +import com.sky.constant.MessageConstant; +import com.sky.constant.StatusConstant; +import com.sky.dto.SetmealDTO; +import com.sky.dto.SetmealPageQueryDTO; +import com.sky.entity.Dish; +import com.sky.entity.Setmeal; +import com.sky.entity.SetmealDish; +import com.sky.exception.DeletionNotAllowedException; +import com.sky.exception.SetmealEnableFailedException; +import com.sky.mapper.DishMapper; +import com.sky.mapper.SetmealDishMapper; +import com.sky.mapper.SetmealMapper; +import com.sky.result.PageResult; +import com.sky.service.SetmealService; +import com.sky.vo.DishItemVO; +import com.sky.vo.SetmealVO; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.List; + +/** + * 套餐业务实现 + */ +@Service +@Slf4j +public class SetmealServiceImpl implements SetmealService { + + @Autowired + private SetmealMapper setmealMapper; + @Autowired + private SetmealDishMapper setmealDishMapper; + @Autowired + private DishMapper dishMapper; + + /** + * 新增套餐,同时需要保存套餐和菜品的关联关系 + * @param setmealDTO + */ + @Transactional + public void saveWithDish(SetmealDTO setmealDTO) { + Setmeal setmeal = new Setmeal(); + BeanUtils.copyProperties(setmealDTO, setmeal); + + //向套餐表插入数据 + setmealMapper.insert(setmeal); + + //获取生成的套餐id + Long setmealId = setmeal.getId(); + + List setmealDishes = setmealDTO.getSetmealDishes(); + setmealDishes.forEach(setmealDish -> { + setmealDish.setSetmealId(setmealId); + }); + + //保存套餐和菜品的关联关系 + setmealDishMapper.insertBatch(setmealDishes); + } + + /** + * 分页查询 + * @param setmealPageQueryDTO + * @return + */ + public PageResult pageQuery(SetmealPageQueryDTO setmealPageQueryDTO) { + int pageNum = setmealPageQueryDTO.getPage(); + int pageSize = setmealPageQueryDTO.getPageSize(); + + PageHelper.startPage(pageNum, pageSize); + Page page = setmealMapper.pageQuery(setmealPageQueryDTO); + return new PageResult(page.getTotal(), page.getResult()); + } + + /** + * 批量删除套餐 + * @param ids + */ + @Transactional + public void deleteBatch(List ids) { + ids.forEach(id -> { + Setmeal setmeal = setmealMapper.getById(id); + if (StatusConstant.ENABLE == setmeal.getStatus()){ + //起售中的套餐不能删除 + throw new DeletionNotAllowedException(MessageConstant.SETMEAL_ON_SALE); + } + }); + + ids.forEach(setmealId -> { + //删除套餐表中的数据 + setmealMapper.deleteById(setmealId); + //删除套餐菜品关系表中的数据 + setmealDishMapper.deleteBySetmealId(setmealId); + }); + } + + /** + * 根据id查询套餐和套餐菜品关系 + * @param id + * @return + */ + public SetmealVO getByIdWithDish(Long id) { + Setmeal setmeal = setmealMapper.getById(id); + List setmealDishes = setmealDishMapper.getBySetmealId(id); + + SetmealVO setmealVO = new SetmealVO(); + BeanUtils.copyProperties(setmeal, setmealVO); + setmealVO.setSetmealDishes(setmealDishes); + + return setmealVO; + } + + /** + * 修改套餐 + * @param setmealDTO + */ + @Transactional + public void update(SetmealDTO setmealDTO) { + Setmeal setmeal = new Setmeal(); + BeanUtils.copyProperties(setmealDTO, setmeal); + + //1、修改套餐表,执行update + setmealMapper.update(setmeal); + + //套餐id + Long setmealId = setmealDTO.getId(); + + //2、删除套餐和菜品的关联关系,操作setmeal_dish表,执行delete + setmealDishMapper.deleteBySetmealId(setmealId); + + List setmealDishes = setmealDTO.getSetmealDishes(); + setmealDishes.forEach(setmealDish -> { + setmealDish.setSetmealId(setmealId); + }); + //3、重新插入套餐和菜品的关联关系,操作setmeal_dish表,执行insert + setmealDishMapper.insertBatch(setmealDishes); + } + + /** + * 套餐起售停售 + * @param status + * @param id + * @return + */ + public void startOrStop(Integer status, Long id) { + //起售套餐时,判断套餐内是否有停售菜品,有停售菜品提示"套餐内包含未起售菜品,无法起售" + if (status == StatusConstant.ENABLE) { + //select a.* from dish a left join setmeal_dish b on a.id = b.dish_id where b.setmeal_id = ? + List dishList = dishMapper.getBySetmealId(id); + if (dishList != null && dishList.size() > 0) { + dishList.forEach(dish -> { + if (StatusConstant.DISABLE == dish.getStatus()) { + throw new SetmealEnableFailedException(MessageConstant.SETMEAL_ENABLE_FAILED); + } + }); + } + } + + Setmeal setmeal = Setmeal.builder() + .id(id) + .status(status) + .build(); + setmealMapper.update(setmeal); + } + + /** + * 条件查询 + * @param setmeal + * @return + */ + public List list(Setmeal setmeal) { + List list = setmealMapper.list(setmeal); + return list; + } + + /** + * 根据id查询菜品选项 + * @param id + * @return + */ + public List getDishItemById(Long id) { + return setmealMapper.getDishItemBySetmealId(id); + } +} \ No newline at end of file diff --git a/sky-server/src/main/java/com/sky/service/impl/ShoppingCartServiceImpl.java b/sky-server/src/main/java/com/sky/service/impl/ShoppingCartServiceImpl.java new file mode 100644 index 0000000..8d14963 --- /dev/null +++ b/sky-server/src/main/java/com/sky/service/impl/ShoppingCartServiceImpl.java @@ -0,0 +1,128 @@ +package com.sky.service.impl; + +import com.sky.context.BaseContext; +import com.sky.dto.ShoppingCartDTO; +import com.sky.entity.Dish; +import com.sky.entity.Setmeal; +import com.sky.entity.ShoppingCart; +import com.sky.mapper.DishMapper; +import com.sky.mapper.SetmealMapper; +import com.sky.mapper.ShoppingCartMapper; +import com.sky.service.ShoppingCartService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.time.LocalDateTime; +import java.util.List; + + +@Service +@Slf4j +public class ShoppingCartServiceImpl implements ShoppingCartService { + + @Autowired + private ShoppingCartMapper shoppingCartMapper; + + @Autowired + private DishMapper dishMapper; + + @Autowired + private SetmealMapper setmealMapper; + + /** + * 添加购物车 + * @param shoppingCartDTO + */ + public void addShoppingCart(ShoppingCartDTO shoppingCartDTO) { + //判断加入购物车中的商品是否已经存在 + ShoppingCart shoppingCart = new ShoppingCart(); + BeanUtils.copyProperties(shoppingCartDTO, shoppingCart); + BaseContext.getCurrentId(); + Long userId = BaseContext.getCurrentId(); + shoppingCart.setUserId(userId); + + List list = shoppingCartMapper.list(shoppingCart); + + //如果已经存在,只需数量加一 + if (list != null && list.size() > 0) { + ShoppingCart cart = list.get(0); + cart.setNumber(cart.getNumber() + 1); //update shopping_cart set number = ? where id = ? + shoppingCartMapper.updateNumberById(cart); + }else { + //如果不存在,需要插入一条购物车数据 + //判断本次添加到购物车的是菜品还是套餐 + Long dishId = shoppingCartDTO.getDishId(); + if (dishId != null) { + //本次添加到购物车的是菜品 + Dish dish = dishMapper.getById(dishId); + shoppingCart.setName(dish.getName()); + shoppingCart.setImage(dish.getImage()); + shoppingCart.setAmount(dish.getPrice()); + }else{ + //本次添加到购物车的是套餐 + Long setmealId = shoppingCartDTO.getSetmealId(); + + Setmeal setmeal = setmealMapper.getById(setmealId); + shoppingCart.setName(setmeal.getName()); + shoppingCart.setImage(setmeal.getImage()); + shoppingCart.setAmount(setmeal.getPrice()); + } + shoppingCart.setNumber(1); + shoppingCart.setCreateTime(LocalDateTime.now()); + shoppingCartMapper.insert(shoppingCart); + } + + } + + /** + * 查看购物车 + * @return + */ + public List showShoppingCart() { + //获取到当前微信用户的id + Long userId = BaseContext.getCurrentId(); + ShoppingCart shoppingCart = ShoppingCart.builder() + .userId(userId) + .build(); + List list = shoppingCartMapper.list(shoppingCart); + return list; + } + + /** + * 清空购物车 + */ + public void cleanShoppingCart() { + //获取到当前微信用户的id + Long userId = BaseContext.getCurrentId(); + shoppingCartMapper.deleteByUserId(userId); + } + + /** + * 删除购物车中一个商品 + * @param shoppingCartDTO + */ + public void subShoppingCart(ShoppingCartDTO shoppingCartDTO) { + ShoppingCart shoppingCart = new ShoppingCart(); + BeanUtils.copyProperties(shoppingCartDTO,shoppingCart); + //设置查询条件,查询当前登录用户的购物车数据 + shoppingCart.setUserId(BaseContext.getCurrentId()); + + List list = shoppingCartMapper.list(shoppingCart); + + if(list != null && list.size() > 0){ + shoppingCart = list.get(0); + + Integer number = shoppingCart.getNumber(); + if(number == 1){ + //当前商品在购物车中的份数为1,直接删除当前记录 + shoppingCartMapper.deleteById(shoppingCart.getId()); + }else { + //当前商品在购物车中的份数不为1,修改份数即可 + shoppingCart.setNumber(shoppingCart.getNumber() - 1); + shoppingCartMapper.updateNumberById(shoppingCart); + } + } + } +} diff --git a/sky-server/src/main/java/com/sky/service/impl/UserServiceImpl.java b/sky-server/src/main/java/com/sky/service/impl/UserServiceImpl.java new file mode 100644 index 0000000..c9d6ff9 --- /dev/null +++ b/sky-server/src/main/java/com/sky/service/impl/UserServiceImpl.java @@ -0,0 +1,81 @@ +package com.sky.service.impl; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.sky.constant.MessageConstant; +import com.sky.dto.UserLoginDTO; +import com.sky.entity.User; +import com.sky.exception.LoginFailedException; +import com.sky.mapper.UserMapper; +import com.sky.properties.WeChatProperties; +import com.sky.service.UserService; +import com.sky.utils.HttpClientUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.time.LocalDateTime; +import java.util.HashMap; +import java.util.Map; + +@Service +@Slf4j +public class UserServiceImpl implements UserService { + + //微信服务接口地址 + public static final String WX_LOGIN = "https://api.weixin.qq.com/sns/jscode2session"; + + @Autowired + private WeChatProperties weChatProperties; + + @Autowired + private UserMapper userMapper; + + /** + * 微信登录 + * @param userLoginDTO + * @return + */ + public User wxLogin(UserLoginDTO userLoginDTO) { + String openid = getOpenid(userLoginDTO.getCode()); + + //判断openid是否为空,如果为空表示登录失败,抛出业务异常 + if (openid==null){ + throw new LoginFailedException(MessageConstant.LOGIN_FAILED); + } + + //判断当前用户是否为新用户 + User user = userMapper.getByOpenId(openid); + + //如果是新用户,自动完成注册 + if (user == null){ + user = User.builder() + .openid(openid) + .createTime(LocalDateTime.now()) + .build(); + userMapper.insert(user); + } + + //返回这个用户对象 + return user; + } + + /** + * 调用微信接口服务,获取微信用户的openid + * @param code + * @return + */ + private String getOpenid(String code) { + //调用微信接口服务,获得当前微信用户的openid + Map map = new HashMap<>(); + map.put("appid",weChatProperties.getAppid()); + map.put("secret",weChatProperties.getSecret()); + map.put("js_code",code); + map.put("grant_type","authorization_code"); + String json = HttpClientUtil.doGet(WX_LOGIN, map); + + JSONObject jsonObject = JSON.parseObject(json); + String openid = jsonObject.getString("openid"); + return openid; + } +} diff --git a/sky-server/src/main/resources/application-dev.yml b/sky-server/src/main/resources/application-dev.yml new file mode 100644 index 0000000..788f133 --- /dev/null +++ b/sky-server/src/main/resources/application-dev.yml @@ -0,0 +1,28 @@ +sky: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + host: localhost + port: 3306 + database: sky_take_out + username: root + password: system + alioss: + endpoint: oss-cn-hangzhou.aliyuncs.com + access-key-id: LTAI5t8Z7fkNjTMNvZmhxbj1 + access-key-secret: aeIFNgJm0y4QYS6ZLMihArbRSImC09 + bucket-name: examplebucket-sun01 + redis: + host: localhost + port: 6379 + database: 0 + #password: + wechat: + appid: wx97e8fd01d23465c8 + secret: 4cc262789680e8e62290decddfe7783f +# mchid: +# mch-serial-no: +# private-key-file-path: +# api-v3-key: +# we-chat-pay-cert-file-path: +# notify-url: +# refund-notify-url: \ No newline at end of file diff --git a/sky-server/src/main/resources/application.yml b/sky-server/src/main/resources/application.yml new file mode 100644 index 0000000..cc02045 --- /dev/null +++ b/sky-server/src/main/resources/application.yml @@ -0,0 +1,62 @@ +server: + port: 8080 + +spring: + profiles: + active: dev + main: + allow-circular-references: true + datasource: + druid: + driver-class-name: ${sky.datasource.driver-class-name} + url: jdbc:mysql://${sky.datasource.host}:${sky.datasource.port}/${sky.datasource.database}?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true + username: ${sky.datasource.username} + password: ${sky.datasource.password} + redis: + host: ${sky.redis.host} + port: ${sky.redis.port} + database: ${sky.redis.database} + #password: + +mybatis: + #mapper配置文件 + mapper-locations: classpath:mapper/*.xml + type-aliases-package: com.sky.entity + configuration: + #开启驼峰命名 + map-underscore-to-camel-case: true + +logging: + level: + com: + sky: + mapper: debug + service: info + controller: info + +sky: + jwt: + # 设置jwt签名加密时使用的秘钥 + admin-secret-key: itcast + # 设置jwt过期时间 + admin-ttl: 7200000 + # 设置前端传递过来的令牌名称 + admin-token-name: token + user-secret-key: itheima + user-ttl: 7200000 + user-token-name: authentication + wechat: + appid: ${sky.wechat.appid} + secret: ${sky.wechat.secret} +# mchid: ${sky.wechat.mchid} +# mch-serial-no: ${sky.wechat.mch-serial-no} +# private-key-file-path: ${sky.wechat.private-key-file-path} +# api-v3-key: ${sky.wechat.api-v3-key} +# we-chat-pay-cert-file-path: ${sky.wechat.we-chat-pay-cert-file-path} +# notify-url: ${sky.wechat.notify-url} +# refund-notify-url: ${sky.wechat.refund-notify-url} + alioss: + endpoint: ${sky.alioss.endpoint} + access-key-id: ${sky.alioss.access-key-id} + access-key-secret: ${sky.alioss.access-key-secret} + bucket-name: ${sky.alioss.bucket-name} diff --git a/sky-server/src/main/resources/mapper/AddressBookMapper.xml b/sky-server/src/main/resources/mapper/AddressBookMapper.xml new file mode 100644 index 0000000..b7ece35 --- /dev/null +++ b/sky-server/src/main/resources/mapper/AddressBookMapper.xml @@ -0,0 +1,45 @@ + + + + + + + + update address_book + + + consignee = #{consignee}, + + + sex = #{sex}, + + + phone = #{phone}, + + + detail = #{detail}, + + + label = #{label}, + + + is_default = #{isDefault}, + + + where id = #{id} + + + diff --git a/sky-server/src/main/resources/mapper/CategoryMapper.xml b/sky-server/src/main/resources/mapper/CategoryMapper.xml new file mode 100644 index 0000000..deee331 --- /dev/null +++ b/sky-server/src/main/resources/mapper/CategoryMapper.xml @@ -0,0 +1,52 @@ + + + + + + + + update category + + + type = #{type}, + + + name = #{name}, + + + sort = #{sort}, + + + status = #{status}, + + + update_time = #{updateTime}, + + + update_user = #{updateUser} + + + where id = #{id} + + + + diff --git a/sky-server/src/main/resources/mapper/DishFlavorMapper.xml b/sky-server/src/main/resources/mapper/DishFlavorMapper.xml new file mode 100644 index 0000000..91990cd --- /dev/null +++ b/sky-server/src/main/resources/mapper/DishFlavorMapper.xml @@ -0,0 +1,18 @@ + + + + + + insert into dish_flavor (dish_id, name, value) VALUES + + (#{df.dishId},#{df.name},#{df.value}) + + + + delete from dish_flavor where dish_id + + #{dishId} + + + diff --git a/sky-server/src/main/resources/mapper/DishMapper.xml b/sky-server/src/main/resources/mapper/DishMapper.xml new file mode 100644 index 0000000..16f3630 --- /dev/null +++ b/sky-server/src/main/resources/mapper/DishMapper.xml @@ -0,0 +1,62 @@ + + + + + + insert into dish (name, category_id, price, image, description, status, create_time, update_time, create_user, update_user) + values (#{name},#{categoryId},#{price},#{image},#{description},#{status},#{createTime},#{updateTime},#{createUser},#{updateUser}) + + + + delete from dish where id in + + #{id} + + + + + + + update dish + + name = #{name}, + category_id = #{categoryId}, + price = #{price}, + image = #{image}, + description = #{description}, + status = #{status}, + update_time = #{updateTime}, + update_user = #{updateUser}, + + where id = #{id} + + diff --git a/sky-server/src/main/resources/mapper/EmployeeMapper.xml b/sky-server/src/main/resources/mapper/EmployeeMapper.xml new file mode 100644 index 0000000..0adb045 --- /dev/null +++ b/sky-server/src/main/resources/mapper/EmployeeMapper.xml @@ -0,0 +1,31 @@ + + + + + + + + update employee + + name = #{name}, + username = #{username}, + password = #{password}, + phone = #{phone}, + sex = #{sex}, + id_number = #{idNumber}, + update_time = #{updateTime}, + update_user = #{updateUser}, + status = #{status}, + + where id = #{id} + + diff --git a/sky-server/src/main/resources/mapper/OrderDetailMapper.xml b/sky-server/src/main/resources/mapper/OrderDetailMapper.xml new file mode 100644 index 0000000..c563577 --- /dev/null +++ b/sky-server/src/main/resources/mapper/OrderDetailMapper.xml @@ -0,0 +1,13 @@ + + + + + + insert into order_detail (name, image, order_id, dish_id, setmeal_id, dish_flavor, number, amount) + values + + (#{od.name},#{od.image},#{od.orderId},#{od.dishId},#{od.setmealId},#{od.dishFlavor},#{od.number},#{od.amount}) + + + diff --git a/sky-server/src/main/resources/mapper/OrderMapper.xml b/sky-server/src/main/resources/mapper/OrderMapper.xml new file mode 100644 index 0000000..5df17ad --- /dev/null +++ b/sky-server/src/main/resources/mapper/OrderMapper.xml @@ -0,0 +1,44 @@ + + + + + + insert into orders (number, status, user_id, address_book_id, order_time, checkout_time, pay_method, + pay_status, amount, remark, phone, address, consignee,estimated_delivery_time, + delivery_status, pack_amount, tableware_number, tableware_status) + VALUES (#{number},#{status},#{userId},#{addressBookId},#{orderTime},#{checkoutTime},#{payMethod}, + #{payStatus},#{amount},#{remark},#{phone},#{address},#{consignee},#{estimatedDeliveryTime}, + #{deliveryStatus},#{packAmount},#{tablewareNumber},#{tablewareStatus}) + + + update orders + + + cancel_reason=#{cancelReason}, + + + rejection_reason=#{rejectionReason}, + + + cancel_time=#{cancelTime}, + + + pay_status=#{payStatus}, + + + pay_method=#{payMethod}, + + + checkout_time=#{checkoutTime}, + + + status = #{status}, + + + delivery_time = #{deliveryTime} + + + where id = #{id} + + diff --git a/sky-server/src/main/resources/mapper/SetmealDishMapper.xml b/sky-server/src/main/resources/mapper/SetmealDishMapper.xml new file mode 100644 index 0000000..72f83ac --- /dev/null +++ b/sky-server/src/main/resources/mapper/SetmealDishMapper.xml @@ -0,0 +1,20 @@ + + + + + insert into setmeal_dish + (setmeal_id,dish_id,name,price,copies) + values + + (#{sd.setmealId},#{sd.dishId},#{sd.name},#{sd.price},#{sd.copies}) + + + + + diff --git a/sky-server/src/main/resources/mapper/SetmealMapper.xml b/sky-server/src/main/resources/mapper/SetmealMapper.xml new file mode 100644 index 0000000..5f5df3c --- /dev/null +++ b/sky-server/src/main/resources/mapper/SetmealMapper.xml @@ -0,0 +1,63 @@ + + + + + insert into setmeal + (category_id, name, price, status, description, image, create_time, update_time, create_user, update_user) + values (#{categoryId}, #{name}, #{price}, #{status}, #{description}, #{image}, #{createTime}, #{updateTime}, + #{createUser}, #{updateUser}) + + + update setmeal + + id = #{id}, + category_id = #{categoryId}, + name = #{name}, + price = #{price}, + status = #{status}, + description = #{description}, + image = #{image}, + update_time = #{updateTime}, + update_user = #{updateUser} + + where id = #{id} + + + + + diff --git a/sky-server/src/main/resources/mapper/ShoppingCartMapper.xml b/sky-server/src/main/resources/mapper/ShoppingCartMapper.xml new file mode 100644 index 0000000..4c1d89a --- /dev/null +++ b/sky-server/src/main/resources/mapper/ShoppingCartMapper.xml @@ -0,0 +1,23 @@ + + + + + + diff --git a/sky-server/src/main/resources/mapper/UserMapper.xml b/sky-server/src/main/resources/mapper/UserMapper.xml new file mode 100644 index 0000000..aa85f06 --- /dev/null +++ b/sky-server/src/main/resources/mapper/UserMapper.xml @@ -0,0 +1,9 @@ + + + + + insert into user (openid, name, phone, sex, id_number, avatar, create_time) + values (#{openid},#{name},#{phone},#{sex},#{idNumber},#{avatar},#{createTime}) + +