叶凌辰 1 gadu atpakaļ
vecāks
revīzija
6ab5a2707e

+ 26 - 0
src/main/java/com/ruoyi/project/VRdemo/controller/SearchController.java

@@ -0,0 +1,26 @@
+package com.ruoyi.project.VRdemo.controller;
+
+import com.ruoyi.framework.aspectj.lang.annotation.Anonymous;
+import com.ruoyi.project.VRdemo.domain.Press;
+import com.ruoyi.project.VRdemo.domain.SearchData;
+import com.ruoyi.project.VRdemo.service.ISearchService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+@RestController
+@RequestMapping("/vr/search")
+public class SearchController {
+
+    @Autowired
+    private ISearchService ISearchService;
+
+    // 高级检索功能接口
+    @Anonymous
+    @PostMapping("/SearchDatabases")
+    public List<Press> SearchDatabases(@RequestBody List<SearchData> searchData) {
+        String query = ISearchService.analyticParameter(searchData);
+        return ISearchService.ExecuteSearchSql(query);
+    }
+}

+ 61 - 0
src/main/java/com/ruoyi/project/VRdemo/domain/SearchData.java

@@ -0,0 +1,61 @@
+package com.ruoyi.project.VRdemo.domain;
+
+
+public class SearchData {
+    private int index;
+    private String field_name;
+    private String query_concat;
+    private String query_style;
+    private String text;
+
+    public int getIndex() {
+        return index;
+    }
+
+    public void setIndex(int index) {
+        this.index = index;
+    }
+
+    public String getField_name() {
+        return field_name;
+    }
+
+    public void setField_name(String field_name) {
+        this.field_name = field_name;
+    }
+
+    public String getQuery_concat() {
+        return query_concat;
+    }
+
+    public void setQuery_concat(String query_concat) {
+        this.query_concat = query_concat;
+    }
+
+    public String getQuery_style() {
+        return query_style;
+    }
+
+    public void setQuery_style(String query_style) {
+        this.query_style = query_style;
+    }
+
+    public String getText() {
+        return text;
+    }
+
+    public void setText(String text) {
+        this.text = text;
+    }
+
+    @Override
+    public String toString() {
+        return "SearchData{" +
+                "index=" + index +
+                ", field_name='" + field_name + '\'' +
+                ", query_concat='" + query_concat + '\'' +
+                ", query_style='" + query_style + '\'' +
+                ", text='" + text + '\'' +
+                '}';
+    }
+}

+ 18 - 0
src/main/java/com/ruoyi/project/VRdemo/mapper/SearchDataMapper.java

@@ -0,0 +1,18 @@
+package com.ruoyi.project.VRdemo.mapper;
+
+import com.ruoyi.project.VRdemo.domain.Press;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Select;
+
+import java.util.List;
+
+@Mapper
+public interface SearchDataMapper {
+
+    /**
+     * 查询press列表
+     */
+    @Select("${SqlString}")
+    public List<Press> ExecuteSearchSql(String SqlString);
+
+}

+ 14 - 0
src/main/java/com/ruoyi/project/VRdemo/service/ISearchService.java

@@ -0,0 +1,14 @@
+package com.ruoyi.project.VRdemo.service;
+
+import com.ruoyi.project.VRdemo.domain.Press;
+import com.ruoyi.project.VRdemo.domain.SearchData;
+import java.util.List;
+
+public interface ISearchService {
+
+    // 解析JSON数据 获取查询语句
+    String analyticParameter(List<SearchData> searchData);
+
+    // 获取检索数据
+    List<Press> ExecuteSearchSql(String SqlString);
+}

+ 124 - 0
src/main/java/com/ruoyi/project/VRdemo/service/impl/SearchServiceImpl.java

@@ -0,0 +1,124 @@
+package com.ruoyi.project.VRdemo.service.impl;
+
+import com.ruoyi.project.VRdemo.domain.Press;
+import com.ruoyi.project.VRdemo.domain.SearchData;
+import com.ruoyi.project.VRdemo.mapper.SearchDataMapper;
+import com.ruoyi.project.VRdemo.service.ISearchService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.*;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+@Service
+public class SearchServiceImpl implements ISearchService {
+
+    @Autowired
+    private SearchDataMapper searchDataMapper;
+
+    @Override
+    public String analyticParameter(List<SearchData> searchData) {
+        // 按照index排序
+        searchData.sort(Comparator.comparingInt(SearchData::getIndex));
+        StringBuilder sql = new StringBuilder("SELECT * FROM vr_press WHERE ");
+
+        int searchDataSize = searchData.size();
+        for (int i = 0; i < searchDataSize; i++) {
+            SearchData query = searchData.get(i);
+            // 添加条件连接符
+            if(i != 0){
+                sql.append(" ").append(query.getQuery_concat()).append(" ");
+            }
+            // 单项查询
+            if(searchDataSize == 1){
+                sql.append(parseLogicOperators(query.getField_name(),query.getText()));
+                return sql.toString();
+            }
+            // 添加查询条件
+            sql.append(handleQueryCondition(query));
+        }
+
+        return sql.toString();
+    }
+
+    /**
+     * 处理单个查询条件并返回对应的SQL片段。
+     * @param query 查询数据对象
+     * @return SQL片段
+     */
+    private String handleQueryCondition(SearchData query) {
+        String text = query.getText();
+        switch (query.getQuery_style()) {
+            case "precise":
+                return query.getField_name() + " = '" + text + "'";
+            case "fuzzy":
+                return query.getField_name() + " LIKE '%" + text + "%'";
+            default:
+                throw new IllegalArgumentException("Unsupported query style: " + query.getQuery_style());
+        }
+    }
+
+    /**
+     * 解析单项查询逻辑运算符并返回转换后的字符串。
+     * @param text 输入字符串
+     * @return 转换后的字符串
+     */
+    public StringBuilder parseLogicOperators(String fieldName, String text) {
+
+        List<String> protectedContents = new ArrayList<>(); // 用于存储双引号内的内容
+        String placeholder = "TEMP_PLUS_PLACEHOLDER"; // 占位符
+
+        // 使用Pattern和Matcher来查找并处理双引号内的内容
+        Pattern pattern = Pattern.compile("\"([^\"]*)\"");
+        Matcher matcher = pattern.matcher(text);
+        StringBuffer sb = new StringBuffer();
+        while (matcher.find()) {
+            String contentInsideQuotes = matcher.group(1); // 获取双引号内的内容
+            protectedContents.add(contentInsideQuotes); // 保存内容
+            matcher.appendReplacement(sb, placeholder); // 替换为占位符
+        }
+        matcher.appendTail(sb);
+        text = sb.toString();
+
+        // 替换逻辑运算符
+        text = text.replace("*", "AND")
+                   .replace("+", "OR")
+                   .replace("-", "NOT");
+
+        // 恢复双引号内的内容
+        for (String protectedContent : protectedContents) {
+            text = text.replaceFirst("TEMP_PLUS_PLACEHOLDER", protectedContent);
+        }
+
+        // 使用正则表达式拆分条件,并保留括号和逻辑运算符
+        List<String> conditions = new ArrayList<>();
+        Matcher conditionMatcher = Pattern.compile("\\(|\\)|\\bAND\\b|\\bOR\\b|\\bNOT\\b|[^\\s()]+").matcher(text);
+        while (conditionMatcher.find()) {
+            String match = conditionMatcher.group();
+            if (!match.trim().isEmpty()) {
+                conditions.add(match.trim());
+            }
+        }
+
+        // 构建SQL条件
+        StringBuilder condition = new StringBuilder();
+        for (String item : conditions) {
+            boolean isLogicalOperatorOrBracket = "AND".equals(item) || "OR".equals(item) || "NOT".equals(item) || "(".equals(item) || ")".equals(item);
+            if (isLogicalOperatorOrBracket) {
+                condition.append(" ").append(item).append(" ");
+            } else {
+                condition.append(fieldName).append(" LIKE '%").append(item).append("%'");
+            }
+        }
+
+        return condition;
+    }
+
+
+    // 执行查询
+    public List<Press> ExecuteSearchSql(String SqlString) {
+        return searchDataMapper.ExecuteSearchSql(SqlString);
+    }
+
+}