diff --git a/DB/version4.2.4toMASTER.sql b/DB/version4.2.4toMASTER.sql index f8cfb17a..06e0fce2 100644 --- a/DB/version4.2.4toMASTER.sql +++ b/DB/version4.2.4toMASTER.sql @@ -1,4 +1,18 @@ /** 增加签到日期 **/ ALTER TABLE li_member_sign ADD day int DEFAULT NULL COMMENT '签到日 '; ALTER TABLE li_member_sign DROP INDEX uk_member_day; -ALTER TABLE li_member_sign add unique uk_member_day (member_id, day) COMMENT 'uk_member_day'; \ No newline at end of file +ALTER TABLE li_member_sign add unique uk_member_day (member_id, day) COMMENT 'uk_member_day'; + + + +-- ---------------------------- +-- Table structure for li_hot_words_history +-- ---------------------------- +DROP TABLE IF EXISTS `li_hot_words_history`; +CREATE TABLE `li_hot_words_history` ( + `id` bigint NOT NULL COMMENT 'ID', + `create_time` datetime(6) DEFAULT NULL COMMENT '创建时间', + `keywords` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT '热词', + `score` int DEFAULT NULL COMMENT '热词分数', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8_bin; diff --git a/buyer-api/src/main/java/cn/lili/controller/goods/GoodsBuyerController.java b/buyer-api/src/main/java/cn/lili/controller/goods/GoodsBuyerController.java index 92f8838d..fc5a5f0d 100644 --- a/buyer-api/src/main/java/cn/lili/controller/goods/GoodsBuyerController.java +++ b/buyer-api/src/main/java/cn/lili/controller/goods/GoodsBuyerController.java @@ -14,6 +14,7 @@ import cn.lili.modules.search.entity.dos.EsGoodsIndex; import cn.lili.modules.search.entity.dos.EsGoodsRelatedInfo; import cn.lili.modules.search.entity.dto.EsGoodsSearchDTO; import cn.lili.modules.search.service.EsGoodsSearchService; +import cn.lili.modules.search.service.HotWordsService; import cn.lili.modules.statistics.aop.PageViewPoint; import cn.lili.modules.statistics.aop.enums.PageViewEnum; import com.baomidou.mybatisplus.core.metadata.IPage; @@ -62,6 +63,9 @@ public class GoodsBuyerController { @Autowired private EsGoodsSearchService goodsSearchService; + @Autowired + private HotWordsService hotWordsService; + @ApiOperation(value = "通过id获取商品信息") @ApiImplicitParam(name = "goodsId", value = "商品ID", required = true, paramType = "path", dataType = "Long") @GetMapping(value = "/get/{goodsId}") @@ -117,7 +121,7 @@ public class GoodsBuyerController { @ApiOperation(value = "获取搜索热词") @GetMapping("/hot-words") public ResultMessage> getGoodsHotWords(Integer count) { - List hotWords = goodsSearchService.getHotWords(count); + List hotWords = hotWordsService.getHotWords(count); return ResultUtil.data(hotWords); } 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 index a6e99c32..ecf63d58 100644 --- 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 @@ -1,11 +1,24 @@ package cn.lili.timetask.handler.impl.hotwords; +import cn.hutool.json.JSONUtil; import cn.lili.cache.Cache; import cn.lili.cache.CachePrefix; +import cn.lili.common.utils.StringUtils; +import cn.lili.modules.search.entity.dos.HotWordsHistory; +import cn.lili.modules.search.service.HotWordsHistoryService; +import cn.lili.modules.system.entity.dos.Setting; +import cn.lili.modules.system.entity.dto.HotWordsSetting; +import cn.lili.modules.system.entity.dto.HotWordsSettingItem; +import cn.lili.modules.system.entity.enums.SettingEnum; +import cn.lili.modules.system.service.SettingService; import cn.lili.timetask.handler.EveryDayExecute; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.DefaultTypedTuple; import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.*; /** * @author paulG @@ -18,13 +31,54 @@ public class HotWordsEveryDayTaskExecute implements EveryDayExecute { @Autowired private Cache cache; + @Autowired + private HotWordsHistoryService hotWordsHistoryService; + @Autowired + private SettingService settingService; + /** * 执行每日任务 */ @Override public void execute() { + //获取大于0分的热词 + Set tuples = cache.zRangeByScore(CachePrefix.HOT_WORD.getPrefix(), 1, Integer.MAX_VALUE); + //如果任务不为空 + if (!CollectionUtils.isEmpty(tuples)) { + + //因为是第二天统计第一天的数据,所以这里获取昨天凌晨的时间 + Calendar calendar = Calendar.getInstance(); + calendar.set(Calendar.HOUR_OF_DAY, 0); + calendar.set(Calendar.SECOND, 0); + calendar.set(Calendar.MILLISECOND, 0); + calendar.set(Calendar.MINUTE, 0); + calendar.set(Calendar.DAY_OF_YEAR, calendar.get(Calendar.DAY_OF_YEAR) - 1); + + //批量保存热词 + List hotWordsHistories = new ArrayList<>(); + for (DefaultTypedTuple tuple : tuples) { + String keywords = (String) tuple.getValue(); + Double score = tuple.getScore(); + hotWordsHistories.add(new HotWordsHistory(keywords, score.intValue(), calendar.getTime())); + } + + hotWordsHistoryService.saveBatch(hotWordsHistories); + } //移除昨日的热搜词 cache.remove(CachePrefix.HOT_WORD.getPrefix()); + + //设置今日默认热词 + Setting setting = settingService.get(SettingEnum.HOT_WORDS.name()); + if (setting == null) { + return; + } + HotWordsSetting hotWordsSetting = JSONUtil.toBean(setting.getSettingValue(), HotWordsSetting.class); + List hotWordsSettingItems = hotWordsSetting.getHotWordsSettingItems(); + if (hotWordsSettingItems != null && !hotWordsSettingItems.isEmpty()) { + for (HotWordsSettingItem hotWordsSettingItem : hotWordsSettingItems) { + cache.zAdd(CachePrefix.HOT_WORD.getPrefix(), hotWordsSettingItem.getScore(), hotWordsSettingItem.getKeywords()); + } + } } } diff --git a/framework/src/main/java/cn/lili/cache/CachePrefix.java b/framework/src/main/java/cn/lili/cache/CachePrefix.java index 27740abe..43423d64 100644 --- a/framework/src/main/java/cn/lili/cache/CachePrefix.java +++ b/framework/src/main/java/cn/lili/cache/CachePrefix.java @@ -471,10 +471,9 @@ public enum CachePrefix { STORE_CATEGORY, /** * 用户菜单 - */ - MENU_USER_ID, - /** - * 用户菜单 + *

+ * 这个缓存并非永久缓存,而是300秒缓存,也就是说修改用户关联的部门,关联的角色, + * 部门关联的角色,角色关联的菜单等等,最多需要5分钟才能生效 */ USER_MENU, /** diff --git a/framework/src/main/java/cn/lili/common/utils/DateUtil.java b/framework/src/main/java/cn/lili/common/utils/DateUtil.java index 34a29c89..ec6c5ef4 100644 --- a/framework/src/main/java/cn/lili/common/utils/DateUtil.java +++ b/framework/src/main/java/cn/lili/common/utils/DateUtil.java @@ -28,6 +28,14 @@ public class DateUtil { public static Long getDayOfStart() { return DateUtil.getDateline()/(60*24*60); } + /** + * 指定日的开始时间 + * + * @return 指定日时间 + */ + public static Long getDayOfStart(Date date) { + return date.getTime()/(60*24*60); + } /** * 当天的开始时间 diff --git a/framework/src/main/java/cn/lili/modules/order/cart/render/impl/CommissionRender.java b/framework/src/main/java/cn/lili/modules/order/cart/render/impl/CommissionRender.java index f7e7bf55..8d35dbaf 100644 --- a/framework/src/main/java/cn/lili/modules/order/cart/render/impl/CommissionRender.java +++ b/framework/src/main/java/cn/lili/modules/order/cart/render/impl/CommissionRender.java @@ -4,6 +4,7 @@ import cn.hutool.core.text.CharSequenceUtil; import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; import cn.lili.common.enums.PromotionTypeEnum; +import cn.lili.common.utils.CurrencyUtil; import cn.lili.modules.goods.service.CategoryService; import cn.lili.modules.order.cart.entity.dto.TradeDTO; import cn.lili.modules.order.cart.entity.enums.CartTypeEnum; @@ -85,7 +86,7 @@ public class CommissionRender implements CartRenderStep { if (kanjiaPromotions.isPresent()) { JSONObject promotionsObj = JSONUtil.parseObj(kanjiaPromotions.get().getValue()); KanjiaActivityGoods kanjiaActivityGoods = JSONUtil.toBean(promotionsObj, KanjiaActivityGoods.class); - priceDetailDTO.setSettlementPrice(kanjiaActivityGoods.getSettlementPrice()); + priceDetailDTO.setSettlementPrice(CurrencyUtil.add(kanjiaActivityGoods.getSettlementPrice(),priceDetailDTO.getBillPrice())); } } } diff --git a/framework/src/main/java/cn/lili/modules/permission/mapper/MenuMapper.java b/framework/src/main/java/cn/lili/modules/permission/mapper/MenuMapper.java index bd3c7235..049fb70e 100644 --- a/framework/src/main/java/cn/lili/modules/permission/mapper/MenuMapper.java +++ b/framework/src/main/java/cn/lili/modules/permission/mapper/MenuMapper.java @@ -24,7 +24,7 @@ public interface MenuMapper extends BaseMapper

{ @Select("SELECT menu.* FROM li_menu AS menu WHERE menu.id IN (" + "SELECT rm.menu_id FROM li_role_menu AS rm WHERE rm.role_id IN (" + "SELECT ur.role_id FROM li_user_role AS ur WHERE ur.user_id=#{userId}) OR rm.role_id IN (" + - "SELECT dr.role_id FROM li_department_role AS dr WHERE dr.id=(" + + "SELECT dr.role_id FROM li_department_role AS dr WHERE dr.department_id =(" + "SELECT department_id FROM li_admin_user AS au WHERE au.id = #{userId})))") List findByUserId(String userId); diff --git a/framework/src/main/java/cn/lili/modules/permission/serviceimpl/AdminUserServiceImpl.java b/framework/src/main/java/cn/lili/modules/permission/serviceimpl/AdminUserServiceImpl.java index a7411f44..53ec3049 100644 --- a/framework/src/main/java/cn/lili/modules/permission/serviceimpl/AdminUserServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/permission/serviceimpl/AdminUserServiceImpl.java @@ -141,15 +141,6 @@ public class AdminUserServiceImpl extends ServiceImpl implements Me if (Boolean.TRUE.equals(authUser.getIsSuper())) { return this.tree(); } - List userMenus = this.baseMapper.findByUserId(authUser.getId()); + List userMenus = this.findUserList(authUser.getId()); return this.tree(userMenus); } @Override public List findUserList(String userId) { - String cacheKey = CachePrefix.MENU_USER_ID.getPrefix() + userId; + String cacheKey = CachePrefix.USER_MENU.getPrefix(UserEnums.MANAGER) + userId; List menuList = cache.get(cacheKey); if (menuList == null) { menuList = this.baseMapper.findByUserId(userId); - cache.put(cacheKey, menuList); + //每5分钟重新确认用户权限 + cache.put(cacheKey, menuList, 300L); } return menuList; } @@ -84,8 +86,7 @@ public class MenuServiceImpl extends ServiceImpl implements Me @Override public boolean saveOrUpdateMenu(Menu menu) { if (CharSequenceUtil.isNotEmpty(menu.getId())) { - cache.vagueDel(CachePrefix.MENU_USER_ID.getPrefix()); - cache.vagueDel(CachePrefix.USER_MENU.getPrefix()); + } return this.saveOrUpdate(menu); } diff --git a/framework/src/main/java/cn/lili/modules/permission/serviceimpl/RoleMenuServiceImpl.java b/framework/src/main/java/cn/lili/modules/permission/serviceimpl/RoleMenuServiceImpl.java index 8966c190..0d2a22dc 100644 --- a/framework/src/main/java/cn/lili/modules/permission/serviceimpl/RoleMenuServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/permission/serviceimpl/RoleMenuServiceImpl.java @@ -47,13 +47,7 @@ public class RoleMenuServiceImpl extends ServiceImpl i @Override public List findAllMenu(String userId) { - String cacheKey = CachePrefix.USER_MENU.getPrefix() + userId; - List menuList = (List) cache.get(cacheKey); - if (menuList == null) { - menuList = menuMapper.getUserRoleMenu(userId); - cache.put(cacheKey, menuList); - } - return menuList; + return menuMapper.getUserRoleMenu(userId); } @@ -65,8 +59,7 @@ public class RoleMenuServiceImpl extends ServiceImpl i this.deleteRoleMenu(roleId); //重新保存角色菜单关系 this.saveBatch(roleMenus); - cache.vagueDel(CachePrefix.MENU_USER_ID.getPrefix()); - cache.vagueDel(CachePrefix.USER_MENU.getPrefix()); + } catch (Exception e) { log.error("修改用户权限错误", e); } @@ -78,8 +71,7 @@ public class RoleMenuServiceImpl extends ServiceImpl i QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("role_id", roleId); this.remove(queryWrapper); - cache.vagueDel(CachePrefix.MENU_USER_ID.getPrefix()); - cache.vagueDel(CachePrefix.USER_MENU.getPrefix()); + } @Override @@ -88,7 +80,6 @@ public class RoleMenuServiceImpl extends ServiceImpl i QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.in("role_id", roleId); this.remove(queryWrapper); - cache.vagueDel(CachePrefix.MENU_USER_ID.getPrefix()); - cache.vagueDel(CachePrefix.USER_MENU.getPrefix()); + } } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/PointsGoodsServiceImpl.java b/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/PointsGoodsServiceImpl.java index b25d7742..95f37f19 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/PointsGoodsServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/PointsGoodsServiceImpl.java @@ -222,6 +222,7 @@ public class PointsGoodsServiceImpl extends AbstractPromotionsServiceImpl query = MapUtil.builder(new HashMap()).put("id", promotions.getSkuId()).build(); Map update = MapUtil.builder(new HashMap()).put("points", promotions.getPoints()).build(); //修改规格索引,发送mq消息 diff --git a/framework/src/main/java/cn/lili/modules/search/entity/dos/HotWordsHistory.java b/framework/src/main/java/cn/lili/modules/search/entity/dos/HotWordsHistory.java new file mode 100644 index 00000000..a012fc33 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/search/entity/dos/HotWordsHistory.java @@ -0,0 +1,52 @@ +package cn.lili.modules.search.entity.dos; + +import cn.lili.mybatis.BaseIdEntity; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.util.Date; + +/** + * HotWordsHistory + * + * @author Chopper + * @version v1.0 + * 2022-04-14 09:39 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@TableName("li_hot_words_history") +public class HotWordsHistory extends BaseIdEntity implements Comparable, Serializable { + + /** + * 词 + */ + private String keywords; + + /** + * 分数 + */ + private Integer score; + + @ApiModelProperty(value = "创建时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private Date createTime; + + public HotWordsHistory(String keywords, Integer score) { + this.keywords = keywords; + this.score = score; + } + + @Override + public int compareTo(HotWordsHistory hotWordsHistory) { + return hotWordsHistory.getScore() - this.score; + } +} diff --git a/framework/src/main/java/cn/lili/modules/search/entity/dto/HotWordsSearchParams.java b/framework/src/main/java/cn/lili/modules/search/entity/dto/HotWordsSearchParams.java new file mode 100644 index 00000000..61cd07c7 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/search/entity/dto/HotWordsSearchParams.java @@ -0,0 +1,83 @@ +package cn.lili.modules.search.entity.dto; + +import cn.hutool.core.text.CharSequenceUtil; +import cn.lili.common.utils.StringUtils; +import cn.lili.common.vo.PageVO; +import cn.lili.modules.goods.entity.enums.GoodsAuthEnum; +import cn.lili.modules.goods.entity.enums.GoodsStatusEnum; +import cn.lili.modules.statistics.entity.dto.StatisticsQueryParam; +import cn.lili.modules.statistics.util.StatisticsDateUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springframework.beans.BeanUtils; + +import javax.validation.constraints.NotNull; +import java.util.Arrays; +import java.util.Calendar; +import java.util.Date; + +/** + * 商品查询条件 + * + * @author pikachu + * @since 2020-02-24 19:27:20 + */ +@EqualsAndHashCode(callSuper = true) +@Data +public class HotWordsSearchParams extends PageVO { + + private static final long serialVersionUID = 2544015852728566887L; + + @NotNull(message = "搜索热词不能为空") + @ApiModelProperty(value = "热词") + private String keywords; + + @ApiModelProperty(value = "快捷搜索", allowableValues = "TODAY, YESTERDAY, LAST_SEVEN, LAST_THIRTY") + private String searchType; + + @ApiModelProperty(value = "类型:年(YEAR)、月(MONTH)") + private String timeType; + + @ApiModelProperty(value = "年份") + private Integer year; + + @ApiModelProperty(value = "月份") + private Integer month; + + + //临时参数 不作为前端传递 + private Date startTIme; + + private Date endTime; + + //搜索热词数量 + private Integer top = 50; + + public QueryWrapper queryWrapper() { + //组织查询时间 + QueryWrapper queryWrapper = new QueryWrapper<>(); + StatisticsQueryParam statisticsQueryParam = new StatisticsQueryParam(); + BeanUtils.copyProperties(this, statisticsQueryParam); + Date[] dates = StatisticsDateUtil.getDateArray(statisticsQueryParam); + + //获取当前时间 + Calendar calendar = Calendar.getInstance(); + + + calendar.set(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH), 0, 0, 0); + calendar.set(Calendar.MILLISECOND, 0); + + if (StringUtils.isNotEmpty(keywords)) { + queryWrapper.like("keywords", keywords); + } + queryWrapper.between("create_time", dates[0], dates[1]); + + startTIme = dates[0]; + endTime = dates[1]; + + return queryWrapper; + } + +} diff --git a/framework/src/main/java/cn/lili/modules/search/entity/vo/HotWordsHistoryVO.java b/framework/src/main/java/cn/lili/modules/search/entity/vo/HotWordsHistoryVO.java new file mode 100644 index 00000000..cbbdc0f9 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/search/entity/vo/HotWordsHistoryVO.java @@ -0,0 +1,33 @@ +package cn.lili.modules.search.entity.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.AllArgsConstructor; +import lombok.Data; + +import java.util.Date; + +/** + * 在线会员 + * + * @author Chopper + * @since 2021-02-21 09:59 + */ +@Data +public class HotWordsHistoryVO { + + /** + * 时间 + */ + private Date createTime; + + /** + * 词 + */ + private String keywords; + + /** + * 分数 + */ + private Integer score; + +} diff --git a/framework/src/main/java/cn/lili/modules/search/mapper/HotWordsHistoryMapper.java b/framework/src/main/java/cn/lili/modules/search/mapper/HotWordsHistoryMapper.java new file mode 100644 index 00000000..97a1d90c --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/search/mapper/HotWordsHistoryMapper.java @@ -0,0 +1,32 @@ +package cn.lili.modules.search.mapper; + +import cn.lili.modules.search.entity.dos.CustomWords; +import cn.lili.modules.search.entity.dos.HotWordsHistory; +import cn.lili.modules.search.entity.vo.HotWordsHistoryVO; +import cn.lili.modules.statistics.entity.vo.OrderStatisticsDataVO; +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +import java.util.List; + +/** + * 搜索热词历史记录数据处理层 + * + * @author paulG + * @since 2020/10/15 + **/ +public interface HotWordsHistoryMapper extends BaseMapper { + + /** + * 获取订单统计数据 + * + * @param queryWrapper 查询条件 + * @return 订单统计列表 + */ + @Select("SELECT sum(score) as score,keywords FROM li_hot_words_history " +" ${ew.customSqlSegment}") + List statistics(@Param(Constants.WRAPPER) Wrapper queryWrapper); + +} 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 0e50be00..84ac2222 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 @@ -26,28 +26,6 @@ public interface EsGoodsSearchService { */ SearchPage searchGoods(EsGoodsSearchDTO searchDTO, PageVO pageVo); - /** - * 获取热门关键词 - * - * @param count 热词数量 - * @return 热词集合 - */ - List getHotWords(Integer count); - - /** - * 设置热门关键词 - * - * @param hotWords 热词分数 - */ - void setHotWords(HotWordsDTO hotWords); - - /** - * 删除热门关键词 - * - * @param keywords 热词 - */ - void deleteHotWords(String keywords); - /** * 获取筛选器 * diff --git a/framework/src/main/java/cn/lili/modules/search/service/HotWordsHistoryService.java b/framework/src/main/java/cn/lili/modules/search/service/HotWordsHistoryService.java new file mode 100644 index 00000000..d357b643 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/search/service/HotWordsHistoryService.java @@ -0,0 +1,41 @@ +package cn.lili.modules.search.service; + +import cn.lili.modules.search.entity.dos.CustomWords; +import cn.lili.modules.search.entity.dos.HotWordsHistory; +import cn.lili.modules.search.entity.dto.HotWordsDTO; +import cn.lili.modules.search.entity.dto.HotWordsSearchParams; +import cn.lili.modules.search.entity.vo.HotWordsHistoryVO; +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import org.apache.poi.ss.formula.functions.T; + +import java.util.Date; +import java.util.List; + +/** + * HotWordsService + * + * @author Chopper + * @version v1.0 + * 2022-04-14 09:35 + */ +public interface HotWordsHistoryService extends IService { + + /** + * 热词统计 + * + * @param hotWordsSearchParams + * @return + */ + List statistics(HotWordsSearchParams hotWordsSearchParams); + + /** + * 根据时间查询 + * + * @param queryTime 查询时间 + * @return + */ + List queryByDay(Date queryTime); +} diff --git a/framework/src/main/java/cn/lili/modules/search/service/HotWordsService.java b/framework/src/main/java/cn/lili/modules/search/service/HotWordsService.java new file mode 100644 index 00000000..a13c9e7e --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/search/service/HotWordsService.java @@ -0,0 +1,47 @@ +package cn.lili.modules.search.service; + +import cn.lili.modules.search.entity.dos.HotWordsHistory; +import cn.lili.modules.search.entity.dto.HotWordsDTO; + +import java.util.List; + +/** + * HotWordsService + * + * @author Chopper + * @version v1.0 + * 2022-04-14 09:35 + */ +public interface HotWordsService { + + /** + * 获取热门关键词 + * + * @param count 热词数量 + * @return 热词集合 + */ + List getHotWords(Integer count); + + /** + * 获取热门关键词 + * + * @param count 热词数量 + * @return 热词集合 + */ + List getHotWordsVO(Integer count); + + /** + * 设置热门关键词 + * + * @param hotWords 热词分数 + */ + void setHotWords(HotWordsDTO hotWords); + + /** + * 删除热门关键词 + * + * @param keywords 热词 + */ + void deleteHotWords(String keywords); + +} 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 bee4efee..620d3bd8 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 @@ -98,42 +98,6 @@ public class EsGoodsSearchServiceImpl implements EsGoodsSearchService { return SearchHitSupport.searchPageFor(search, searchQuery.getPageable()); } - @Override - public List getHotWords(Integer count) { - if (count == null) { - count = 0; - } - List hotWords = new ArrayList<>(); - // redis 排序中,下标从0开始,所以这里需要 -1 处理 - count = count - 1; - Set> set = cache.reverseRangeWithScores(CachePrefix.HOT_WORD.getPrefix(), count); - if (set == null || set.isEmpty()) { - return new ArrayList<>(); - } - for (ZSetOperations.TypedTuple defaultTypedTuple : set) { - hotWords.add(Objects.requireNonNull(defaultTypedTuple.getValue()).toString()); - } - return hotWords; - } - - @Override - public void setHotWords(HotWordsDTO hotWords) { - cache.incrementScore(CachePrefix.HOT_WORD.getPrefix(), hotWords.getKeywords(), hotWords.getPoint()); - } - - /** - * 删除热门关键词 - * - * @param keywords 热词 - */ - @Override - public void deleteHotWords(String keywords) { - if (CharSequenceUtil.isEmpty(keywords)) { - cache.vagueDel(CachePrefix.HOT_WORD.getPrefix()); - } else { - cache.zRemove(CachePrefix.HOT_WORD.getPrefix(), keywords); - } - } @Override public EsGoodsRelatedInfo getSelector(EsGoodsSearchDTO goodsSearch, PageVO pageVo) { diff --git a/framework/src/main/java/cn/lili/modules/search/serviceimpl/HotWordsHistoryServiceImpl.java b/framework/src/main/java/cn/lili/modules/search/serviceimpl/HotWordsHistoryServiceImpl.java new file mode 100644 index 00000000..c3091ef7 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/search/serviceimpl/HotWordsHistoryServiceImpl.java @@ -0,0 +1,53 @@ +package cn.lili.modules.search.serviceimpl; + +import cn.lili.common.utils.DateUtil; +import cn.lili.modules.search.entity.dos.HotWordsHistory; +import cn.lili.modules.search.entity.dto.HotWordsSearchParams; +import cn.lili.modules.search.mapper.HotWordsHistoryMapper; +import cn.lili.modules.search.service.HotWordsHistoryService; +import cn.lili.modules.search.service.HotWordsService; +import cn.lili.modules.statistics.entity.enums.SearchTypeEnum; +import cn.lili.modules.statistics.util.StatisticsDateUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.*; + +/** + * 历史热词 + * + * @author paulG + * @since 2020/10/15 + **/ +@Service +public class HotWordsHistoryServiceImpl extends ServiceImpl implements HotWordsHistoryService { + + @Autowired + private HotWordsService hotWordsService; + + @Override + public List statistics(HotWordsSearchParams hotWordsSearchParams) { + if (hotWordsSearchParams.getSearchType().equals(SearchTypeEnum.TODAY.name())) { + return hotWordsService.getHotWordsVO(hotWordsSearchParams.getTop()); + } + QueryWrapper queryWrapper = hotWordsSearchParams.queryWrapper(); + + queryWrapper.groupBy("keywords"); + queryWrapper.orderByDesc("score"); + queryWrapper.last("limit " + hotWordsSearchParams.getTop()); + List list = baseMapper.statistics(queryWrapper); + return list; + } + + @Override + public List queryByDay(Date queryTime) { + QueryWrapper queryWrapper = new QueryWrapper(); + + Date[] dates = StatisticsDateUtil.getDateArray(queryTime); + queryWrapper.between("create_time", dates[0], dates[1]); + return list(queryWrapper); + } + +} diff --git a/framework/src/main/java/cn/lili/modules/search/serviceimpl/HotWordsServiceImpl.java b/framework/src/main/java/cn/lili/modules/search/serviceimpl/HotWordsServiceImpl.java new file mode 100644 index 00000000..d036f96e --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/search/serviceimpl/HotWordsServiceImpl.java @@ -0,0 +1,96 @@ +package cn.lili.modules.search.serviceimpl; + +import cn.lili.cache.Cache; +import cn.lili.cache.CachePrefix; +import cn.lili.modules.search.entity.dos.HotWordsHistory; +import cn.lili.modules.search.entity.dto.HotWordsDTO; +import cn.lili.modules.search.mapper.HotWordsHistoryMapper; +import cn.lili.modules.search.service.HotWordsService; +import cn.lili.modules.system.entity.dos.Setting; +import cn.lili.modules.system.entity.enums.SettingEnum; +import cn.lili.modules.system.service.SettingService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.ZSetOperations; +import org.springframework.stereotype.Service; + +import java.util.*; + +/** + * HotWordsServiceImpl + * + * @author Chopper + * @version v1.0 + * 2022-04-14 09:35 + */ +@Slf4j +@Service +public class HotWordsServiceImpl implements HotWordsService { + + /** + * 缓存 + */ + @Autowired + private Cache cache; + + @Override + public List getHotWords(Integer count) { + if (count == null) { + count = 0; + } + List hotWords = new ArrayList<>(); + // redis 排序中,下标从0开始,所以这里需要 -1 处理 + count = count - 1; + Set> set = cache.reverseRangeWithScores(CachePrefix.HOT_WORD.getPrefix(), count); + if (set == null || set.isEmpty()) { + return new ArrayList<>(); + } + for (ZSetOperations.TypedTuple defaultTypedTuple : set) { + hotWords.add(Objects.requireNonNull(defaultTypedTuple.getValue()).toString()); + } + return hotWords; + } + + @Override + public List getHotWordsVO(Integer count) { + if (count == null) { + count = 50; + } + List hotWords = new ArrayList<>(); + // redis 排序中,下标从0开始,所以这里需要 -1 处理 + count = count - 1; + Set> set = cache.reverseRangeWithScores(CachePrefix.HOT_WORD.getPrefix(), count); + if (set == null || set.isEmpty()) { + return new ArrayList<>(); + } + for (ZSetOperations.TypedTuple defaultTypedTuple : set) { + try { + hotWords.add(new HotWordsHistory(defaultTypedTuple.getValue().toString(), + defaultTypedTuple.getScore().intValue())); + } catch (Exception e) { + log.error("读取热词错误", e); + } + + } + + + Collections.sort(hotWords); + return hotWords; + } + + @Override + public void setHotWords(HotWordsDTO hotWords) { + cache.incrementScore(CachePrefix.HOT_WORD.getPrefix(), hotWords.getKeywords(), hotWords.getPoint()); + } + + /** + * 删除热门关键词 + * + * @param keywords 热词 + */ + @Override + public void deleteHotWords(String keywords) { + cache.zRemove(CachePrefix.HOT_WORD.getPrefix(), keywords); + } + +} diff --git a/framework/src/main/java/cn/lili/modules/statistics/util/StatisticsDateUtil.java b/framework/src/main/java/cn/lili/modules/statistics/util/StatisticsDateUtil.java index 8161765d..d97b1b82 100644 --- a/framework/src/main/java/cn/lili/modules/statistics/util/StatisticsDateUtil.java +++ b/framework/src/main/java/cn/lili/modules/statistics/util/StatisticsDateUtil.java @@ -121,4 +121,30 @@ public class StatisticsDateUtil { } } + + /** + * 根据一个日期,获取这一天的开始时间和结束时间 + * + * @param queryDate + * @return + */ + public static Date[] getDateArray(Date queryDate) { + + Date[] dateArray = new Date[2]; + Calendar calendar = Calendar.getInstance(); + calendar.setTime(queryDate); + //时间归到今天凌晨0点 + calendar.set(Calendar.HOUR_OF_DAY, 0); + calendar.set(Calendar.MINUTE, 0); + calendar.set(Calendar.SECOND, 0); + calendar.set(Calendar.MILLISECOND, 0); + dateArray[0] = calendar.getTime(); + + calendar.set(Calendar.DAY_OF_YEAR, calendar.get(Calendar.DAY_OF_YEAR) + 1); + calendar.set(Calendar.SECOND, calendar.get(Calendar.SECOND) - 1); + + dateArray[1] = calendar.getTime(); + return dateArray; + } + } diff --git a/framework/src/main/java/cn/lili/modules/system/entity/dto/HotWordsSetting.java b/framework/src/main/java/cn/lili/modules/system/entity/dto/HotWordsSetting.java new file mode 100644 index 00000000..0b98d43b --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/system/entity/dto/HotWordsSetting.java @@ -0,0 +1,28 @@ +package cn.lili.modules.system.entity.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + +/** + * 搜索热词 + * + * @author Bulbasaur + * @since 2021/5/16 11:10 下午 + */ +@Data +public class HotWordsSetting implements Serializable { + + //热词1-5,默认分数1-5 + + @ApiModelProperty(value = "热词默认配置") + private List hotWordsSettingItems = new ArrayList<>(); + + + @ApiModelProperty("每日保存数量") + private Integer saveNum; + +} diff --git a/framework/src/main/java/cn/lili/modules/system/entity/dto/HotWordsSettingItem.java b/framework/src/main/java/cn/lili/modules/system/entity/dto/HotWordsSettingItem.java new file mode 100644 index 00000000..41fa826c --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/system/entity/dto/HotWordsSettingItem.java @@ -0,0 +1,41 @@ +package cn.lili.modules.system.entity.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +/** + * 积分签到设置 + * + * @author Chopper + * @since 2021-02-26 11:48 + */ +@Data +public class HotWordsSettingItem implements Comparable, Serializable { + + + @ApiModelProperty(value = "热词") + private String keywords; + + + @ApiModelProperty(value = "默认分数") + private Integer score; + + + public Integer getScore() { + if (score == null || score < 0) { + return 0; + } + return score; + } + + public void setScore(Integer score) { + this.score = score; + } + + @Override + public int compareTo(HotWordsSettingItem pointSettingItem) { + return pointSettingItem.getScore(); + } +} diff --git a/framework/src/main/java/cn/lili/modules/system/entity/enums/SettingEnum.java b/framework/src/main/java/cn/lili/modules/system/entity/enums/SettingEnum.java index ec6b1e23..55f55c84 100644 --- a/framework/src/main/java/cn/lili/modules/system/entity/enums/SettingEnum.java +++ b/framework/src/main/java/cn/lili/modules/system/entity/enums/SettingEnum.java @@ -44,5 +44,7 @@ public enum SettingEnum { //支付宝支付设置 ALIPAY_PAYMENT, //微信支付设置 - WECHAT_PAYMENT; + WECHAT_PAYMENT, + //热词设置 + HOT_WORDS } 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 ec13d030..10a38764 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 @@ -1,8 +1,6 @@ package cn.lili.modules.system.token; import cn.hutool.core.text.CharSequenceUtil; -import cn.lili.cache.Cache; -import cn.lili.cache.CachePrefix; import cn.lili.common.security.AuthUser; import cn.lili.common.security.enums.PermissionEnum; import cn.lili.common.security.enums.UserEnums; @@ -11,7 +9,6 @@ import cn.lili.common.security.token.TokenUtil; import cn.lili.common.security.token.base.AbstractTokenGenerate; import cn.lili.modules.permission.entity.dos.AdminUser; import cn.lili.modules.permission.entity.vo.UserMenuVO; -import cn.lili.modules.permission.service.RoleMenuService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -32,21 +29,10 @@ public class ManagerTokenGenerate extends AbstractTokenGenerate { @Autowired private TokenUtil tokenUtil; - @Autowired - private RoleMenuService roleMenuService; - @Autowired - private Cache cache; - @Override public Token createToken(AdminUser adminUser, Boolean longTerm) { AuthUser authUser = new AuthUser(adminUser.getUsername(), adminUser.getId(), adminUser.getAvatar(), UserEnums.MANAGER, adminUser.getNickName(), adminUser.getIsSuper()); - - - List userMenuVOList = roleMenuService.findAllMenu(authUser.getId()); - //缓存权限列表 - cache.put(CachePrefix.PERMISSION_LIST.getPrefix(UserEnums.MANAGER) + authUser.getId(), this.permissionList(userMenuVOList)); - return tokenUtil.createToken(adminUser.getUsername(), authUser, longTerm, UserEnums.MANAGER); } diff --git a/manager-api/src/main/java/cn/lili/controller/hotwords/HotWordsManagerController.java b/manager-api/src/main/java/cn/lili/controller/hotwords/HotWordsManagerController.java deleted file mode 100644 index cf7a46d3..00000000 --- a/manager-api/src/main/java/cn/lili/controller/hotwords/HotWordsManagerController.java +++ /dev/null @@ -1,54 +0,0 @@ -package cn.lili.controller.hotwords; - -import cn.lili.common.enums.ResultUtil; -import cn.lili.common.vo.ResultMessage; -import cn.lili.modules.search.entity.dto.HotWordsDTO; -import cn.lili.modules.search.service.EsGoodsSearchService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -/** - * 管理端,app版本控制器 - * - * @author Chopper - * @since 2018-07-04 21:50:52 - */ -@RestController -@Api(tags = "管理端,系统设置扩展接口") -@RequestMapping("/manager/hotwords/hotwords") -public class HotWordsManagerController { - - @Autowired - private EsGoodsSearchService esGoodsSearchService; - - @ApiOperation(value = "获取热词") - @GetMapping - public ResultMessage getHotWords() { - return ResultUtil.data(esGoodsSearchService.getHotWords(100)); - } - - @ApiOperation(value = "设置热词") - @PostMapping - public ResultMessage paymentForm(@Validated HotWordsDTO hotWords) { - esGoodsSearchService.setHotWords(hotWords); - return ResultUtil.success(); - } - - @ApiOperation(value = "删除热词") - @DeleteMapping("/{words}") - public ResultMessage deleteWords(@PathVariable String words) { - esGoodsSearchService.deleteHotWords(words); - return ResultUtil.success(); - } - - @ApiOperation(value = "删除全部热词") - @DeleteMapping("") - public ResultMessage deleteWordsAll() { - esGoodsSearchService.deleteHotWords(null); - return ResultUtil.success(); - } - -} diff --git a/manager-api/src/main/java/cn/lili/controller/other/HotWordsManagerController.java b/manager-api/src/main/java/cn/lili/controller/other/HotWordsManagerController.java new file mode 100644 index 00000000..a8b5f01a --- /dev/null +++ b/manager-api/src/main/java/cn/lili/controller/other/HotWordsManagerController.java @@ -0,0 +1,83 @@ +package cn.lili.controller.other; + +import cn.lili.common.enums.ResultUtil; +import cn.lili.common.vo.ResultMessage; +import cn.lili.modules.search.entity.dos.HotWordsHistory; +import cn.lili.modules.search.entity.dto.HotWordsDTO; +import cn.lili.modules.search.entity.dto.HotWordsSearchParams; +import cn.lili.modules.search.service.HotWordsHistoryService; +import cn.lili.modules.search.service.HotWordsService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.Data; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.format.annotation.DateTimeFormat; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.validation.constraints.NotNull; +import java.util.Collections; +import java.util.Comparator; +import java.util.Date; +import java.util.List; + +/** + * 管理端,热词管理 + * + * @author Chopper + * @since 2018-07-04 21:50:52 + */ +@RestController +@Api(tags = "管理端,热词管理") +@RequestMapping("/manager/hotwords/hotwords") +public class HotWordsManagerController { + + @Autowired + private HotWordsService hotWordsService; + + + @Autowired + private HotWordsHistoryService hotWordsHistoryService; + + @ApiOperation(value = "获取热词") + @GetMapping + public ResultMessage getHotWords() { + return ResultUtil.data(hotWordsService.getHotWords(100)); + } + + @ApiOperation(value = "设置热词") + @PostMapping + public ResultMessage setHotWords(@Validated HotWordsDTO hotWords) { + hotWordsService.setHotWords(hotWords); + return ResultUtil.success(); + } + + @ApiOperation(value = "删除热词") + @DeleteMapping + public ResultMessage deleteWords(String words) { + hotWordsService.deleteHotWords(words); + return ResultUtil.success(); + } + + @ApiOperation(value = "历史热词") + @GetMapping("/history") + public ResultMessage deleteWords(HistorySearchParams historySearchParams) { + List hotWordsHistoryList = hotWordsHistoryService.queryByDay(historySearchParams.getDate()); + Collections.sort(hotWordsHistoryList); + return ResultUtil.data(hotWordsHistoryList); + } + + @ApiOperation(value = "热词统计") + @GetMapping("/statistics") + public ResultMessage deleteWords(HotWordsSearchParams hotWordsSearchParams) { + return ResultUtil.data(hotWordsHistoryService.statistics(hotWordsSearchParams)); + } +} + +@Data +class HistorySearchParams { + @DateTimeFormat(pattern = "yyyy-MM-dd") + @NotNull(message = "查询日期不能为空") + private Date date; + +} diff --git a/manager-api/src/main/java/cn/lili/controller/passport/AdminUserManagerController.java b/manager-api/src/main/java/cn/lili/controller/passport/AdminUserManagerController.java index 1be65f27..d93e73e1 100644 --- a/manager-api/src/main/java/cn/lili/controller/passport/AdminUserManagerController.java +++ b/manager-api/src/main/java/cn/lili/controller/passport/AdminUserManagerController.java @@ -88,13 +88,10 @@ public class AdminUserManagerController { @GetMapping(value = "/info") @ApiOperation(value = "获取当前登录用户接口") - public ResultMessage getUserInfo() { + public ResultMessage getUserInfo() { AuthUser tokenUser = UserContext.getCurrentUser(); if (tokenUser != null) { - AdminUserVO adminUser = new AdminUserVO(adminUserService.findByUsername(tokenUser.getUsername())); - if (StringUtils.isNotEmpty(adminUser.getDepartmentId())) { - adminUser.setDepartmentTitle(departmentService.getById(adminUser.getDepartmentId()).getTitle()); - } + AdminUser adminUser = adminUserService.findByUsername(tokenUser.getUsername()); adminUser.setPassword(null); return ResultUtil.data(adminUser); } diff --git a/manager-api/src/main/java/cn/lili/controller/setting/SettingManagerController.java b/manager-api/src/main/java/cn/lili/controller/setting/SettingManagerController.java index e0f9c48d..bf85cf9b 100644 --- a/manager-api/src/main/java/cn/lili/controller/setting/SettingManagerController.java +++ b/manager-api/src/main/java/cn/lili/controller/setting/SettingManagerController.java @@ -185,6 +185,10 @@ public class SettingManagerController { return setting == null ? ResultUtil.data(new ImSetting()) : ResultUtil.data(JSONUtil.toBean(setting.getSettingValue(), ImSetting.class)); + case HOT_WORDS: + return setting == null ? + ResultUtil.data(new HotWordsSetting()) : + ResultUtil.data(JSONUtil.toBean(setting.getSettingValue(), HotWordsSetting.class)); default: throw new ServiceException(ResultCode.SETTING_NOT_TO_SET); }