Browse Source

Merge remote-tracking branch 'origin/developer' into developerA

zhijiezhao 2 years ago
parent
commit
2d42b57089

+ 33 - 0
src/main/java/com/caimei365/commodity/components/RedisConfig.java

@@ -0,0 +1,33 @@
+package com.caimei365.commodity.components;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.data.redis.connection.RedisConnectionFactory;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
+import org.springframework.data.redis.serializer.RedisSerializer;
+
+/**
+ * 去除序列化和反序列化
+ */
+@Configuration
+public class RedisConfig {
+
+    @Bean
+    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
+        // 准备RedisTemplate对象
+        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
+        // 设置连接工厂
+        redisTemplate.setConnectionFactory(connectionFactory);
+        // 创建JSON序列化工具
+        GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
+        // 设置key的序列化
+        redisTemplate.setKeySerializer(RedisSerializer.string());
+        redisTemplate.setHashKeySerializer(RedisSerializer.string());
+        // 设置value的序列化
+        redisTemplate.setValueSerializer(jsonRedisSerializer);
+        redisTemplate.setHashValueSerializer(jsonRedisSerializer);
+        // 返回
+        return redisTemplate;
+    }
+}

+ 3 - 1
src/main/java/com/caimei365/commodity/controller/ProductPageApi.java

@@ -371,7 +371,9 @@ public class ProductPageApi {
     @GetMapping("/product/archive")
     public ResponseJson<PaginationVo<ArchiveVo>> getProductArchive(String keyword, Integer productType,
                                                                    @RequestParam(value = "pageNum", defaultValue = "1") int pageNum,
-                                                                   @RequestParam(value = "pageSize", defaultValue = "10") int pageSize) {
+                                                                   @RequestParam(value = "pageSize", defaultValue = "10") int pageSize,
+                                                                   @RequestParam(value = "productFlag", defaultValue = "1") int productFlag,
+                                                                   @RequestParam(value = "linkageFlag", defaultValue = "0") int linkageFlag) {
         return pageService.getProductArchive(keyword, productType, pageNum, pageSize);
     }
 

+ 36 - 4
src/main/java/com/caimei365/commodity/controller/SearchProductApi.java

@@ -1,8 +1,11 @@
 package com.caimei365.commodity.controller;
 
+import com.alibaba.fastjson.JSONObject;
 import com.caimei365.commodity.annotation.IpSave;
 import com.caimei365.commodity.model.ResponseJson;
 import com.caimei365.commodity.model.po.SearchHistoryPo;
+import com.caimei365.commodity.model.vo.SearchFrequencyVo;
+import com.caimei365.commodity.model.vo.SearchKeywordyVo;
 import com.caimei365.commodity.service.SearchProductService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
@@ -10,10 +13,7 @@ import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
 import lombok.RequiredArgsConstructor;
 import org.apache.commons.lang3.StringUtils;
-import org.springframework.web.bind.annotation.GetMapping;
-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.util.HashMap;
 import java.util.List;
@@ -80,6 +80,8 @@ public class SearchProductApi {
                                                       @RequestParam(value = "promotionFlag", defaultValue = "0") Integer promotionFlag,
                                                       @RequestParam(value = "pageNum", defaultValue = "1") int pageNum,
                                                       @RequestParam(value = "pageSize", defaultValue = "20") int pageSize,
+                                                      @RequestParam(value = "productFlag", defaultValue = "1") int productFlag,
+                                                      @RequestParam(value = "linkageFlag", defaultValue = "0") int linkageFlag,
                                                       String sortField, Integer sortType) {
         return searchProductService.queryProductByKeyword(keyword, brandIds, identity, newFlag, promotionFlag, pageNum, pageSize, sortField, sortType);
     }
@@ -220,4 +222,34 @@ public class SearchProductApi {
     public ResponseJson<Map<String, Object>> getHotSearchTerms() {
         return searchProductService.getHotSearchTerms();
     }
+
+    /**
+     * 统计关键词及次数
+     * @param fromType
+     * @param path
+     * @param keyword
+     * @return
+     */
+    @GetMapping("/con/keyword")
+    public ResponseJson conKeyword(Integer fromType,String path,String keyword){
+       return ResponseJson.success(searchProductService.conKeyword(fromType,path,keyword));
+    }
+
+    /**
+     * 获取已加入关键词库的关键词进行搜索联动
+     * 从redis获取,获取不到则去数据库获取
+     * @return
+     */
+    @PostMapping("/get/keyword/list")
+    public ResponseJson<List<SearchKeywordyVo>> getKeywordList(SearchFrequencyVo searchKeywordyVo){
+        if(StringUtils.isEmpty(searchKeywordyVo.getKeyword())){
+            return ResponseJson.error("请输入关键词");
+        }
+        return ResponseJson.success(searchProductService.getKeywordList(searchKeywordyVo.getKeyword()));
+    }
+    @GetMapping("/conKeyWord")
+    public void conKeyWord(){
+        searchProductService.conKeyWord();
+    }
+
 }

+ 6 - 2
src/main/java/com/caimei365/commodity/controller/SearchQueryApi.java

@@ -153,7 +153,9 @@ public class SearchQueryApi {
     @GetMapping("/article")
     public ResponseJson<String> queryArticleByKeyword(String keyword,Integer status,
                                            @RequestParam(value = "pageNum", defaultValue = "1") int pageNum,
-                                           @RequestParam(value = "pageSize", defaultValue = "20") int pageSize) {
+                                           @RequestParam(value = "pageSize", defaultValue = "20") int pageSize,
+                                           @RequestParam(value = "productFlag", defaultValue = "1") int productFlag,
+                                           @RequestParam(value = "linkageFlag", defaultValue = "0") int linkageFlag) {
         return searchQueryService.queryArticleByKeyword(keyword, pageNum, pageSize,status);
     }
 
@@ -224,7 +226,9 @@ public class SearchQueryApi {
     @GetMapping("/baike/keyword")
     public ResponseJson<PaginationVo<BaikeProductVo>> queryBaikeProductByKeyword(String keyword,
                                                           @RequestParam(value = "pageNum", defaultValue = "1") int pageNum,
-                                                          @RequestParam(value = "pageSize", defaultValue = "20") int pageSize) {
+                                                          @RequestParam(value = "pageSize", defaultValue = "20") int pageSize,
+                                                          @RequestParam(value = "productFlag", defaultValue = "1") int productFlag,
+                                                          @RequestParam(value = "linkageFlag", defaultValue = "0") int linkageFlag) {
         return searchQueryService.queryBaikeProductByKeyword(keyword, pageNum, pageSize);
     }
 

+ 25 - 0
src/main/java/com/caimei365/commodity/mapper/SearchFrequencyMapper.java

@@ -0,0 +1,25 @@
+package com.caimei365.commodity.mapper;
+
+import com.caimei365.commodity.model.vo.SearchFrequencyVo;
+import com.caimei365.commodity.model.vo.SearchKeywordyVo;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+@Mapper
+public interface SearchFrequencyMapper {
+
+        List<SearchFrequencyVo>  getAll();
+
+        List<SearchFrequencyVo>  getInfoBykeyword(String keyword, Integer fromSearch);
+
+        void saveInfo(SearchFrequencyVo searchFrequencyVo);
+
+        void upFrequencyById(Integer id,Integer frequency);
+
+        List<SearchKeywordyVo> getKeywordList(@Param("keyword")String keyword);
+
+        List<SearchKeywordyVo> getvalueList(@Param("keyword") String keyword);
+
+}

+ 38 - 0
src/main/java/com/caimei365/commodity/model/vo/SearchFrequencyVo.java

@@ -0,0 +1,38 @@
+package com.caimei365.commodity.model.vo;
+
+import lombok.Data;
+
+import java.sql.Date;
+
+@Data
+public class SearchFrequencyVo {
+       private Integer  id ;
+    /**
+     * 数据来源(1:首页;2:信息中心)
+     */
+    private Integer fromSearch   ;
+    /**
+     * 接口路径
+     */
+    private String  path;
+    /**
+     * 关键词
+     */
+    private String  keyword ;
+    /**
+     * 关键词出现次数
+     */
+    private Integer  frequency ;
+    /**
+     * 搜索时间
+     */
+    private Date searchTime ;
+    /**
+     * 0:未加入关键词库;1:已加入关键词库
+     */
+    private Integer trueStatus;
+    /**
+     * 联动搜索次数
+     */
+    private Integer linkageFrequency;
+}

+ 13 - 0
src/main/java/com/caimei365/commodity/model/vo/SearchKeywordyVo.java

@@ -0,0 +1,13 @@
+package com.caimei365.commodity.model.vo;
+
+import lombok.Data;
+
+import java.sql.Date;
+
+@Data
+public class SearchKeywordyVo {
+    /**
+     * 关键词
+     */
+    private String  keyword ;
+}

+ 19 - 0
src/main/java/com/caimei365/commodity/service/SearchProductService.java

@@ -2,6 +2,7 @@ package com.caimei365.commodity.service;
 
 import com.caimei365.commodity.model.ResponseJson;
 import com.caimei365.commodity.model.po.SearchHistoryPo;
+import com.caimei365.commodity.model.vo.SearchKeywordyVo;
 
 import java.util.HashMap;
 import java.util.List;
@@ -91,4 +92,22 @@ public interface SearchProductService {
     ResponseJson<Map<String, Object>> getHotSearchTerms();
 
     ResponseJson<Set<HashMap<String, Object>>> queryBrand(String keyword, Integer id, Integer idType, Integer newFlag , Integer promotionFlag, Integer identity);
+    /**
+     * 统计关键词及次数
+     * @param fromType
+     * @param path
+     * @param keyword
+     * @return
+     */
+     ResponseJson conKeyword(Integer fromType,String path,String keyword);
+
+    /**
+     * 获取已加入关键词库的关键词进行搜索联动
+     * 从redis获取,获取不到则去数据库获取
+     * @return
+     */
+      List<SearchKeywordyVo> getKeywordList(String keyword);
+
+       void conKeyWord();
+
 }

+ 83 - 0
src/main/java/com/caimei365/commodity/service/impl/SearchProductServiceImpl.java

@@ -8,20 +8,25 @@ import com.aliyun.opensearch.sdk.generated.commons.OpenSearchException;
 import com.aliyun.opensearch.sdk.generated.search.DeepPaging;
 import com.aliyun.opensearch.sdk.generated.search.SearchParams;
 import com.caimei365.commodity.components.PriceUtilService;
+import com.caimei365.commodity.components.RedisService;
 import com.caimei365.commodity.components.SearchOpenService;
 import com.caimei365.commodity.mapper.PageMapper;
+import com.caimei365.commodity.mapper.SearchFrequencyMapper;
 import com.caimei365.commodity.mapper.SearchMapper;
 import com.caimei365.commodity.model.ResponseJson;
 import com.caimei365.commodity.model.po.SearchHistoryPo;
 import com.caimei365.commodity.model.search.ProductListVo;
 import com.caimei365.commodity.model.vo.HotSearchVo;
 import com.caimei365.commodity.model.vo.PaginationVo;
+import com.caimei365.commodity.model.vo.SearchFrequencyVo;
+import com.caimei365.commodity.model.vo.SearchKeywordyVo;
 import com.caimei365.commodity.service.SearchProductService;
 import com.caimei365.commodity.utils.AppletsLinkUtil;
 import com.caimei365.commodity.utils.Json2PojoUtil;
 import com.github.pagehelper.PageHelper;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 
@@ -51,6 +56,11 @@ public class SearchProductServiceImpl implements SearchProductService {
     @Resource
     private PriceUtilService priceUtilService;
 
+    @Resource
+    private SearchFrequencyMapper searchFrequencyMapper;
+
+    @Autowired
+    private RedisService redisService;
     /**
      * 根据关键词搜索商品
      *
@@ -595,4 +605,77 @@ public class SearchProductServiceImpl implements SearchProductService {
         });
         return productHotSearch;
     }
+    /**
+     * 统计关键词及次数
+     * @param fromType
+     * @param path
+     * @param keyword
+     * @return
+     */
+    public ResponseJson conKeyword(Integer fromType,String path,String keyword){
+        Date date=new Date();
+        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd");
+        sf.format(date);
+        //根据关键词和来源查询数据库是否存在(存在来源也相同时增加次数,存在但来源不同时和不存在则新增)
+        List<SearchFrequencyVo> searchFrequencyVoList = searchFrequencyMapper.getInfoBykeyword(keyword,fromType);
+        if(null!= searchFrequencyVoList && searchFrequencyVoList.size()>0){
+            //存在 统计次数
+           Integer frequency= searchFrequencyVoList.get(0).getFrequency()+1;
+            searchFrequencyMapper.upFrequencyById(searchFrequencyVoList.get(0).getId(),frequency);
+        }else{
+            //不存在 新增
+            SearchFrequencyVo sea=new SearchFrequencyVo();
+            sea.setKeyword(keyword);
+            sea.setFrequency(1);
+            sea.setPath(path);
+            sea.setFromSearch(fromType);
+            sea.setSearchTime(new java.sql.Date(date.getTime()));
+            searchFrequencyMapper.saveInfo(sea);
+        }
+        return ResponseJson.success();
+    }
+
+    /**
+     * 获取已加入关键词库的关键词进行搜索联动
+     * 从redis获取,获取不到则去数据库获取
+     * @return
+     */
+    @Override
+    public List<SearchKeywordyVo> getKeywordList(String keyword){
+        //先从reids中获取keyword值,不存在时在查询数据库
+        List<SearchKeywordyVo> searchFrequencyVos=new ArrayList<>();
+        if(redisService.getExpireTime(keyword)>0){
+            log.info("-------------获取redis中的数据--------------");
+            searchFrequencyVos= com.alibaba.fastjson.JSONArray.parseArray(redisService.get(keyword).toString(),SearchKeywordyVo.class);
+        }
+        else{
+            log.info("-------------获取数据库中的数据--------------");
+            searchFrequencyVos = searchFrequencyMapper.getKeywordList(keyword);
+        }
+        return searchFrequencyVos;
+    }
+    /**
+     * redis缓存关键词(把所有的关键词整合到一个字符串中)
+     * 用时从redis取出转成list集合返回给前端进行联动
+     */
+    public void conKeyWord(){
+        List<SearchKeywordyVo> keywordList = searchFrequencyMapper.getKeywordList(null);
+        for (SearchKeywordyVo searchFrequency:keywordList) {
+            String str=searchFrequency.getKeyword();
+            String key="";
+            for(int i=0;i<str.length();i++){
+                key+=str.charAt(i);
+                List<SearchKeywordyVo> searchFrequencyVos = searchFrequencyMapper.getvalueList(key);
+                String keyword = com.alibaba.fastjson.JSONObject.toJSONString(searchFrequencyVos);//有值的字段才转
+                redisService.set(key,keyword,60L * 60 * 24 * 30);
+            }
+        }
+        System.out.println(redisService.getExpireTime("恩"));
+        System.out.println(redisService.get("恩"));
+        System.out.println(redisService.getExpireTime("光"));
+        System.out.println(redisService.get("光"));
+//        System.out.println(redisService.getExpireTime("keyword"));
+//        String key=redisService.get("keyword").toString();
+//        System.out.println(key);
+    }
 }

+ 58 - 0
src/main/resources/mapper/SearchFrequencyMapper.xml

@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.caimei365.commodity.mapper.SearchFrequencyMapper">
+         <select id="getAll" resultType="com.caimei365.commodity.model.vo.SearchFrequencyVo">
+             select
+                    id,
+                    fromSearch,
+                    path,
+                    keyword,
+                    frequency,
+                    searchTime,
+                    trueStatus
+              from cm_user_search_frequency
+         </select>
+    <select id="getInfoBykeyword" resultType="com.caimei365.commodity.model.vo.SearchFrequencyVo">
+        select
+            id,
+            fromSearch,
+            path,
+            keyword,
+            frequency,
+            searchTime,
+            trueStatus
+        from cm_user_search_frequency
+        where keyword=#{keyword}
+        and   fromSearch=#{fromSearch}
+    </select>
+    <insert id="saveInfo" parameterType="com.caimei365.commodity.model.vo.SearchFrequencyVo">
+        insert into cm_user_search_frequency(fromSearch,path,keyword,frequency,searchTime)
+        values (#{fromSearch},#{path},#{keyword},#{frequency},#{searchTime})
+
+    </insert>
+    <update id="upFrequencyById">
+        update cm_user_search_frequency set frequency=#{frequency} where id=#{id}
+    </update>
+    <select id="getKeywordList" resultType="com.caimei365.commodity.model.vo.SearchKeywordyVo">
+        select
+            keyword
+        from cm_user_search_frequency
+        where trueStatus=1
+          and   delStatus=1
+        <if test="keyword != null and keyword != ''">
+            and keyword like concat('%', #{keyword},'%')
+        </if>
+    </select>
+
+    <select id="getvalueList" resultType="com.caimei365.commodity.model.vo.SearchKeywordyVo">
+        select
+        keyword
+        from cm_user_search_frequency
+        where trueStatus=1
+        and   delStatus=1
+        and keyword is not null
+        <if test="keyword != null and keyword != ''">
+            and keyword like concat(#{keyword},'%')
+        </if>
+    </select>
+</mapper>