Browse Source

Merge remote-tracking branch 'origin/yxp' into twoMange

# Conflicts:
#	src/main/java/com/futu/course/user/controller/UserController.java
#	src/main/java/com/futu/course/user/service/UserService.java
#	src/main/java/com/futu/course/user/service/impl/UserServiceImpl.java
yu_u66 2 months ago
parent
commit
7519f43829

+ 52 - 4
pom.xml

@@ -51,7 +51,6 @@
             <version>0.11.5</version>
             <version>0.11.5</version>
             <scope>runtime</scope>
             <scope>runtime</scope>
         </dependency>
         </dependency>
-
         <dependency>
         <dependency>
             <groupId>commons-io</groupId>
             <groupId>commons-io</groupId>
             <artifactId>commons-io</artifactId>
             <artifactId>commons-io</artifactId>
@@ -60,6 +59,7 @@
         <dependency>
         <dependency>
             <groupId>javax.validation</groupId>
             <groupId>javax.validation</groupId>
             <artifactId>validation-api</artifactId>
             <artifactId>validation-api</artifactId>
+            <version>2.0.1.Final</version> <!-- 指定版本 -->
         </dependency>
         </dependency>
         <dependency>
         <dependency>
             <groupId>org.apache.commons</groupId>
             <groupId>org.apache.commons</groupId>
@@ -94,7 +94,6 @@
             <artifactId>hutool-all</artifactId>
             <artifactId>hutool-all</artifactId>
             <version>5.8.16</version>
             <version>5.8.16</version>
         </dependency>
         </dependency>
-
         <dependency>
         <dependency>
             <groupId>com.mysql</groupId>
             <groupId>com.mysql</groupId>
             <artifactId>mysql-connector-j</artifactId>
             <artifactId>mysql-connector-j</artifactId>
@@ -105,12 +104,61 @@
             <artifactId>lombok</artifactId>
             <artifactId>lombok</artifactId>
             <optional>true</optional>
             <optional>true</optional>
         </dependency>
         </dependency>
-
         <dependency>
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-test</artifactId>
             <artifactId>spring-boot-starter-test</artifactId>
             <scope>test</scope>
             <scope>test</scope>
         </dependency>
         </dependency>
+        <!-- es依赖 -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.elasticsearch.client</groupId>
+            <artifactId>elasticsearch-rest-high-level-client</artifactId>
+            <version>7.17.3</version> <!-- 此版本需与 Spring Boot 2.7.6 兼容 -->
+        </dependency>
+        <dependency>
+            <groupId>org.elasticsearch.client</groupId>
+            <artifactId>elasticsearch-rest-client</artifactId>
+            <version>7.17.3</version>
+        </dependency>
+        <dependency>
+            <groupId>org.elasticsearch</groupId>
+            <artifactId>elasticsearch</artifactId>
+            <version>7.17.3</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-data-mongodb</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-autoconfigure</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>io.minio</groupId>
+            <artifactId>minio</artifactId>
+            <version>7.1.0</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-configuration-processor</artifactId>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-actuator</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-data-mongodb</artifactId>
+        </dependency>
     </dependencies>
     </dependencies>
     <dependencyManagement>
     <dependencyManagement>
         <dependencies>
         <dependencies>
@@ -156,4 +204,4 @@
         </plugins>
         </plugins>
     </build>
     </build>
 
 
-</project>
+</project>

+ 208 - 208
src/main/java/com/futu/course/common/config/IntercepterConfig.java

@@ -1,217 +1,217 @@
-package com.futu.course.common.config;
-
-import com.fasterxml.jackson.annotation.JsonInclude;
-import com.fasterxml.jackson.core.JsonGenerator;
-import com.fasterxml.jackson.core.JsonParser;
-import com.fasterxml.jackson.databind.DeserializationFeature;
-import com.fasterxml.jackson.databind.JsonSerializer;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.SerializerProvider;
-
-import com.futu.course.common.handle.CurrentUserHandler;
-import com.futu.course.common.intercepter.AuthIntercepter;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.Primary;
-import org.springframework.data.redis.core.RedisTemplate;
-import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
-import org.springframework.web.filter.HttpPutFormContentFilter;
-import org.springframework.web.method.support.HandlerMethodArgumentResolver;
-import org.springframework.web.servlet.config.annotation.CorsRegistry;
-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 java.io.IOException;
-import java.util.List;
-
-@Configuration
-@Slf4j
-//@EnableWebMvc
-public class IntercepterConfig extends WebMvcConfigurationSupport {
-
-    @Override
-    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
-        log.info("IntercepterConfig--------------------");
-        resolvers.add(new CurrentUserHandler());
-    }
-    @Autowired
-    AuthIntercepter authIntercepter;
-    @Autowired
-    protected RedisTemplate redisTemplate;
-
-    @Override
-    public void addInterceptors(InterceptorRegistry registry) {
-        // 拦截所有请求,通过判断是否有 @LoginRequired 注解 决定是否需要登录
-        registry.addInterceptor(authenticationInterceptor()).excludePathPatterns("**.html").excludePathPatterns("**.txt")
-                .excludePathPatterns("/webjars/**")
-                .excludePathPatterns("/api/goods-detail")
-                .excludePathPatterns("/api/home")
-                .excludePathPatterns("/api/cate")
-                .excludePathPatterns("/api/goods")
-                .excludePathPatterns("/api/boss/home")
-                .excludePathPatterns("/api/boss/team-detail")
-                .excludePathPatterns("/api/boss/home-detail")
-                .excludePathPatterns("/api/boss/supplier")
-                .excludePathPatterns("/api/boss/lottery")
-                .excludePathPatterns("/api/boss/lottery-detail")
-                .excludePathPatterns("/api/team-buy")
-                .excludePathPatterns("/api/cart")
-                .excludePathPatterns("/api/order")
-                .excludePathPatterns("/api/keywords")
-                .excludePathPatterns("/api/share-detail")
-                .excludePathPatterns("/dashboard/list")
-                .excludePathPatterns("/swagger-ui.html")
-                .excludePathPatterns("/swagger-resources/**").excludePathPatterns("/error").addPathPatterns("/**");
-        super.addInterceptors(registry);
-    }
-
-
-    @Override
-    public void addResourceHandlers(ResourceHandlerRegistry registry) {
-        super.addResourceHandlers(registry);
-        registry.addResourceHandler("/**")
-                .addResourceLocations("classpath:/static/")
-                .addResourceLocations("classpath:/templates/")
-                .addResourceLocations("classpath:/resources/");
-//        registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
-//        registry.addResourceHandler("swagger-ui.html")
+//package com.futu.course.common.config;
+//
+//import com.fasterxml.jackson.annotation.JsonInclude;
+//import com.fasterxml.jackson.core.JsonGenerator;
+//import com.fasterxml.jackson.core.JsonParser;
+//import com.fasterxml.jackson.databind.DeserializationFeature;
+//import com.fasterxml.jackson.databind.JsonSerializer;
+//import com.fasterxml.jackson.databind.ObjectMapper;
+//import com.fasterxml.jackson.databind.SerializerProvider;
+//
+//import com.futu.course.common.handle.CurrentUserHandler;
+//import com.futu.course.common.intercepter.AuthIntercepter;
+//import lombok.extern.slf4j.Slf4j;
+//import org.springframework.beans.factory.annotation.Autowired;
+//import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+//import org.springframework.context.annotation.Bean;
+//import org.springframework.context.annotation.Configuration;
+//import org.springframework.context.annotation.Primary;
+//import org.springframework.data.redis.core.RedisTemplate;
+//import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
+//import org.springframework.web.filter.HttpPutFormContentFilter;
+//import org.springframework.web.method.support.HandlerMethodArgumentResolver;
+//import org.springframework.web.servlet.config.annotation.CorsRegistry;
+//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 java.io.IOException;
+//import java.util.List;
+//
+//@Configuration
+//@Slf4j
+////@EnableWebMvc
+//public class IntercepterConfig extends WebMvcConfigurationSupport {
+//
+//    @Override
+//    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
+//        log.info("IntercepterConfig--------------------");
+//        resolvers.add(new CurrentUserHandler());
+//    }
+//    @Autowired
+//    AuthIntercepter authIntercepter;
+//    @Autowired
+//    protected RedisTemplate redisTemplate;
+//
+//    @Override
+//    public void addInterceptors(InterceptorRegistry registry) {
+//        // 拦截所有请求,通过判断是否有 @LoginRequired 注解 决定是否需要登录
+//        registry.addInterceptor(authenticationInterceptor()).excludePathPatterns("**.html").excludePathPatterns("**.txt")
+//                .excludePathPatterns("/webjars/**")
+//                .excludePathPatterns("/api/goods-detail")
+//                .excludePathPatterns("/api/home")
+//                .excludePathPatterns("/api/cate")
+//                .excludePathPatterns("/api/goods")
+//                .excludePathPatterns("/api/boss/home")
+//                .excludePathPatterns("/api/boss/team-detail")
+//                .excludePathPatterns("/api/boss/home-detail")
+//                .excludePathPatterns("/api/boss/supplier")
+//                .excludePathPatterns("/api/boss/lottery")
+//                .excludePathPatterns("/api/boss/lottery-detail")
+//                .excludePathPatterns("/api/team-buy")
+//                .excludePathPatterns("/api/cart")
+//                .excludePathPatterns("/api/order")
+//                .excludePathPatterns("/api/keywords")
+//                .excludePathPatterns("/api/share-detail")
+//                .excludePathPatterns("/dashboard/list")
+//                .excludePathPatterns("/swagger-ui.html")
+//                .excludePathPatterns("/swagger-resources/**").excludePathPatterns("/error").addPathPatterns("/**");
+//        super.addInterceptors(registry);
+//    }
+//
+//
+//    @Override
+//    public void addResourceHandlers(ResourceHandlerRegistry registry) {
+//        super.addResourceHandlers(registry);
+//        registry.addResourceHandler("/**")
+//                .addResourceLocations("classpath:/static/")
+//                .addResourceLocations("classpath:/templates/")
 //                .addResourceLocations("classpath:/resources/");
 //                .addResourceLocations("classpath:/resources/");
-//        registry.addResourceHandler("resources/**.html")
+////        registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
+////        registry.addResourceHandler("swagger-ui.html")
+////                .addResourceLocations("classpath:/resources/");
+////        registry.addResourceHandler("resources/**.html")
+////                .addResourceLocations("classpath:/META-INF/resources/");
+////
+////        registry.addResourceHandler("doc.html")
+////                .addResourceLocations("classpath:resources/");
+////
+////        registry.addResourceHandler("/webjars/**")
+////                .addResourceLocations("classpath:resources/webjars/");
+//        registry.addResourceHandler("swagger-ui.html")
 //                .addResourceLocations("classpath:/META-INF/resources/");
 //                .addResourceLocations("classpath:/META-INF/resources/");
+//        registry.addResourceHandler("/webjars/**")
+//                .addResourceLocations("classpath:/META-INF/resources/webjars/");
+//        registry.addResourceHandler("SFLMPwcUTv.txt")
+//                .addResourceLocations("classpath:/resources/");
 //
 //
-//        registry.addResourceHandler("doc.html")
-//                .addResourceLocations("classpath:resources/");
+//    }
+//    @Override
+//    public void addCorsMappings(CorsRegistry registry) {
+//        super.addCorsMappings(registry);
+//        registry
+//                .addMapping("/**")
+//                .allowedHeaders("*")
+//                .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
+//                .allowedOrigins("*");
+//    }
 //
 //
-//        registry.addResourceHandler("/webjars/**")
-//                .addResourceLocations("classpath:resources/webjars/");
-        registry.addResourceHandler("swagger-ui.html")
-                .addResourceLocations("classpath:/META-INF/resources/");
-        registry.addResourceHandler("/webjars/**")
-                .addResourceLocations("classpath:/META-INF/resources/webjars/");
-        registry.addResourceHandler("SFLMPwcUTv.txt")
-                .addResourceLocations("classpath:/resources/");
-
-    }
-    @Override
-    public void addCorsMappings(CorsRegistry registry) {
-        super.addCorsMappings(registry);
-        registry
-                .addMapping("/**")
-                .allowedHeaders("*")
-                .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
-                .allowedOrigins("*");
-    }
-
-    @Bean
-    public AuthIntercepter authenticationInterceptor() {
-        return new AuthIntercepter(redisTemplate);
-    }
-
 //    @Bean
 //    @Bean
-//    public CurrentUserMethodArgumentResolver currentUserMethodArgumentResolver() {
-//        return new CurrentUserMethodArgumentResolver();
+//    public AuthIntercepter authenticationInterceptor() {
+//        return new AuthIntercepter(redisTemplate);
 //    }
 //    }
-//    @Override
-////    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
-////        argumentResolvers.add(currentUserMethodArgumentResolver());
-////        super.addArgumentResolvers(argumentResolvers);
+//
+////    @Bean
+////    public CurrentUserMethodArgumentResolver currentUserMethodArgumentResolver() {
+////        return new CurrentUserMethodArgumentResolver();
 ////    }
 ////    }
-
-    /**
-     * @Description 解决使用put请求   服务器接收不到参数
-     * @author DengKaiTao
-     * @date 2018/12/4 16:35
-     * @return org.springframework.web.filter.HttpPutFormContentFilter
-     * @version v1.0
-     **/
-    @Bean
-    public HttpPutFormContentFilter httpPutFormContentFilter() {
-        return new HttpPutFormContentFilter();
-    }
-
-//    @Override
-//    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
-//
-////        FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
-////        FastJsonConfig config = new FastJsonConfig();
-////        config.setSerializerFeatures(
-////                //保留map空的字段
-////                SerializerFeature.WriteMapNullValue,
-////                // 将String类型的NULL转化为""
-////                SerializerFeature.WriteNullStringAsEmpty,
-////                // 将Number类型的NULL转化为0
-////                SerializerFeature.WriteNullNumberAsZero,
-////                // 将List类型的NULL转成[]
-////                SerializerFeature.WriteNullListAsEmpty,
-////                // 将Boolean类型的NULL转化为false
-////                SerializerFeature.WriteNullBooleanAsFalse,
-////                SerializerFeature.PrettyFormat,
-////                // 避免循环引用
-////                SerializerFeature.DisableCircularReferenceDetect);
-////
-////        converter.setFastJsonConfig(config);
-////        converter.setDefaultCharset(Charset.forName("UTF-8"));
+////    @Override
+//////    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
+//////        argumentResolvers.add(currentUserMethodArgumentResolver());
+//////        super.addArgumentResolvers(argumentResolvers);
+//////    }
+//
+//    /**
+//     * @Description 解决使用put请求   服务器接收不到参数
+//     * @author DengKaiTao
+//     * @date 2018/12/4 16:35
+//     * @return org.springframework.web.filter.HttpPutFormContentFilter
+//     * @version v1.0
+//     **/
+//    @Bean
+//    public HttpPutFormContentFilter httpPutFormContentFilter() {
+//        return new HttpPutFormContentFilter();
+//    }
+//
+////    @Override
+////    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
 ////
 ////
-////        List<MediaType> mediaTypeList = new ArrayList<>();
-////        // 解决中文乱码问题,相当于在Controller上的@RequestMapping中加了个属性produces = "application/json"
-////        mediaTypeList.add(MediaType.APPLICATION_JSON);
-////        converter.setSupportedMediaTypes(mediaTypeList);
-////        converters.add(converter);
-//        //定义Json转换器
-//        MappingJackson2HttpMessageConverter jackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter();
-//        ObjectMapper objectMapper = new ObjectMapper();
-//        //定义对象模型
-//        SimpleModule simpleModule = new SimpleModule();
-//        //添加对长整型的转换关系
-//        simpleModule.addSerializer(BigInteger.class, ToStringSerializer.instance);
-////        simpleModule.addSerializer(Long.class, ToStringSerializer.instance);
-////        simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance);
-////        simpleModule.addSerializer(Date.class,ToStringSerializer.instance);
-//        //将对象模型添加至对象映射器
-//        objectMapper.registerModule(simpleModule);
-//        jackson2HttpMessageConverter.setObjectMapper(objectMapper);
-//        //在转换器列表中添加自定义的Json转换器
-//        converters.add(jackson2HttpMessageConverter);
-//        //添加utf-8的默认String转换器
-//        converters.add(new StringHttpMessageConverter(Charset.forName("UTF-8")));
+//////        FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
+//////        FastJsonConfig config = new FastJsonConfig();
+//////        config.setSerializerFeatures(
+//////                //保留map空的字段
+//////                SerializerFeature.WriteMapNullValue,
+//////                // 将String类型的NULL转化为""
+//////                SerializerFeature.WriteNullStringAsEmpty,
+//////                // 将Number类型的NULL转化为0
+//////                SerializerFeature.WriteNullNumberAsZero,
+//////                // 将List类型的NULL转成[]
+//////                SerializerFeature.WriteNullListAsEmpty,
+//////                // 将Boolean类型的NULL转化为false
+//////                SerializerFeature.WriteNullBooleanAsFalse,
+//////                SerializerFeature.PrettyFormat,
+//////                // 避免循环引用
+//////                SerializerFeature.DisableCircularReferenceDetect);
+//////
+//////        converter.setFastJsonConfig(config);
+//////        converter.setDefaultCharset(Charset.forName("UTF-8"));
+//////
+//////        List<MediaType> mediaTypeList = new ArrayList<>();
+//////        // 解决中文乱码问题,相当于在Controller上的@RequestMapping中加了个属性produces = "application/json"
+//////        mediaTypeList.add(MediaType.APPLICATION_JSON);
+//////        converter.setSupportedMediaTypes(mediaTypeList);
+//////        converters.add(converter);
+////        //定义Json转换器
+////        MappingJackson2HttpMessageConverter jackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter();
+////        ObjectMapper objectMapper = new ObjectMapper();
+////        //定义对象模型
+////        SimpleModule simpleModule = new SimpleModule();
+////        //添加对长整型的转换关系
+////        simpleModule.addSerializer(BigInteger.class, ToStringSerializer.instance);
+//////        simpleModule.addSerializer(Long.class, ToStringSerializer.instance);
+//////        simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance);
+//////        simpleModule.addSerializer(Date.class,ToStringSerializer.instance);
+////        //将对象模型添加至对象映射器
+////        objectMapper.registerModule(simpleModule);
+////        jackson2HttpMessageConverter.setObjectMapper(objectMapper);
+////        //在转换器列表中添加自定义的Json转换器
+////        converters.add(jackson2HttpMessageConverter);
+////        //添加utf-8的默认String转换器
+////        converters.add(new StringHttpMessageConverter(Charset.forName("UTF-8")));
+////    }
+//
+//    @Bean
+//    @Primary
+//    @ConditionalOnMissingBean(ObjectMapper.class)
+//    public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder)
+//    {
+//        ObjectMapper objectMapper = builder.createXmlMapper(false).build();
+//
+//        // 通过该方法对mapper对象进行设置,所有序列化的对象都将按改规则进行系列化
+//        // Include.Include.ALWAYS 默认
+//        // Include.NON_DEFAULT 属性为默认值不序列化
+//        // Include.NON_EMPTY 属性为 空("") 或者为 NULL 都不序列化,则返回的json是没有这个字段的。这样对移动端会更省流量
+//        // Include.NON_NULL 属性为NULL 不序列化
+//        objectMapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY);
+//        objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+//        // 允许出现特殊字符和转义符
+//        objectMapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_CONTROL_CHARS, true);
+//        // 允许出现单引号
+//        objectMapper.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true);
+//        // 字段保留,将null值转为""
+//        objectMapper.getSerializerProvider().setNullValueSerializer(new JsonSerializer<Object>()
+//        {
+//            @Override
+//            public void serialize(Object o, JsonGenerator jsonGenerator,
+//                                  SerializerProvider serializerProvider)
+//                    throws IOException
+//            {
+//                jsonGenerator.writeString("");
+//            }
+//        });
+//        return objectMapper;
 //    }
 //    }
-
-    @Bean
-    @Primary
-    @ConditionalOnMissingBean(ObjectMapper.class)
-    public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder)
-    {
-        ObjectMapper objectMapper = builder.createXmlMapper(false).build();
-
-        // 通过该方法对mapper对象进行设置,所有序列化的对象都将按改规则进行系列化
-        // Include.Include.ALWAYS 默认
-        // Include.NON_DEFAULT 属性为默认值不序列化
-        // Include.NON_EMPTY 属性为 空("") 或者为 NULL 都不序列化,则返回的json是没有这个字段的。这样对移动端会更省流量
-        // Include.NON_NULL 属性为NULL 不序列化
-        objectMapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY);
-        objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
-        // 允许出现特殊字符和转义符
-        objectMapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_CONTROL_CHARS, true);
-        // 允许出现单引号
-        objectMapper.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true);
-        // 字段保留,将null值转为""
-        objectMapper.getSerializerProvider().setNullValueSerializer(new JsonSerializer<Object>()
-        {
-            @Override
-            public void serialize(Object o, JsonGenerator jsonGenerator,
-                                  SerializerProvider serializerProvider)
-                    throws IOException
-            {
-                jsonGenerator.writeString("");
-            }
-        });
-        return objectMapper;
-    }
-
-
-
-}
+//
+//
+//
+//}

+ 107 - 107
src/main/java/com/futu/course/common/intercepter/AuthIntercepter.java

@@ -1,108 +1,108 @@
-package com.futu.course.common.intercepter;
-
-
-import com.alibaba.fastjson.JSON;
-import com.alibaba.fastjson.JSONObject;
-import com.futu.course.common.annotation.NonLoginRequired;
-import com.futu.course.common.exception.RRException;
-import com.futu.course.common.utils.RedisUtil;
-import com.futu.course.common.utils.StringUtils;
-import com.futu.course.common.utils.TokenUtils;
-
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.data.redis.core.RedisTemplate;
-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;
-import java.lang.reflect.Method;
-
-@Component
-@Slf4j
-public class AuthIntercepter implements HandlerInterceptor {
-
-    @Autowired
-    protected RedisTemplate redisTemplate;
-
-    @Autowired
-    private RedisUtil redisUtil;
-
-    public final static String ACCESSTOKEN = "token";
-
-    public AuthIntercepter() {
-
-    }
-
-    public AuthIntercepter(RedisTemplate redisTemplate) {
-        this.redisTemplate = redisTemplate;
-    }
-
-    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
-            throws Exception {
-        //System.out.println("preHandle");
-        String deviceId = request.getHeader("deviceId");
-        String token = request.getHeader(ACCESSTOKEN);
-//        String time = request.getHeader("time");
-        log.info(request.getRequestURI());
-        //log.info("deviceId={},token={},time={}",deviceId,token,time);
-        try {
-
-            if (!(handler instanceof HandlerMethod)) {
-                return true;
-            }
-
-            HandlerMethod handlerMethod = (HandlerMethod) handler;
-
-            Method method = handlerMethod.getMethod();
-
-            NonLoginRequired loginRequired = method.getAnnotation(NonLoginRequired.class);
-            //有@LoginRequired注解,需要认证
-            if (loginRequired != null) {
-
-                return true;
-            }
-
-            log.info("---interceptertoken");
-            log.info(token);
-            if (StringUtils.isEmpty(deviceId)) {
-
-                //response.getWriter().print("");
-                log.info("*********************》deviceId错误");
-                throw new RRException("deviceId错误", 102);
-                //return false;
-            }
-            if (StringUtils.isEmpty(token)) {
-                log.info("*********************》token为空");
-                throw new RRException("token错误,请重新登录", 101);
-            }
-//            if (StringUtils.isEmpty(time)) {
-//                throw new RRException("时间错误", 103);
+//package com.futu.course.common.intercepter;
+//
+//
+//import com.alibaba.fastjson.JSON;
+//import com.alibaba.fastjson.JSONObject;
+//import com.futu.course.common.annotation.NonLoginRequired;
+//import com.futu.course.common.exception.RRException;
+//import com.futu.course.common.utils.RedisUtil;
+//import com.futu.course.common.utils.StringUtils;
+//import com.futu.course.common.utils.TokenUtils;
+//
+//import lombok.extern.slf4j.Slf4j;
+//import org.springframework.beans.factory.annotation.Autowired;
+//import org.springframework.data.redis.core.RedisTemplate;
+//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;
+//import java.lang.reflect.Method;
+//
+//@Component
+//@Slf4j
+//public class AuthIntercepter implements HandlerInterceptor {
+//
+//    @Autowired
+//    protected RedisTemplate redisTemplate;
+//
+//    @Autowired
+//    private RedisUtil redisUtil;
+//
+//    public final static String ACCESSTOKEN = "token";
+//
+//    public AuthIntercepter() {
+//
+//    }
+//
+//    public AuthIntercepter(RedisTemplate redisTemplate) {
+//        this.redisTemplate = redisTemplate;
+//    }
+//
+//    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
+//            throws Exception {
+//        //System.out.println("preHandle");
+//        String deviceId = request.getHeader("deviceId");
+//        String token = request.getHeader(ACCESSTOKEN);
+////        String time = request.getHeader("time");
+//        log.info(request.getRequestURI());
+//        //log.info("deviceId={},token={},time={}",deviceId,token,time);
+//        try {
+//
+//            if (!(handler instanceof HandlerMethod)) {
+//                return true;
 //            }
 //            }
-
-            log.info("调用token**********************》");
-            log.info(token);
-            log.info("************************************》");
-            Long userId = TokenUtils.getUserId(token);
-            log.info("userId={}",userId);
-            Object obj = redisTemplate.opsForValue().get(Long.toString(userId));
-            if (obj == null) {
-                log.info("************************用户token不存在");
-                throw new RRException("token过期", 101);
-            }
-
-
-
-        } catch (RRException e) {
-            log.info("调用了异常通知" + e.getMessage());
-
-            throw e;
-        }
-
-        return true;
-    }
-
-
-}
+//
+//            HandlerMethod handlerMethod = (HandlerMethod) handler;
+//
+//            Method method = handlerMethod.getMethod();
+//
+//            NonLoginRequired loginRequired = method.getAnnotation(NonLoginRequired.class);
+//            //有@LoginRequired注解,需要认证
+//            if (loginRequired != null) {
+//
+//                return true;
+//            }
+//
+//            log.info("---interceptertoken");
+//            log.info(token);
+//            if (StringUtils.isEmpty(deviceId)) {
+//
+//                //response.getWriter().print("");
+//                log.info("*********************》deviceId错误");
+//                throw new RRException("deviceId错误", 102);
+//                //return false;
+//            }
+//            if (StringUtils.isEmpty(token)) {
+//                log.info("*********************》token为空");
+//                throw new RRException("token错误,请重新登录", 101);
+//            }
+////            if (StringUtils.isEmpty(time)) {
+////                throw new RRException("时间错误", 103);
+////            }
+//
+//            log.info("调用token**********************》");
+//            log.info(token);
+//            log.info("************************************》");
+//            Long userId = TokenUtils.getUserId(token);
+//            log.info("userId={}",userId);
+//            Object obj = redisTemplate.opsForValue().get(Long.toString(userId));
+//            if (obj == null) {
+//                log.info("************************用户token不存在");
+//                throw new RRException("token过期", 101);
+//            }
+//
+//
+//
+//        } catch (RRException e) {
+//            log.info("调用了异常通知" + e.getMessage());
+//
+//            throw e;
+//        }
+//
+//        return true;
+//    }
+//
+//
+//}

+ 1 - 8
src/main/java/com/futu/course/course/service/impl/CourseCategoryServiceImpl.java

@@ -5,15 +5,8 @@ import com.futu.course.course.domain.CourseCategory;
 import com.futu.course.course.service.CourseCategoryService;
 import com.futu.course.course.service.CourseCategoryService;
 import com.futu.course.course.mapper.CourseCategoryMapper;
 import com.futu.course.course.mapper.CourseCategoryMapper;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
-
-/**
-* @author yuu
-* @description 针对表【course_category】的数据库操作Service实现
-* @createDate 2025-05-05 18:45:13
-*/
 @Service
 @Service
-public class CourseCategoryServiceImpl extends ServiceImpl<CourseCategoryMapper, CourseCategory>
-    implements CourseCategoryService{
+public class CourseCategoryServiceImpl extends ServiceImpl<CourseCategoryMapper, CourseCategory> implements CourseCategoryService {
 
 
 }
 }
 
 

+ 8 - 6
src/main/java/com/futu/course/course/service/impl/CourseServiceImpl.java

@@ -4,16 +4,18 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.futu.course.course.domain.Course;
 import com.futu.course.course.domain.Course;
 import com.futu.course.course.service.CourseService;
 import com.futu.course.course.service.CourseService;
 import com.futu.course.course.mapper.CourseMapper;
 import com.futu.course.course.mapper.CourseMapper;
+
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 
 
+
 /**
 /**
-* @author yuu
-* @description 针对表【course(课程表)】的数据库操作Service实现
-* @createDate 2025-05-05 18:45:13
-*/
+ * @author yuu
+ * @description 针对表【course(课程表)】的数据库操作Service实现
+ * @createDate 2025-05-05 18:45:13
+ */
 @Service
 @Service
-public class CourseServiceImpl extends ServiceImpl<CourseMapper, Course>
-    implements CourseService{
+public class CourseServiceImpl extends ServiceImpl<CourseMapper, Course> implements CourseService {
+
 
 
 }
 }
 
 

+ 8 - 0
src/main/java/com/futu/course/es/Service/ESService.java

@@ -0,0 +1,8 @@
+package com.futu.course.es.Service;
+
+import com.futu.course.es.domain.ESCourse;
+import org.springframework.data.mongodb.repository.MongoRepository;
+
+public interface ESService extends MongoRepository<ESCourse,String> {
+
+}

+ 382 - 0
src/main/java/com/futu/course/es/Service/impl/ESCourseService.java

@@ -0,0 +1,382 @@
+package com.futu.course.es.Service.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.futu.course.course.domain.Course;
+import com.futu.course.course.service.impl.CourseServiceImpl;
+import com.futu.course.es.Service.ESService;
+import com.futu.course.es.domain.ESCourse;
+import org.elasticsearch.action.admin.indices.exists.indices.IndicesExistsRequest;
+import org.elasticsearch.action.admin.indices.exists.indices.IndicesExistsResponse;
+import org.elasticsearch.action.bulk.BulkRequest;
+import org.elasticsearch.action.delete.DeleteRequest;
+import org.elasticsearch.action.index.IndexRequest;
+import org.elasticsearch.action.search.SearchRequest;
+import org.elasticsearch.action.search.SearchResponse;
+import org.elasticsearch.action.support.WriteRequest;
+import org.elasticsearch.client.IndicesClient;
+import org.elasticsearch.client.RequestOptions;
+import org.elasticsearch.client.RestHighLevelClient;
+import org.elasticsearch.client.indices.CreateIndexRequest;
+import org.elasticsearch.client.indices.CreateIndexResponse;
+import org.elasticsearch.client.indices.GetIndexRequest;
+import org.elasticsearch.common.bytes.BytesReference;
+import org.elasticsearch.index.query.BoolQueryBuilder;
+import org.elasticsearch.index.query.MatchAllQueryBuilder;
+import org.elasticsearch.index.query.QueryBuilders;
+import org.elasticsearch.index.reindex.DeleteByQueryRequest;
+import org.elasticsearch.search.SearchHit;
+import org.elasticsearch.search.builder.SearchSourceBuilder;
+import org.elasticsearch.xcontent.XContentBuilder;
+import org.elasticsearch.xcontent.XContentFactory;
+import org.elasticsearch.xcontent.XContentType;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.io.IOException;
+import java.math.BigDecimal;
+import java.util.*;
+
+/**
+ * @author "杨旭朋"
+ * @ClassName: ESCourseService
+ * @date 2025年05月06日 15:54
+ */
+@Service
+public class ESCourseService {
+    @Autowired
+    RestHighLevelClient client;
+    @Autowired
+    CourseServiceImpl courseService;
+    @Autowired
+    ESService esService;
+
+    /**
+     * @title: search
+     * @desc: ES搜索指引
+     * @params (String name)
+     * @return: ArrayList<String>
+     * @author: 杨旭朋
+     * @date: 2025/5/6 16:29
+     */
+    public ArrayList<String> search(String name) throws IOException {
+        // 创建搜索请求
+        SearchRequest searchRequest = new SearchRequest("course");
+        // 创建搜索容器
+        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
+        // 创建布尔查询器
+        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery()
+                // 创建条件,在条件中添加 match 查询,使用 ik 分词器
+                .must(QueryBuilders.matchQuery("name", name));
+        // 设置查询的最大条数
+        searchSourceBuilder.size(5);
+        // 将搜索容器添加搜索条件
+        searchSourceBuilder.query(boolQueryBuilder);
+        // 添加数据为搜索容器
+        searchRequest.source(searchSourceBuilder);
+        // 执行请求,并获取响应
+        SearchResponse search = client.search(searchRequest, RequestOptions.DEFAULT);
+        System.out.println(searchRequest);
+        // 返回搜索结果
+        SearchHit[] hits = search.getHits().getHits();
+        ArrayList<String> list = new ArrayList<>();
+        for (SearchHit hit : hits) {
+            Map<String, Object> sourceAsMap = hit.getSourceAsMap();
+            list.add((String) sourceAsMap.get("name"));
+        }
+        return list;
+    }
+
+    /**
+     * @title: MysqlInterES
+     * @desc: 将mysql中的数据与ES进行同步
+     * @params ()
+     * @return: Result
+     * @author: 杨旭朋
+     * @date: 2025/5/6 16:50
+     */
+    @Transactional
+    public void MysqlInterES() throws IOException {
+//        创建索引
+        this.checkAndCreateIndex();
+        // ES删除所有数据
+        DeleteByQueryRequest request = new DeleteByQueryRequest("course");
+        // 使用 MatchAllQuery 匹配所有文档
+        request.setQuery(QueryBuilders.matchAllQuery());
+        client.deleteByQuery(request, RequestOptions.DEFAULT);
+        // 查询数据库中所有的课程
+        List<Course> list = courseService.list();
+        List<ESCourse> esCourses = new ArrayList<>();
+        // 初始化数据
+        for (Course course : list) {
+            ESCourse esCourse = new ESCourse();
+            esCourse.setId(String.valueOf(course.getId()));
+            esCourse.setName(course.getTitle());
+            esCourse.setCategoryId(Long.valueOf(course.getCategoryId()));
+            esCourse.setCoverImg(course.getCoverImg());
+            esCourse.setPrice(course.getPrice());
+            esCourses.add(esCourse);
+        }
+        // 将数据添加到ES中
+        BulkRequest bulkRequest = new BulkRequest("course");
+        for (ESCourse esCourse : esCourses) {
+            String string = JSON.toJSONString(esCourse);
+            IndexRequest indexRequest = new IndexRequest()
+                    .id(esCourse.getId().toString())
+                    .source(string, XContentType.JSON);
+            bulkRequest.add(indexRequest);
+        }
+    }
+
+    /**
+     * @title: CourseList
+     * @desc: 分类查询所有
+     * @params int categoryId
+     * @return: HashSet<ESCourse>
+     * @author: 杨旭朋
+     * @date: 2025/5/7 17:09
+     */
+    public HashSet<ESCourse> CourseList(int categoryId) throws IOException {
+        SearchRequest searchRequest = new SearchRequest("course");
+        // 创建搜索容器
+        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
+        HashSet<ESCourse> esCourses = new HashSet<>();
+        if (categoryId != 0) {
+            BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery()
+                    // 创建条件在条件中添加 term 查询
+                    .must(QueryBuilders.termQuery("category_id", categoryId));
+            // 将搜索容器添加搜索条件
+            searchSourceBuilder.query(boolQueryBuilder);
+            // 添加数据为搜索容器
+            searchRequest.source(searchSourceBuilder);
+            try {
+                // 执行请求,并获取响应
+                SearchResponse search = client.search(searchRequest, RequestOptions.DEFAULT);
+                System.out.println(searchRequest);
+                SearchHit[] hits = search.getHits().getHits();
+                for (SearchHit hit : hits) {
+                    ESCourse esCourse = new ESCourse();
+                    Map<String, Object> sourceAsMap = hit.getSourceAsMap();
+
+                    // 处理可能的类型转换问题
+                    Object idObj = sourceAsMap.get("id");
+                    if (idObj instanceof Integer) {
+                        esCourse.setId(String.valueOf(((Integer) idObj).longValue()));
+                    } else if (idObj instanceof Long) {
+                        esCourse.setId(String.valueOf((Long) idObj));
+                    }
+
+                    esCourse.setName((String) sourceAsMap.get("name"));
+
+                    Object priceObj = sourceAsMap.get("price");
+                    if (priceObj instanceof Number) {
+                        esCourse.setPrice(BigDecimal.valueOf(((Number) priceObj).doubleValue()));
+                    }
+
+                    Object categoryIdObj = sourceAsMap.get("category_id");
+                    if (categoryIdObj instanceof Integer) {
+                        esCourse.setCategoryId(((Integer) categoryIdObj).longValue());
+                    } else if (categoryIdObj instanceof Long) {
+                        esCourse.setCategoryId((Long) categoryIdObj);
+                    }
+
+                    esCourse.setCoverImg((String) sourceAsMap.get("cover_img"));
+                    esCourses.add(esCourse);
+                }
+            } catch (IOException e) {
+                System.err.println("执行搜索请求时出现异常: ");
+                e.printStackTrace();
+            }
+        } else {
+            // 创建 MatchAllQueryBuilder 并设置 boost 值
+            MatchAllQueryBuilder matchAllQuery = QueryBuilders.matchAllQuery();
+            matchAllQuery.boost(1.0f);
+            searchSourceBuilder.query(matchAllQuery);
+            // 将 SearchSourceBuilder 设置到 SearchRequest 中
+            searchRequest.source(searchSourceBuilder);
+            // 执行搜索请求
+            SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
+            SearchHit[] hits = searchResponse.getHits().getHits();
+            for (SearchHit hit : hits) {
+                ESCourse esCourse = new ESCourse();
+                Map<String, Object> sourceAsMap = hit.getSourceAsMap();
+
+                // 处理可能的类型转换问题
+                Object idObj = sourceAsMap.get("id");
+                if (idObj instanceof Integer) {
+                    esCourse.setId(String.valueOf(((Integer) idObj).longValue()));
+                } else if (idObj instanceof Long) {
+                    esCourse.setId(String.valueOf((Long) idObj));
+                }
+
+                esCourse.setName((String) sourceAsMap.get("name"));
+
+                Object priceObj = sourceAsMap.get("price");
+                if (priceObj instanceof Number) {
+                    esCourse.setPrice(BigDecimal.valueOf(((Number) priceObj).doubleValue()));
+                }
+
+                Object categoryIdObj = sourceAsMap.get("category_id");
+                if (categoryIdObj instanceof Integer) {
+                    esCourse.setCategoryId(((Integer) categoryIdObj).longValue());
+                } else if (categoryIdObj instanceof Long) {
+                    esCourse.setCategoryId((Long) categoryIdObj);
+                }
+
+                esCourse.setCoverImg((String) sourceAsMap.get("cover_img"));
+                esCourses.add(esCourse);
+            }
+            // 处理搜索结果
+        }
+        return esCourses;
+    }
+    /**
+     * @title: SelCourse
+     * @desc:  搜索并将搜索记录写入到MongoDB中
+     * @params ()
+     * @return: Result
+     * @author: 杨旭朋
+     * @date: 2025/5/8 8:35
+     */
+    public HashSet<ESCourse> SelCourse(String name) throws IOException {
+        // 创建搜索请求
+        SearchRequest searchRequest = new SearchRequest("course");
+        // 创建搜索容器
+        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
+        // 创建布尔查询器
+        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery()
+                // 创建条件,在条件中添加 match 查询,使用 ik 分词器
+                .must(QueryBuilders.matchQuery("name", name));
+        // 将搜索容器添加搜索条件
+        searchSourceBuilder.query(boolQueryBuilder);
+        // 添加数据为搜索容器
+        searchRequest.source(searchSourceBuilder);
+        // 执行请求,并获取响应
+        SearchResponse search = client.search(searchRequest, RequestOptions.DEFAULT);
+        System.out.println(searchRequest);
+        // 返回搜索结果
+        SearchHit[] hits = search.getHits().getHits();
+        HashSet<ESCourse> esCourses = new HashSet<>();
+        for (SearchHit hit : hits) {
+            ESCourse esCourse = new ESCourse();
+            Map<String, Object> sourceAsMap = hit.getSourceAsMap();
+
+            // 处理可能的类型转换问题
+            Object idObj = sourceAsMap.get("id");
+            if (idObj instanceof Integer) {
+                esCourse.setId(String.valueOf(((Integer) idObj).longValue()));
+            } else if (idObj instanceof Long) {
+                esCourse.setId(String.valueOf((Long) idObj));
+            }
+
+            esCourse.setName((String) sourceAsMap.get("name"));
+
+            Object priceObj = sourceAsMap.get("price");
+            if (priceObj instanceof Number) {
+                esCourse.setPrice(BigDecimal.valueOf(((Number) priceObj).doubleValue()));
+            }
+
+            Object categoryIdObj = sourceAsMap.get("category_id");
+            if (categoryIdObj instanceof Integer) {
+                esCourse.setCategoryId(((Integer) categoryIdObj).longValue());
+            } else if (categoryIdObj instanceof Long) {
+                esCourse.setCategoryId((Long) categoryIdObj);
+            }
+
+            esCourse.setCoverImg((String) sourceAsMap.get("cover_img"));
+            esCourses.add(esCourse);
+        }
+        this.SaveMongoDB(name);
+        return esCourses;
+    }
+    /**
+     * @title: SaveMongoDB
+     * @desc:  保存聊天记录到MongoDB中
+     * @params String name
+     * @return: void
+     * @author: 杨旭朋
+     * @date: 2025/5/8 9:14
+     */
+    public void SaveMongoDB(String name){
+        List<ESCourse> all = esService.findAll();
+        int i = 0;
+        for (ESCourse esCourse : all) {
+            if (esCourse.getName().equals(name)){
+                ESCourse byId = esService.findById(esCourse.getId().toString()).get();
+                byId.setCreateTime(new Date());
+                esService.save(byId);
+                i++;
+            }
+        }
+        if (i == 0){
+            ESCourse esCourse = new ESCourse();
+            String string = UUID.randomUUID().toString();
+            esCourse.setId(string);
+            esCourse.setName(name);
+            esCourse.setCreateTime(new Date());
+            esCourse.setUid(1L);
+            esService.save(esCourse);
+        }
+    }
+    /**
+     * @title: checkAndCreateIndex
+     * @desc:  数据初始化
+     * @params ()
+     * @return: Result
+     * @author: 杨旭朋
+     * @date: 2025/5/8 15:25
+     */
+    public boolean checkAndCreateIndex() throws IOException {
+        IndicesClient indicesClient = client.indices();
+        // 检查索引是否存在
+        GetIndexRequest getIndexRequest = new GetIndexRequest("course");
+        boolean exists = indicesClient.exists(getIndexRequest, RequestOptions.DEFAULT);
+
+        if (!exists) {
+            // 索引不存在,创建索引
+            CreateIndexRequest createRequest = new CreateIndexRequest("course");
+            // 设置索引映射
+            XContentBuilder mappingBuilder = XContentFactory.jsonBuilder();
+            mappingBuilder.startObject()
+                    .startObject("properties")
+                    .startObject("id")
+                    .field("type", "long")
+                    .endObject()
+                    .startObject("name")
+                    .field("type", "text")
+                    .field("analyzer", "ik_max_word")
+                    .endObject()
+                    .startObject("uid")
+                    .field("type", "long")
+                    .endObject()
+                    .startObject("create_time")
+                    .field("type", "date")
+                    .field("format", "yyyy-MM-dd HH:mm:ss")
+                    .endObject()
+                    .startObject("price")
+                    .field("type", "float")
+                    .endObject()
+                    .startObject("category_id")
+                    .field("type", "long")
+                    .endObject()
+                    .startObject("cover_img")
+                    .field("type", "keyword")
+                    .endObject()
+                    .endObject()
+                    .endObject();
+            createRequest.mapping(mappingBuilder);
+
+            CreateIndexResponse createResponse = indicesClient.create(createRequest, RequestOptions.DEFAULT);
+            if (createResponse.isAcknowledged()) {
+                System.out.println("索引course创建成功");
+                return true;
+            } else {
+                System.out.println("索引course创建失败");
+                return false;
+            }
+        }
+        System.out.println("索引course已存在");
+        return true;
+    }
+
+}

+ 42 - 0
src/main/java/com/futu/course/es/controller/ESCourseController.java

@@ -0,0 +1,42 @@
+package com.futu.course.es.controller;
+
+import com.futu.course.es.Service.impl.ESCourseService;
+import com.futu.course.es.domain.ESCourse;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashSet;
+
+/**
+ * @author "杨旭朋"
+ * @ClassName: ESCourseController
+ * @date 2025年05月06日 15:54
+ */
+@RestController
+@RequestMapping("/EsCourse")
+public class ESCourseController {
+    @Autowired
+    ESCourseService esCourseService;
+    @PostMapping("/search")
+    public ArrayList<String> search(@RequestParam("name") String name) throws IOException {
+      return esCourseService.search(name);
+    }
+    @GetMapping("/MysqlInterES")
+    public void MysqlInterES() throws IOException {
+        esCourseService.MysqlInterES();
+    }
+    @PostMapping("/CourseList")
+    public HashSet<ESCourse> CourseList(@RequestParam("categoryId") int categoryId) throws IOException {
+        return esCourseService.CourseList(categoryId);
+    }
+    @PostMapping("/SelCourse")
+    public HashSet<ESCourse> SelCourse(@RequestParam("name") String name) throws IOException {
+        return esCourseService.SelCourse(name);
+    }
+    @GetMapping("checkAndCreateIndex")
+    public boolean checkAndCreateIndex() throws IOException {
+        return esCourseService.checkAndCreateIndex();
+    }
+}

+ 42 - 0
src/main/java/com/futu/course/es/domain/ESCourse.java

@@ -0,0 +1,42 @@
+package com.futu.course.es.domain;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.springframework.data.annotation.Id;
+
+import org.springframework.data.elasticsearch.annotations.Field;
+import org.springframework.data.elasticsearch.annotations.FieldType;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.springframework.data.mongodb.core.mapping.Document;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+@Data
+// 对 ES 中的 course 进行映射
+@Document("course")
+@NoArgsConstructor
+@AllArgsConstructor
+public class ESCourse {
+    // 用于 Elasticsearch 的主键注解
+    @Id
+    @Field(type = FieldType.Long)
+    private String id;
+
+    @Field(name = "name", type = FieldType.Text, analyzer = "ik_max_word")
+    private String name;
+
+    @Field(name = "uid", type = FieldType.Long)
+    private Long uid;
+    @Field(name = "price")
+    private BigDecimal price;
+    @Field(name = "category_id")
+    private Long categoryId;
+    @Field(name = "cover_img")
+    private String coverImg;
+
+    @Field(name = "create_time", type = FieldType.Date, format = {}, pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date createTime;
+}    

+ 24 - 0
src/main/java/com/futu/course/minio/config/MinioConfig.java

@@ -0,0 +1,24 @@
+package com.futu.course.minio.config;
+
+import io.minio.MinioClient;
+import lombok.Data;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+
+@Data
+@EnableConfigurationProperties({MinioConfigProperties.class})
+public class MinioConfig {
+
+    @Autowired
+    private MinioConfigProperties minioConfigProperties;
+
+    @Bean
+    public MinioClient minioClient(){
+        return  MinioClient.builder()
+                .endpoint(minioConfigProperties.getEndpoint())
+                .credentials(minioConfigProperties.getAccesskey(), minioConfigProperties.getSecretKey())
+                .build();
+    }
+
+}

+ 21 - 0
src/main/java/com/futu/course/minio/config/MinioConfigProperties.java

@@ -0,0 +1,21 @@
+package com.futu.course.minio.config;
+
+import io.minio.MinioClient;
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+
+@Data
+@ConfigurationProperties(prefix = "minio")
+public class MinioConfigProperties {
+    //服务器地址
+    /**
+     * minio.endpoint
+     */
+    private String endpoint;
+    private String accesskey;
+    private String secretKey;
+    private String bucketName;
+
+
+
+}

+ 19 - 0
src/main/java/com/futu/course/minio/service/FileService.java

@@ -0,0 +1,19 @@
+package com.futu.course.minio.service;
+
+import io.minio.errors.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.security.InvalidKeyException;
+import java.security.NoSuchAlgorithmException;
+
+public interface FileService {
+    //上传
+    public String uploadHtml(MultipartFile multipartFile);
+    public String uploadImage(MultipartFile multipartFile) throws IOException, ServerException, InvalidBucketNameException, InsufficientDataException, ErrorResponseException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException;
+
+
+
+
+}

+ 113 - 0
src/main/java/com/futu/course/minio/service/impl/FileServiceImpl.java

@@ -0,0 +1,113 @@
+package com.futu.course.minio.service.impl;
+
+import com.futu.course.minio.config.MinioConfig;
+import com.futu.course.minio.config.MinioConfigProperties;
+import io.minio.MinioClient;
+import io.minio.ObjectWriteResponse;
+import io.minio.PutObjectArgs;
+import io.minio.errors.*;
+import lombok.SneakyThrows;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.context.annotation.Import;
+import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.security.InvalidKeyException;
+import java.security.NoSuchAlgorithmException;
+import java.util.UUID;
+
+@Service
+@Import(MinioConfig.class)
+@EnableConfigurationProperties(MinioConfigProperties.class)
+public class FileServiceImpl {
+
+    @Autowired
+    private MinioClient minioClient;
+
+    @Autowired
+    private MinioConfigProperties minioConfigProperties;
+
+
+    @SneakyThrows
+    public String uploadHtml(MultipartFile multipartFile) {
+        InputStream inputStream = multipartFile.getInputStream();
+        if (multipartFile.getSize()<=0 || multipartFile==null){
+            return "文件为空";
+        }
+        String originalFilename = multipartFile.getOriginalFilename();
+        String filename = UUID.randomUUID().toString().replace("-", "") +originalFilename;
+
+        PutObjectArgs putObjectArgs = PutObjectArgs.builder()
+                .bucket(minioConfigProperties.getBucketName())
+                .contentType("text/html")
+                .object(filename)
+                .stream(inputStream, inputStream.available(), -1)
+                .build();
+        ObjectWriteResponse response = minioClient.putObject(putObjectArgs);
+        //获取地址
+        String path = minioClient.getObjectUrl(putObjectArgs.bucket(), putObjectArgs.object());
+
+        return path;
+    }
+    @SneakyThrows
+    public String uploadHtml(String fileName, InputStream inputStream){
+        PutObjectArgs putObjectArgs = PutObjectArgs.builder()
+                .bucket(minioConfigProperties.getBucketName())
+                .contentType("text/html")
+                .object(fileName)
+                .stream(inputStream, inputStream.available(), -1)
+                .build();
+
+        ObjectWriteResponse response = minioClient.putObject(putObjectArgs);
+
+        //获取地址
+        String path = minioClient.getObjectUrl(putObjectArgs.bucket(), putObjectArgs.object());
+
+        return path;
+    }
+
+    public String uploadImage(MultipartFile multipartFile) throws IOException, ServerException, InvalidBucketNameException, InsufficientDataException, ErrorResponseException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException, IOException, ServerException, InvalidBucketNameException, InsufficientDataException, ErrorResponseException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException {
+        InputStream inputStream = multipartFile.getInputStream();
+
+        if (multipartFile.getSize()<=0 || multipartFile==null){
+            return "文件为空";
+        }
+//        获取原始文件名
+        String originalFilename = multipartFile.getOriginalFilename();
+//        重新生成文件名
+        String filename = UUID.randomUUID().toString().replace("-", "") +originalFilename;
+
+        PutObjectArgs putObjectArgs=PutObjectArgs.builder()
+                .contentType("image/jpg").bucket(minioConfigProperties.getBucketName()).object(filename)
+                .stream(inputStream,inputStream.available(),-1)
+                .build();
+
+        ObjectWriteResponse response = minioClient.putObject(putObjectArgs);
+
+        //获取地址
+        String path = minioClient.getObjectUrl(putObjectArgs.bucket(), putObjectArgs.object());
+
+        return path;
+    }
+    public String uploadImage(String fileName, InputStream inputStream) throws IOException, ServerException, InvalidBucketNameException, InsufficientDataException, ErrorResponseException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException {
+        PutObjectArgs putObjectArgs = PutObjectArgs.builder()
+                .contentType("image/jpg").bucket(minioConfigProperties.getBucketName()).object(fileName)
+                .stream(inputStream, inputStream.available(), -1)
+                .build();
+
+        ObjectWriteResponse response = minioClient.putObject(putObjectArgs);
+
+
+        //获取地址
+        String path = minioClient.getObjectUrl(putObjectArgs.bucket(), putObjectArgs.object());
+
+        return path;
+    }
+
+
+
+
+}

+ 29 - 0
src/main/java/com/futu/course/user/controller/UserController.java

@@ -1,5 +1,6 @@
 package com.futu.course.user.controller;
 package com.futu.course.user.controller;
 
 
+<<<<<<< HEAD
 import com.futu.course.common.annotation.NonLoginRequired;
 import com.futu.course.common.annotation.NonLoginRequired;
 import com.futu.course.common.entity.R;
 import com.futu.course.common.entity.R;
 import com.futu.course.user.dto.UserDTO;
 import com.futu.course.user.dto.UserDTO;
@@ -41,4 +42,32 @@ public class UserController {
 
 
 
 
 
 
+=======
+import com.futu.course.user.service.impl.UserServiceImpl;
+import io.minio.errors.*;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
+import java.security.InvalidKeyException;
+import java.security.NoSuchAlgorithmException;
+
+/**
+ * @author "杨旭朋"
+ * @ClassName: UserController
+ * @date 2025年05月07日 14:24
+ */
+@RestController
+@RequestMapping("user")
+public class UserController {
+    @Autowired
+    private UserServiceImpl userService;
+    @PostMapping("unload")
+    public String unload(MultipartFile multipartFile,Long uid) throws ServerException, InvalidBucketNameException, InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException {
+        return userService.unload(multipartFile,uid);
+    }
+>>>>>>> origin/yxp
 }
 }

+ 1 - 12
src/main/java/com/futu/course/user/service/UserService.java

@@ -1,24 +1,13 @@
 package com.futu.course.user.service;
 package com.futu.course.user.service;
 
 
-import com.futu.course.common.entity.R;
 import com.futu.course.user.domain.User;
 import com.futu.course.user.domain.User;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.baomidou.mybatisplus.extension.service.IService;
-import com.futu.course.user.dto.UserDTO;
-import com.futu.course.user.dto.UserLoginDto;
-import com.futu.course.user.dto.UserRegisterDto;
 
 
 /**
 /**
 * @author yuu
 * @author yuu
 * @description 针对表【user(用户表)】的数据库操作Service
 * @description 针对表【user(用户表)】的数据库操作Service
-* @createDate 2025-05-07 08:26:30
+* @createDate 2025-05-05 18:52:53
 */
 */
 public interface UserService extends IService<User> {
 public interface UserService extends IService<User> {
 
 
-    R appLogin(UserDTO dto);
-
-    R logout(UserDTO dto);
-
-    R login(UserLoginDto dto) throws InterruptedException;
-
-
 }
 }

+ 2 - 218
src/main/java/com/futu/course/user/service/impl/UserServiceImpl.java

@@ -1,237 +1,21 @@
 package com.futu.course.user.service.impl;
 package com.futu.course.user.service.impl;
 
 
-import com.alibaba.fastjson.JSON;
-import com.alibaba.fastjson.JSONObject;
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.futu.course.common.entity.R;
-import com.futu.course.common.utils.SnowflakeIdWorker;
-import com.futu.course.common.utils.TokenUtils;
 import com.futu.course.user.domain.User;
 import com.futu.course.user.domain.User;
-import com.futu.course.user.dto.LoginDTO;
-import com.futu.course.user.dto.UserDTO;
-import com.futu.course.user.dto.UserLoginDto;
-import com.futu.course.user.dto.UserRegisterDto;
 import com.futu.course.user.service.UserService;
 import com.futu.course.user.service.UserService;
 import com.futu.course.user.mapper.UserMapper;
 import com.futu.course.user.mapper.UserMapper;
-import io.jsonwebtoken.Jwts;
-import io.jsonwebtoken.SignatureAlgorithm;
-import io.jsonwebtoken.security.Keys;
-import io.lettuce.core.RedisClient;
-import org.apache.commons.codec.binary.Base64;
-import org.apache.http.HttpEntity;
-import org.apache.http.HttpResponse;
-import org.apache.http.client.ClientProtocolException;
-import org.apache.http.client.HttpClient;
-import org.apache.http.client.methods.HttpGet;
-import org.apache.http.impl.client.HttpClients;
-import org.apache.http.util.EntityUtils;
-import org.redisson.api.RLock;
-import org.redisson.api.RedissonClient;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.data.redis.core.RedisTemplate;
-import org.springframework.data.redis.core.StringRedisTemplate;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
-import org.springframework.util.DigestUtils;
-
-import javax.annotation.Resource;
-import javax.crypto.Cipher;
-import javax.crypto.SecretKey;
-import javax.crypto.spec.IvParameterSpec;
-import javax.crypto.spec.SecretKeySpec;
-import java.io.IOException;
-import java.nio.charset.StandardCharsets;
-import java.util.List;
-import java.util.concurrent.TimeUnit;
 
 
 /**
 /**
 * @author yuu
 * @author yuu
 * @description 针对表【user(用户表)】的数据库操作Service实现
 * @description 针对表【user(用户表)】的数据库操作Service实现
-* @createDate 2025-05-07 08:26:30
+* @createDate 2025-05-05 18:52:53
 */
 */
 @Service
 @Service
 public class UserServiceImpl extends ServiceImpl<UserMapper, User>
 public class UserServiceImpl extends ServiceImpl<UserMapper, User>
     implements UserService{
     implements UserService{
-    @Autowired
-    private UserMapper userMapper;
-
-    @Autowired
-    private RedisTemplate redisTemplate;
-    @Autowired
-    private RedissonClient redissonClient;
-
-    // 填写上你的AppID,如何获取AppID自行百度,这步骤很简单
-    private final static String APP_ID = "wxdbcbc020c8e4b0d9";
-    // 填写上你的AppSecret,如何获取AppSecret自行百度,这步骤很简单
-    private final static String APP_SECRET = "60efa9e4ff7fae35c7f561de7763da7a";
-    // 微信小程序登录校验请求地址
-    private final static String LOGIN_URL = "https://api.weixin.qq.com/sns/jscode2session";
-    @Override
-    public R appLogin(UserDTO dto) {
-
-        SnowflakeIdWorker worker=new SnowflakeIdWorker(1,1);
-        System.out.println(dto);
-        String url = LOGIN_URL + "?appid=" + APP_ID + "&secret="+ APP_SECRET + "&grant_type=authorization_code&js_code=" + dto.getCode();
-        HttpClient client = HttpClients.createDefault(); // 创建默认http连接
-        HttpGet getRequest = new HttpGet(url);// 创建一个post请求
-        LoginDTO loginDTO = new LoginDTO();
-        try {
-            // 用http连接去执行get请求并且获得http响应
-            HttpResponse response = client.execute(getRequest);
-            // 从response中取到响实体
-            HttpEntity entity = response.getEntity();
-            // 把响应实体转成文本
-            String html = EntityUtils.toString(entity);
-            loginDTO = JSON.parseObject(html, LoginDTO.class);
-            if(null == loginDTO.getErrCode()) {
-                dto.setWxId(loginDTO.getOpenid());
-            } else {
-                return R.restResult(loginDTO,loginDTO.getErrCode(),loginDTO.getErrMsg());
-            }
-            List<User> users = userMapper.selectList(new LambdaQueryWrapper<User>().eq(User::getOpenId, dto.getWxId()));
-            if(users.size() > 0) {
-                User user = users.get(0);
-                // 生成一个 256 位(32 字节)的安全密钥
-                SecretKey key = Keys.secretKeyFor(SignatureAlgorithm.HS256);
-                // 使用密钥生成 JWT
-                String jws = Jwts.builder()
-                        .setSubject(user.getId().toString())
-                        .signWith(key)
-                        .compact();
-                user.setToken(jws);
-                redisTemplate.opsForValue().set("user",user,1, TimeUnit.DAYS);
-                return R.ok(user);
-            }
-              else {
-                User user = new User();
-                String sessionKey = loginDTO.getSession_key();
-
-                String encryptedData = dto.getEncryptedData();
-
-                String iv = dto.getIv();
-
-                String decryptedData1 = decryptData(encryptedData, sessionKey, iv);
-                System.out.println("解密后的数据:" + decryptedData1);
-                String decryptedData = decryptData(encryptedData, sessionKey, iv);
-                JSONObject jsonObject = JSON.parseObject(decryptedData);
-
-                String unionId = jsonObject.getString("unionId"); // 提取 unionId
-
-                user.setOpenId(loginDTO.getOpenid());
-                user.setSessionKey(loginDTO.getSession_key());
-                user.setUnionId(dto.getWxId());
-                user.setAvatar(dto.getWxHeadPic());
-                    user.setUsername(dto.getWxUsername());
-                   user.setNickname(dto.getWxUsername());
-                    user.setId(worker.nextId());
-                    user.setPassword(null);
-                // 生成一个 256 位(32 字节)的安全密钥
-                SecretKey key = Keys.secretKeyFor(SignatureAlgorithm.HS256);
-                // 使用密钥生成 JWT
-                String jws = Jwts.builder()
-                        .setSubject(user.getId().toString())
-                        .signWith(key)
-                        .compact();
-                user.setToken(jws);
-                    userMapper.insert(user);
-                redisTemplate.opsForValue().set("user",user,1, TimeUnit.DAYS);
-                    return R.ok(user);
-                }
-            } catch (ClientProtocolException e) {
-            throw new RuntimeException(e);
-        } catch (Exception e) {
-            throw new RuntimeException(e);
-        }
-
-    }
-
-    @Override
-    public R logout(UserDTO dto) {
-        if (redisTemplate.opsForValue().get("user") != null)
-        {
-            redisTemplate.delete("user");
-        }
-        return R.ok("登出成功");
-    }
-
-    @Override
-    public R login(UserLoginDto dto) throws InterruptedException {
-        RLock lock = redissonClient.getLock(dto.getMobile());
-        boolean b = lock.tryLock(3, TimeUnit.SECONDS);
-        if (!b)
-        {
-          return R.failed("请勿重复提交");
-        }
-         try {
-             User user = userMapper.selectOne(new LambdaQueryWrapper<User>().eq(User::getMobile, dto.getMobile()));
-             if (user == null)
-             {
-                 return R.restResult(null,500,"用户不存在");
-             }
-             String salt = user.getSalt();
-             String password = dto.getPassword();
-             String hex = DigestUtils.md5DigestAsHex((salt + password).getBytes());
-             if (hex.equals(user.getPassword()))
-             {
-                 // 生成一个 256 位(32 字节)的安全密钥
-                 SecretKey key = Keys.secretKeyFor(SignatureAlgorithm.HS256);
-                 // 使用密钥生成 JWT
-                 String jws = Jwts.builder()
-                         .setSubject(user.getId().toString())
-                         .signWith(key)
-                         .compact();
-                 user.setToken(jws);
-                 redisTemplate.opsForValue().set("user",user,1, TimeUnit.DAYS);
-                 return R.ok(user);
-             }
-
-         }catch (Exception e)
-         {
-             e.printStackTrace();
-             throw e;
-         }finally {
-            if (lock.isLocked()&&lock.isHeldByCurrentThread())
-            {
-                lock.unlock();
-            }
-         }
-        return null;
-    }
-
-//    @Override
-//    public R register(UserRegisterDto dto) {
-//        SnowflakeIdWorker worker=new SnowflakeIdWorker(1,1);
-//        if (redisTemplate.opsForValue().get("user") != null)
-//        {
-//            return R.failed("用户已存在");
-//        }
-//        try {
-//            User user = new User();
-//            user.setId(worker.nextId());
-//        }
-//
-//        return null;
-//    }
-
-
-    public static String decryptData(String encryptedData, String sessionKey, String iv) throws Exception {
-        // Base64 解码
-        byte[] encryptedDataBytes = Base64.decodeBase64(encryptedData);
-        byte[] sessionKeyBytes = Base64.decodeBase64(sessionKey);
-        byte[] ivBytes = Base64.decodeBase64(iv);
-
-        // 初始化 AES 解密器
-        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
-        SecretKeySpec keySpec = new SecretKeySpec(sessionKeyBytes, "AES");
-        IvParameterSpec ivSpec = new IvParameterSpec(ivBytes);
-        cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);
-
-        // 执行解密
-        byte[] decryptedBytes = cipher.doFinal(encryptedDataBytes);
-        return new String(decryptedBytes, StandardCharsets.UTF_8);
-    }
 
 
-    }
+}
 
 
 
 
 
 

+ 2 - 0
src/main/resources/META-INF/spring.factories

@@ -0,0 +1,2 @@
+org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
+  com.futu.course.minio.service.impl.FileServiceImpl

+ 12 - 1
src/main/resources/application.yml

@@ -1,14 +1,25 @@
 server:
 server:
   port: 8003
   port: 8003
 spring:
 spring:
+  data:
+    mongodb:
+      # 在数据库名后添加参数,这里以添加最大连接池大小和最小连接池大小为例
+      uri: mongodb://localhost:27017/course?maxPoolSize=100&minPoolSize=10
   datasource:
   datasource:
     driver-class-name: com.mysql.cj.jdbc.Driver
     driver-class-name: com.mysql.cj.jdbc.Driver
     url: jdbc:mysql://182.92.251.243:3306/goose?characterEncoding=utf8&serverTimezone=GMT%2B8
     url: jdbc:mysql://182.92.251.243:3306/goose?characterEncoding=utf8&serverTimezone=GMT%2B8
     username: root
     username: root
     password: 01241314Yxp!
     password: 01241314Yxp!
-
   redis:
   redis:
     host: localhost
     host: localhost
     database: 0
     database: 0
     port: 6379
     port: 6379
     password:
     password:
+  elasticsearch:
+    rest:
+      uris: http://localhost:9200
+minio:
+  endpoint: http://182.92.251.243:9000
+  accesskey: "minioadmin"
+  secretKey: "minioadmin"
+  bucketName: "images"

+ 6 - 0
接口文档.txt

@@ -0,0 +1,6 @@
+      方法               参数              返回                 作用           请求         请求路径
+   search             String name    ArrayList<String>       搜索指引         post     /EsCourse/search
+   MysqlInterES          无                无              同步mysql中的数据   get      /EsCourse/MysqlInterES
+   CourseList         int categoryId  HashSet<ESCourse>    课程分类查询所有    Post     /EsCourse/CourseList
+   SelCourse          String name     HashSet<ESCourse>     课程的搜索        Post     /EsCourse/SelCourse
+   checkAndCreateIndex  无              boolean           ES索引结构初始化     Get      /EsCourse/checkAndCreateIndex