From e99aeeede5018acf69c5494d1f2e22725b4233a9 Mon Sep 17 00:00:00 2001 From: Chopper Date: Sun, 25 Jul 2021 17:45:46 +0800 Subject: [PATCH] =?UTF-8?q?=E7=83=AD=E8=AF=8D=E5=8A=9F=E8=83=BD=E5=A4=84?= =?UTF-8?q?=E7=90=86=EF=BC=8C=E6=8F=90=E4=BE=9Bredis=E8=87=AA=E5=AE=9A?= =?UTF-8?q?=E4=B9=89=E5=A2=9E=E5=8A=A0=E6=9D=83=E9=87=8D=E5=80=BC=E7=9A=84?= =?UTF-8?q?=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hotwords/HotWordsEveryDayTaskExecute.java | 30 ++++++++++++ .../src/main/java/cn/lili/cache/Cache.java | 27 +++++++---- .../java/cn/lili/cache/impl/RedisCache.java | 10 ++-- .../entity/enums/HotWordsRedisKeyEnum.java | 24 ---------- .../search/service/EsGoodsSearchService.java | 8 ++++ .../serviceimpl/EsGoodsSearchServiceImpl.java | 16 +++++-- .../system/token/ManagerTokenGenerate.java | 16 +++++-- .../setting/HotWordsManagerController.java | 47 +++++++++++++++++++ .../InstantDeliveryManagerController.java | 1 - 9 files changed, 134 insertions(+), 45 deletions(-) create mode 100644 consumer/src/main/java/cn/lili/timetask/handler/impl/hotwords/HotWordsEveryDayTaskExecute.java delete mode 100644 framework/src/main/java/cn/lili/modules/search/entity/enums/HotWordsRedisKeyEnum.java create mode 100755 manager-api/src/main/java/cn/lili/controller/setting/HotWordsManagerController.java diff --git a/consumer/src/main/java/cn/lili/timetask/handler/impl/hotwords/HotWordsEveryDayTaskExecute.java b/consumer/src/main/java/cn/lili/timetask/handler/impl/hotwords/HotWordsEveryDayTaskExecute.java new file mode 100644 index 00000000..a6e99c32 --- /dev/null +++ b/consumer/src/main/java/cn/lili/timetask/handler/impl/hotwords/HotWordsEveryDayTaskExecute.java @@ -0,0 +1,30 @@ +package cn.lili.timetask.handler.impl.hotwords; + +import cn.lili.cache.Cache; +import cn.lili.cache.CachePrefix; +import cn.lili.timetask.handler.EveryDayExecute; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * @author paulG + * @since 2021/3/11 + **/ +@Slf4j +@Component +public class HotWordsEveryDayTaskExecute implements EveryDayExecute { + + @Autowired + private Cache cache; + + /** + * 执行每日任务 + */ + @Override + public void execute() { + //移除昨日的热搜词 + cache.remove(CachePrefix.HOT_WORD.getPrefix()); + } + +} diff --git a/framework/src/main/java/cn/lili/cache/Cache.java b/framework/src/main/java/cn/lili/cache/Cache.java index c8c69080..cd475d4d 100644 --- a/framework/src/main/java/cn/lili/cache/Cache.java +++ b/framework/src/main/java/cn/lili/cache/Cache.java @@ -60,7 +60,7 @@ public interface Cache { * Add an item to the cache, nontransactionally, with * failfast semantics * - * @param key 缓存key + * @param key 缓存key * @param value 缓存value */ void put(Object key, T value); @@ -68,7 +68,7 @@ public interface Cache { /** * 往缓存中写入内容 * - * @param key 缓存key + * @param key 缓存key * @param value 缓存value * @param exp 超时时间,单位为秒 */ @@ -77,9 +77,9 @@ public interface Cache { /** * 往缓存中写入内容 * - * @param key 缓存key - * @param value 缓存value - * @param exp 过期时间 + * @param key 缓存key + * @param value 缓存value + * @param exp 过期时间 * @param timeUnit 过期单位 */ void put(Object key, T value, Long exp, TimeUnit timeUnit); @@ -124,7 +124,7 @@ public interface Cache { /** * 读取缓存值 * - * @param key 缓存key + * @param key 缓存key * @param hashKey map value * @return 返回缓存中的数据 */ @@ -142,8 +142,7 @@ public interface Cache { * 是否包含 * * @param key 缓存key - * @return 缓存中的数据 - * + * @return 缓存中的数据 */ boolean hasKey(Object key); @@ -164,7 +163,7 @@ public interface Cache { * 效率较高的 计数器 * 如需清零,按照普通key 移除即可 * - * @param key key值 + * @param key key值 * @param value 去重统计值 * @return 计数器结果 */ @@ -223,6 +222,16 @@ public interface Cache { */ void incrementScore(String sortedSetName, String keyword); + /** + * 使用Sorted Set记录keyword + * zincrby命令,对于一个Sorted Set,存在的就把分数加x(x可自行设定),不存在就创建一个分数为1的成员 + * + * @param sortedSetName sortedSetName的Sorted Set不用预先创建,不存在会自动创建,存在则向里添加数据 + * @param keyword 关键词 + * @param score 分数 + */ + void incrementScore(String sortedSetName, String keyword, Integer score); + /** * zrevrange命令, 查询Sorted Set中指定范围的值 * 返回的有序集合中,score大的在前面 diff --git a/framework/src/main/java/cn/lili/cache/impl/RedisCache.java b/framework/src/main/java/cn/lili/cache/impl/RedisCache.java index ef96f058..f34515e5 100644 --- a/framework/src/main/java/cn/lili/cache/impl/RedisCache.java +++ b/framework/src/main/java/cn/lili/cache/impl/RedisCache.java @@ -223,9 +223,13 @@ public class RedisCache implements Cache { */ @Override public void incrementScore(String sortedSetName, String keyword) { - //x 的含义请见本方法的注释 - double x = 1.0; - this.redisTemplate.opsForZSet().incrementScore(sortedSetName, keyword, x); + //指向key名为KEY的zset元素 + redisTemplate.opsForZSet().incrementScore(sortedSetName,keyword, 1); + } + + @Override + public void incrementScore(String sortedSetName, String keyword, Integer score) { + redisTemplate.opsForZSet().incrementScore(sortedSetName, keyword, score); } /** diff --git a/framework/src/main/java/cn/lili/modules/search/entity/enums/HotWordsRedisKeyEnum.java b/framework/src/main/java/cn/lili/modules/search/entity/enums/HotWordsRedisKeyEnum.java deleted file mode 100644 index 1ccaf7e1..00000000 --- a/framework/src/main/java/cn/lili/modules/search/entity/enums/HotWordsRedisKeyEnum.java +++ /dev/null @@ -1,24 +0,0 @@ -package cn.lili.modules.search.entity.enums; - -/** - * @author paulG - * @since 2021/1/20 - **/ -public enum HotWordsRedisKeyEnum { - - /** - * "搜索热词" - */ - SEARCH_HOT_WORD("搜索热词"); - - - private final String description; - - HotWordsRedisKeyEnum(String description) { - this.description = description; - } - - public String description() { - return description; - } -} diff --git a/framework/src/main/java/cn/lili/modules/search/service/EsGoodsSearchService.java b/framework/src/main/java/cn/lili/modules/search/service/EsGoodsSearchService.java index 795b7e37..1099c0ba 100644 --- a/framework/src/main/java/cn/lili/modules/search/service/EsGoodsSearchService.java +++ b/framework/src/main/java/cn/lili/modules/search/service/EsGoodsSearchService.java @@ -34,6 +34,14 @@ public interface EsGoodsSearchService { */ List getHotWords(Integer start, Integer end); + /** + * 设置热门关键词 + * + * @param words 关键词 + * @param point 赋予分数 + */ + void setHotWords(String words, Integer point); + /** * 获取筛选器 * diff --git a/framework/src/main/java/cn/lili/modules/search/serviceimpl/EsGoodsSearchServiceImpl.java b/framework/src/main/java/cn/lili/modules/search/serviceimpl/EsGoodsSearchServiceImpl.java index ec039e52..7637c196 100644 --- a/framework/src/main/java/cn/lili/modules/search/serviceimpl/EsGoodsSearchServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/search/serviceimpl/EsGoodsSearchServiceImpl.java @@ -3,6 +3,7 @@ package cn.lili.modules.search.serviceimpl; import cn.hutool.core.convert.Convert; import cn.hutool.core.text.CharSequenceUtil; import cn.lili.cache.Cache; +import cn.lili.cache.CachePrefix; import cn.lili.common.utils.StringUtils; import cn.lili.common.vo.PageVO; import cn.lili.modules.goods.entity.dos.Brand; @@ -16,7 +17,6 @@ import cn.lili.modules.search.entity.dos.EsGoodsRelatedInfo; import cn.lili.modules.search.entity.dto.EsGoodsSearchDTO; import cn.lili.modules.search.entity.dto.ParamOptions; import cn.lili.modules.search.entity.dto.SelectorOptions; -import cn.lili.modules.search.entity.enums.HotWordsRedisKeyEnum; import cn.lili.modules.search.repository.EsGoodsIndexRepository; import cn.lili.modules.search.service.EsGoodsSearchService; import lombok.extern.slf4j.Slf4j; @@ -51,6 +51,7 @@ import java.util.*; /** * ES商品搜索业务层实现 + * * @author paulG * @since 2020/10/16 **/ @@ -90,7 +91,7 @@ public class EsGoodsSearchServiceImpl implements EsGoodsSearchService { @Override public Page searchGoods(EsGoodsSearchDTO searchDTO, PageVO pageVo) { if (CharSequenceUtil.isNotEmpty(searchDTO.getKeyword())) { - cache.incrementScore(HotWordsRedisKeyEnum.SEARCH_HOT_WORD.name(), searchDTO.getKeyword()); + cache.incrementScore(CachePrefix.HOT_WORD.getPrefix(), searchDTO.getKeyword()); } NativeSearchQueryBuilder searchQueryBuilder = createSearchQueryBuilder(searchDTO, pageVo, true); NativeSearchQuery searchQuery = searchQueryBuilder.build(); @@ -102,13 +103,18 @@ public class EsGoodsSearchServiceImpl implements EsGoodsSearchService { @Override public List getHotWords(Integer start, Integer end) { List hotWords = new ArrayList<>(); - Set set = cache.reverseRangeWithScores(HotWordsRedisKeyEnum.SEARCH_HOT_WORD.name(), start, end); + Set set = cache.reverseRangeWithScores(CachePrefix.HOT_WORD.getPrefix(), start, end); for (DefaultTypedTuple defaultTypedTuple : set) { hotWords.add(Objects.requireNonNull(defaultTypedTuple.getValue()).toString()); } return hotWords; } + @Override + public void setHotWords(String words, Integer point) { + cache.incrementScore(CachePrefix.HOT_WORD.getPrefix(), words, point); + } + @Override public EsGoodsRelatedInfo getSelector(EsGoodsSearchDTO goodsSearch, PageVO pageVo) { NativeSearchQueryBuilder builder = createSearchQueryBuilder(goodsSearch, null, true); @@ -318,6 +324,7 @@ public class EsGoodsSearchServiceImpl implements EsGoodsSearchService { /** * 查询属性处理 + * * @param filterBuilder * @param queryBuilder * @param searchDTO @@ -391,7 +398,7 @@ public class EsGoodsSearchServiceImpl implements EsGoodsSearchService { //价格区间判定 if (CharSequenceUtil.isNotEmpty(searchDTO.getPrice())) { String[] prices = searchDTO.getPrice().split("_"); - if(prices.length==0){ + if (prices.length == 0) { return; } double min = Convert.toDouble(prices[0], 0.0); @@ -406,6 +413,7 @@ public class EsGoodsSearchServiceImpl implements EsGoodsSearchService { /** * 关键字查询处理 + * * @param filterBuilder * @param queryBuilder * @param keyword diff --git a/framework/src/main/java/cn/lili/modules/system/token/ManagerTokenGenerate.java b/framework/src/main/java/cn/lili/modules/system/token/ManagerTokenGenerate.java index ee621f04..3948977c 100644 --- a/framework/src/main/java/cn/lili/modules/system/token/ManagerTokenGenerate.java +++ b/framework/src/main/java/cn/lili/modules/system/token/ManagerTokenGenerate.java @@ -3,8 +3,8 @@ package cn.lili.modules.system.token; import cn.lili.cache.Cache; import cn.lili.cache.CachePrefix; import cn.lili.common.security.AuthUser; -import cn.lili.common.security.enums.UserEnums; import cn.lili.common.security.enums.PermissionEnum; +import cn.lili.common.security.enums.UserEnums; import cn.lili.common.security.token.Token; import cn.lili.common.security.token.TokenUtil; import cn.lili.common.security.token.base.AbstractTokenGenerate; @@ -116,11 +116,19 @@ public class ManagerTokenGenerate extends AbstractTokenGenerate { */ void initPermission(List superPermissions, List queryPermissions) { //用户信息维护 - superPermissions.add("/manager/user/info"); - superPermissions.add("/manager/user/edit"); + superPermissions.add("/manager/user/info*"); + superPermissions.add("/manager/user/edit*"); superPermissions.add("/manager/user/editPassword*"); - //统计查看 + + //统计查看权限 queryPermissions.add("/manager/statistics*"); + //菜单查看权限 + queryPermissions.add("/manager/menu*"); + //商品分类查看权限 + queryPermissions.add("/manager/goods/category*"); + //查看地区接口 + queryPermissions.add("/manager/region*"); + } } diff --git a/manager-api/src/main/java/cn/lili/controller/setting/HotWordsManagerController.java b/manager-api/src/main/java/cn/lili/controller/setting/HotWordsManagerController.java new file mode 100755 index 00000000..91d9a5da --- /dev/null +++ b/manager-api/src/main/java/cn/lili/controller/setting/HotWordsManagerController.java @@ -0,0 +1,47 @@ +package cn.lili.controller.setting; + +import cn.lili.common.enums.ResultUtil; +import cn.lili.common.vo.ResultMessage; +import cn.lili.modules.search.service.EsGoodsSearchService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * 管理端,app版本控制器 + * + * @author Chopper + * @since 2018-07-04 21:50:52 + */ +@RestController +@Api(tags = "管理端,系统设置扩展接口") +@RequestMapping("/manager/hotwords") +public class HotWordsManagerController { + + @Autowired + private EsGoodsSearchService esGoodsSearchService; + + @ApiOperation(value = "获取热词") + @GetMapping + public ResultMessage getHotWords() { + return ResultUtil.data(esGoodsSearchService.getHotWords(0, 99)); + } + + @ApiOperation(value = "设置热词") + @ApiImplicitParams({ + @ApiImplicitParam(name = "keywords", value = "关键字"), + @ApiImplicitParam(name = "point", value = "权重值") + }) + @PostMapping + public ResultMessage paymentForm(String keywords, Integer point) { + esGoodsSearchService.setHotWords(keywords, point); + return ResultUtil.success(); + } + +} diff --git a/manager-api/src/main/java/cn/lili/controller/setting/InstantDeliveryManagerController.java b/manager-api/src/main/java/cn/lili/controller/setting/InstantDeliveryManagerController.java index bd6e68ce..bd9e6dc6 100644 --- a/manager-api/src/main/java/cn/lili/controller/setting/InstantDeliveryManagerController.java +++ b/manager-api/src/main/java/cn/lili/controller/setting/InstantDeliveryManagerController.java @@ -39,7 +39,6 @@ public class InstantDeliveryManagerController { IPage data = instantDeliveryService.page(PageUtil.initPage(page)); //组织数据结构 IPage newData = instantDeliveryService.getInstantDeliveryPage(data, page); - System.out.println(); //返回数据 return ResultUtil.data(newData); }