Commit 1bf10cec by shenjunjie

Merge branch 'feature' into 'release'

Feature

See merge request !265
parents 3c3bec1b d61e307f
......@@ -4,13 +4,18 @@ import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.zhiwei.brandkbs2.common.GenericAttribute;
import com.zhiwei.brandkbs2.dao.BehaviorDao;
import com.zhiwei.brandkbs2.dao.UserLogRecordDao;
import com.zhiwei.brandkbs2.model.ResponseResult;
import com.zhiwei.brandkbs2.pojo.Behavior;
import com.zhiwei.brandkbs2.pojo.UserInfo;
import com.zhiwei.brandkbs2.pojo.UserLogRecord;
import com.zhiwei.brandkbs2.service.UserService;
import com.zhiwei.brandkbs2.util.Tools;
import com.zhiwei.middleware.auth.util.JwtUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
......@@ -24,6 +29,7 @@ import org.springframework.web.servlet.HandlerMapping;
import javax.annotation.Resource;
import javax.servlet.ServletRequest;
import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Method;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.*;
......@@ -46,9 +52,12 @@ public class AopLogRecord {
@Resource(name = "behaviorDao")
private BehaviorDao behaviorDao;
@Resource(name = "UserLogRecordDao")
private UserLogRecordDao userLogRecordDao;
private static final List<String> URL_PATTERNS = Arrays.asList("/getNewAll", "/getNew", "/schedule");
@AfterReturning(value = "execution(public * com..controller..admin..*Controller.*(..)) || execution(* com..controller..app..*Controller.*(..))", returning = "ResponseResult")
@AfterReturning(value = "execution(public * com..controller..admin..*Controller.*(..)) || execution(* com..controller..app..*Controller.*(..)) || execution(* com..controller..LoginController.checkBind())", returning = "ResponseResult")
private void beforeLog(JoinPoint joinPoint, ResponseResult ResponseResult) throws UnknownHostException, ClassNotFoundException{
long now = System.currentTimeMillis();
// RequestContextHolder 顾名思义 持有 request 上下文的容器
......@@ -84,7 +93,8 @@ public class AopLogRecord {
}
String userId = userIdObj.toString();
String projectId = request.getHeader("pid");
String nickName = userService.queryUserInfo(userId, projectId).getNickname();
UserInfo userInfo = userService.queryUserInfo(userId, projectId);
String nickName = userInfo.getNickname();
// 请求地址和服务器地址
String severAddress = InetAddress.getLocalHost().getHostAddress();
String ipAddress = Tools.getIpAddress(request);
......@@ -92,57 +102,75 @@ public class AopLogRecord {
List<Map<String, Object>> arguments = getRequestArguments(joinPoint);
Behavior behavior = new Behavior(userId, projectId, nickName, ipAddress, now, controller, method, backstage,
uri, methodName, httpMethod, arguments, now, severAddress, null);
setInfo(behavior, uri, joinPoint, methodSignature, arguments, ResponseResult);
UserLogRecord userLogRecord = userLogRecord(projectId, userInfo, joinPoint, methodSignature, ResponseResult);
if (Objects.nonNull(userLogRecord)) {
userLogRecordDao.insertOne(userLogRecord);
}
String collectionName = behaviorDao.generateCollectionName();
behaviorDao.insertOneWithoutId(behavior, collectionName);
}
}
}
/**
* 用户行为实体搜索关键词、渠道库渠道、事件详情事件名赋值
*
* @param behavior
* @param uri
* @param joinPoint
* @param methodSignature
* @param arguments
* @param ResponseResult
*/
private void setInfo(Behavior behavior, String uri, JoinPoint joinPoint, MethodSignature methodSignature, List<Map<String, Object>> arguments, ResponseResult ResponseResult) {
String record = null;
private UserLogRecord userLogRecord(String projectId, UserInfo userInfo, JoinPoint joinPoint, MethodSignature methodSignature, ResponseResult responseResult) {
long now = System.currentTimeMillis();
Object[] args = joinPoint.getArgs();
// 搜索接口关键词记录
if (uri.contains("/app/search") && !Tools.isEmpty(args)) {
if (1 == arguments.size()) {
if (!(args[0] instanceof Integer) && !(args[0] instanceof String)) {
Method method = methodSignature.getMethod();
// 方法上无@LogRecord注解
if (!method.isAnnotationPresent(LogRecord.class)) {
return null;
}
String prefix = method.getAnnotation(LogRecord.class).description();
// 注解上操作描述description为空或空字符
if (StringUtils.isEmpty(prefix)){
return null;
}
String[] value = method.getAnnotation(LogRecord.class).values();
// 注解value为空字符串(value使用默认值未设置)
if (1 == value.length && StringUtils.isEmpty(value[0])){
return new UserLogRecord(projectId, userInfo.getUserId(), userInfo.getNickname(), prefix, userInfo.getRoleId(), now, now);
}
// 获取接口传参(value为获取传参的具体字段)并与操作描述description拼接返回,传参值为实体
if (method.getAnnotation(LogRecord.class).arguments() && method.getAnnotation(LogRecord.class).entity()) {
JSONObject jsonObject = (JSONObject) JSON.toJSON(args[0]);
record = Objects.nonNull(jsonObject.get("keyword")) ? String.valueOf(jsonObject.get("keyword")) : String.valueOf(jsonObject.get("search"));
List<Object> res = new ArrayList<>(value.length);
for (String v : value) {
Object o = jsonObject.get(v);
if (Objects.nonNull(o)) {
res.add(o);
}
} else {
}
String suffix = CollectionUtils.isNotEmpty(res) ? "-" + Tools.concat(res) : "";
return new UserLogRecord(projectId, userInfo.getUserId(), userInfo.getNickname(), prefix + suffix, userInfo.getRoleId(), now, now);
}
// 获取接口传参(value为获取传参的具体字段)并与操作描述description拼接返回,传参值不为实体
if (method.getAnnotation(LogRecord.class).arguments() && !method.getAnnotation(LogRecord.class).entity()) {
String[] parameterNames = methodSignature.getParameterNames();
List<Object> res = new ArrayList<>(value.length);
for (String v : value) {
for (int i = 0; i < parameterNames.length; i++) {
if (Objects.equals(parameterNames[i], "keyword")) {
record = String.valueOf(args[i]);
if (Objects.equals(parameterNames[i], v)) {
res.add(args[i]);
}
}
}
behavior.setRecord(record);
return;
String suffix = CollectionUtils.isNotEmpty(res) ? "-" + Tools.concat(res) : "";
return new UserLogRecord(projectId, userInfo.getUserId(), userInfo.getNickname(), prefix + suffix, userInfo.getRoleId(), now, now);
}
// 获取接口返回值(value为获取返回值的具体字段)并与操作描述description拼接返回,返回值为实体
if (!method.getAnnotation(LogRecord.class).arguments() && method.getAnnotation(LogRecord.class).entity()) {
List<Object> res = new ArrayList<>(value.length);
for (String v : value) {
JSONObject jsonObject = (JSONObject) JSONObject.toJSON(responseResult.getData());
String s = String.valueOf(jsonObject.get(v));
if (Objects.nonNull(s)) {
res.add(s);
}
// 渠道记录
if (uri.contains("/app/channel/baseInfo")) {
JSONObject jsonObject = (JSONObject) JSONObject.toJSON(ResponseResult.getData());
record = Tools.concat(jsonObject.get("platform"), jsonObject.get("realSource"), jsonObject.get("source"));
behavior.setRecord(record);
return;
}
// 事件标题记录
if (uri.contains("/app/event/detail/baseInfo")) {
JSONObject jsonObject = (JSONObject) JSON.toJSON(ResponseResult.getData());
record = String.valueOf(jsonObject.get("title"));
behavior.setRecord(record);
String suffix = CollectionUtils.isNotEmpty(res) ? "-" + Tools.concat(res) : "";
return new UserLogRecord(projectId, userInfo.getUserId(), userInfo.getNickname(), prefix + suffix, userInfo.getRoleId(), now, now);
}
return new UserLogRecord(projectId, userInfo.getUserId(), userInfo.getNickname(), prefix, userInfo.getRoleId(), now, now);
}
/**
......
package com.zhiwei.brandkbs2.aop;
import java.lang.annotation.*;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface LogRecord {
String[] values() default "";
String description() default "";
boolean arguments() default false;
boolean entity() default false;
}
package com.zhiwei.brandkbs2.controller;
import com.alibaba.fastjson.JSONObject;
import com.zhiwei.brandkbs2.aop.LogRecord;
import com.zhiwei.brandkbs2.auth.Auth;
import com.zhiwei.brandkbs2.enmus.RoleEnum;
import com.zhiwei.brandkbs2.model.ResponseResult;
......@@ -82,6 +83,7 @@ public class LoginController extends BaseController {
}
@ApiOperation("校验用户是否已有绑定关系")
@LogRecord(description = "登录")
@GetMapping("/user/login/checkBind")
public ResponseResult checkBind() {
return ResponseResult.success(userService.checkUserRoles());
......
......@@ -5,6 +5,7 @@ import com.zhiwei.brandkbs2.auth.UserThreadLocal;
import com.zhiwei.brandkbs2.controller.BaseController;
import com.zhiwei.brandkbs2.easyexcel.EasyExcelUtil;
import com.zhiwei.brandkbs2.easyexcel.dto.ExportBehaviorDTO;
import com.zhiwei.brandkbs2.easyexcel.dto.ExportUserLogRecordDTO;
import com.zhiwei.brandkbs2.enmus.RoleEnum;
import com.zhiwei.brandkbs2.model.ResponseResult;
import com.zhiwei.brandkbs2.service.BehaviorService;
......@@ -13,10 +14,7 @@ import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
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 javax.annotation.Resource;
import java.util.List;
......@@ -77,4 +75,41 @@ public class BehaviorController extends BaseController {
return ResponseResult.success();
}
@ApiOperation("记录用户操作记录")
@GetMapping("/logRecord/save")
public ResponseResult saveUserLogRecord(@RequestParam(value = "description") String description) {
behaviorService.saveUserLogRecord(description);
return ResponseResult.success();
}
@ApiOperation("分页查询用户操作记录列表")
@ApiImplicitParams({
@ApiImplicitParam(name = "page", value = "页码", defaultValue = "1", paramType = "query", dataType = "int"),
@ApiImplicitParam(name = "pageSize", value = "每页记录数", defaultValue = "10", paramType = "query", dataType = "int"),
@ApiImplicitParam(name = "startTime", value = "开始时间", required = true, paramType = "query", dataType = "long"),
@ApiImplicitParam(name = "endTime", value = "结束时间", required = true, paramType = "query", dataType = "long"),
@ApiImplicitParam(name = "keyword", value = "关键词",defaultValue = "", paramType = "query", dataType = "string")
})
@GetMapping("/logRecord/list")
public ResponseResult findLogRecordList(@RequestParam(value = "page", defaultValue = "1") int page,
@RequestParam(value = "pageSize", defaultValue = "10") int pageSize,
@RequestParam("startTime") long startTime,
@RequestParam("endTime") long endTime,
@RequestParam(value = "keyword", defaultValue = "") String keyword) {
return ResponseResult.success(behaviorService.findLogRecordList(page, pageSize, startTime, endTime, keyword));
}
@ApiOperation("下载用户操作记录列表")
@ApiImplicitParams({
@ApiImplicitParam(name = "startTime", value = "开始时间", required = true, paramType = "query", dataType = "long"),
@ApiImplicitParam(name = "endTime", value = "结束时间", required = true, paramType = "query", dataType = "long"),
})
@GetMapping("/logRecord/download")
public ResponseResult downloadLogRecordList(@RequestParam("startTime") long startTime,
@RequestParam("endTime") long endTime) {
List<ExportUserLogRecordDTO> list = behaviorService.downloadUserLogRecord(startTime, endTime);
String sheetName = ProjectService.getProjectVOById(UserThreadLocal.getProjectId()).getProjectName() + "_操作记录";
EasyExcelUtil.download(sheetName, sheetName, ExportUserLogRecordDTO.class, list, response);
return ResponseResult.success();
}
}
package com.zhiwei.brandkbs2.controller.app;
import com.alibaba.fastjson.JSONObject;
import com.zhiwei.brandkbs2.aop.LogRecord;
import com.zhiwei.brandkbs2.auth.Auth;
import com.zhiwei.brandkbs2.controller.BaseController;
import com.zhiwei.brandkbs2.easyexcel.EasyExcelUtil;
......@@ -46,6 +47,7 @@ public class AppArticleController extends BaseController {
@ApiOperation("舆情列表")
@PostMapping("/mark/list")
@LogRecord(description = "舆情库-舆情列表")
public ResponseResult getYuqingMarkList(@RequestBody MarkSearchDTO markSearchDTO) {
return ResponseResult.success(markDataService.getYuqingMarkList(markSearchDTO));
}
......@@ -107,6 +109,7 @@ public class AppArticleController extends BaseController {
@ApiImplicitParam(name = "startTime", value = "开始时间", paramType = "query", dataType = "long"),
@ApiImplicitParam(name = "endTime", value = "结束时间", paramType = "query", dataType = "long")
})
@LogRecord(description = "舆情库-舆情分析")
@GetMapping("/emotion/proportion")
public ResponseResult getMarkEmotionProportion(@RequestParam(value = "startTime", required = false) Long startTime,
@RequestParam(value = "endTime", required = false) Long endTime) {
......@@ -156,6 +159,7 @@ public class AppArticleController extends BaseController {
@ApiOperation("舆情简报-全部报告列表")
@GetMapping("/report/list")
@LogRecord(description = "舆情库-舆情简报")
public ResponseResult findReportList(ReportSearchDTO reportSearch) {
return ResponseResult.success(reportService.findReportList(reportSearch));
}
......
package com.zhiwei.brandkbs2.controller.app;
import com.zhiwei.brandkbs2.aop.LogRecord;
import com.zhiwei.brandkbs2.auth.Auth;
import com.zhiwei.brandkbs2.controller.BaseController;
import com.zhiwei.brandkbs2.easyexcel.EasyExcelUtil;
......@@ -41,6 +42,7 @@ public class AppChannelController extends BaseController {
@ApiImplicitParam(name = "pageSize", value = "选取前几", defaultValue = "50", paramType = "query", dataType = "int"),
})
@ApiOperation("渠道库-活跃渠道榜")
@LogRecord(description = "渠道库-活跃渠道榜")
@GetMapping("/list/active")
public ResponseResult getActiveChannelList(@RequestParam(value = "contendId", defaultValue = "0") String contendId,
@RequestParam(value = "platform", required = false) String platform,
......@@ -61,6 +63,7 @@ public class AppChannelController extends BaseController {
@ApiImplicitParam(name = "endTime", value = "结束时间", paramType = "query", dataType = "long"),
@ApiImplicitParam(name = "pageSize", value = "选取前几", defaultValue = "50", paramType = "query", dataType = "int")
})
@LogRecord(description = "渠道库-友好渠道榜")
@GetMapping("/list/positive")
public ResponseResult getPositiveList(@RequestParam(value = "contendId", defaultValue = "0") String contendId,
@RequestParam(value = "platform", required = false) String platform,
......@@ -82,6 +85,7 @@ public class AppChannelController extends BaseController {
@ApiImplicitParam(name = "endTime", value = "结束时间", paramType = "query", dataType = "long"),
@ApiImplicitParam(name = "pageSize", value = "选取前几", defaultValue = "50", paramType = "query", dataType = "int")
})
@LogRecord(description = "渠道库-敏感渠道榜")
@GetMapping("/list/negative")
public ResponseResult getNegativeList(@RequestParam(value = "contendId", defaultValue = "0") String contendId,
@RequestParam(value = "platform", required = false) String platform,
......@@ -109,6 +113,7 @@ public class AppChannelController extends BaseController {
@ApiOperation("渠道库-收藏渠道列表")
@ApiImplicitParams(@ApiImplicitParam(name = "contendId", value = "品牌ID", paramType = "query", dataType = "string"))
@LogRecord(description = "渠道库-收藏渠道")
@GetMapping("/list/collect")
public ResponseResult getCollectList(@RequestParam(value = "contendId", required = false, defaultValue = "0") String contendId) {
return ResponseResult.success(channelService.getCollectList(contendId));
......
package com.zhiwei.brandkbs2.controller.app;
import com.alibaba.fastjson.JSONObject;
import com.zhiwei.brandkbs2.aop.LogRecord;
import com.zhiwei.brandkbs2.auth.Auth;
import com.zhiwei.brandkbs2.auth.UserThreadLocal;
import com.zhiwei.brandkbs2.controller.BaseController;
......@@ -41,12 +42,14 @@ public class AppContendController extends BaseController {
}
@ApiOperation("竞品库-竞品舆情-搜索结果列表")
@LogRecord(description = "竞品舆情库-竞品舆情")
@PostMapping("/list")
public ResponseResult getContendSearchList(@RequestBody MarkSearchDTO markSearchDTO){
return ResponseResult.success(markDataService.getContendSearchList(markSearchDTO));
}
@ApiOperation("竞品库-竞品分析-舆情总结页面")
@LogRecord(description = "竞品舆情库-竞品对比")
@PostMapping("/summary")
public ResponseResult getSummary(@RequestBody MarkSearchDTO markSearchDTO) throws IOException {
return ResponseResult.success(markDataService.getContendSummary(markSearchDTO, true));
......
......@@ -2,6 +2,7 @@ package com.zhiwei.brandkbs2.controller.app;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.zhiwei.brandkbs2.aop.LogRecord;
import com.zhiwei.brandkbs2.auth.Auth;
import com.zhiwei.brandkbs2.auth.UserThreadLocal;
import com.zhiwei.brandkbs2.controller.BaseController;
......@@ -73,6 +74,7 @@ public class AppCrisisController extends BaseController {
}
@ApiOperation("危机库-危机库列表")
@LogRecord(description = "危机案例库")
@GetMapping("/crisisList")
public ResponseResult crisisList(@RequestParam(value = "page",defaultValue = "1") Integer page,
@RequestParam(value = "pageSize",defaultValue = "10") Integer pageSize,
......
......@@ -2,6 +2,7 @@ package com.zhiwei.brandkbs2.controller.app;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.zhiwei.brandkbs2.aop.LogRecord;
import com.zhiwei.brandkbs2.auth.Auth;
import com.zhiwei.brandkbs2.auth.UserThreadLocal;
import com.zhiwei.brandkbs2.controller.BaseController;
......@@ -121,6 +122,7 @@ public class AppEventController extends BaseController {
}
@ApiOperation("前台事件库-全网事件库-列表")
@LogRecord(description = "事件库-全网事件库")
@GetMapping("/getWholeNetworkEventsList")
public ResponseResult getWholeNetworkEventsList(@RequestParam(value = "firstType", required = false, defaultValue = "") String firstType,
@RequestParam(value = "start", required = false, defaultValue = "0") long start,
......@@ -162,6 +164,7 @@ public class AppEventController extends BaseController {
}
@ApiOperation("前台事件库-品牌事件库-获取品牌事件库事件列表")
@LogRecord(description = "事件库-品牌事件库")
@PostMapping("/eventList")
public ResponseResult getEventListMiddleware(@RequestBody BrandkbsEventSearchDTO dto){
return ResponseResult.success(eventService.getEventListMiddleware(dto));
......@@ -174,6 +177,7 @@ public class AppEventController extends BaseController {
}
@ApiOperation("前台事件库-事件监测-获取事件监测列表")
@LogRecord(description = "事件库-事件分析")
@GetMapping("/eventMonitor")
public ResponseResult getEventMonitor(@RequestParam(value = "page", defaultValue = "1") Integer page,
@RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize){
......@@ -219,6 +223,7 @@ public class AppEventController extends BaseController {
@ApiOperation("前台事件库-事件详情-获取事件基础信息")
@GetMapping("/detail/baseInfo")
@LogRecord(values = "title", description = "事件库-品牌事件库", arguments = false, entity = true)
@Auth(role = RoleEnum.NO_AUTHORISE)
public ResponseResult eventBaseInfo(@RequestParam(value = "eventId") String eventId){
return ResponseResult.success(eventService.eventBaseInfo(eventId));
......
......@@ -2,6 +2,7 @@ package com.zhiwei.brandkbs2.controller.app;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.zhiwei.brandkbs2.aop.LogRecord;
import com.zhiwei.brandkbs2.auth.Auth;
import com.zhiwei.brandkbs2.auth.UserThreadLocal;
import com.zhiwei.brandkbs2.common.RedisKeyPrefix;
......@@ -77,6 +78,7 @@ public class AppHotController extends BaseController {
* bilibili-ranking B站
*/
@ApiOperation("热点库-列表")
@LogRecord(description = "热点库")
@GetMapping("/getHotList")
public ResponseResult getHotList(@RequestParam(value = "sortType", defaultValue = "realTime") String sortType,
@RequestParam(value = "type", defaultValue = "weibo") String type) {
......
package com.zhiwei.brandkbs2.controller.app;
import com.zhiwei.brandkbs2.aop.LogRecord;
import com.zhiwei.brandkbs2.auth.Auth;
import com.zhiwei.brandkbs2.controller.BaseController;
import com.zhiwei.brandkbs2.enmus.RoleEnum;
......@@ -38,6 +39,7 @@ public class AppIndexController extends BaseController {
@ApiImplicitParam(name = "startTime", value = "开始时间", paramType = "query", dataType = "long"),
@ApiImplicitParam(name = "endTime", value = "结束时间", paramType = "query", dataType = "long")
})
@LogRecord(description = "首页")
@GetMapping("/yuqing-amount")
public ResponseResult getYuqingAmount(@RequestParam(value = "startTime", required = false) Long startTime,
@RequestParam(value = "endTime", required = false) Long endTime) {
......
......@@ -3,6 +3,7 @@ package com.zhiwei.brandkbs2.controller.app;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.zhiwei.brandkbs2.aop.LogRecord;
import com.zhiwei.brandkbs2.auth.Auth;
import com.zhiwei.brandkbs2.auth.UserThreadLocal;
import com.zhiwei.brandkbs2.config.Constant;
......@@ -76,6 +77,7 @@ public class AppSearchController extends BaseController {
ProjectService projectService;
@ApiOperation("搜索-查热点")
@LogRecord(values = "keyword", description = "查热点", arguments = true, entity = false)
@GetMapping("/hot/list")
public ResponseResult searchHotList(@RequestParam(value = "pageSize", defaultValue = "10") Integer limit,
@RequestParam(value = "page", defaultValue = "1") Integer page,
......@@ -91,6 +93,7 @@ public class AppSearchController extends BaseController {
}
@ApiOperation("搜索-查危机")
@LogRecord(values = "keyword", description = "查危机", arguments = true, entity = false)
@GetMapping("/crisisSearch")
public ResponseResult crisisSearch(@RequestParam(value = "page", defaultValue = "1") Integer page,
@RequestParam(value = "pageSize", defaultValue = "3") Integer pageSize,
......@@ -112,6 +115,7 @@ public class AppSearchController extends BaseController {
}
@ApiOperation("搜索-全网事件库-查事件")
@LogRecord(values = "keyword", description = "查事件", arguments = true, entity = false)
@GetMapping("/getWholeNetworkEvents")
public ResponseResult getWholeNetworkEvents(@RequestParam("keyword") String keyword,
@RequestParam(value = "page", defaultValue = "1") Integer page,
......@@ -131,6 +135,7 @@ public class AppSearchController extends BaseController {
}
@ApiOperation("搜索-全网搜")
@LogRecord(values = {"keyword", "search"}, description = "全网搜", arguments = true, entity = true)
@PostMapping("/searchWhole")
public ResponseResult searchWholeNetwork(@RequestBody SearchFilterDTO dto) {
// 针对商业数据库做限制
......@@ -171,6 +176,7 @@ public class AppSearchController extends BaseController {
}
@ApiOperation("舆情列表")
@LogRecord(values = "keyword", description = "查舆情", arguments = true, entity = true)
@PostMapping("/mark/list")
public ResponseResult getYuqingMarkList(@RequestBody MarkSearchDTO markSearchDTO) {
return ResponseResult.success(markDataService.getYuqingMarkList(markSearchDTO));
......@@ -201,6 +207,7 @@ public class AppSearchController extends BaseController {
@ApiOperation("搜索-渠道列表")
@LogRecord(values = "keyword", description = "查渠道", arguments = true, entity = true)
@PostMapping(value = "/channel/channelList")
public ResponseResult getChannelList(@RequestBody ChannelSearchDTO channelSearchDTO) {
return ResponseResult.success(channelService.getChannelListNew(channelSearchDTO.getPage(), channelSearchDTO.getPageSize(),
......@@ -238,12 +245,14 @@ public class AppSearchController extends BaseController {
}
@ApiOperation("搜索-前台事件库-品牌事件库-新")
@LogRecord(values = "keyword", description = "查事件", arguments = true, entity = true)
@PostMapping("/event/newList")
public ResponseResult getEventListMiddleware(@RequestBody BrandkbsEventSearchDTO dto){
return ResponseResult.success(eventService.getEventListMiddleware(dto));
}
@ApiOperation("搜索-查竞品")
@LogRecord(values = "keyword", description = "查竞品",arguments = true, entity = true)
@PostMapping("/contend/list")
public ResponseResult getContendSearchList(@RequestBody MarkSearchDTO markSearchDTO) {
return ResponseResult.success(markDataService.getContendSearchList(markSearchDTO));
......
package com.zhiwei.brandkbs2.dao;
import com.zhiwei.brandkbs2.pojo.UserLogRecord;
/**
* @ClassName: UserLogRecordDao
* @Description UserLogRecordDao
* @author: cjz
* @date: 2023-03-22 10:46
*/
public interface UserLogRecordDao extends BaseMongoDao<UserLogRecord>{
}
package com.zhiwei.brandkbs2.dao.impl;
import com.zhiwei.brandkbs2.dao.UserLogRecordDao;
import com.zhiwei.brandkbs2.pojo.UserLogRecord;
import org.springframework.stereotype.Component;
@Component("UserLogRecordDao")
public class UserLogRecordDaoImpl extends BaseMongoDaoImpl<UserLogRecord> implements UserLogRecordDao {
private static final String COLLECTION_NAME = "brandkbs_user_log_record";
public UserLogRecordDaoImpl() {
super(COLLECTION_NAME);
}
}
package com.zhiwei.brandkbs2.easyexcel.dto;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;
import java.util.Date;
/**
* @author cjz
* @version 1.0
* @description 导出用户操作实体类
* @date 2023/03/22 14:14
*/
@Data
public class ExportUserLogRecordDTO {
@ExcelProperty("用户名")
private String nickname;
@ExcelProperty("记录")
private String description;
@ExcelProperty("操作时间")
private Date time;
@ExcelProperty("用户身份")
private String role;
}
......@@ -206,12 +206,15 @@ public class EsQueryTools {
}
public static void assembleContendsQuery(BoolQueryBuilder query, Collection<String> contends) {
if (CollectionUtils.isEmpty(contends)) {
return;
}
BoolQueryBuilder contendQuery = QueryBuilders.boolQuery();
// 本品舆情一定有
contendQuery.should(cacheMapsNestedQuery(QueryBuilders.termQuery("brandkbs_cache_maps.contend_id.keyword", Constant.PRIMARY_CONTEND_ID)));
if (!CollectionUtils.isEmpty(contends)) {
for (String contendId : contends) {
query.should(cacheMapsNestedQuery(QueryBuilders.termQuery("brandkbs_cache_maps.contend_id.keyword", contendId)));
contendQuery.should(cacheMapsNestedQuery(QueryBuilders.termQuery("brandkbs_cache_maps.contend_id.keyword", contendId)));
}
}
query.must(contendQuery);
}
public static void assembleContendsQuery4Channel(BoolQueryBuilder query, Collection<String> contends) {
......
package com.zhiwei.brandkbs2.pojo;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;
import org.springframework.data.mongodb.core.mapping.Document;
/**
* @ClassName: UserLogRecord
* @Description 用户操作记录实体类
* @author: cjz
* @date: 2023-03-21 10:16
*/
@Getter
@Setter
@AllArgsConstructor
@Document(collection = "brandkbs_user_log_record")
public class UserLogRecord extends AbstractBaseMongo{
/**
* 项目id
*/
private String projectId;
/**
* 用户id
*/
private String userId;
/**
* nickname
*/
private String nickname;
/**
* 操作记录描述
*/
private String description;
/**
* 用户权限id
*/
private Integer roleId;
/**
* 创建时间
*/
private Long cTime;
/**
* 更新时间
*/
private Long updateTime;
}
package com.zhiwei.brandkbs2.service;
import com.zhiwei.brandkbs2.easyexcel.dto.ExportBehaviorDTO;
import com.zhiwei.brandkbs2.easyexcel.dto.ExportUserLogRecordDTO;
import com.zhiwei.brandkbs2.pojo.Behavior;
import com.zhiwei.brandkbs2.pojo.UserLogRecord;
import com.zhiwei.brandkbs2.pojo.vo.BehaviorVO;
import com.zhiwei.brandkbs2.pojo.vo.PageVO;
......@@ -46,4 +48,30 @@ public interface BehaviorService {
*/
List<ExportBehaviorDTO> download(long startTime, long endTime, boolean backstage);
/**
* 记录用户操作记录
*
* @param description
*/
void saveUserLogRecord(String description);
/**
* 分页查询用户操作记录列表
*
* @param page 页码
* @param size 大小
* @param startTime 开始时间
* @param endTime 结束时间
* @param nickname 用户昵称
* @return 用户行为列表
*/
PageVO<UserLogRecord> findLogRecordList(int page, int size, long startTime, long endTime, String nickname);
/**
* 下载用户操作记录列表
* @param startTime
* @param endTime
* @return
*/
List<ExportUserLogRecordDTO> downloadUserLogRecord(long startTime, long endTime);
}
package com.zhiwei.brandkbs2.service.impl;
import com.zhiwei.brandkbs2.auth.UserThreadLocal;
import com.zhiwei.brandkbs2.common.GenericAttribute;
import com.zhiwei.brandkbs2.dao.BehaviorDao;
import com.zhiwei.brandkbs2.dao.UserDao;
import com.zhiwei.brandkbs2.dao.UserLogRecordDao;
import com.zhiwei.brandkbs2.easyexcel.dto.ExportBehaviorDTO;
import com.zhiwei.brandkbs2.easyexcel.dto.ExportUserLogRecordDTO;
import com.zhiwei.brandkbs2.enmus.RoleEnum;
import com.zhiwei.brandkbs2.pojo.Behavior;
import com.zhiwei.brandkbs2.pojo.User;
import com.zhiwei.brandkbs2.pojo.UserRole;
import com.zhiwei.brandkbs2.pojo.*;
import com.zhiwei.brandkbs2.pojo.vo.BehaviorVO;
import com.zhiwei.brandkbs2.pojo.vo.PageVO;
import com.zhiwei.brandkbs2.service.BehaviorService;
import com.zhiwei.brandkbs2.service.UserService;
import com.zhiwei.brandkbs2.util.Tools;
import com.zhiwei.middleware.auth.util.JwtUtil;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Service;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.*;
import java.util.stream.Collectors;
/**
......@@ -37,12 +41,21 @@ import java.util.stream.Collectors;
public class BehaviorServiceImpl implements BehaviorService {
public static final Logger log = LogManager.getLogger(BehaviorServiceImpl.class);
@Value("${jwt.key}")
private String jwtKey;
@Resource(name = "behaviorDao")
private BehaviorDao behaviorDao;
@Resource(name = "userDao")
private UserDao userDao;
@Resource(name = "UserLogRecordDao")
private UserLogRecordDao userLogRecordDao;
@Resource(name = "userServiceImpl")
private UserService userService;
@Resource(name = "mongoUtil")
private com.zhiwei.brandkbs2.util.MongoUtil mongoUtil;
......@@ -139,6 +152,71 @@ public class BehaviorServiceImpl implements BehaviorService {
return resList;
}
@Override
public void saveUserLogRecord(String description) {
long now = System.currentTimeMillis();
ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
// 获取request对象
HttpServletRequest request = Objects.requireNonNull(requestAttributes).getRequest();
if (!(Tools.isNullOrUndefined(request.getHeader(jwtKey)))) {
Map<String, Object> map = JwtUtil.unsign(request.getHeader(jwtKey), Map.class);
if (null == map) {
return;
}
Object userIdObj = map.get(GenericAttribute.USER_ID);
// 无用户信息不做记录
if (null == userIdObj) {
return;
}
String userId = userIdObj.toString();
String projectId = UserThreadLocal.getProjectId();
UserInfo userInfo = userService.queryUserInfo(userId, projectId);
if (null == userInfo) {
return;
}
UserLogRecord userLogRecord = new UserLogRecord(projectId, userInfo.getUserId(), userInfo.getNickname(), description, userInfo.getRoleId(), now, now);
userLogRecordDao.insertOne(userLogRecord);
}
}
@Override
public PageVO<UserLogRecord> findLogRecordList(int page, int size, long startTime, long endTime, String nickname) {
String projectId = UserThreadLocal.getProjectId();
Query query = new Query();
query.addCriteria(Criteria.where("cTime").gte(startTime).lt(endTime));
query.addCriteria(Criteria.where("projectId").is(projectId));
userLogRecordDao.addSort(query, "{\"cTime\":\"descend\"}");
if (StringUtils.isNotEmpty(nickname)) {
userDao.addKeywordFuzz(query, nickname, "nickname");
}
long count = userLogRecordDao.count(query);
int skipCount = (page - 1) * size;
query.limit(size);
query.skip(skipCount);
List<UserLogRecord> resList = userLogRecordDao.findList(query);
return PageVO.createPageVo(count, page, size, resList);
}
@Override
public List<ExportUserLogRecordDTO> downloadUserLogRecord(long startTime, long endTime) {
String projectId = UserThreadLocal.getProjectId();
Query query = new Query();
query.addCriteria(Criteria.where("cTime").gte(startTime).lt(endTime));
query.addCriteria(Criteria.where("projectId").is(projectId));
userLogRecordDao.addSort(query, "{\"cTime\":\"descend\"}");
List<UserLogRecord> logRecordList = userLogRecordDao.findList(query);
List<ExportUserLogRecordDTO> resList = new ArrayList<>(logRecordList.size());
logRecordList.forEach(record -> {
ExportUserLogRecordDTO dto = new ExportUserLogRecordDTO();
dto.setNickname(record.getNickname());
dto.setDescription(record.getDescription());
dto.setTime(new Date(record.getCTime()));
dto.setRole(RoleEnum.getNameByState(record.getRoleId()));
resList.add(dto);
});
return resList;
}
private Integer getRoleId(String userId, String projectId) {
User user = userDao.findOneById(userId);
Integer roleId = -1;
......
......@@ -12,14 +12,16 @@ import com.zhiwei.brandkbs2.enmus.EmotionEnum;
import com.zhiwei.brandkbs2.es.EsClientDao;
import com.zhiwei.brandkbs2.es.EsQueryTools;
import com.zhiwei.brandkbs2.model.ResponseResult;
import com.zhiwei.brandkbs2.pojo.*;
import com.zhiwei.brandkbs2.pojo.AbstractProject;
import com.zhiwei.brandkbs2.pojo.BaseMap;
import com.zhiwei.brandkbs2.pojo.Channel;
import com.zhiwei.brandkbs2.pojo.Project;
import com.zhiwei.brandkbs2.pojo.external.*;
import com.zhiwei.brandkbs2.pojo.vo.CrisisCaseWarnVO;
import com.zhiwei.brandkbs2.service.ProjectService;
import com.zhiwei.brandkbs2.service.ProjectWarnService;
import com.zhiwei.brandkbs2.util.RedisUtil;
import com.zhiwei.brandkbs2.util.Tools;
import com.zhiwei.middleware.event.core.EventClient;
import com.zhiwei.middleware.event.pojo.entity.Event;
import com.zhiwei.middleware.event.pojo.entity.EventTagBasicInfo;
import org.apache.commons.collections4.CollectionUtils;
......@@ -603,10 +605,8 @@ public class ProjectWarnServiceImpl implements ProjectWarnService {
if (CollectionUtils.isNotEmpty(config.getMarkerTags())) {
config.getMarkerTags().forEach(tagName -> sourceBuilder.should(QueryBuilders.termQuery("brandkbs_mark_cache_maps.name.keyword", tagName)));
}
if (CollectionUtils.isNotEmpty(config.getContends())) {
EsQueryTools.assembleContendsQuery(sourceBuilder, config.getContends());
}
postFilter.must(sourceBuilder);
EsQueryTools.assembleContendsQuery(postFilter, config.getContends());
// postFilter.must(EsQueryTools.assembleNormalKeywordQuery(config.getKeyword(), new String[]{GenericAttribute.ES_IND_FULL_TEXT}));
helper.setPostFilter(postFilter);
SearchHits searchHits = esClientDao.searchHits(helper);
......
......@@ -521,6 +521,21 @@ public class Tools {
return resultStr.substring(0, resultStr.length() - 1);
}
/**
* 拼接字符串,以_隔开
*
* @param objects 可变参数
* @return 拼接后的字符串
*/
public static String concat(List<Object> objects) {
StringBuilder sb = new StringBuilder();
for (Object obj : objects) {
sb.append(obj).append(Constant.DEFAULT_SEPARATOR);
}
String resultStr = sb.toString();
return resultStr.substring(0, resultStr.length() - 1);
}
public static String[] split(String concatStr) {
return concatStr.split(Constant.DEFAULT_SEPARATOR);
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment