Merge branch 'backup'

# Conflicts:
#	manager-api/src/main/java/cn/lili/controller/member/MemberManagerController.java
#	manager-api/src/main/java/cn/lili/controller/other/PageDataManagerController.java
#	manager-api/src/main/java/cn/lili/controller/passport/AdminUserManagerController.java
#	manager-api/src/main/java/cn/lili/controller/permission/MenuManagerController.java
#	manager-api/src/main/java/cn/lili/controller/setting/RegionManagerController.java
#	manager-api/src/main/java/cn/lili/controller/store/StoreManagerController.java
This commit is contained in:
Chopper 2021-07-25 17:51:05 +08:00
commit fe8523ca3f
17 changed files with 163 additions and 68 deletions

View File

@ -4,8 +4,6 @@ import cn.lili.common.enums.ResultUtil;
import cn.lili.common.security.context.UserContext;
import cn.lili.common.vo.PageVO;
import cn.lili.common.vo.ResultMessage;
import cn.lili.modules.statistics.aop.PageViewPoint;
import cn.lili.modules.statistics.aop.enums.PageViewEnum;
import cn.lili.modules.store.entity.dto.StoreBankDTO;
import cn.lili.modules.store.entity.dto.StoreCompanyDTO;
import cn.lili.modules.store.entity.dto.StoreOtherInfoDTO;
@ -61,7 +59,6 @@ public class StoreBuyerController {
@ApiOperation(value = "通过id获取店铺信息")
@ApiImplicitParam(name = "id", value = "店铺ID", required = true, paramType = "path")
@GetMapping(value = "/get/detail/{id}")
@PageViewPoint(type = PageViewEnum.STORE, id = "#id")
public ResultMessage<StoreBasicInfoVO> detail(@NotNull @PathVariable String id) {
return ResultUtil.data(storeDetailService.getStoreBasicInfoDTO(id));
}

View File

@ -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());
}
}

View File

@ -60,7 +60,7 @@ public interface Cache<T> {
* 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<T> {
/**
* 往缓存中写入内容
*
* @param key 缓存key
* @param key 缓存key
* @param value 缓存value
* @param exp 超时时间单位为秒
*/
@ -77,9 +77,9 @@ public interface Cache<T> {
/**
* 往缓存中写入内容
*
* @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<T> {
/**
* 读取缓存值
*
* @param key 缓存key
* @param key 缓存key
* @param hashKey map value
* @return 返回缓存中的数据
*/
@ -142,8 +142,7 @@ public interface Cache<T> {
* 是否包含
*
* @param key 缓存key
* @return 缓存中的数据
*
* @return 缓存中的数据
*/
boolean hasKey(Object key);
@ -164,7 +163,7 @@ public interface Cache<T> {
* 效率较高的 计数器
* 如需清零按照普通key 移除即可
*
* @param key key值
* @param key key值
* @param value 去重统计值
* @return 计数器结果
*/
@ -223,6 +222,16 @@ public interface Cache<T> {
*/
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大的在前面

View File

@ -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);
}
/**

View File

@ -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;
}
}

View File

@ -34,6 +34,14 @@ public interface EsGoodsSearchService {
*/
List<String> getHotWords(Integer start, Integer end);
/**
* 设置热门关键词
*
* @param words 关键词
* @param point 赋予分数
*/
void setHotWords(String words, Integer point);
/**
* 获取筛选器
*

View File

@ -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<EsGoodsIndex> 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<String> getHotWords(Integer start, Integer end) {
List<String> hotWords = new ArrayList<>();
Set<DefaultTypedTuple> set = cache.reverseRangeWithScores(HotWordsRedisKeyEnum.SEARCH_HOT_WORD.name(), start, end);
Set<DefaultTypedTuple> 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

View File

@ -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<String> superPermissions, List<String> 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*");
}
}

View File

@ -3,6 +3,7 @@ package cn.lili.controller.member;
import cn.lili.common.enums.ResultUtil;
import cn.lili.common.vo.PageVO;
import cn.lili.common.vo.ResultMessage;
import cn.lili.modules.system.aspect.annotation.DemoSite;
import cn.lili.modules.member.entity.dos.Member;
import cn.lili.modules.member.entity.dto.ManagerMemberEditDTO;
import cn.lili.modules.member.entity.dto.MemberAddDTO;

View File

@ -3,6 +3,7 @@ package cn.lili.controller.other;
import cn.lili.common.enums.ResultUtil;
import cn.lili.common.vo.PageVO;
import cn.lili.common.vo.ResultMessage;
import cn.lili.modules.system.aspect.annotation.DemoSite;
import cn.lili.modules.page.entity.dos.PageData;
import cn.lili.modules.page.entity.dto.PageDataDTO;
import cn.lili.modules.page.entity.vos.PageDataListVO;

View File

@ -10,6 +10,7 @@ import cn.lili.common.utils.StringUtils;
import cn.lili.common.vo.PageVO;
import cn.lili.common.vo.ResultMessage;
import cn.lili.common.vo.SearchVO;
import cn.lili.modules.system.aspect.annotation.DemoSite;
import cn.lili.modules.permission.entity.dos.AdminUser;
import cn.lili.modules.permission.entity.dto.AdminUserDTO;
import cn.lili.modules.permission.entity.vo.AdminUserVO;

View File

@ -2,6 +2,7 @@ package cn.lili.controller.permission;
import cn.lili.common.enums.ResultUtil;
import cn.lili.common.vo.ResultMessage;
import cn.lili.modules.system.aspect.annotation.DemoSite;
import cn.lili.modules.permission.entity.dos.Menu;
import cn.lili.modules.permission.entity.dto.MenuSearchParams;
import cn.lili.modules.permission.entity.vo.MenuVO;

View File

@ -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();
}
}

View File

@ -39,7 +39,6 @@ public class InstantDeliveryManagerController {
IPage<InstantDelivery> data = instantDeliveryService.page(PageUtil.initPage(page));
//组织数据结构
IPage<InstantDeliveryVO> newData = instantDeliveryService.getInstantDeliveryPage(data, page);
System.out.println();
//返回数据
return ResultUtil.data(newData);
}

View File

@ -3,8 +3,8 @@ package cn.lili.controller.setting;
import cn.lili.common.enums.ResultUtil;
import cn.lili.common.vo.ResultMessage;
import cn.lili.modules.system.aspect.annotation.DemoSite;
import cn.lili.modules.system.entity.dos.Region;
import cn.lili.modules.system.service.RegionService;
import cn.lili.modules.system.entity.dos.Region;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;

View File

@ -3,6 +3,7 @@ package cn.lili.controller.store;
import cn.lili.common.enums.ResultUtil;
import cn.lili.common.vo.PageVO;
import cn.lili.common.vo.ResultMessage;
import cn.lili.modules.system.aspect.annotation.DemoSite;
import cn.lili.modules.goods.entity.vos.CategoryVO;
import cn.lili.modules.store.entity.dos.Store;
import cn.lili.modules.store.entity.dto.AdminStoreApplyDTO;

View File

@ -4,6 +4,7 @@ import cn.hutool.core.util.StrUtil;
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.SecurityEnum;
import cn.lili.common.security.enums.UserEnums;
import cn.lili.common.security.token.SecretKeyUtil;
@ -20,6 +21,8 @@ import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.web.authentication.www.BasicAuthenticationFilter;
import org.springframework.util.PatternMatchUtils;
import org.springframework.web.bind.annotation.RequestMethod;
import javax.naming.NoPermissionException;
import javax.servlet.FilterChain;
@ -71,27 +74,28 @@ public class ManagerAuthenticationFilter extends BasicAuthenticationFilter {
*/
private void customAuthentication(HttpServletRequest request, HttpServletResponse response, UsernamePasswordAuthenticationToken authentication) throws NoPermissionException {
AuthUser authUser = (AuthUser) authentication.getDetails();
String requestUrl = request.getRequestURI();
Map<String, List<String>> permission = (Map<String, List<String>>) cache.get(CachePrefix.PERMISSION_LIST.getPrefix(UserEnums.MANAGER) + authUser.getId());
if (authUser.getIsSuper()) {
return;
} else {
//用户是否拥有权限判定œ
//如果不是超级管理员 不做鉴权
if (!authUser.getIsSuper()) {
//获取数据权限
// if (request.getMethod().equals(RequestMethod.GET.name())) {
// if (!PatternMatchUtils.simpleMatch(permission.get(PermissionEnum.SUPER).toArray(new String[0]), request.getRequestURI()) ||
// PatternMatchUtils.simpleMatch(permission.get(PermissionEnum.QUERY).toArray(new String[0]), request.getRequestURI())) {
//
// ResponseUtil.output(response, ResponseUtil.resultMap(false, 401, "抱歉,您没有访问权限"));
// throw new NoPermissionException("权限不足");
// }
// } else {
// if (!PatternMatchUtils.simpleMatch(permission.get(PermissionEnum.SUPER).toArray(new String[0]), request.getRequestURI())) {
//
// ResponseUtil.output(response, ResponseUtil.resultMap(false, 401, "抱歉,您没有访问权限"));
// throw new NoPermissionException("权限不足");
// }
// }
return;
if (request.getMethod().equals(RequestMethod.GET.name())) {
//如果用户的超级权限和查阅权限都不包含当前请求的api
if (!PatternMatchUtils.simpleMatch(permission.get(PermissionEnum.SUPER.name()).toArray(new String[0]), requestUrl) &&
!PatternMatchUtils.simpleMatch(permission.get(PermissionEnum.QUERY.name()).toArray(new String[0]), requestUrl)) {
ResponseUtil.output(response, ResponseUtil.resultMap(false, 401, "抱歉,您没有访问权限"));
throw new NoPermissionException("权限不足");
}
}
//非get请求数据操作 判定
else {
if (!PatternMatchUtils.simpleMatch(permission.get(PermissionEnum.SUPER.name()).toArray(new String[0]), request.getRequestURI())) {
ResponseUtil.output(response, ResponseUtil.resultMap(false, 401, "抱歉,您没有访问权限"));
throw new NoPermissionException("权限不足");
}
}
}
}