From e8ab76f09fe2291adfcdd692087d4de8c4f8db2e Mon Sep 17 00:00:00 2001 From: xuxin <840198532@qq.com> Date: Wed, 19 Nov 2025 14:14:47 +0800 Subject: [PATCH] =?UTF-8?q?=E8=8B=8D=E7=A9=B9=E5=A4=96=E5=8D=96=E9=A1=B9?= =?UTF-8?q?=E7=9B=AE=E5=88=9D=E5=A7=8B=E5=8C=96=E4=BB=A3=E7=A0=81-?= =?UTF-8?q?=E6=8F=90=E4=BA=A4=E8=AE=A2=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- .../com/sky/constant/MessageConstant.java | 1 + .../com/sky/properties/AliOssProperties.java | 2 +- .../properties/InmindAliOSSProperties.java | 23 ++ .../java/com/sky/utils/InmindAliOSSUtils.java | 69 +++++ .../main/java/com/sky/entity/Employee.java | 3 +- .../src/main/java/com/sky/SkyApplication.java | 2 + .../java/com/sky/annotation/AutoFill.java | 18 ++ .../java/com/sky/aspect/AutoFillAspect.java | 82 ++++++ .../java/com/sky/config/OssConfiguration.java | 20 ++ .../com/sky/config/RedisConfiguration.java | 30 +++ .../com/sky/config/WebMvcConfiguration.java | 65 ++++- .../controller/admin/CategoryController.java | 103 ++++++++ .../controller/admin/CommonController.java | 43 ++++ .../sky/controller/admin/DishController.java | 143 +++++++++++ .../controller/admin/EmployeeController.java | 69 ++++- .../controller/admin/SetmealController.java | 108 ++++++++ .../sky/controller/admin/ShopController.java | 50 ++++ .../user/AddressBookController.java | 113 +++++++++ .../controller/user/CategoryController.java | 33 +++ .../sky/controller/user/DishController.java | 60 +++++ .../sky/controller/user/OrderController.java | 42 ++++ .../controller/user/SetmealController.java | 56 +++++ .../sky/controller/user/ShopController.java | 39 +++ .../user/ShoppingCartController.java | 60 +++++ .../sky/controller/user/UserController.java | 58 +++++ .../sky/handler/GlobalExceptionHandler.java | 23 ++ .../interceptor/JwtTokenAdminInterceptor.java | 2 + .../interceptor/JwtTokenUserInterceptor.java | 65 +++++ .../com/sky/mapper/AddressBookMapper.java | 56 +++++ .../java/com/sky/mapper/CategoryMapper.java | 53 ++++ .../java/com/sky/mapper/DishFlavorMapper.java | 30 +++ .../main/java/com/sky/mapper/DishMapper.java | 71 ++++++ .../java/com/sky/mapper/EmployeeMapper.java | 23 ++ .../com/sky/mapper/OrderDetailMapper.java | 15 ++ .../main/java/com/sky/mapper/OrderMapper.java | 13 + .../com/sky/mapper/SetmealDishMapper.java | 70 ++++++ .../java/com/sky/mapper/SetmealMapper.java | 85 +++++++ .../com/sky/mapper/ShoppingCartMapper.java | 43 ++++ .../main/java/com/sky/mapper/UserMapper.java | 23 ++ .../com/sky/service/AddressBookService.java | 20 ++ .../java/com/sky/service/CategoryService.java | 49 ++++ .../java/com/sky/service/DishService.java | 43 ++++ .../java/com/sky/service/EmployeeService.java | 12 + .../java/com/sky/service/OrderService.java | 8 + .../java/com/sky/service/SetmealService.java | 71 ++++++ .../com/sky/service/ShoppingCartService.java | 14 ++ .../java/com/sky/service/UserService.java | 8 + .../service/impl/AddressBookServiceImpl.java | 86 +++++++ .../sky/service/impl/CategoryServiceImpl.java | 132 ++++++++++ .../com/sky/service/impl/DishServiceImpl.java | 236 ++++++++++++++++++ .../sky/service/impl/EmployeeServiceImpl.java | 96 ++++++- .../sky/service/impl/OrderServiceImpl.java | 97 +++++++ .../sky/service/impl/SetmealServiceImpl.java | 194 ++++++++++++++ .../service/impl/ShoppingCartServiceImpl.java | 105 ++++++++ .../com/sky/service/impl/UserServiceImpl.java | 74 ++++++ .../src/main/resources/application-dev.yml | 14 +- sky-server/src/main/resources/application.yml | 22 +- .../resources/mapper/AddressBookMapper.xml | 45 ++++ .../main/resources/mapper/CategoryMapper.xml | 52 ++++ .../resources/mapper/DishFlavorMapper.xml | 19 ++ .../src/main/resources/mapper/DishMapper.xml | 65 +++++ .../main/resources/mapper/EmployeeMapper.xml | 27 ++ .../resources/mapper/OrderDetailMapper.xml | 10 + .../resources/mapper/SetmealDishMapper.xml | 20 ++ .../main/resources/mapper/SetmealMapper.xml | 93 +++++++ .../resources/mapper/ShoppingCartMapper.xml | 21 ++ .../src/main/resources/mapper/UserMapper.xml | 14 ++ springcache-demo/pom.xml | 92 +++++++ springcache-demo/springcachedemo.sql | 7 + .../java/com/inmind/CacheDemoApplication.java | 16 ++ .../inmind/config/WebMvcConfiguration.java | 53 ++++ .../com/inmind/controller/UserController.java | 47 ++++ .../src/main/java/com/inmind/entity/User.java | 17 ++ .../java/com/inmind/mapper/UserMapper.java | 21 ++ .../src/main/resources/application.yml | 21 ++ 76 files changed, 3772 insertions(+), 15 deletions(-) create mode 100644 sky-common/src/main/java/com/sky/properties/InmindAliOSSProperties.java create mode 100644 sky-common/src/main/java/com/sky/utils/InmindAliOSSUtils.java create mode 100644 sky-server/src/main/java/com/sky/annotation/AutoFill.java create mode 100644 sky-server/src/main/java/com/sky/aspect/AutoFillAspect.java create mode 100644 sky-server/src/main/java/com/sky/config/OssConfiguration.java create mode 100644 sky-server/src/main/java/com/sky/config/RedisConfiguration.java create mode 100644 sky-server/src/main/java/com/sky/controller/admin/CategoryController.java create mode 100644 sky-server/src/main/java/com/sky/controller/admin/CommonController.java create mode 100644 sky-server/src/main/java/com/sky/controller/admin/DishController.java create mode 100644 sky-server/src/main/java/com/sky/controller/admin/SetmealController.java create mode 100644 sky-server/src/main/java/com/sky/controller/admin/ShopController.java create mode 100644 sky-server/src/main/java/com/sky/controller/user/AddressBookController.java create mode 100644 sky-server/src/main/java/com/sky/controller/user/CategoryController.java create mode 100644 sky-server/src/main/java/com/sky/controller/user/DishController.java create mode 100644 sky-server/src/main/java/com/sky/controller/user/OrderController.java create mode 100644 sky-server/src/main/java/com/sky/controller/user/SetmealController.java create mode 100644 sky-server/src/main/java/com/sky/controller/user/ShopController.java create mode 100644 sky-server/src/main/java/com/sky/controller/user/ShoppingCartController.java create mode 100644 sky-server/src/main/java/com/sky/controller/user/UserController.java create mode 100644 sky-server/src/main/java/com/sky/interceptor/JwtTokenUserInterceptor.java create mode 100644 sky-server/src/main/java/com/sky/mapper/AddressBookMapper.java create mode 100644 sky-server/src/main/java/com/sky/mapper/CategoryMapper.java create mode 100644 sky-server/src/main/java/com/sky/mapper/DishFlavorMapper.java create mode 100644 sky-server/src/main/java/com/sky/mapper/DishMapper.java create mode 100644 sky-server/src/main/java/com/sky/mapper/OrderDetailMapper.java create mode 100644 sky-server/src/main/java/com/sky/mapper/OrderMapper.java create mode 100644 sky-server/src/main/java/com/sky/mapper/SetmealDishMapper.java create mode 100644 sky-server/src/main/java/com/sky/mapper/SetmealMapper.java create mode 100644 sky-server/src/main/java/com/sky/mapper/ShoppingCartMapper.java create mode 100644 sky-server/src/main/java/com/sky/mapper/UserMapper.java create mode 100644 sky-server/src/main/java/com/sky/service/AddressBookService.java create mode 100644 sky-server/src/main/java/com/sky/service/CategoryService.java create mode 100644 sky-server/src/main/java/com/sky/service/DishService.java create mode 100644 sky-server/src/main/java/com/sky/service/OrderService.java create mode 100644 sky-server/src/main/java/com/sky/service/SetmealService.java create mode 100644 sky-server/src/main/java/com/sky/service/ShoppingCartService.java create mode 100644 sky-server/src/main/java/com/sky/service/UserService.java create mode 100644 sky-server/src/main/java/com/sky/service/impl/AddressBookServiceImpl.java create mode 100644 sky-server/src/main/java/com/sky/service/impl/CategoryServiceImpl.java create mode 100644 sky-server/src/main/java/com/sky/service/impl/DishServiceImpl.java create mode 100644 sky-server/src/main/java/com/sky/service/impl/OrderServiceImpl.java create mode 100644 sky-server/src/main/java/com/sky/service/impl/SetmealServiceImpl.java create mode 100644 sky-server/src/main/java/com/sky/service/impl/ShoppingCartServiceImpl.java create mode 100644 sky-server/src/main/java/com/sky/service/impl/UserServiceImpl.java create mode 100644 sky-server/src/main/resources/mapper/AddressBookMapper.xml create mode 100644 sky-server/src/main/resources/mapper/CategoryMapper.xml create mode 100644 sky-server/src/main/resources/mapper/DishFlavorMapper.xml create mode 100644 sky-server/src/main/resources/mapper/DishMapper.xml create mode 100644 sky-server/src/main/resources/mapper/OrderDetailMapper.xml create mode 100644 sky-server/src/main/resources/mapper/SetmealDishMapper.xml create mode 100644 sky-server/src/main/resources/mapper/SetmealMapper.xml create mode 100644 sky-server/src/main/resources/mapper/ShoppingCartMapper.xml create mode 100644 sky-server/src/main/resources/mapper/UserMapper.xml create mode 100644 springcache-demo/pom.xml create mode 100644 springcache-demo/springcachedemo.sql create mode 100644 springcache-demo/src/main/java/com/inmind/CacheDemoApplication.java create mode 100644 springcache-demo/src/main/java/com/inmind/config/WebMvcConfiguration.java create mode 100644 springcache-demo/src/main/java/com/inmind/controller/UserController.java create mode 100644 springcache-demo/src/main/java/com/inmind/entity/User.java create mode 100644 springcache-demo/src/main/java/com/inmind/mapper/UserMapper.java create mode 100644 springcache-demo/src/main/resources/application.yml diff --git a/pom.xml b/pom.xml index b10da2e..ddbf0cb 100644 --- a/pom.xml +++ b/pom.xml @@ -24,7 +24,7 @@ 2.6 1.2.1 1.3.0 - 3.10.2 + 3.17.4 3.0.2 1.9.4 0.9.1 diff --git a/sky-common/src/main/java/com/sky/constant/MessageConstant.java b/sky-common/src/main/java/com/sky/constant/MessageConstant.java index c6b645d..3f38f07 100644 --- a/sky-common/src/main/java/com/sky/constant/MessageConstant.java +++ b/sky-common/src/main/java/com/sky/constant/MessageConstant.java @@ -7,6 +7,7 @@ public class MessageConstant { public static final String PASSWORD_ERROR = "密码错误"; public static final String ACCOUNT_NOT_FOUND = "账号不存在"; + public static final String ALEADY_EXISTS = "已存在"; public static final String ACCOUNT_LOCKED = "账号被锁定"; public static final String UNKNOWN_ERROR = "未知错误"; public static final String USER_NOT_LOGIN = "用户未登录"; diff --git a/sky-common/src/main/java/com/sky/properties/AliOssProperties.java b/sky-common/src/main/java/com/sky/properties/AliOssProperties.java index 4e6c625..a75a69f 100644 --- a/sky-common/src/main/java/com/sky/properties/AliOssProperties.java +++ b/sky-common/src/main/java/com/sky/properties/AliOssProperties.java @@ -5,7 +5,7 @@ import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; @Component -@ConfigurationProperties(prefix = "sky.alioss") +@ConfigurationProperties(prefix = "sky.alioss1") @Data public class AliOssProperties { diff --git a/sky-common/src/main/java/com/sky/properties/InmindAliOSSProperties.java b/sky-common/src/main/java/com/sky/properties/InmindAliOSSProperties.java new file mode 100644 index 0000000..bd1c90f --- /dev/null +++ b/sky-common/src/main/java/com/sky/properties/InmindAliOSSProperties.java @@ -0,0 +1,23 @@ +package com.sky.properties; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +/** + * ClassName: AliOSSProperties + * Package: com.inmind.utils + * Description: + * + * @Author xuxin + * @Create 5/14 15:10 + * @Version 1.0 + */ +@Data +@Component +@ConfigurationProperties(prefix = "sky.alioss") +public class InmindAliOSSProperties { + private String endpoint; + private String bucketName; + private String region; +} diff --git a/sky-common/src/main/java/com/sky/utils/InmindAliOSSUtils.java b/sky-common/src/main/java/com/sky/utils/InmindAliOSSUtils.java new file mode 100644 index 0000000..bc2524f --- /dev/null +++ b/sky-common/src/main/java/com/sky/utils/InmindAliOSSUtils.java @@ -0,0 +1,69 @@ +package com.sky.utils; + +import com.aliyun.oss.ClientBuilderConfiguration; +import com.aliyun.oss.OSS; +import com.aliyun.oss.OSSClientBuilder; +import com.aliyun.oss.common.auth.CredentialsProviderFactory; +import com.aliyun.oss.common.auth.EnvironmentVariableCredentialsProvider; +import com.aliyun.oss.common.comm.SignVersion; +import com.aliyun.oss.model.PutObjectRequest; +import com.aliyun.oss.model.PutObjectResult; +import com.aliyuncs.exceptions.ClientException; +import com.sky.properties.InmindAliOSSProperties; +import lombok.AllArgsConstructor; +import lombok.Data; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.io.InputStream; +import java.util.UUID; + +/** + * 阿里云 OSS 工具类 + */ +@Data +@AllArgsConstructor +public class InmindAliOSSUtils { + + /*@Value("${aliyun.oss.endpoint}") + private String endpoint; + @Value("${aliyun.oss.bucketName}") + private String bucketName; + @Value("${aliyun.oss.region}") + private String region ;*/ + InmindAliOSSProperties aliOSSProperties; + + /** + * 实现上传图片到OSS + */ + public String upload(MultipartFile file) throws IOException, ClientException { + // 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。 + EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider(); + // 获取上传的文件的输入流 + InputStream inputStream = file.getInputStream(); + // 避免文件覆盖 + String originalFilename = file.getOriginalFilename(); + String fileName = UUID.randomUUID().toString() + originalFilename.substring(originalFilename.lastIndexOf(".")); + //上传文件到 OSS + // 创建OSSClient实例。 + ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration(); + clientBuilderConfiguration.setSignatureVersion(SignVersion.V4); + OSS ossClient = OSSClientBuilder.create() + .endpoint(aliOSSProperties.getEndpoint()) + .credentialsProvider(credentialsProvider) + .clientConfiguration(clientBuilderConfiguration) + .region(aliOSSProperties.getRegion()) + .build(); + // 创建PutObjectRequest对象。 + PutObjectRequest putObjectRequest = new PutObjectRequest(aliOSSProperties.getBucketName(), fileName, inputStream); + PutObjectResult result = ossClient.putObject(putObjectRequest); + //文件访问路径 + String url = aliOSSProperties.getEndpoint().split("//")[0] + "//" + aliOSSProperties.getBucketName() + "." + aliOSSProperties.getEndpoint().split("//")[1] + "/" + fileName; + // 关闭ossClient + ossClient.shutdown(); + return url;// 把上传到oss的路径返回 + } + +} diff --git a/sky-pojo/src/main/java/com/sky/entity/Employee.java b/sky-pojo/src/main/java/com/sky/entity/Employee.java index 0076cc2..c9fe288 100644 --- a/sky-pojo/src/main/java/com/sky/entity/Employee.java +++ b/sky-pojo/src/main/java/com/sky/entity/Employee.java @@ -1,5 +1,6 @@ package com.sky.entity; +import com.fasterxml.jackson.annotation.JsonFormat; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -32,7 +33,7 @@ public class Employee implements Serializable { private Integer status; - //@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") +// @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime createTime; //@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") diff --git a/sky-server/src/main/java/com/sky/SkyApplication.java b/sky-server/src/main/java/com/sky/SkyApplication.java index b13f77c..845d36b 100644 --- a/sky-server/src/main/java/com/sky/SkyApplication.java +++ b/sky-server/src/main/java/com/sky/SkyApplication.java @@ -3,11 +3,13 @@ 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.transaction.annotation.EnableTransactionManagement; @SpringBootApplication @EnableTransactionManagement //开启注解方式的事务管理 @Slf4j +@EnableCaching public class SkyApplication { public static void main(String[] args) { SpringApplication.run(SkyApplication.class, args); 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..eef806e --- /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 { + //当前操作类型:INSERT、UPDATE + OperationType value(); //sky-common模块中的枚举 +} \ No newline at end of file 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..cee9aa0 --- /dev/null +++ b/sky-server/src/main/java/com/sky/aspect/AutoFillAspect.java @@ -0,0 +1,82 @@ +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.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; + +/** + * 公共字段自动填充的切面 + */ +@Aspect //通过这个注解来标记当前这个类是一个切面类 +@Component //注意:切面对象本质也是一个spring容器中的bean对象 +@Slf4j +public class AutoFillAspect { + + /** + * 通过切入点指定我们需要拦截哪些类或者哪些方法 + */ +// @Pointcut("execution(* com.sky.mapper.*.*(..)) && @annotation(com.sky.annotation.AutoFill)") + @Pointcut("@annotation(com.sky.annotation.AutoFill)") + public void autoFilePointCut() { + } + + /** + * 前置通知:在通知中进行公共字段的赋值 + */ + @Before("autoFilePointCut()") + public void autoFill(JoinPoint joinPoint) { + log.info("开始进行公共字段自动填充..."); + //为实体类中公共的属性设置值 + MethodSignature signature = (MethodSignature) joinPoint.getSignature();//获得方法签名对象 + //获得当前被拦截的方法对象 + Method method = signature.getMethod(); + //获得当前方法上的注解对象 + AutoFill annotation = method.getAnnotation(AutoFill.class); + //获得当前数据库操作类型,从注解中就可以获取到 + //本次数据库操作的类型是什么? + OperationType operationType = annotation.value(); + System.out.println(operationType); + //实体类在哪?在连接点的方法参数中 + //获得当前被拦截的方法上的参数列表 + Object[] args = joinPoint.getArgs(); + //安全判断,没有参数则不操作 + if (args == null || args.length == 0) { + return; + } + //不能写死employee + Object entity = args[0]; + //赋的值是什么? + LocalDateTime now = LocalDateTime.now(); + Long currentId = BaseContext.getCurrentId(); + //判断当前数据库操作类型 + //需要为4个属性赋值,需要通过反射来赋值 + try { + if (operationType == OperationType.INSERT) { +// Method setCreateTimeMethod = entity.getClass().getDeclaredMethod("setCreateTime", LocalDateTime.class); + Method setCreateTimeMethod = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_CREATE_TIME, LocalDateTime.class); + Method setCreateUserMethod = entity.getClass().getDeclaredMethod("setCreateUser", Long.class); + setCreateUserMethod.invoke(entity, currentId); + //通过反射来调用上面的方法 + setCreateTimeMethod.invoke(entity, now);//相当于 category.setCreateTime(now); + } + Method setUpdateTimeMethod = entity.getClass().getDeclaredMethod("setUpdateTime", LocalDateTime.class); + setUpdateTimeMethod.invoke(entity, now); + Method setUpdateUserMethod = entity.getClass().getDeclaredMethod("setUpdateUser", Long.class); + setUpdateUserMethod.invoke(entity, currentId); + } catch (Exception e) { + e.printStackTrace(); + } + } + +} \ No newline at end of file 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..9d2181f --- /dev/null +++ b/sky-server/src/main/java/com/sky/config/OssConfiguration.java @@ -0,0 +1,20 @@ +package com.sky.config; + +import com.sky.properties.InmindAliOSSProperties; +import com.sky.utils.InmindAliOSSUtils; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +@Slf4j +public class OssConfiguration { + + @Bean + @ConditionalOnMissingBean//当bean对象不存在则创建,保证spring中只有一个bean对象 + public InmindAliOSSUtils inmindAliOSSUtils(InmindAliOSSProperties aliOSSProperties) { + log.info("开始创建阿里云文件上传工具类对象:{}", aliOSSProperties); + return new InmindAliOSSUtils(aliOSSProperties); + } +} 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..625c5fa --- /dev/null +++ b/sky-server/src/main/java/com/sky/config/RedisConfiguration.java @@ -0,0 +1,30 @@ +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; + + +/** + * redis的配置类 + */ +@Configuration +@Slf4j +public class RedisConfiguration { + + @Bean + //由于导入了Spring的redis起步依赖,已经将redis连接工厂类,加载到spring容器,只要定义参数就可以直接使用 + public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) { + log.info("开始创建redis模板对象..."); + RedisTemplate redisTemplate = new RedisTemplate(); + //设置redis的连接工厂对象 + redisTemplate.setConnectionFactory(redisConnectionFactory); + //设置redis key的序列化器 + redisTemplate.setKeySerializer(new StringRedisSerializer()); + return redisTemplate; + } +} \ No newline at end of file diff --git a/sky-server/src/main/java/com/sky/config/WebMvcConfiguration.java b/sky-server/src/main/java/com/sky/config/WebMvcConfiguration.java index 98fc764..072a753 100644 --- a/sky-server/src/main/java/com/sky/config/WebMvcConfiguration.java +++ b/sky-server/src/main/java/com/sky/config/WebMvcConfiguration.java @@ -1,13 +1,18 @@ 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 org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import springfox.documentation.builders.ApiInfoBuilder; import springfox.documentation.builders.PathSelectors; import springfox.documentation.builders.RequestHandlerSelectors; @@ -15,26 +20,36 @@ 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 { +//public class WebMvcConfiguration extends WebMvcConfigurationSupport { +public class WebMvcConfiguration implements WebMvcConfigurer { @Autowired private JwtTokenAdminInterceptor jwtTokenAdminInterceptor; + @Autowired + private JwtTokenUserInterceptor jwtTokenUserInterceptor; /** * 注册自定义拦截器 * * @param registry */ - protected void addInterceptors(InterceptorRegistry registry) { + public 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"); } /** @@ -42,16 +57,36 @@ public class WebMvcConfiguration extends WebMvcConfigurationSupport { * @return */ @Bean - public Docket docket() { + 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")) + .apis(RequestHandlerSelectors.basePackage("com.sky.controller.admin")) + .paths(PathSelectors.any()) + .build(); + return docket; + } + + @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; @@ -61,8 +96,28 @@ public class WebMvcConfiguration extends WebMvcConfigurationSupport { * 设置静态资源映射 * @param registry */ - protected void addResourceHandlers(ResourceHandlerRegistry registry) { + public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/doc.html").addResourceLocations("classpath:/META-INF/resources/"); registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/"); } + + + + /** + * 扩展springMVC框架的消息转化器 + * @param converters + */ + @Override + public void extendMessageConverters(List> converters) { + log.info("扩展消息转换器....."); + //创建一个消息转换器对象(注意:千万不要选错类MappingJackson2CborHttpMessageConverter) + 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..ae7b1ec --- /dev/null +++ b/sky-server/src/main/java/com/sky/controller/admin/CommonController.java @@ -0,0 +1,43 @@ +package com.sky.controller.admin; + +import com.sky.constant.MessageConstant; +import com.sky.result.Result; +import com.sky.utils.InmindAliOSSUtils; +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; + +/* +通用接口 + */ +@RestController +@RequestMapping("/admin/common") +@Api(tags = "通用接口") +@Slf4j +public class CommonController { + + @Autowired + private InmindAliOSSUtils aliOssUtil; + + /** + * 文件上传 + * @return + */ + @PostMapping("/upload") + @ApiOperation("文件上传") + public Result upload(MultipartFile file){ + try { + //调用阿里云OSS工具类,将文件上传到阿里云服务器,返回完整url地址 + String path = aliOssUtil.upload(file); + return Result.success(path); + } catch (Exception e) { + log.error("文件上传失败!"); + } + 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..03e4217 --- /dev/null +++ b/sky-server/src/main/java/com/sky/controller/admin/DishController.java @@ -0,0 +1,143 @@ +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.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 add(@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){//@RequestParam:能够使用springmvc框架对1,2,3进行切割解析到集合中 + log.info("菜品批量删除:{}",ids); + dishService.deleteBatch(ids); + 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 dishDTO + * @return + */ + @PutMapping + @ApiOperation("修改菜品") + public Result update(@RequestBody DishDTO dishDTO){ + log.info("修改菜品:{}",dishDTO); + dishService.updateWithFlavor(dishDTO); + cleanCache("dish_*"); + return Result.success(); + } + + + /** + * 菜品起售停售 + * @param status + * @param id + * @return + */ + @PostMapping("/status/{status}") + @ApiOperation("菜品起售停售") + public Result startOrStop(@PathVariable Integer status, Long id){ + dishService.startOrStop(status,id); + + 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 pattern + */ + public void cleanCache(String pattern){ + //查询所有dish_开头的key + 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 index 5857f07..2bdc9fe 100644 --- a/sky-server/src/main/java/com/sky/controller/admin/EmployeeController.java +++ b/sky-server/src/main/java/com/sky/controller/admin/EmployeeController.java @@ -1,19 +1,21 @@ 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.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import java.util.HashMap; import java.util.Map; @@ -24,6 +26,7 @@ import java.util.Map; @RestController @RequestMapping("/admin/employee") @Slf4j +@Api(tags = "员工相关接口")//描述当前的作用 public class EmployeeController { @Autowired @@ -38,6 +41,7 @@ public class EmployeeController { * @return */ @PostMapping("/login") + @ApiOperation("员工登录")//描述当前方法的作用 public Result login(@RequestBody EmployeeLoginDTO employeeLoginDTO) { log.info("员工登录:{}", employeeLoginDTO); @@ -66,9 +70,66 @@ public class EmployeeController { * * @return */ + @ApiOperation("员工退出") @PostMapping("/logout") public Result logout() { return Result.success(); } + + @ApiOperation("新增员工") + @PostMapping + 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 + */ + @ApiOperation("员工分页查询") + @GetMapping("/page") + 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(); + } + + /** + * 根据Id查询员工 + * @param id + * @return + */ + @GetMapping("/{id}") + @ApiOperation("根据Id查询员工") + public Result getById(@PathVariable Long id){ + Employee employee = employeeService.getById(id); + return Result.success(employee); + } + + + /** + * 修改员工 + * @param employeeDTO + * @return + */ + @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..1bb710e --- /dev/null +++ b/sky-server/src/main/java/com/sky/controller/admin/SetmealController.java @@ -0,0 +1,108 @@ +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 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::2 + 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}") + @ApiOperation("套餐起售停售") + @CacheEvict(cacheNames = "setmealCache",allEntries = true) + public Result startOrStop(@PathVariable Integer status, Long id) { + setmealService.startOrStop(status, id); + return Result.success(); + } +} 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..2fc6ba2 --- /dev/null +++ b/sky-server/src/main/java/com/sky/controller/admin/ShopController.java @@ -0,0 +1,50 @@ +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 SHOP_STATUS = "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(SHOP_STATUS,status); + return Result.success(); + } + + /** + * 获取营业状态 + * @return + */ + @GetMapping("/status") + @ApiOperation("获取营业状态") + public Result getStatus(){ + Integer status = (Integer) redisTemplate.opsForValue().get(SHOP_STATUS); + log.info("获取店铺的营业状态:{}",status == 1?"营业中":"打烊中"); + return Result.success(status); + } + +} 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..528d6eb --- /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(); + } + + @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..d264bf7 --- /dev/null +++ b/sky-server/src/main/java/com/sky/controller/user/DishController.java @@ -0,0 +1,60 @@ +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.ReactiveRedisOperations; +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中的String数据类型存储数据,但是redis的string与java的string不是同一个概念,它可以将对象序列化到reids中,再从redis中反序列化出对应的对象 + //1.构造redis中的key,规则:dish_分类id + String key = "dish_"+categoryId; + //2.查询redis中是否存在菜品数据 + List list = (List) redisTemplate.opsForValue().get(key); + //3.如果存在,直接返回,无须查询数据库 + if (list != null && list.size() > 0) { + return Result.success(list); + } + + //4.如果不存在,查询数据库,将查询到的数据翻入redis中 + Dish dish = new Dish(); + dish.setCategoryId(categoryId); + dish.setStatus(StatusConstant.ENABLE);//查询起售中的菜品 + + list = dishService.listWithFlavor(dish); + //5.保存到redis中 + 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..67eefce --- /dev/null +++ b/sky-server/src/main/java/com/sky/controller/user/OrderController.java @@ -0,0 +1,42 @@ +package com.sky.controller.user; + +import com.sky.dto.OrdersSubmitDTO; +import com.sky.result.Result; +import com.sky.service.OrderService; +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.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * 订单操作控制器 + * + **/ +@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.submit(ordersSubmitDTO); + return Result.success(orderSubmitVO); + } + +} \ No newline at end of file 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..7f480bb --- /dev/null +++ b/sky-server/src/main/java/com/sky/controller/user/SetmealController.java @@ -0,0 +1,56 @@ +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查询套餐") + //key: setmealCache::categoryId (查询或储存缓存!!!!) + @Cacheable(cacheNames = "setmealCache" ,key = "#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..187474c --- /dev/null +++ b/sky-server/src/main/java/com/sky/controller/user/ShopController.java @@ -0,0 +1,39 @@ +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.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * 店铺营业状态 + **/ +@RestController("userShopController") +@RequestMapping("/user/shop") +@Api(tags = "店铺状态相关接口") +@Slf4j +public class ShopController {//控制器会放入spring,重名会有问题 + + public static final String SHOP_STATUS = "SHOP_STATUS"; + + @Autowired + private RedisTemplate redisTemplate; + + /** + * 获取营业状态 + * @return + */ + @GetMapping("/status") + @ApiOperation("获取营业状态") + public Result getStatus(){ + Integer status = (Integer) redisTemplate.opsForValue().get(SHOP_STATUS); + 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..799bb84 --- /dev/null +++ b/sky-server/src/main/java/com/sky/controller/user/ShoppingCartController.java @@ -0,0 +1,60 @@ +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.springframework.beans.factory.annotation.Autowired; +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> showShoppingCart(){ + log.info("查看购物车!!"); + List list = shoppingCartService.showShoppingCart(); + return Result.success(list); + } + + + /** + * 清空购物车 + * @return + */ + @DeleteMapping("/clean") + @ApiOperation("清空购物车") + public Result cleanShoppingCart(){ + shoppingCartService.cleanShoppingCart(); + return Result.success(); + } +} \ No newline at end of file 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..8501030 --- /dev/null +++ b/sky-server/src/main/java/com/sky/controller/user/UserController.java @@ -0,0 +1,58 @@ +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") +@Slf4j +@Api(tags = "C端用户相关接口") +public class UserController { + + @Autowired + private UserService userService; + + @Autowired + private JwtProperties jwtProperties; + + /** + * 微信用户登录 + * @param userLoginDTO + * @return + */ + @PostMapping("/login") + @ApiOperation("微信用户登录") + public Result wxLogin(@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); + } + +} \ No newline at end of file diff --git a/sky-server/src/main/java/com/sky/handler/GlobalExceptionHandler.java b/sky-server/src/main/java/com/sky/handler/GlobalExceptionHandler.java index 1a48598..74fe29a 100644 --- a/sky-server/src/main/java/com/sky/handler/GlobalExceptionHandler.java +++ b/sky-server/src/main/java/com/sky/handler/GlobalExceptionHandler.java @@ -1,11 +1,14 @@ 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; + /** * 全局异常处理器,处理项目中抛出的业务异常 */ @@ -24,4 +27,24 @@ public class GlobalExceptionHandler { return Result.error(ex.getMessage()); } + /** + * 处理SQL异常 + * @param ex + * @return + */ + @ExceptionHandler + public Result exceptionHandler(SQLIntegrityConstraintViolationException ex){ + //Duplicate entry 'zhangsan' for key 'idx_username' + String message = ex.getMessage(); + if(message.contains("Duplicate entry")){ + String[] split = message.split(" "); + String username = split[2]; +// String msg = username + "已经存在"; + String msg = username + MessageConstant.ALEADY_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 index e7c50b6..b880123 100644 --- a/sky-server/src/main/java/com/sky/interceptor/JwtTokenAdminInterceptor.java +++ b/sky-server/src/main/java/com/sky/interceptor/JwtTokenAdminInterceptor.java @@ -1,6 +1,7 @@ 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; @@ -47,6 +48,7 @@ public class JwtTokenAdminInterceptor implements HandlerInterceptor { 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) { 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..50357ce --- /dev/null +++ b/sky-server/src/main/java/com/sky/interceptor/JwtTokenUserInterceptor.java @@ -0,0 +1,65 @@ +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); + //保存登录id + 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..397447c --- /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 + */ + @AutoFill(OperationType.INSERT) + @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})") + 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(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..98f483c --- /dev/null +++ b/sky-server/src/main/java/com/sky/mapper/DishFlavorMapper.java @@ -0,0 +1,30 @@ +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 { + void insertBath(List flavors); + + /** + * 根据菜品id,删除对应的口味数据 + * @param dishId + */ + @Delete("delete from dish_flavor where dish_id = #{dishId}") + void deleteByDishId(Long dishId); + + void deleteByDishIds(List dishIds); + + /** + * 根据菜品id查询对应的口味数据 + * @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..6b01afa --- /dev/null +++ b/sky-server/src/main/java/com/sky/mapper/DishMapper.java @@ -0,0 +1,71 @@ +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.Insert; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Select; + +import java.util.List; + +@Mapper +public interface DishMapper { + + /** + * 根据分类id查询菜品数量 + * @param categoryId + * @return + */ + @AutoFill(OperationType.INSERT) + @Select("select count(id) from dish where category_id = #{categoryId}") + Integer countByCategoryId(Long categoryId); + + @AutoFill(OperationType.INSERT) + void insert(Dish dish); + + Page pageQuery(DishPageQueryDTO dishPageQueryDTO); + + /** + * 根据主键查询菜品 + * @param id + * @return + */ + @Select("select * from dish where id = #{id}") + Dish getById(Long id); + + /** + * 根据id删除菜品 + * @param dishId + */ + @Delete("delete from dish where id = #{dishId}") + void deleteById(Long dishId); + + 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 index 550eda5..90a37d9 100644 --- a/sky-server/src/main/java/com/sky/mapper/EmployeeMapper.java +++ b/sky-server/src/main/java/com/sky/mapper/EmployeeMapper.java @@ -1,6 +1,11 @@ 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; @@ -15,4 +20,22 @@ public interface EmployeeMapper { @Select("select * from employee where username = #{username}") Employee getByUsername(String username); + + @AutoFill(OperationType.INSERT) + @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})") + void insert(Employee employee); + + Page pageQuery(EmployeePageQueryDTO employeePageQueryDTO); + + @AutoFill(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..8252840 --- /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..2f940c8 --- /dev/null +++ b/sky-server/src/main/java/com/sky/mapper/OrderMapper.java @@ -0,0 +1,13 @@ +package com.sky.mapper; + +import com.sky.entity.Orders; +import org.apache.ibatis.annotations.Insert; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Options; + +@Mapper +public interface OrderMapper { + @Insert("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})") + @Options(useGeneratedKeys = true,keyProperty = "id") + void insert(Orders order); +} 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..9f856a3 --- /dev/null +++ b/sky-server/src/main/java/com/sky/mapper/SetmealDishMapper.java @@ -0,0 +1,70 @@ +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 ids + * @return + */ + + /** + * 根据菜品id查询关联套餐id + * @param ids + * @return + */ + //select setmeal_id from setmeal_dish where dish_id in(1,2,3); + List getSetmealIdsByDishIds(List ids); + + /** + * 批量保存套餐和菜品的关联关系 + * @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);*/ + + /** + * 批量保存套餐和菜品的关联关系 + * @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..2a4f843 --- /dev/null +++ b/sky-server/src/main/java/com/sky/mapper/SetmealMapper.java @@ -0,0 +1,85 @@ +package com.sky.mapper; + +import com.github.pagehelper.Page; +import com.sky.dto.SetmealPageQueryDTO; +import com.sky.entity.Setmeal; +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; +import java.util.Map; + +@Mapper +public interface SetmealMapper { + + /** + * 根据分类id查询套餐的数量 + * @param id + * @return + */ + @Select("select count(id) from setmeal where category_id = #{categoryId}") + Integer countByCategoryId(Long id); + + /** + * 根据id修改套餐 + * + * @param setmeal + */ + void update(Setmeal setmeal); + + /** + * 新增套餐 + * @param setmeal + */ + 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 + * @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); + + /** + * 根据条件统计套餐数量 + * @param map + * @return + */ + Integer countByMap(Map map); + +} 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..4252916 --- /dev/null +++ b/sky-server/src/main/java/com/sky/mapper/ShoppingCartMapper.java @@ -0,0 +1,43 @@ +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 java.util.List; + +/** + * 购物车持久层接口 + **/ +@Mapper +public interface ShoppingCartMapper { + + /** + * 动态条件查询 + * @param shoppingCart + * @return + */ + List list(ShoppingCart shoppingCart); + + /** + * 更新商品数量 + */ + @Update("update shopping_cart set number = #{number} where id = #{id}") + void updateNumberById(ShoppingCart cart); + + /** + * 新增购物车数据 + * @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); +} \ No newline at end of file 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..4be9a8e --- /dev/null +++ b/sky-server/src/main/java/com/sky/mapper/UserMapper.java @@ -0,0 +1,23 @@ +package com.sky.mapper; + +import com.sky.entity.User; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Select; + +import java.util.Map; + +@Mapper +public interface UserMapper { + + //根据openid查询用户 + @Select("select * from user where openid = #{openid}") + User getByOpenid(String openid); + + /** + * 插入数据 + * @param user + * @Options(useGeneratedKeys = true,keyProperty = "id") + */ + void insert(User user); + +} 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..9d761d6 --- /dev/null +++ b/sky-server/src/main/java/com/sky/service/DishService.java @@ -0,0 +1,43 @@ +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 { + void saveWithFlavor(DishDTO dishDTO); + + PageResult pageQuery(DishPageQueryDTO dishPageQueryDTO); + + void deleteBatch(List ids); + + DishVO getByIdWithFlavor(Long id); + + void updateWithFlavor(DishDTO dishDTO); + + /** + * 根据分类id查询菜品 + * @param categoryId + * @return + */ + List list(Long categoryId); + + /** + * 条件查询菜品和口味 + * @param dish + * @return + */ + List listWithFlavor(Dish dish); + + /** + * 菜品起售停售 + * @param status + * @param id + */ + 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 index d3e2ab2..0719a01 100644 --- a/sky-server/src/main/java/com/sky/service/EmployeeService.java +++ b/sky-server/src/main/java/com/sky/service/EmployeeService.java @@ -1,7 +1,10 @@ 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 { @@ -12,4 +15,13 @@ public interface EmployeeService { */ Employee login(EmployeeLoginDTO employeeLoginDTO); + void save(EmployeeDTO employeeDTO); + + PageResult pageQuery(EmployeePageQueryDTO employeePageQueryDTO); + + void startOrStop(Integer status, Long id); + + Employee getById(Long id); + + 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..4f6a10b --- /dev/null +++ b/sky-server/src/main/java/com/sky/service/OrderService.java @@ -0,0 +1,8 @@ +package com.sky.service; + +import com.sky.dto.OrdersSubmitDTO; +import com.sky.vo.OrderSubmitVO; + +public interface OrderService { + OrderSubmitVO submit(OrdersSubmitDTO ordersSubmitDTO); +} 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..ece27e5 --- /dev/null +++ b/sky-server/src/main/java/com/sky/service/SetmealService.java @@ -0,0 +1,71 @@ +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; + +/** + * desc + * + **/ +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 + */ + void startOrStop(Integer status, Long id); + + /** + * 条件查询 + * @param setmeal + * @return + */ + List list(Setmeal setmeal); + + /** + * 根据id查询菜品选项 + * @param id + * @return + */ + List getDishItemById(Long id); + + +} 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..3c821c8 --- /dev/null +++ b/sky-server/src/main/java/com/sky/service/ShoppingCartService.java @@ -0,0 +1,14 @@ +package com.sky.service; + +import com.sky.dto.ShoppingCartDTO; +import com.sky.entity.ShoppingCart; + +import java.util.List; + +public interface ShoppingCartService { + void addShoppingCart(ShoppingCartDTO shoppingCartDTO); + + List showShoppingCart(); + + void cleanShoppingCart(); +} 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..200dac6 --- /dev/null +++ b/sky-server/src/main/java/com/sky/service/UserService.java @@ -0,0 +1,8 @@ +package com.sky.service; + +import com.sky.dto.UserLoginDTO; +import com.sky.entity.User; + +public interface UserService { + 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..86b64d3 --- /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..6f07634 --- /dev/null +++ b/sky-server/src/main/java/com/sky/service/impl/DishServiceImpl.java @@ -0,0 +1,236 @@ +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.mapper.DishFlavorMapper; +import com.sky.mapper.DishMapper; +import com.sky.mapper.SetmealDishMapper; +import com.sky.mapper.SetmealMapper; +import com.sky.result.PageResult; +import com.sky.service.DishService; +import com.sky.vo.DishVO; +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 + public class DishServiceImpl implements DishService { + + @Autowired + private DishMapper dishMapper; + @Autowired + private DishFlavorMapper dishFlavorMapper; + @Autowired + private SetmealDishMapper setmealDishMapper; + @Autowired + private SetmealMapper setmealMapper; + + /* + 新增菜品和对应的口味 + */ + @Transactional + @Override + public void saveWithFlavor(DishDTO dishDTO) { + Dish dish = new Dish(); + BeanUtils.copyProperties(dishDTO, dish); + //向菜品插入1条数据 + dishMapper.insert(dish); + //获取insert语句生成的主键 + Long dishId = dish.getId(); + + //向口味表插入n条数据 + List flavors = dishDTO.getFlavors(); + if (flavors != null && flavors.size() > 0) { + flavors.forEach(flavor -> { + flavor.setDishId(dishId); + }); + //批量插入 + dishFlavorMapper.insertBath(flavors); + } + } + + /** + * 菜品分页查询 + * @param dishPageQueryDTO + * @return + */ + @Override + 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 + * @return + */ + @Override + @Transactional + public void deleteBatch(List ids) { + //1.判断菜品的起售状态,如果起售中提示不能删除 + ids.forEach(id->{ + Dish dish = dishMapper.getById(id); + //判断售卖状态 + if(dish.getStatus() == StatusConstant.ENABLE){ + //起售中,不能删除,抛出业务异常 + throw new DeletionNotAllowedException(MessageConstant.DISH_ON_SALE); + } + }); + + //2.判断当前菜品是否被套餐关联了 + List setmealIds = setmealDishMapper.getSetmealIdsByDishIds(ids); + if(setmealIds != null && setmealIds.size() > 0){ + //菜品被套餐关联了,不能删除,抛出业务异常 + throw new DeletionNotAllowedException(MessageConstant.DISH_BE_RELATED_BY_SETMEAL); + } + + //遍历菜品id,删除菜品和口味 + //3.根据菜品id集合批量删除菜品数据 + //4.根据菜品id集合批量删除关联的口味数据 + //以下代码可以优化,用一条sql就执行结束 + /*for (Long dishId : ids) { + dishMapper.deleteById(dishId);//根据主键id删除菜品 + dishFlavorMapper.deleteByDishId(dishId);//根据菜品id删除口味 + }*/ + + //3.根据菜品id集合批量删除菜品数据 + dishMapper.deleteByIds(ids); + //4.根据菜品id集合批量删除关联的口味数据 + //delete from dish_flavor where dish_id in(?,?,?); + dishFlavorMapper.deleteByDishIds(ids); + } + + /** + * 根据id查询菜品和对应的口味数据 + * @param id + * @return + */ + @Override + public DishVO getByIdWithFlavor(Long id) { + //1.查询2张表:菜品表和口味表 + //2.根据id查询菜品 + Dish dish = dishMapper.getById(id); + //3.根据菜品id查询关联的口味 + List dishFlavors = dishFlavorMapper.getByDishId(id); + + DishVO dishVO = new DishVO(); + //对象属性拷贝 + BeanUtils.copyProperties(dish,dishVO); + dishVO.setFlavors(dishFlavors); + + return dishVO; + } + + /** + * 根据id修改菜品基本信息和对应的口味信息 + * @param dishDTO + */ + @Override + public void updateWithFlavor(DishDTO dishDTO) { + //1.影响几张表:2张,分别是菜品表和口味表 + + Dish dish = new Dish(); + BeanUtils.copyProperties(dishDTO,dish); + + //2.修改菜品信息 + dishMapper.update(dish); + + //3.对于口味表,先执行删除,再重新添加 + dishFlavorMapper.deleteByDishId(dishDTO.getId()); + + //4.重新插入口味数据 + List flavors = dishDTO.getFlavors(); + if(flavors != null && flavors.size() > 0){ + for (DishFlavor flavor : flavors) { + //重新设置菜品id + flavor.setDishId(dishDTO.getId()); + } + //批量插入口味数据 + dishFlavorMapper.insertBath(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; + } + + /** + * 菜品起售停售 + * + * @param status + * @param id + */ + @Transactional + public void startOrStop(Integer status, Long id) { + Dish dish = Dish.builder() + .id(id) + .status(status) + .build(); + dishMapper.update(dish); + + if (status == StatusConstant.DISABLE) { + // 如果是停售操作,还需要将包含当前菜品的套餐也停售 + List dishIds = new ArrayList<>(); + dishIds.add(id); + // select setmeal_id from setmeal_dish where dish_id in (?,?,?) + List setmealIds = setmealDishMapper.getSetmealIdsByDishIds(dishIds); + if (setmealIds != null && setmealIds.size() > 0) { + for (Long setmealId : setmealIds) { + Setmeal setmeal = Setmeal.builder() + .id(setmealId) + .status(StatusConstant.DISABLE) + .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 index cc98c98..bbb9139 100644 --- a/sky-server/src/main/java/com/sky/service/impl/EmployeeServiceImpl.java +++ b/sky-server/src/main/java/com/sky/service/impl/EmployeeServiceImpl.java @@ -1,18 +1,29 @@ 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 { @@ -39,7 +50,8 @@ public class EmployeeServiceImpl implements EmployeeService { } //密码比对 - // TODO 后期需要进行md5加密,然后再进行比对 + // 后期需要进行md5加密,然后再进行比对 + password = DigestUtils.md5DigestAsHex(password.getBytes()); if (!password.equals(employee.getPassword())) { //密码错误 throw new PasswordErrorException(MessageConstant.PASSWORD_ERROR); @@ -54,4 +66,86 @@ public class EmployeeServiceImpl implements EmployeeService { return employee; } + + @Override + 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); + //设置默认密码 + employee.setPassword(DigestUtils.md5DigestAsHex(PasswordConstant.DEFAULT_PASSWORD.getBytes())); + //设置创建时间和修改时间 + employee.setCreateTime(LocalDateTime.now()); + employee.setUpdateTime(LocalDateTime.now()); + //设置当前记录创建人id和修改人的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 = ? + //写法1:普通写法 + /*Employee employee = new Employee(); + employee.setId(id); + employee.setStatus(status);*/ + //写法2:构建器方式创建实体对象 + 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..e976e0c --- /dev/null +++ b/sky-server/src/main/java/com/sky/service/impl/OrderServiceImpl.java @@ -0,0 +1,97 @@ +package com.sky.service.impl; + +import com.sky.constant.MessageConstant; +import com.sky.context.BaseContext; +import com.sky.dto.OrdersSubmitDTO; +import com.sky.entity.AddressBook; +import com.sky.entity.OrderDetail; +import com.sky.entity.Orders; +import com.sky.entity.ShoppingCart; +import com.sky.exception.AddressBookBusinessException; +import com.sky.exception.ShoppingCartBusinessException; +import com.sky.mapper.*; +import com.sky.service.OrderService; +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.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; + +@Service +public class OrderServiceImpl implements OrderService { + + @Autowired + private ShoppingCartMapper shoppingCartMapper; + @Autowired + private AddressBookMapper addressBookMapper; + @Autowired + private OrderMapper orderMapper; + @Autowired + private OrderDetailMapper orderDetailMapper; + @Autowired + private UserMapper userMapper; + + + /** + * 用户下单 + * @param ordersSubmitDTO + * @return + */ + @Transactional + public OrderSubmitVO submit(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 cart = new ShoppingCart(); + cart.setUserId(userId); + List cartList = shoppingCartMapper.list(cart); + if (cartList == null || cartList.size() == 0) { + //抛出购物车数据为空业务异常 + throw new ShoppingCartBusinessException(MessageConstant.SHOPPING_CART_IS_NULL); + } + + + //2.向订单表插入一条数据 + 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); + orders.setAddress(addressBook.getProvinceName()+addressBook.getCityName()+addressBook.getDistrictName()+addressBook.getDetail()); + + + orderMapper.insert(orders); + //3.向订单明细表插入n条数据 + List orderDetailList = new ArrayList<>(); + for (ShoppingCart shoppingCart : cartList) { + OrderDetail orderDetail = new OrderDetail();//订单明细 + BeanUtils.copyProperties(shoppingCart,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()) + .orderNumber(orders.getNumber()) + .orderTime(orders.getOrderTime()) + .orderAmount(orders.getAmount()) + .build(); + return orderSubmitVO; + } +} 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..0e9559c --- /dev/null +++ b/sky-server/src/main/java/com/sky/service/impl/SetmealServiceImpl.java @@ -0,0 +1,194 @@ +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.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 + */ + 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); + } + + + +} 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..296a6ae --- /dev/null +++ b/sky-server/src/main/java/com/sky/service/impl/ShoppingCartServiceImpl.java @@ -0,0 +1,105 @@ +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 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 +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); + shoppingCart.setUserId(BaseContext.getCurrentId()); + + //1、判断当前购物车中是否存在该商品(有可能是菜品,也可能是套餐)----只能查询自己购物车中的商品 where user_id = ? + List list = shoppingCartMapper.list(shoppingCart); + + //2、如果已经存在,则数量 + 1(因为添加购物车时,是直接添加一个菜品或者套餐,所以如果存在直接+1即可) + 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{ + //3、如果不存在,向购物车表插入1条数据 + // insert into shopping_cart(...) values(...) + //判断本次添加的商品是菜品还是套餐 + if(shoppingCartDTO.getDishId() != null){ + //本次添加的是菜品,查询菜品表,获取菜品的名称、图片路径、单价 + Dish dish = dishMapper.getById(shoppingCartDTO.getDishId()); + //封装购物车对象 + shoppingCart = ShoppingCart.builder() + .dishId(shoppingCartDTO.getDishId()) + .name(dish.getName()) + .image(dish.getImage()) + .dishFlavor(shoppingCartDTO.getDishFlavor()) + .amount(dish.getPrice()) + .build(); + }else { + //本次添加的是套餐,查询套餐表,获取套餐的名称、图片路径、单价 + Setmeal setmeal = setmealMapper.getById(shoppingCartDTO.getSetmealId()); + //封装购物车对象 + shoppingCart = ShoppingCart.builder() + .setmealId(shoppingCartDTO.getSetmealId()) + .name(setmeal.getName()) + .image(setmeal.getImage()) + .amount(setmeal.getPrice()) + .build(); + } + shoppingCart.setUserId(BaseContext.getCurrentId()); + shoppingCart.setNumber(1); + shoppingCart.setCreateTime(LocalDateTime.now()); + shoppingCartMapper.insert(shoppingCart); + } + + } + + /** + * 查看购物车 + * @return + */ + public List showShoppingCart() { + //select * from shopping_cart where user_id = ? + Long userId = BaseContext.getCurrentId(); + ShoppingCart cart = ShoppingCart.builder() + .userId(userId) + .build(); + + List list = shoppingCartMapper.list(cart); + return list; + } + + /** + * 清空购物车 + */ + public void cleanShoppingCart() {//方法名体现的是业务功能 + // delete from shopping_cart where user_id = ? + shoppingCartMapper.deleteByUserId(BaseContext.getCurrentId());//体现的是数据库操作 + } + +} 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..9216fc4 --- /dev/null +++ b/sky-server/src/main/java/com/sky/service/impl/UserServiceImpl.java @@ -0,0 +1,74 @@ +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 org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.time.LocalDateTime; +import java.util.HashMap; +import java.util.Map; + +@Service +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 + */ + @Override + public User wxLogin(UserLoginDTO userLoginDTO) { + //1.调用微信接口服务,获取当前微信用户端openid + String openid = getOpenid(userLoginDTO.getCode()); + + //2.判断openid是否是空,如果为空,表示登录失败,抛出业务异常 + if (openid == null) { + throw new LoginFailedException(MessageConstant.LOGIN_FAILED); + } + //3.判断当前用户是否为新用户 + User user = userMapper.getByOpenid(openid); + //4.如果是新用户,自动完成注册 + if (user == null) { + user = User.builder() + .openid(openid) + .createTime(LocalDateTime.now()) + .build(); + userMapper.insert(user); + } + //返回用户对象 + return user; + } + + + //调用微信接口服务,获取当前微信用户端openid + private String getOpenid(String code){ + 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 index fa4146b..5e07ab0 100644 --- a/sky-server/src/main/resources/application-dev.yml +++ b/sky-server/src/main/resources/application-dev.yml @@ -3,6 +3,18 @@ sky: driver-class-name: com.mysql.cj.jdbc.Driver host: localhost port: 3306 - database: sky_take_out + database: sky_take_out1 username: root password: 1234 + alioss: + endpoint: https://oss-cn-shanghai.aliyuncs.com + bucket-name: inmind-test + region: cn-shanghai + redis: + host: localhost + port: 6379 + password: 123456 + database: 10 #不配置的话,默认是0号数据库 + wechat: + appid: wx3a8ed8d8e9c9552a + secret: 8ada060abc5326be3a446a75df4c77b3 diff --git a/sky-server/src/main/resources/application.yml b/sky-server/src/main/resources/application.yml index f0e51cf..492cf69 100644 --- a/sky-server/src/main/resources/application.yml +++ b/sky-server/src/main/resources/application.yml @@ -12,6 +12,14 @@ spring: 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} + mvc: + pathmatch: + matching-strategy: ant_path_matcher #swagger配置兼容Springboot + redis: + host: ${sky.redis.host} + port: ${sky.redis.port} +# password: ${sky.redis.password} + database: ${sky.redis.database} #不配置的话,默认是0号数据库 mybatis: #mapper配置文件 @@ -20,6 +28,8 @@ mybatis: configuration: #开启驼峰命名 map-underscore-to-camel-case: true + #输出mybatis的日志 + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl logging: level: @@ -34,6 +44,16 @@ sky: # 设置jwt签名加密时使用的秘钥 admin-secret-key: inmind # 设置jwt过期时间 - admin-ttl: 7200000 + admin-ttl: 86400000 # 设置前端传递过来的令牌名称 admin-token-name: token + user-secret-key: inmind + user-ttl: 3600000 + user-token-name: authentication + alioss: + endpoint: ${sky.alioss.endpoint} + bucket-name: ${sky.alioss.bucket-name} + region: ${sky.alioss.region} + wechat: + appid: ${sky.wechat.appid} + secret: ${sky.wechat.secret} 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..f6f4bc3 --- /dev/null +++ b/sky-server/src/main/resources/mapper/DishFlavorMapper.xml @@ -0,0 +1,19 @@ + + + + + + insert into dish_flavor(dish_id, name, value) + values + + (#{df.dishId},#{df.name},#{df.value}) + + + + delete from dish_flavor where dish_id in + + #{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..53bd5cf --- /dev/null +++ b/sky-server/src/main/resources/mapper/DishMapper.xml @@ -0,0 +1,65 @@ + + + + + + insert into dish (name, category_id, price, image, description, create_time, update_time, create_user, update_user,status) + values (#{name},#{categoryId},#{price},#{image},#{description},#{createTime},#{updateTime},#{createUser},#{updateUser},#{status}) + + + + + 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 index 3c3dc8d..4d04fa8 100644 --- a/sky-server/src/main/resources/mapper/EmployeeMapper.xml +++ b/sky-server/src/main/resources/mapper/EmployeeMapper.xml @@ -2,4 +2,31 @@ + + + + update employee + + name = #{name}, + username = #{username}, + password = #{password}, + phone = #{phone}, + sex = #{sex}, + id_number = #{idNumber}, + status = #{status}, + create_time = #{createTime}, + update_time = #{updateTime}, + create_user = #{createUser}, + update_user = #{updateUser}, + + 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..28b8476 --- /dev/null +++ b/sky-server/src/main/resources/mapper/OrderDetailMapper.xml @@ -0,0 +1,10 @@ + + + + + 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}) + + + \ No newline at end of file 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..ab392b5 --- /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..722b4c9 --- /dev/null +++ b/sky-server/src/main/resources/mapper/SetmealMapper.xml @@ -0,0 +1,93 @@ + + + + + update setmeal + + + name = #{name}, + + + category_id = #{categoryId}, + + + price = #{price}, + + + status = #{status}, + + + description = #{description}, + + + image = #{image}, + + + update_time = #{updateTime}, + + + update_user = #{updateUser} + + + where id = #{id} + + + + 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}) + + + + + + + + + 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..5dd3881 --- /dev/null +++ b/sky-server/src/main/resources/mapper/ShoppingCartMapper.xml @@ -0,0 +1,21 @@ + + + + + \ No newline at end of file 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..5277ca2 --- /dev/null +++ b/sky-server/src/main/resources/mapper/UserMapper.xml @@ -0,0 +1,14 @@ + + + + + + insert into user (openid, name, phone, sex, id_number, avatar, create_time) + values (#{openid},#{name},#{phone},#{sex},#{idNumber},#{avatar},#{createTime}) + + + diff --git a/springcache-demo/pom.xml b/springcache-demo/pom.xml new file mode 100644 index 0000000..907d76c --- /dev/null +++ b/springcache-demo/pom.xml @@ -0,0 +1,92 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.7.3 + + + com.itheima + springcache-demo + 1.0-SNAPSHOT + + + 11 + 11 + + + + + org.springframework.boot + spring-boot-starter-web + compile + + + org.projectlombok + lombok + 1.18.20 + + + + com.alibaba + fastjson + 1.2.76 + + + + commons-lang + commons-lang + 2.6 + + + org.springframework.boot + spring-boot-starter-cache + + + + org.springframework.boot + spring-boot-starter-data-redis + + + + mysql + mysql-connector-java + runtime + + + + org.mybatis.spring.boot + mybatis-spring-boot-starter + 2.2.0 + + + + com.alibaba + druid-spring-boot-starter + 1.2.1 + + + + com.github.xiaoymin + knife4j-spring-boot-starter + 3.0.2 + + + + org.springframework.boot + spring-boot-starter-test + + + + + + org.springframework.boot + spring-boot-maven-plugin + 2.7.3 + + + + diff --git a/springcache-demo/springcachedemo.sql b/springcache-demo/springcachedemo.sql new file mode 100644 index 0000000..3003d73 --- /dev/null +++ b/springcache-demo/springcachedemo.sql @@ -0,0 +1,7 @@ +DROP TABLE IF EXISTS `user`; +CREATE TABLE `user` ( + `id` bigint NOT NULL AUTO_INCREMENT, + `name` varchar(45) DEFAULT NULL, + `age` int DEFAULT NULL, + PRIMARY KEY (`id`) +); diff --git a/springcache-demo/src/main/java/com/inmind/CacheDemoApplication.java b/springcache-demo/src/main/java/com/inmind/CacheDemoApplication.java new file mode 100644 index 0000000..6e6f82f --- /dev/null +++ b/springcache-demo/src/main/java/com/inmind/CacheDemoApplication.java @@ -0,0 +1,16 @@ +package com.inmind; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cache.annotation.EnableCaching; + +@Slf4j +@SpringBootApplication +@EnableCaching //开启缓存注解功能 +public class CacheDemoApplication { + public static void main(String[] args) { + SpringApplication.run(CacheDemoApplication.class,args); + log.info("项目启动成功..."); + } +} diff --git a/springcache-demo/src/main/java/com/inmind/config/WebMvcConfiguration.java b/springcache-demo/src/main/java/com/inmind/config/WebMvcConfiguration.java new file mode 100644 index 0000000..389dba3 --- /dev/null +++ b/springcache-demo/src/main/java/com/inmind/config/WebMvcConfiguration.java @@ -0,0 +1,53 @@ +package com.inmind.config; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.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; + +@Configuration +@Slf4j +public class WebMvcConfiguration extends WebMvcConfigurationSupport { + + /** + * 生成接口文档配置 + * @return + */ + @Bean + public Docket docket(){ + log.info("准备生成接口文档..."); + + ApiInfo apiInfo = new ApiInfoBuilder() + .title("接口文档") + .version("2.0") + .description("接口文档") + .build(); + + Docket docket = new Docket(DocumentationType.SWAGGER_2) + .apiInfo(apiInfo) + .select() + //指定生成接口需要扫描的包 + .apis(RequestHandlerSelectors.basePackage("com.inmind.controller")) + .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/"); + } +} diff --git a/springcache-demo/src/main/java/com/inmind/controller/UserController.java b/springcache-demo/src/main/java/com/inmind/controller/UserController.java new file mode 100644 index 0000000..500a7e4 --- /dev/null +++ b/springcache-demo/src/main/java/com/inmind/controller/UserController.java @@ -0,0 +1,47 @@ +package com.inmind.controller; + +import com.inmind.entity.User; +import com.inmind.mapper.UserMapper; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.CachePut; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/user") +@Slf4j +public class UserController { + + @Autowired + private UserMapper userMapper; + + @PostMapping + @CachePut(cacheNames = "userCache",key = "#user.id") + public User save(@RequestBody User user){ + userMapper.insert(user); + return user; + } + + @DeleteMapping + @CacheEvict(cacheNames = "userCache",key = "#id")//key的生成:userCache::id(动态) + public void deleteById(Long id){ + userMapper.deleteById(id); + } + + @CacheEvict(cacheNames = "userCache",allEntries = true) + @DeleteMapping("/delAll") + public void deleteAll(){ + userMapper.deleteAll(); + } + + @GetMapping + + @Cacheable(cacheNames = "userCache",key = "#id") + public User getById(Long id){ + User user = userMapper.getById(id); + return user; + } + +} diff --git a/springcache-demo/src/main/java/com/inmind/entity/User.java b/springcache-demo/src/main/java/com/inmind/entity/User.java new file mode 100644 index 0000000..4e433c7 --- /dev/null +++ b/springcache-demo/src/main/java/com/inmind/entity/User.java @@ -0,0 +1,17 @@ +package com.inmind.entity; + +import lombok.Data; +import java.io.Serializable; + +@Data +public class User implements Serializable { + + private static final long serialVersionUID = 1L; + + private Long id; + + private String name; + + private int age; + +} diff --git a/springcache-demo/src/main/java/com/inmind/mapper/UserMapper.java b/springcache-demo/src/main/java/com/inmind/mapper/UserMapper.java new file mode 100644 index 0000000..f3a0ac5 --- /dev/null +++ b/springcache-demo/src/main/java/com/inmind/mapper/UserMapper.java @@ -0,0 +1,21 @@ +package com.inmind.mapper; + +import com.inmind.entity.User; +import org.apache.ibatis.annotations.*; + +@Mapper +public interface UserMapper{ + + @Insert("insert into user(name,age) values (#{name},#{age})") + @Options(useGeneratedKeys = true,keyProperty = "id") + void insert(User user); + + @Delete("delete from user where id = #{id}") + void deleteById(Long id); + + @Delete("delete from user") + void deleteAll(); + + @Select("select * from user where id = #{id}") + User getById(Long id); +} diff --git a/springcache-demo/src/main/resources/application.yml b/springcache-demo/src/main/resources/application.yml new file mode 100644 index 0000000..c07e212 --- /dev/null +++ b/springcache-demo/src/main/resources/application.yml @@ -0,0 +1,21 @@ +server: + port: 8888 +spring: + datasource: + druid: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://localhost:3306/spring_cache_demo?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true + username: root + password: 1234 + redis: + host: localhost + port: 6379 +# password: 123456 + database: 1 +logging: + level: + com: + inmind: + mapper: debug + service: info + controller: info