فهرست منبع

第二次更新
(
"分类查询所有",Mysql数据同步到ES,minio用户更新头像

)

杨旭朋 2 هفته پیش
والد
کامیت
a8875d2b30

+ 26 - 0
pom.xml

@@ -120,6 +120,32 @@
             <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-web</artifactId>
+        </dependency>
     </dependencies>
     <dependencyManagement>
         <dependencies>

+ 18 - 7
src/main/java/com/futu/course/course/service/impl/CourseCategoryServiceImpl.java

@@ -6,15 +6,26 @@ import com.futu.course.course.service.CourseCategoryService;
 import com.futu.course.course.mapper.CourseCategoryMapper;
 import org.springframework.stereotype.Service;
 
+import java.util.List;
+
 /**
-* @author yuu
-* @description 针对表【course_category】的数据库操作Service实现
-* @createDate 2025-05-05 18:45:13
-*/
+ * @author yuu
+ * @description 针对表【course_category】的数据库操作Service实现
+ * @createDate 2025-05-05 18:45:13
+ */
 @Service
-public class CourseCategoryServiceImpl extends ServiceImpl<CourseCategoryMapper, CourseCategory>
-    implements CourseCategoryService{
-
+public class CourseCategoryServiceImpl extends ServiceImpl<CourseCategoryMapper, CourseCategory> implements CourseCategoryService {
+    /**
+     * @title: CourseCategoryList
+     * @desc: 查看所有的分类
+     * @params ()
+     * @return: List<CourseCategory>
+     * @author: 杨旭朋
+     * @date: 2025/5/6 18:42
+     */
+    public List<CourseCategory> CourseCategoryList() {
+        return this.list();
+    }
 }
 
 

+ 42 - 7
src/main/java/com/futu/course/course/service/impl/CourseServiceImpl.java

@@ -4,17 +4,52 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.futu.course.course.domain.Course;
 import com.futu.course.course.service.CourseService;
 import com.futu.course.course.mapper.CourseMapper;
+import com.futu.course.course.vo.CourseVo;
 import org.springframework.stereotype.Service;
 
+import java.util.ArrayList;
+import java.util.List;
+import java.util.WeakHashMap;
+
 /**
-* @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
-public class CourseServiceImpl extends ServiceImpl<CourseMapper, Course>
-    implements CourseService{
-
+public class CourseServiceImpl extends ServiceImpl<CourseMapper, Course> implements CourseService {
+/**
+ * @title: CourseList
+ * @desc:  数据分类
+ * @params List<CourseVo>
+ * @return: int categoryId
+ * @author: 杨旭朋
+ * @date: 2025/5/6 19:03
+ */
+    public List<CourseVo> CourseList(int categoryId) {
+//        初始化数据
+        List<CourseVo> courseVos = new ArrayList<>();
+        for (Course course : this.list()) {
+            CourseVo courseVo = new CourseVo();
+            courseVo.setId(course.getId());
+            courseVo.setCategoryId(course.getCategoryId());
+            courseVo.setTitle(course.getTitle());
+            courseVo.setCoverImg(course.getCoverImg());
+            courseVo.setPrice(course.getPrice());
+            courseVos.add(courseVo);
+        }
+//       分类查询
+        if (categoryId != 0){
+            List<CourseVo> coursevoList = new ArrayList<>();
+            for (CourseVo courseVo : courseVos) {
+                if (courseVo.getCategoryId()==categoryId){
+                    coursevoList.add(courseVo);
+                }
+            }
+            return coursevoList;
+        }
+        return courseVos;
+    }
 }
 
 

+ 151 - 7
src/main/java/com/futu/course/es/Service/ESCourseService.java

@@ -1,20 +1,32 @@
 package com.futu.course.es.Service;
 
+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.domain.ESCourse;
+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.RequestOptions;
 import org.elasticsearch.client.RestHighLevelClient;
+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.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.util.ArrayList;
-import java.util.Map;
+import java.math.BigDecimal;
+import java.util.*;
 
 /**
  * @author "杨旭朋"
@@ -27,10 +39,11 @@ public class ESCourseService {
     RestHighLevelClient client;
     @Autowired
     CourseServiceImpl courseService;
+
     /**
      * @title: search
-     * @desc:  ES搜索指引
-     * @params ( String name)
+     * @desc: ES搜索指引
+     * @params (String name)
      * @return: ArrayList<String>
      * @author: 杨旭朋
      * @date: 2025/5/6 16:29
@@ -45,7 +58,7 @@ public class ESCourseService {
                 // 创建条件,在条件中添加 match 查询,使用 ik 分词器
                 .must(QueryBuilders.matchQuery("name", name));
         // 设置查询的最大条数
-        searchSourceBuilder.size(10);
+        searchSourceBuilder.size(5);
         // 将搜索容器添加搜索条件
         searchSourceBuilder.query(boolQueryBuilder);
         // 添加数据为搜索容器
@@ -62,15 +75,146 @@ public class ESCourseService {
         }
         return list;
     }
+
     /**
      * @title: MysqlInterES
-     * @desc:  将mysql中的数据与mysql进行同步
+     * @desc: 将mysql中的数据与ES进行同步
      * @params ()
      * @return: Result
      * @author: 杨旭朋
      * @date: 2025/5/6 16:50
      */
-    public void MysqlInterES(){
+    @Transactional
+    public void MysqlInterES() throws IOException {
+        // 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(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(((Integer) idObj).longValue());
+                    } else if (idObj instanceof Long) {
+                        esCourse.setId((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(((Integer) idObj).longValue());
+                } else if (idObj instanceof Long) {
+                    esCourse.setId((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;
     }
 }

+ 11 - 4
src/main/java/com/futu/course/es/controller/ESCourseController.java

@@ -1,15 +1,14 @@
 package com.futu.course.es.controller;
 
 import com.futu.course.es.Service.ESCourseService;
+import com.futu.course.es.domain.ESCourse;
 import org.elasticsearch.search.SearchHit;
 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.RequestParam;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 import java.io.IOException;
 import java.util.ArrayList;
+import java.util.HashSet;
 
 /**
  * @author "杨旭朋"
@@ -25,4 +24,12 @@ public class ESCourseController {
     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);
+    }
 }

+ 13 - 10
src/main/java/com/futu/course/es/domain/ESCourse.java

@@ -1,19 +1,17 @@
 package com.futu.course.es.domain;
 
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.NoArgsConstructor;
+import com.fasterxml.jackson.annotation.JsonFormat;
 import org.springframework.data.annotation.Id;
 import org.springframework.data.elasticsearch.annotations.Document;
 import org.springframework.data.elasticsearch.annotations.Field;
 import org.springframework.data.elasticsearch.annotations.FieldType;
-import org.springframework.data.mongodb.core.mapping.MongoId;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
 
+import java.math.BigDecimal;
 import java.util.Date;
 
-/**
- * 课程表
- */
 @Data
 // 对 ES 中的 course 进行映射
 @Document(indexName = "course")
@@ -22,8 +20,6 @@ import java.util.Date;
 public class ESCourse {
     // 用于 Elasticsearch 的主键注解
     @Id
-    // 用于 MongoDB 的主键注解
-    @MongoId
     @Field(type = FieldType.Long)
     private Long id;
 
@@ -32,7 +28,14 @@ public class ESCourse {
 
     @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;
-}
+}    

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

@@ -10,4 +10,5 @@ import com.baomidou.mybatisplus.extension.service.IService;
 */
 public interface UserService extends IService<User> {
 
+
 }

+ 19 - 3
src/main/java/com/futu/course/user/service/impl/UserServiceImpl.java

@@ -1,10 +1,19 @@
 package com.futu.course.user.service.impl;
 
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.futu.course.minio.service.impl.FileServiceImpl;
 import com.futu.course.user.domain.User;
 import com.futu.course.user.service.UserService;
 import com.futu.course.user.mapper.UserMapper;
+import io.minio.errors.*;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
+import java.security.InvalidKeyException;
+import java.security.NoSuchAlgorithmException;
 
 /**
 * @author yuu
@@ -12,9 +21,16 @@ import org.springframework.stereotype.Service;
 * @createDate 2025-05-05 18:52:53
 */
 @Service
-public class UserServiceImpl extends ServiceImpl<UserMapper, User>
-    implements UserService{
-
+public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService{
+    @Autowired
+    private FileServiceImpl fileService;
+    public String unload(MultipartFile multipartFile,@RequestParam("uid") Long uid) throws ServerException, InvalidBucketNameException, InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException {
+        User byId = this.getById(uid);
+        String s = fileService.uploadImage(multipartFile);
+        byId.setAvatar(s);
+        boolean b = this.updateById(byId);
+       return b?"修改成功":"修改失败";
+    }
 }
 
 

+ 6 - 2
src/main/resources/application.yml

@@ -6,7 +6,6 @@ spring:
     url: jdbc:mysql://182.92.251.243:3306/goose?characterEncoding=utf8&serverTimezone=GMT%2B8
     username: root
     password: 01241314Yxp!
-
   redis:
     host: localhost
     database: 0
@@ -14,4 +13,9 @@ spring:
     password:
   elasticsearch:
     rest:
-      uris: http://localhost:9200
+      uris: http://localhost:9200
+minio:
+  endpoint: http://182.92.251.243:9000
+  accesskey: "minioadmin"
+  secretKey: "minioadmin"
+  bucketName: "images"