Commit 000a07fe by shenjunjie

Merge branch 'feature' into 'dev'

Feature

See merge request !267
parents a227ea9f f4aa7270
...@@ -35,7 +35,7 @@ ...@@ -35,7 +35,7 @@
<dubbo.version>2.7.4.1</dubbo.version> <dubbo.version>2.7.4.1</dubbo.version>
<curator.version>2.12.0</curator.version> <curator.version>2.12.0</curator.version>
<push.log.version>2.17.0-SNAPSHOT</push.log.version> <push.log.version>2.17.0-SNAPSHOT</push.log.version>
<event-client.version>1.0.9-SNAPSHOT</event-client.version> <event-client.version>1.0.9.3-SNAPSHOT</event-client.version>
</properties> </properties>
<dependencies> <dependencies>
......
...@@ -4,13 +4,18 @@ import com.alibaba.fastjson.JSON; ...@@ -4,13 +4,18 @@ import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.zhiwei.brandkbs2.common.GenericAttribute; import com.zhiwei.brandkbs2.common.GenericAttribute;
import com.zhiwei.brandkbs2.dao.BehaviorDao; import com.zhiwei.brandkbs2.dao.BehaviorDao;
import com.zhiwei.brandkbs2.dao.UserLogRecordDao;
import com.zhiwei.brandkbs2.model.ResponseResult; import com.zhiwei.brandkbs2.model.ResponseResult;
import com.zhiwei.brandkbs2.pojo.Behavior; 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.service.UserService;
import com.zhiwei.brandkbs2.util.Tools; import com.zhiwei.brandkbs2.util.Tools;
import com.zhiwei.middleware.auth.util.JwtUtil; import com.zhiwei.middleware.auth.util.JwtUtil;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; 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.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning; import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Aspect;
...@@ -24,6 +29,7 @@ import org.springframework.web.servlet.HandlerMapping; ...@@ -24,6 +29,7 @@ import org.springframework.web.servlet.HandlerMapping;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.servlet.ServletRequest; import javax.servlet.ServletRequest;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Method;
import java.net.InetAddress; import java.net.InetAddress;
import java.net.UnknownHostException; import java.net.UnknownHostException;
import java.util.*; import java.util.*;
...@@ -46,9 +52,12 @@ public class AopLogRecord { ...@@ -46,9 +52,12 @@ public class AopLogRecord {
@Resource(name = "behaviorDao") @Resource(name = "behaviorDao")
private BehaviorDao behaviorDao; private BehaviorDao behaviorDao;
@Resource(name = "UserLogRecordDao")
private UserLogRecordDao userLogRecordDao;
private static final List<String> URL_PATTERNS = Arrays.asList("/getNewAll", "/getNew", "/schedule"); 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{ private void beforeLog(JoinPoint joinPoint, ResponseResult ResponseResult) throws UnknownHostException, ClassNotFoundException{
long now = System.currentTimeMillis(); long now = System.currentTimeMillis();
// RequestContextHolder 顾名思义 持有 request 上下文的容器 // RequestContextHolder 顾名思义 持有 request 上下文的容器
...@@ -84,7 +93,8 @@ public class AopLogRecord { ...@@ -84,7 +93,8 @@ public class AopLogRecord {
} }
String userId = userIdObj.toString(); String userId = userIdObj.toString();
String projectId = request.getHeader("pid"); 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 severAddress = InetAddress.getLocalHost().getHostAddress();
String ipAddress = Tools.getIpAddress(request); String ipAddress = Tools.getIpAddress(request);
...@@ -92,57 +102,75 @@ public class AopLogRecord { ...@@ -92,57 +102,75 @@ public class AopLogRecord {
List<Map<String, Object>> arguments = getRequestArguments(joinPoint); List<Map<String, Object>> arguments = getRequestArguments(joinPoint);
Behavior behavior = new Behavior(userId, projectId, nickName, ipAddress, now, controller, method, backstage, Behavior behavior = new Behavior(userId, projectId, nickName, ipAddress, now, controller, method, backstage,
uri, methodName, httpMethod, arguments, now, severAddress, null); 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(); String collectionName = behaviorDao.generateCollectionName();
behaviorDao.insertOneWithoutId(behavior, collectionName); behaviorDao.insertOneWithoutId(behavior, collectionName);
} }
} }
} }
/** private UserLogRecord userLogRecord(String projectId, UserInfo userInfo, JoinPoint joinPoint, MethodSignature methodSignature, ResponseResult responseResult) {
* 用户行为实体搜索关键词、渠道库渠道、事件详情事件名赋值 long now = System.currentTimeMillis();
*
* @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;
Object[] args = joinPoint.getArgs(); Object[] args = joinPoint.getArgs();
// 搜索接口关键词记录 Method method = methodSignature.getMethod();
if (uri.contains("/app/search") && !Tools.isEmpty(args)) { // 方法上无@LogRecord注解
if (1 == arguments.size()) { if (!method.isAnnotationPresent(LogRecord.class)) {
if (!(args[0] instanceof Integer) && !(args[0] instanceof String)) { return null;
JSONObject jsonObject = (JSONObject) JSON.toJSON(args[0]); }
record = Objects.nonNull(jsonObject.get("keyword")) ? String.valueOf(jsonObject.get("keyword")) : String.valueOf(jsonObject.get("search")); 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]);
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[] parameterNames = methodSignature.getParameterNames(); 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++) { for (int i = 0; i < parameterNames.length; i++) {
if (Objects.equals(parameterNames[i], "keyword")) { if (Objects.equals(parameterNames[i], v)) {
record = String.valueOf(args[i]); res.add(args[i]);
} }
} }
} }
behavior.setRecord(record); String suffix = CollectionUtils.isNotEmpty(res) ? "-" + Tools.concat(res) : "";
return; return new UserLogRecord(projectId, userInfo.getUserId(), userInfo.getNickname(), prefix + suffix, userInfo.getRoleId(), now, now);
} }
// 渠道记录 // 获取接口返回值(value为获取返回值的具体字段)并与操作描述description拼接返回,返回值为实体
if (uri.contains("/app/channel/baseInfo")) { if (!method.getAnnotation(LogRecord.class).arguments() && method.getAnnotation(LogRecord.class).entity()) {
JSONObject jsonObject = (JSONObject) JSONObject.toJSON(ResponseResult.getData()); List<Object> res = new ArrayList<>(value.length);
record = Tools.concat(jsonObject.get("platform"), jsonObject.get("realSource"), jsonObject.get("source")); for (String v : value) {
behavior.setRecord(record); JSONObject jsonObject = (JSONObject) JSONObject.toJSON(responseResult.getData());
return; String s = String.valueOf(jsonObject.get(v));
} if (Objects.nonNull(s)) {
// 事件标题记录 res.add(s);
if (uri.contains("/app/event/detail/baseInfo")) { }
JSONObject jsonObject = (JSONObject) JSON.toJSON(ResponseResult.getData()); }
record = String.valueOf(jsonObject.get("title")); String suffix = CollectionUtils.isNotEmpty(res) ? "-" + Tools.concat(res) : "";
behavior.setRecord(record); 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; package com.zhiwei.brandkbs2.controller;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.zhiwei.brandkbs2.aop.LogRecord;
import com.zhiwei.brandkbs2.auth.Auth; import com.zhiwei.brandkbs2.auth.Auth;
import com.zhiwei.brandkbs2.enmus.RoleEnum; import com.zhiwei.brandkbs2.enmus.RoleEnum;
import com.zhiwei.brandkbs2.model.ResponseResult; import com.zhiwei.brandkbs2.model.ResponseResult;
...@@ -82,6 +83,7 @@ public class LoginController extends BaseController { ...@@ -82,6 +83,7 @@ public class LoginController extends BaseController {
} }
@ApiOperation("校验用户是否已有绑定关系") @ApiOperation("校验用户是否已有绑定关系")
@LogRecord(description = "登录")
@GetMapping("/user/login/checkBind") @GetMapping("/user/login/checkBind")
public ResponseResult checkBind() { public ResponseResult checkBind() {
return ResponseResult.success(userService.checkUserRoles()); return ResponseResult.success(userService.checkUserRoles());
......
...@@ -5,6 +5,7 @@ import com.zhiwei.brandkbs2.auth.UserThreadLocal; ...@@ -5,6 +5,7 @@ import com.zhiwei.brandkbs2.auth.UserThreadLocal;
import com.zhiwei.brandkbs2.controller.BaseController; import com.zhiwei.brandkbs2.controller.BaseController;
import com.zhiwei.brandkbs2.easyexcel.EasyExcelUtil; import com.zhiwei.brandkbs2.easyexcel.EasyExcelUtil;
import com.zhiwei.brandkbs2.easyexcel.dto.ExportBehaviorDTO; import com.zhiwei.brandkbs2.easyexcel.dto.ExportBehaviorDTO;
import com.zhiwei.brandkbs2.easyexcel.dto.ExportUserLogRecordDTO;
import com.zhiwei.brandkbs2.enmus.RoleEnum; import com.zhiwei.brandkbs2.enmus.RoleEnum;
import com.zhiwei.brandkbs2.model.ResponseResult; import com.zhiwei.brandkbs2.model.ResponseResult;
import com.zhiwei.brandkbs2.service.BehaviorService; import com.zhiwei.brandkbs2.service.BehaviorService;
...@@ -13,10 +14,7 @@ import io.swagger.annotations.Api; ...@@ -13,10 +14,7 @@ import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.util.List; import java.util.List;
...@@ -77,4 +75,41 @@ public class BehaviorController extends BaseController { ...@@ -77,4 +75,41 @@ public class BehaviorController extends BaseController {
return ResponseResult.success(); 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; package com.zhiwei.brandkbs2.controller.app;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.zhiwei.brandkbs2.aop.LogRecord;
import com.zhiwei.brandkbs2.auth.Auth; import com.zhiwei.brandkbs2.auth.Auth;
import com.zhiwei.brandkbs2.controller.BaseController; import com.zhiwei.brandkbs2.controller.BaseController;
import com.zhiwei.brandkbs2.easyexcel.EasyExcelUtil; import com.zhiwei.brandkbs2.easyexcel.EasyExcelUtil;
...@@ -46,6 +47,7 @@ public class AppArticleController extends BaseController { ...@@ -46,6 +47,7 @@ public class AppArticleController extends BaseController {
@ApiOperation("舆情列表") @ApiOperation("舆情列表")
@PostMapping("/mark/list") @PostMapping("/mark/list")
@LogRecord(description = "舆情库-舆情列表")
public ResponseResult getYuqingMarkList(@RequestBody MarkSearchDTO markSearchDTO) { public ResponseResult getYuqingMarkList(@RequestBody MarkSearchDTO markSearchDTO) {
return ResponseResult.success(markDataService.getYuqingMarkList(markSearchDTO)); return ResponseResult.success(markDataService.getYuqingMarkList(markSearchDTO));
} }
...@@ -107,6 +109,7 @@ public class AppArticleController extends BaseController { ...@@ -107,6 +109,7 @@ public class AppArticleController extends BaseController {
@ApiImplicitParam(name = "startTime", value = "开始时间", paramType = "query", dataType = "long"), @ApiImplicitParam(name = "startTime", value = "开始时间", paramType = "query", dataType = "long"),
@ApiImplicitParam(name = "endTime", value = "结束时间", paramType = "query", dataType = "long") @ApiImplicitParam(name = "endTime", value = "结束时间", paramType = "query", dataType = "long")
}) })
@LogRecord(description = "舆情库-舆情分析")
@GetMapping("/emotion/proportion") @GetMapping("/emotion/proportion")
public ResponseResult getMarkEmotionProportion(@RequestParam(value = "startTime", required = false) Long startTime, public ResponseResult getMarkEmotionProportion(@RequestParam(value = "startTime", required = false) Long startTime,
@RequestParam(value = "endTime", required = false) Long endTime) { @RequestParam(value = "endTime", required = false) Long endTime) {
...@@ -156,6 +159,7 @@ public class AppArticleController extends BaseController { ...@@ -156,6 +159,7 @@ public class AppArticleController extends BaseController {
@ApiOperation("舆情简报-全部报告列表") @ApiOperation("舆情简报-全部报告列表")
@GetMapping("/report/list") @GetMapping("/report/list")
@LogRecord(description = "舆情库-舆情简报")
public ResponseResult findReportList(ReportSearchDTO reportSearch) { public ResponseResult findReportList(ReportSearchDTO reportSearch) {
return ResponseResult.success(reportService.findReportList(reportSearch)); return ResponseResult.success(reportService.findReportList(reportSearch));
} }
......
package com.zhiwei.brandkbs2.controller.app; package com.zhiwei.brandkbs2.controller.app;
import com.zhiwei.brandkbs2.aop.LogRecord;
import com.zhiwei.brandkbs2.auth.Auth; import com.zhiwei.brandkbs2.auth.Auth;
import com.zhiwei.brandkbs2.controller.BaseController; import com.zhiwei.brandkbs2.controller.BaseController;
import com.zhiwei.brandkbs2.easyexcel.EasyExcelUtil; import com.zhiwei.brandkbs2.easyexcel.EasyExcelUtil;
...@@ -41,6 +42,7 @@ public class AppChannelController extends BaseController { ...@@ -41,6 +42,7 @@ public class AppChannelController extends BaseController {
@ApiImplicitParam(name = "pageSize", value = "选取前几", defaultValue = "50", paramType = "query", dataType = "int"), @ApiImplicitParam(name = "pageSize", value = "选取前几", defaultValue = "50", paramType = "query", dataType = "int"),
}) })
@ApiOperation("渠道库-活跃渠道榜") @ApiOperation("渠道库-活跃渠道榜")
@LogRecord(description = "渠道库-活跃渠道榜")
@GetMapping("/list/active") @GetMapping("/list/active")
public ResponseResult getActiveChannelList(@RequestParam(value = "contendId", defaultValue = "0") String contendId, public ResponseResult getActiveChannelList(@RequestParam(value = "contendId", defaultValue = "0") String contendId,
@RequestParam(value = "platform", required = false) String platform, @RequestParam(value = "platform", required = false) String platform,
...@@ -61,6 +63,7 @@ public class AppChannelController extends BaseController { ...@@ -61,6 +63,7 @@ public class AppChannelController extends BaseController {
@ApiImplicitParam(name = "endTime", value = "结束时间", paramType = "query", dataType = "long"), @ApiImplicitParam(name = "endTime", value = "结束时间", paramType = "query", dataType = "long"),
@ApiImplicitParam(name = "pageSize", value = "选取前几", defaultValue = "50", paramType = "query", dataType = "int") @ApiImplicitParam(name = "pageSize", value = "选取前几", defaultValue = "50", paramType = "query", dataType = "int")
}) })
@LogRecord(description = "渠道库-友好渠道榜")
@GetMapping("/list/positive") @GetMapping("/list/positive")
public ResponseResult getPositiveList(@RequestParam(value = "contendId", defaultValue = "0") String contendId, public ResponseResult getPositiveList(@RequestParam(value = "contendId", defaultValue = "0") String contendId,
@RequestParam(value = "platform", required = false) String platform, @RequestParam(value = "platform", required = false) String platform,
...@@ -82,6 +85,7 @@ public class AppChannelController extends BaseController { ...@@ -82,6 +85,7 @@ public class AppChannelController extends BaseController {
@ApiImplicitParam(name = "endTime", value = "结束时间", paramType = "query", dataType = "long"), @ApiImplicitParam(name = "endTime", value = "结束时间", paramType = "query", dataType = "long"),
@ApiImplicitParam(name = "pageSize", value = "选取前几", defaultValue = "50", paramType = "query", dataType = "int") @ApiImplicitParam(name = "pageSize", value = "选取前几", defaultValue = "50", paramType = "query", dataType = "int")
}) })
@LogRecord(description = "渠道库-敏感渠道榜")
@GetMapping("/list/negative") @GetMapping("/list/negative")
public ResponseResult getNegativeList(@RequestParam(value = "contendId", defaultValue = "0") String contendId, public ResponseResult getNegativeList(@RequestParam(value = "contendId", defaultValue = "0") String contendId,
@RequestParam(value = "platform", required = false) String platform, @RequestParam(value = "platform", required = false) String platform,
...@@ -109,6 +113,7 @@ public class AppChannelController extends BaseController { ...@@ -109,6 +113,7 @@ public class AppChannelController extends BaseController {
@ApiOperation("渠道库-收藏渠道列表") @ApiOperation("渠道库-收藏渠道列表")
@ApiImplicitParams(@ApiImplicitParam(name = "contendId", value = "品牌ID", paramType = "query", dataType = "string")) @ApiImplicitParams(@ApiImplicitParam(name = "contendId", value = "品牌ID", paramType = "query", dataType = "string"))
@LogRecord(description = "渠道库-收藏渠道")
@GetMapping("/list/collect") @GetMapping("/list/collect")
public ResponseResult getCollectList(@RequestParam(value = "contendId", required = false, defaultValue = "0") String contendId) { public ResponseResult getCollectList(@RequestParam(value = "contendId", required = false, defaultValue = "0") String contendId) {
return ResponseResult.success(channelService.getCollectList(contendId)); return ResponseResult.success(channelService.getCollectList(contendId));
......
package com.zhiwei.brandkbs2.controller.app; package com.zhiwei.brandkbs2.controller.app;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.zhiwei.brandkbs2.aop.LogRecord;
import com.zhiwei.brandkbs2.auth.Auth; import com.zhiwei.brandkbs2.auth.Auth;
import com.zhiwei.brandkbs2.auth.UserThreadLocal; import com.zhiwei.brandkbs2.auth.UserThreadLocal;
import com.zhiwei.brandkbs2.controller.BaseController; import com.zhiwei.brandkbs2.controller.BaseController;
...@@ -41,12 +42,14 @@ public class AppContendController extends BaseController { ...@@ -41,12 +42,14 @@ public class AppContendController extends BaseController {
} }
@ApiOperation("竞品库-竞品舆情-搜索结果列表") @ApiOperation("竞品库-竞品舆情-搜索结果列表")
@LogRecord(description = "竞品舆情库-竞品舆情")
@PostMapping("/list") @PostMapping("/list")
public ResponseResult getContendSearchList(@RequestBody MarkSearchDTO markSearchDTO){ public ResponseResult getContendSearchList(@RequestBody MarkSearchDTO markSearchDTO){
return ResponseResult.success(markDataService.getContendSearchList(markSearchDTO)); return ResponseResult.success(markDataService.getContendSearchList(markSearchDTO));
} }
@ApiOperation("竞品库-竞品分析-舆情总结页面") @ApiOperation("竞品库-竞品分析-舆情总结页面")
@LogRecord(description = "竞品舆情库-竞品对比")
@PostMapping("/summary") @PostMapping("/summary")
public ResponseResult getSummary(@RequestBody MarkSearchDTO markSearchDTO) throws IOException { public ResponseResult getSummary(@RequestBody MarkSearchDTO markSearchDTO) throws IOException {
return ResponseResult.success(markDataService.getContendSummary(markSearchDTO, true)); return ResponseResult.success(markDataService.getContendSummary(markSearchDTO, true));
......
...@@ -2,6 +2,7 @@ package com.zhiwei.brandkbs2.controller.app; ...@@ -2,6 +2,7 @@ package com.zhiwei.brandkbs2.controller.app;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.zhiwei.brandkbs2.aop.LogRecord;
import com.zhiwei.brandkbs2.auth.Auth; import com.zhiwei.brandkbs2.auth.Auth;
import com.zhiwei.brandkbs2.auth.UserThreadLocal; import com.zhiwei.brandkbs2.auth.UserThreadLocal;
import com.zhiwei.brandkbs2.controller.BaseController; import com.zhiwei.brandkbs2.controller.BaseController;
...@@ -73,6 +74,7 @@ public class AppCrisisController extends BaseController { ...@@ -73,6 +74,7 @@ public class AppCrisisController extends BaseController {
} }
@ApiOperation("危机库-危机库列表") @ApiOperation("危机库-危机库列表")
@LogRecord(description = "危机案例库")
@GetMapping("/crisisList") @GetMapping("/crisisList")
public ResponseResult crisisList(@RequestParam(value = "page",defaultValue = "1") Integer page, public ResponseResult crisisList(@RequestParam(value = "page",defaultValue = "1") Integer page,
@RequestParam(value = "pageSize",defaultValue = "10") Integer pageSize, @RequestParam(value = "pageSize",defaultValue = "10") Integer pageSize,
......
...@@ -2,6 +2,7 @@ package com.zhiwei.brandkbs2.controller.app; ...@@ -2,6 +2,7 @@ package com.zhiwei.brandkbs2.controller.app;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.zhiwei.brandkbs2.aop.LogRecord;
import com.zhiwei.brandkbs2.auth.Auth; import com.zhiwei.brandkbs2.auth.Auth;
import com.zhiwei.brandkbs2.auth.UserThreadLocal; import com.zhiwei.brandkbs2.auth.UserThreadLocal;
import com.zhiwei.brandkbs2.controller.BaseController; import com.zhiwei.brandkbs2.controller.BaseController;
...@@ -121,6 +122,7 @@ public class AppEventController extends BaseController { ...@@ -121,6 +122,7 @@ public class AppEventController extends BaseController {
} }
@ApiOperation("前台事件库-全网事件库-列表") @ApiOperation("前台事件库-全网事件库-列表")
@LogRecord(description = "事件库-全网事件库")
@GetMapping("/getWholeNetworkEventsList") @GetMapping("/getWholeNetworkEventsList")
public ResponseResult getWholeNetworkEventsList(@RequestParam(value = "firstType", required = false, defaultValue = "") String firstType, public ResponseResult getWholeNetworkEventsList(@RequestParam(value = "firstType", required = false, defaultValue = "") String firstType,
@RequestParam(value = "start", required = false, defaultValue = "0") long start, @RequestParam(value = "start", required = false, defaultValue = "0") long start,
...@@ -162,6 +164,7 @@ public class AppEventController extends BaseController { ...@@ -162,6 +164,7 @@ public class AppEventController extends BaseController {
} }
@ApiOperation("前台事件库-品牌事件库-获取品牌事件库事件列表") @ApiOperation("前台事件库-品牌事件库-获取品牌事件库事件列表")
@LogRecord(description = "事件库-品牌事件库")
@PostMapping("/eventList") @PostMapping("/eventList")
public ResponseResult getEventListMiddleware(@RequestBody BrandkbsEventSearchDTO dto){ public ResponseResult getEventListMiddleware(@RequestBody BrandkbsEventSearchDTO dto){
return ResponseResult.success(eventService.getEventListMiddleware(dto)); return ResponseResult.success(eventService.getEventListMiddleware(dto));
...@@ -174,6 +177,7 @@ public class AppEventController extends BaseController { ...@@ -174,6 +177,7 @@ public class AppEventController extends BaseController {
} }
@ApiOperation("前台事件库-事件监测-获取事件监测列表") @ApiOperation("前台事件库-事件监测-获取事件监测列表")
@LogRecord(description = "事件库-事件分析")
@GetMapping("/eventMonitor") @GetMapping("/eventMonitor")
public ResponseResult getEventMonitor(@RequestParam(value = "page", defaultValue = "1") Integer page, public ResponseResult getEventMonitor(@RequestParam(value = "page", defaultValue = "1") Integer page,
@RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize){ @RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize){
...@@ -219,6 +223,7 @@ public class AppEventController extends BaseController { ...@@ -219,6 +223,7 @@ public class AppEventController extends BaseController {
@ApiOperation("前台事件库-事件详情-获取事件基础信息") @ApiOperation("前台事件库-事件详情-获取事件基础信息")
@GetMapping("/detail/baseInfo") @GetMapping("/detail/baseInfo")
@LogRecord(values = "title", description = "事件库-品牌事件库", arguments = false, entity = true)
@Auth(role = RoleEnum.NO_AUTHORISE) @Auth(role = RoleEnum.NO_AUTHORISE)
public ResponseResult eventBaseInfo(@RequestParam(value = "eventId") String eventId){ public ResponseResult eventBaseInfo(@RequestParam(value = "eventId") String eventId){
return ResponseResult.success(eventService.eventBaseInfo(eventId)); return ResponseResult.success(eventService.eventBaseInfo(eventId));
......
...@@ -2,6 +2,7 @@ package com.zhiwei.brandkbs2.controller.app; ...@@ -2,6 +2,7 @@ package com.zhiwei.brandkbs2.controller.app;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.zhiwei.brandkbs2.aop.LogRecord;
import com.zhiwei.brandkbs2.auth.Auth; import com.zhiwei.brandkbs2.auth.Auth;
import com.zhiwei.brandkbs2.auth.UserThreadLocal; import com.zhiwei.brandkbs2.auth.UserThreadLocal;
import com.zhiwei.brandkbs2.common.RedisKeyPrefix; import com.zhiwei.brandkbs2.common.RedisKeyPrefix;
...@@ -77,6 +78,7 @@ public class AppHotController extends BaseController { ...@@ -77,6 +78,7 @@ public class AppHotController extends BaseController {
* bilibili-ranking B站 * bilibili-ranking B站
*/ */
@ApiOperation("热点库-列表") @ApiOperation("热点库-列表")
@LogRecord(description = "热点库")
@GetMapping("/getHotList") @GetMapping("/getHotList")
public ResponseResult getHotList(@RequestParam(value = "sortType", defaultValue = "realTime") String sortType, public ResponseResult getHotList(@RequestParam(value = "sortType", defaultValue = "realTime") String sortType,
@RequestParam(value = "type", defaultValue = "weibo") String type) { @RequestParam(value = "type", defaultValue = "weibo") String type) {
......
package com.zhiwei.brandkbs2.controller.app; package com.zhiwei.brandkbs2.controller.app;
import com.zhiwei.brandkbs2.aop.LogRecord;
import com.zhiwei.brandkbs2.auth.Auth; import com.zhiwei.brandkbs2.auth.Auth;
import com.zhiwei.brandkbs2.controller.BaseController; import com.zhiwei.brandkbs2.controller.BaseController;
import com.zhiwei.brandkbs2.enmus.RoleEnum; import com.zhiwei.brandkbs2.enmus.RoleEnum;
...@@ -38,6 +39,7 @@ public class AppIndexController extends BaseController { ...@@ -38,6 +39,7 @@ public class AppIndexController extends BaseController {
@ApiImplicitParam(name = "startTime", value = "开始时间", paramType = "query", dataType = "long"), @ApiImplicitParam(name = "startTime", value = "开始时间", paramType = "query", dataType = "long"),
@ApiImplicitParam(name = "endTime", value = "结束时间", paramType = "query", dataType = "long") @ApiImplicitParam(name = "endTime", value = "结束时间", paramType = "query", dataType = "long")
}) })
@LogRecord(description = "首页")
@GetMapping("/yuqing-amount") @GetMapping("/yuqing-amount")
public ResponseResult getYuqingAmount(@RequestParam(value = "startTime", required = false) Long startTime, public ResponseResult getYuqingAmount(@RequestParam(value = "startTime", required = false) Long startTime,
@RequestParam(value = "endTime", required = false) Long endTime) { @RequestParam(value = "endTime", required = false) Long endTime) {
......
...@@ -3,6 +3,7 @@ package com.zhiwei.brandkbs2.controller.app; ...@@ -3,6 +3,7 @@ package com.zhiwei.brandkbs2.controller.app;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.zhiwei.brandkbs2.aop.LogRecord;
import com.zhiwei.brandkbs2.auth.Auth; import com.zhiwei.brandkbs2.auth.Auth;
import com.zhiwei.brandkbs2.auth.UserThreadLocal; import com.zhiwei.brandkbs2.auth.UserThreadLocal;
import com.zhiwei.brandkbs2.config.Constant; import com.zhiwei.brandkbs2.config.Constant;
...@@ -76,6 +77,7 @@ public class AppSearchController extends BaseController { ...@@ -76,6 +77,7 @@ public class AppSearchController extends BaseController {
ProjectService projectService; ProjectService projectService;
@ApiOperation("搜索-查热点") @ApiOperation("搜索-查热点")
@LogRecord(values = "keyword", description = "查热点", arguments = true, entity = false)
@GetMapping("/hot/list") @GetMapping("/hot/list")
public ResponseResult searchHotList(@RequestParam(value = "pageSize", defaultValue = "10") Integer limit, public ResponseResult searchHotList(@RequestParam(value = "pageSize", defaultValue = "10") Integer limit,
@RequestParam(value = "page", defaultValue = "1") Integer page, @RequestParam(value = "page", defaultValue = "1") Integer page,
...@@ -91,6 +93,7 @@ public class AppSearchController extends BaseController { ...@@ -91,6 +93,7 @@ public class AppSearchController extends BaseController {
} }
@ApiOperation("搜索-查危机") @ApiOperation("搜索-查危机")
@LogRecord(values = "keyword", description = "查危机", arguments = true, entity = false)
@GetMapping("/crisisSearch") @GetMapping("/crisisSearch")
public ResponseResult crisisSearch(@RequestParam(value = "page", defaultValue = "1") Integer page, public ResponseResult crisisSearch(@RequestParam(value = "page", defaultValue = "1") Integer page,
@RequestParam(value = "pageSize", defaultValue = "3") Integer pageSize, @RequestParam(value = "pageSize", defaultValue = "3") Integer pageSize,
...@@ -112,6 +115,7 @@ public class AppSearchController extends BaseController { ...@@ -112,6 +115,7 @@ public class AppSearchController extends BaseController {
} }
@ApiOperation("搜索-全网事件库-查事件") @ApiOperation("搜索-全网事件库-查事件")
@LogRecord(values = "keyword", description = "查事件", arguments = true, entity = false)
@GetMapping("/getWholeNetworkEvents") @GetMapping("/getWholeNetworkEvents")
public ResponseResult getWholeNetworkEvents(@RequestParam("keyword") String keyword, public ResponseResult getWholeNetworkEvents(@RequestParam("keyword") String keyword,
@RequestParam(value = "page", defaultValue = "1") Integer page, @RequestParam(value = "page", defaultValue = "1") Integer page,
...@@ -131,6 +135,7 @@ public class AppSearchController extends BaseController { ...@@ -131,6 +135,7 @@ public class AppSearchController extends BaseController {
} }
@ApiOperation("搜索-全网搜") @ApiOperation("搜索-全网搜")
@LogRecord(values = {"keyword", "search"}, description = "全网搜", arguments = true, entity = true)
@PostMapping("/searchWhole") @PostMapping("/searchWhole")
public ResponseResult searchWholeNetwork(@RequestBody SearchFilterDTO dto) { public ResponseResult searchWholeNetwork(@RequestBody SearchFilterDTO dto) {
// 针对商业数据库做限制 // 针对商业数据库做限制
...@@ -171,6 +176,7 @@ public class AppSearchController extends BaseController { ...@@ -171,6 +176,7 @@ public class AppSearchController extends BaseController {
} }
@ApiOperation("舆情列表") @ApiOperation("舆情列表")
@LogRecord(values = "keyword", description = "查舆情", arguments = true, entity = true)
@PostMapping("/mark/list") @PostMapping("/mark/list")
public ResponseResult getYuqingMarkList(@RequestBody MarkSearchDTO markSearchDTO) { public ResponseResult getYuqingMarkList(@RequestBody MarkSearchDTO markSearchDTO) {
return ResponseResult.success(markDataService.getYuqingMarkList(markSearchDTO)); return ResponseResult.success(markDataService.getYuqingMarkList(markSearchDTO));
...@@ -201,6 +207,7 @@ public class AppSearchController extends BaseController { ...@@ -201,6 +207,7 @@ public class AppSearchController extends BaseController {
@ApiOperation("搜索-渠道列表") @ApiOperation("搜索-渠道列表")
@LogRecord(values = "keyword", description = "查渠道", arguments = true, entity = true)
@PostMapping(value = "/channel/channelList") @PostMapping(value = "/channel/channelList")
public ResponseResult getChannelList(@RequestBody ChannelSearchDTO channelSearchDTO) { public ResponseResult getChannelList(@RequestBody ChannelSearchDTO channelSearchDTO) {
return ResponseResult.success(channelService.getChannelListNew(channelSearchDTO.getPage(), channelSearchDTO.getPageSize(), return ResponseResult.success(channelService.getChannelListNew(channelSearchDTO.getPage(), channelSearchDTO.getPageSize(),
...@@ -238,12 +245,14 @@ public class AppSearchController extends BaseController { ...@@ -238,12 +245,14 @@ public class AppSearchController extends BaseController {
} }
@ApiOperation("搜索-前台事件库-品牌事件库-新") @ApiOperation("搜索-前台事件库-品牌事件库-新")
@LogRecord(values = "keyword", description = "查事件", arguments = true, entity = true)
@PostMapping("/event/newList") @PostMapping("/event/newList")
public ResponseResult getEventListMiddleware(@RequestBody BrandkbsEventSearchDTO dto){ public ResponseResult getEventListMiddleware(@RequestBody BrandkbsEventSearchDTO dto){
return ResponseResult.success(eventService.getEventListMiddleware(dto)); return ResponseResult.success(eventService.getEventListMiddleware(dto));
} }
@ApiOperation("搜索-查竞品") @ApiOperation("搜索-查竞品")
@LogRecord(values = "keyword", description = "查竞品",arguments = true, entity = true)
@PostMapping("/contend/list") @PostMapping("/contend/list")
public ResponseResult getContendSearchList(@RequestBody MarkSearchDTO markSearchDTO) { public ResponseResult getContendSearchList(@RequestBody MarkSearchDTO markSearchDTO) {
return ResponseResult.success(markDataService.getContendSearchList(markSearchDTO)); return ResponseResult.success(markDataService.getContendSearchList(markSearchDTO));
......
...@@ -9,6 +9,7 @@ import com.zhiwei.middleware.event.pojo.dto.EventDTO; ...@@ -9,6 +9,7 @@ import com.zhiwei.middleware.event.pojo.dto.EventDTO;
import com.zhiwei.middleware.event.pojo.dto.EventTagRelatedDTO; import com.zhiwei.middleware.event.pojo.dto.EventTagRelatedDTO;
import com.zhiwei.middleware.event.pojo.entity.*; import com.zhiwei.middleware.event.pojo.entity.*;
import com.zhiwei.middleware.event.pojo.vo.EventListInfoVO; import com.zhiwei.middleware.event.pojo.vo.EventListInfoVO;
import com.zhiwei.middleware.event.pojo.vo.EventTagBrandkbsVO;
import com.zhiwei.middleware.event.pojo.vo.EventVO; import com.zhiwei.middleware.event.pojo.vo.EventVO;
import java.util.List; import java.util.List;
...@@ -28,6 +29,7 @@ public interface EventMiddlewareDao { ...@@ -28,6 +29,7 @@ public interface EventMiddlewareDao {
* @return * @return
*/ */
PageData<EventListInfoVO> getEventListBrandkbs(BrandkbsEventSearchDTO dto); PageData<EventListInfoVO> getEventListBrandkbs(BrandkbsEventSearchDTO dto);
/** /**
* 根据id删除事件 * 根据id删除事件
* @param eventId * @param eventId
...@@ -276,6 +278,14 @@ public interface EventMiddlewareDao { ...@@ -276,6 +278,14 @@ public interface EventMiddlewareDao {
ReturnData getBrandkbsBindingEventTags(String brandkbsProjectId); ReturnData getBrandkbsBindingEventTags(String brandkbsProjectId);
/** /**
* 获取品见项目标签绑定详情
* @param brandkbsProjectId 品见项目id
* @param brandkbsBrandId 品见品牌id
* @return
*/
List<EventTagBrandkbsVO> getBrandkbsBindingEventTagsDetail(String brandkbsProjectId, String brandkbsBrandId);
/**
* 修改品见关联关系,若存在则修改,否则新增 * 修改品见关联关系,若存在则修改,否则新增
* @param yuQingProject * @param yuQingProject
* @param yuQingProjectId * @param yuQingProjectId
......
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>{
}
...@@ -16,6 +16,7 @@ import com.zhiwei.middleware.event.pojo.entity.Event; ...@@ -16,6 +16,7 @@ import com.zhiwei.middleware.event.pojo.entity.Event;
import com.zhiwei.middleware.event.pojo.entity.EventDetailAdditionalInfo; import com.zhiwei.middleware.event.pojo.entity.EventDetailAdditionalInfo;
import com.zhiwei.middleware.event.pojo.entity.EventDisseminationTrend; import com.zhiwei.middleware.event.pojo.entity.EventDisseminationTrend;
import com.zhiwei.middleware.event.pojo.vo.EventListInfoVO; import com.zhiwei.middleware.event.pojo.vo.EventListInfoVO;
import com.zhiwei.middleware.event.pojo.vo.EventTagBrandkbsVO;
import com.zhiwei.middleware.event.pojo.vo.EventVO; import com.zhiwei.middleware.event.pojo.vo.EventVO;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
...@@ -197,6 +198,11 @@ public class EventMiddlewareDaoImpl implements EventMiddlewareDao { ...@@ -197,6 +198,11 @@ public class EventMiddlewareDaoImpl implements EventMiddlewareDao {
} }
@Override @Override
public List<EventTagBrandkbsVO> getBrandkbsBindingEventTagsDetail(String brandkbsProjectId, String brandkbsBrandId) {
return eventTagClient.getBrandkbsBindingEventTagsDetail(brandkbsProjectId, brandkbsBrandId);
}
@Override
public ReturnData modifyBrandkbsEventTags(String yuQingProject, String yuQingProjectId, List<EventTagRelatedDTO> eventTags, String brandkbsProject, String brandkbsProjectId, String brandkbsBrand, String brandkbsBrandId, String submitter, String submitterId) { public ReturnData modifyBrandkbsEventTags(String yuQingProject, String yuQingProjectId, List<EventTagRelatedDTO> eventTags, String brandkbsProject, String brandkbsProjectId, String brandkbsBrand, String brandkbsBrandId, String submitter, String submitterId) {
return eventTagClient.modifyBrandkbsEventTags(yuQingProject, yuQingProjectId, eventTags, brandkbsProject, brandkbsProjectId, brandkbsBrand, brandkbsBrandId, submitter, submitterId); return eventTagClient.modifyBrandkbsEventTags(yuQingProject, yuQingProjectId, eventTags, brandkbsProject, brandkbsProjectId, brandkbsBrand, brandkbsBrandId, submitter, submitterId);
} }
......
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;
}
...@@ -114,43 +114,29 @@ public class EsQueryTools { ...@@ -114,43 +114,29 @@ public class EsQueryTools {
nestedBoolBuilder.must(QueryBuilders.termQuery("brandkbs_cache_maps.channel_emotion", channelEmotion)); nestedBoolBuilder.must(QueryBuilders.termQuery("brandkbs_cache_maps.channel_emotion", channelEmotion));
} }
boolQueryBuilder.must(cacheMapsNestedQuery(nestedBoolBuilder)); boolQueryBuilder.must(cacheMapsNestedQuery(nestedBoolBuilder));
// 其他字段 // mediaTypes
if (CollectionUtils.isNotEmpty(mediaTypes)) { addMediaTypes(mediaTypes, boolQueryBuilder);
BoolQueryBuilder mediaTypesBoolQueryBuilder = QueryBuilders.boolQuery();
for (String mediaType : mediaTypes) {
BoolQueryBuilder mediaTypeBoolQueryBuilder = QueryBuilders.boolQuery();
//其他
if (ImportantChannelEnum.QITA.getState().equals(mediaType)) {
for (String tag : ImportantChannelEnum.getAllTagExceptSpec()) {
mediaTypeBoolQueryBuilder.mustNot(QueryBuilders.matchQuery("channel_tag", tag));
}
} else {
mediaTypeBoolQueryBuilder.must(QueryBuilders.matchQuery("channel_tag", mediaType));
}
mediaTypesBoolQueryBuilder.should(mediaTypeBoolQueryBuilder);
}
boolQueryBuilder.must(mediaTypesBoolQueryBuilder);
}
return boolQueryBuilder; return boolQueryBuilder;
} }
public static BoolQueryBuilder assembleCacheMapsQueryWithProject(String projectId, List<String> mediaTypes) { public static BoolQueryBuilder assembleCacheMapsQueryWithProject(String projectId, List<String> mediaTypes) {
BoolQueryBuilder nestedBoolQueryBuilder = QueryBuilders.boolQuery(); BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
TermQueryBuilder mustQuery = QueryBuilders.termQuery("brandkbs_cache_maps.project_id.keyword", projectId); BoolQueryBuilder nestedBoolBuilder = QueryBuilders.boolQuery();
if (CollectionUtils.isEmpty(mediaTypes)) { // 必要条件
// 不组装mediaTypes的情况 nestedBoolBuilder.must(QueryBuilders.termQuery("brandkbs_cache_maps.project_id.keyword", projectId));
nestedBoolQueryBuilder.must(cacheMapsNestedQuery(mustQuery)); // 或需要添加其余nested字段
} else { boolQueryBuilder.must(cacheMapsNestedQuery(nestedBoolBuilder));
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); // mediaTypes
mediaTypes.forEach(e -> { addMediaTypes(mediaTypes, boolQueryBuilder);
BoolQueryBuilder mediaTypeQueryBuilder = QueryBuilders.boolQuery(); // BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
mediaTypeQueryBuilder.must(QueryBuilders.termQuery("brandkbs_cache_maps.channel_type.keyword", e)); // mediaTypes.forEach(e -> {
mediaTypeQueryBuilder.must(mustQuery); // BoolQueryBuilder mediaTypeQueryBuilder = QueryBuilders.boolQuery();
boolQueryBuilder.should(cacheMapsNestedQuery(mediaTypeQueryBuilder)); // mediaTypeQueryBuilder.must(QueryBuilders.termQuery("brandkbs_cache_maps.channel_type.keyword", e));
}); // mediaTypeQueryBuilder.must(mustQuery);
nestedBoolQueryBuilder.must(boolQueryBuilder); // boolQueryBuilder.should(cacheMapsNestedQuery(mediaTypeQueryBuilder));
} // });
return nestedBoolQueryBuilder; // nestedBoolQueryBuilder.must(boolQueryBuilder);
return boolQueryBuilder;
} }
public static BoolQueryBuilder assembleCacheMapsQueryExcludePrimaryId(String projectId){ public static BoolQueryBuilder assembleCacheMapsQueryExcludePrimaryId(String projectId){
...@@ -220,12 +206,15 @@ public class EsQueryTools { ...@@ -220,12 +206,15 @@ public class EsQueryTools {
} }
public static void assembleContendsQuery(BoolQueryBuilder query, Collection<String> contends) { public static void assembleContendsQuery(BoolQueryBuilder query, Collection<String> contends) {
if (CollectionUtils.isEmpty(contends)) { BoolQueryBuilder contendQuery = QueryBuilders.boolQuery();
return; // 本品舆情一定有
} contendQuery.should(cacheMapsNestedQuery(QueryBuilders.termQuery("brandkbs_cache_maps.contend_id.keyword", Constant.PRIMARY_CONTEND_ID)));
for (String contendId : contends) { if (!CollectionUtils.isEmpty(contends)) {
query.should(cacheMapsNestedQuery(QueryBuilders.termQuery("brandkbs_cache_maps.contend_id.keyword", contendId))); for (String contendId : contends) {
contendQuery.should(cacheMapsNestedQuery(QueryBuilders.termQuery("brandkbs_cache_maps.contend_id.keyword", contendId)));
}
} }
query.must(contendQuery);
} }
public static void assembleContendsQuery4Channel(BoolQueryBuilder query, Collection<String> contends) { public static void assembleContendsQuery4Channel(BoolQueryBuilder query, Collection<String> contends) {
...@@ -351,4 +340,23 @@ public class EsQueryTools { ...@@ -351,4 +340,23 @@ public class EsQueryTools {
return regex.toString(); return regex.toString();
} }
private static void addMediaTypes(List<String> mediaTypes, BoolQueryBuilder boolQueryBuilder) {
if (CollectionUtils.isNotEmpty(mediaTypes)) {
BoolQueryBuilder mediaTypesBoolQueryBuilder = QueryBuilders.boolQuery();
for (String mediaType : mediaTypes) {
BoolQueryBuilder mediaTypeBoolQueryBuilder = QueryBuilders.boolQuery();
//其他
if (ImportantChannelEnum.QITA.getState().equals(mediaType)) {
for (String tag : ImportantChannelEnum.getAllTagExceptSpec()) {
mediaTypeBoolQueryBuilder.mustNot(QueryBuilders.matchQuery("channel_tag", tag));
}
} else {
mediaTypeBoolQueryBuilder.must(QueryBuilders.matchQuery("channel_tag", mediaType));
}
mediaTypesBoolQueryBuilder.should(mediaTypeBoolQueryBuilder);
}
boolQueryBuilder.must(mediaTypesBoolQueryBuilder);
}
}
} }
...@@ -74,6 +74,8 @@ public class BaseMap { ...@@ -74,6 +74,8 @@ public class BaseMap {
private Double channelEmotionIndex; private Double channelEmotionIndex;
private String channelTag;
/** /**
* 当标题为空时用文本截取前20个字代替 * 当标题为空时用文本截取前20个字代替
* *
......
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.pojo.external; package com.zhiwei.brandkbs2.pojo.external;
import com.zhiwei.base.category.ClassB; import com.zhiwei.base.category.ClassB;
import com.zhiwei.brandkbs2.common.GlobalPojo;
import com.zhiwei.brandkbs2.pojo.BaseMap; import com.zhiwei.brandkbs2.pojo.BaseMap;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.List; import java.util.List;
/** /**
...@@ -33,9 +33,13 @@ public class BaseMapCompound { ...@@ -33,9 +33,13 @@ public class BaseMapCompound {
// 情感倾向 // 情感倾向
// tagList.add(baseMap.getEmotion()); // tagList.add(baseMap.getEmotion());
// 媒体类型 // 媒体类型
String mediaType = GlobalPojo.getMediaType(projectId, baseMap.getPlatform(), baseMap.getSource()); // String mediaType = GlobalPojo.getMediaType(projectId, baseMap.getPlatform(), baseMap.getSource());
if (null != mediaType) { // if (null != mediaType) {
tagList.add(mediaType); // tagList.add(mediaType);
// }
String channelTag = baseMap.getChannelTag();
if (null != channelTag) {
tagList.addAll(Arrays.asList(channelTag.split(",")));
} }
// 仅针对微博平台的 原创/转发 标签 // 仅针对微博平台的 原创/转发 标签
if (ClassB.TypeB.INCOMPLETE.equals(baseMap.getTypeB())) { if (ClassB.TypeB.INCOMPLETE.equals(baseMap.getTypeB())) {
......
package com.zhiwei.brandkbs2.service; package com.zhiwei.brandkbs2.service;
import com.zhiwei.brandkbs2.easyexcel.dto.ExportBehaviorDTO; 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.Behavior;
import com.zhiwei.brandkbs2.pojo.UserLogRecord;
import com.zhiwei.brandkbs2.pojo.vo.BehaviorVO; import com.zhiwei.brandkbs2.pojo.vo.BehaviorVO;
import com.zhiwei.brandkbs2.pojo.vo.PageVO; import com.zhiwei.brandkbs2.pojo.vo.PageVO;
...@@ -46,4 +48,30 @@ public interface BehaviorService { ...@@ -46,4 +48,30 @@ public interface BehaviorService {
*/ */
List<ExportBehaviorDTO> download(long startTime, long endTime, boolean backstage); 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; package com.zhiwei.brandkbs2.service.impl;
import com.zhiwei.brandkbs2.auth.UserThreadLocal; import com.zhiwei.brandkbs2.auth.UserThreadLocal;
import com.zhiwei.brandkbs2.common.GenericAttribute;
import com.zhiwei.brandkbs2.dao.BehaviorDao; import com.zhiwei.brandkbs2.dao.BehaviorDao;
import com.zhiwei.brandkbs2.dao.UserDao; 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.ExportBehaviorDTO;
import com.zhiwei.brandkbs2.easyexcel.dto.ExportUserLogRecordDTO;
import com.zhiwei.brandkbs2.enmus.RoleEnum; import com.zhiwei.brandkbs2.enmus.RoleEnum;
import com.zhiwei.brandkbs2.pojo.Behavior; import com.zhiwei.brandkbs2.pojo.*;
import com.zhiwei.brandkbs2.pojo.User;
import com.zhiwei.brandkbs2.pojo.UserRole;
import com.zhiwei.brandkbs2.pojo.vo.BehaviorVO; import com.zhiwei.brandkbs2.pojo.vo.BehaviorVO;
import com.zhiwei.brandkbs2.pojo.vo.PageVO; import com.zhiwei.brandkbs2.pojo.vo.PageVO;
import com.zhiwei.brandkbs2.service.BehaviorService; 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.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; 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.Criteria;
import org.springframework.data.mongodb.core.query.Query; import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Service; 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.annotation.Resource;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList; import java.util.*;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/** /**
...@@ -37,12 +41,21 @@ import java.util.stream.Collectors; ...@@ -37,12 +41,21 @@ import java.util.stream.Collectors;
public class BehaviorServiceImpl implements BehaviorService { public class BehaviorServiceImpl implements BehaviorService {
public static final Logger log = LogManager.getLogger(BehaviorServiceImpl.class); public static final Logger log = LogManager.getLogger(BehaviorServiceImpl.class);
@Value("${jwt.key}")
private String jwtKey;
@Resource(name = "behaviorDao") @Resource(name = "behaviorDao")
private BehaviorDao behaviorDao; private BehaviorDao behaviorDao;
@Resource(name = "userDao") @Resource(name = "userDao")
private UserDao userDao; private UserDao userDao;
@Resource(name = "UserLogRecordDao")
private UserLogRecordDao userLogRecordDao;
@Resource(name = "userServiceImpl")
private UserService userService;
@Resource(name = "mongoUtil") @Resource(name = "mongoUtil")
private com.zhiwei.brandkbs2.util.MongoUtil mongoUtil; private com.zhiwei.brandkbs2.util.MongoUtil mongoUtil;
...@@ -139,6 +152,71 @@ public class BehaviorServiceImpl implements BehaviorService { ...@@ -139,6 +152,71 @@ public class BehaviorServiceImpl implements BehaviorService {
return resList; 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) { private Integer getRoleId(String userId, String projectId) {
User user = userDao.findOneById(userId); User user = userDao.findOneById(userId);
Integer roleId = -1; Integer roleId = -1;
......
...@@ -751,10 +751,14 @@ public class EventServiceImpl implements EventService { ...@@ -751,10 +751,14 @@ public class EventServiceImpl implements EventService {
// 品牌 // 品牌
result.put("brands", projectService.getBrands(projectId, true)); result.put("brands", projectService.getBrands(projectId, true));
// 事件调性 // 事件调性
AbstractProject abstractProject = projectService.getProjectByContendId(UserThreadLocal.getProjectId(), brandId); AbstractProject abstractProject = projectService.getProjectByContendId(projectId, brandId);
List<EventTagBrandkbsVO> eventTags = (List<EventTagBrandkbsVO>)eventMiddlewareDao.getEventTagGroupInfoBrandkbs(abstractProject.getBrandLinkedGroupId()).getData(); List<EventTagBrandkbsVO> eventTags = (List<EventTagBrandkbsVO>)eventMiddlewareDao.getEventTagGroupInfoBrandkbs(abstractProject.getBrandLinkedGroupId()).getData();
List<EventTagBrandkbsVO> emotion = eventTags.stream().filter(eventTag -> EventTagEnum.EVENT_ATTRIBUTE.getName().equals(eventTag.getGroupName())).collect(Collectors.toList()); List<EventTagBrandkbsVO> emotion = eventTags.stream().filter(eventTag -> EventTagEnum.EVENT_ATTRIBUTE.getName().equals(eventTag.getGroupName())).collect(Collectors.toList());
result.put("emotions", emotion); result.put("emotions", emotion);
// 绑定中的事件标签
brandId = Objects.equals(Constant.PRIMARY_CONTEND_ID, brandId) ? projectId : brandId;
List<EventTagBrandkbsVO> brandkbsBindingEventTagsDetail = eventMiddlewareDao.getBrandkbsBindingEventTagsDetail(projectId, brandId);
result.put("eventTags", brandkbsBindingEventTagsDetail);
// 时间 // 时间
result.put("times", getDefaultTimes()); result.put("times", getDefaultTimes());
// 传播量 // 传播量
......
...@@ -12,14 +12,16 @@ import com.zhiwei.brandkbs2.enmus.EmotionEnum; ...@@ -12,14 +12,16 @@ import com.zhiwei.brandkbs2.enmus.EmotionEnum;
import com.zhiwei.brandkbs2.es.EsClientDao; import com.zhiwei.brandkbs2.es.EsClientDao;
import com.zhiwei.brandkbs2.es.EsQueryTools; import com.zhiwei.brandkbs2.es.EsQueryTools;
import com.zhiwei.brandkbs2.model.ResponseResult; 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.external.*;
import com.zhiwei.brandkbs2.pojo.vo.CrisisCaseWarnVO; import com.zhiwei.brandkbs2.pojo.vo.CrisisCaseWarnVO;
import com.zhiwei.brandkbs2.service.ProjectService; import com.zhiwei.brandkbs2.service.ProjectService;
import com.zhiwei.brandkbs2.service.ProjectWarnService; import com.zhiwei.brandkbs2.service.ProjectWarnService;
import com.zhiwei.brandkbs2.util.RedisUtil; import com.zhiwei.brandkbs2.util.RedisUtil;
import com.zhiwei.brandkbs2.util.Tools; 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.Event;
import com.zhiwei.middleware.event.pojo.entity.EventTagBasicInfo; import com.zhiwei.middleware.event.pojo.entity.EventTagBasicInfo;
import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.CollectionUtils;
...@@ -603,10 +605,8 @@ public class ProjectWarnServiceImpl implements ProjectWarnService { ...@@ -603,10 +605,8 @@ public class ProjectWarnServiceImpl implements ProjectWarnService {
if (CollectionUtils.isNotEmpty(config.getMarkerTags())) { if (CollectionUtils.isNotEmpty(config.getMarkerTags())) {
config.getMarkerTags().forEach(tagName -> sourceBuilder.should(QueryBuilders.termQuery("brandkbs_mark_cache_maps.name.keyword", tagName))); 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); postFilter.must(sourceBuilder);
EsQueryTools.assembleContendsQuery(postFilter, config.getContends());
// postFilter.must(EsQueryTools.assembleNormalKeywordQuery(config.getKeyword(), new String[]{GenericAttribute.ES_IND_FULL_TEXT})); // postFilter.must(EsQueryTools.assembleNormalKeywordQuery(config.getKeyword(), new String[]{GenericAttribute.ES_IND_FULL_TEXT}));
helper.setPostFilter(postFilter); helper.setPostFilter(postFilter);
SearchHits searchHits = esClientDao.searchHits(helper); SearchHits searchHits = esClientDao.searchHits(helper);
......
...@@ -334,6 +334,10 @@ public class Tools { ...@@ -334,6 +334,10 @@ public class Tools {
res.setRealSource(String.valueOf(map.get(GenericAttribute.ES_REAL_SOURCE))); res.setRealSource(String.valueOf(map.get(GenericAttribute.ES_REAL_SOURCE)));
res.setPlatform(getPlatform(map)); res.setPlatform(getPlatform(map));
res.setEmotion(getEmotion(map)); res.setEmotion(getEmotion(map));
Object channelTagObj = map.get("channel_tag");
if (null != channelTagObj) {
res.setChannelTag(channelTagObj.toString());
}
int c5 = Integer.parseInt(String.valueOf(map.get(GenericAttribute.ES_C5))); int c5 = Integer.parseInt(String.valueOf(map.get(GenericAttribute.ES_C5)));
// 单独设置属性title,content 部分url // 单独设置属性title,content 部分url
switch (res.getTypeB()) { switch (res.getTypeB()) {
...@@ -517,6 +521,21 @@ public class Tools { ...@@ -517,6 +521,21 @@ public class Tools {
return resultStr.substring(0, resultStr.length() - 1); 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) { public static String[] split(String concatStr) {
return concatStr.split(Constant.DEFAULT_SEPARATOR); 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