tao.mo

manager-server | 修改 | 国家字典查询

mt
2024年11月6日15:06:11
Showing 17 changed files with 421 additions and 39 deletions
package com.fedex.connect.common.dependencies.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 记录操作日志的自定义注解
* @author EDY
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface OperationMethodLog {
//操作描述
String describe();
String module() default "";
//备注类型,
// 0-无特殊备注
// 1-从参数中获取备注,reamrkExt保存的是参数名,分号分隔
// 2-从参数中获取id查询,remarkExt保存的是查询表格
// 3-需要根据url特殊处理
int remarkType() default 0;
String remarkField() default "";
String remarkTable() default "";
//日志是否展示, 0-不展示, 1-展示
long status() default 0;
}
package com.fedex.connect.common.dependencies.aspect;
import com.fedex.connect.common.dependencies.annotation.OperationMethodLog;
import com.fedex.connect.common.dependencies.contants.AnnotationConstants;
import com.fedex.connect.common.dependencies.date.vo.ResponseVo;
import com.fedex.connect.common.dependencies.i18n.LocaleMessageUtil;
import com.fedex.connect.common.dependencies.repository.repo.log.IOperationRepository;
import com.fedex.connect.common.dependencies.util.CurrentUserInfo;
import com.fedex.connect.common.dependencies.util.JsonUtils;
import com.fedex.connect.common.model.log.Operation;
import com.fedex.connect.common.model.sys.User;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.*;
/**
* 定义切面。用于处理定义的切点。
* 用于自定义注解。记录操作日志
*/
@Aspect
@Component
public class OperationLogAspect {
private Logger logger = LoggerFactory.getLogger(OperationLogAspect.class);
@Resource
protected LocaleMessageUtil localeMessageUtil;
@Autowired
protected IOperationRepository operationRepository;
/**
* 定义切点
* 在OperationMethodLog注解位置做切面
* @throws Exception
*/
@Pointcut("@annotation(com.fedex.connect.common.dependencies.annotation.OperationMethodLog)")
public void OperationMethodLog() throws Exception{
}
/**
* 在切点方法之前执行
* @param joinPoint 连接点对象,获取当前切入的方法的参数、代理类等信息
* @throws Exception
*/
@Before("OperationMethodLog()")
public void doBefore(JoinPoint joinPoint) throws Exception{
RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes() ;
HttpServletRequest request =((ServletRequestAttributes)requestAttributes).getRequest();
//options过滤出去
if ("OPTIONS".equals(request.getMethod())){
return;
}
logger.info("【收到请求】" + request.getRequestURL() + request.getMethod());
}
/**
* 切点方法返回后执行
* @param joinPoint 连接点对象,获取当前切入的方法的参数、代理类等信息
* @param e
*/
@AfterThrowing(pointcut = "OperationMethodLog()", throwing = "e")
public void doAfterThrowing(JoinPoint joinPoint, Throwable e){
logger.error("【日志切面异常】" + e.getMessage());
}
/**
* 围绕着切点或方法上的注解执行.
* @param pjp
* @param operationMethodLog 在JoinPoint的基础上暴露出 proceed 这个方法.
* @return
* @throws Throwable
*/
@Around("OperationMethodLog() && @annotation(operationMethodLog)")
public Object doAfterReturning(ProceedingJoinPoint pjp, OperationMethodLog operationMethodLog) throws Throwable{
RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes() ;
HttpServletRequest request =((ServletRequestAttributes)requestAttributes).getRequest();
//参数中,HttpServletRequest和HttpServletResponse无法转成json,过滤掉
//如果是MultipartFile类型,只记录文件的名称
Object[] param = pjp.getArgs();
param = Arrays.stream(pjp.getArgs())
.filter(o -> !( o instanceof HttpServletResponse))
.filter(o -> !( o instanceof HttpServletRequest))
.map(o -> {
if (o instanceof MultipartFile){
return ((MultipartFile) o).getOriginalFilename();
}
return o;
})
.toArray();
//获取请求的参数进行处理
String requestParameters = JsonUtils.obj2jsonIgnoreNull(param);
String url = request.getServletPath();
String describe = localeMessageUtil.getMessage(operationMethodLog.describe());
String method = request.getMethod();
Operation log = new Operation();
log.setRequestParameters(requestParameters);
log.setUrl(url);
log.setDescribe(describe);
log.setStatus(operationMethodLog.status());
log.setRemark(method + ":" +getRemark(operationMethodLog.remarkType(), operationMethodLog.remarkTable(), operationMethodLog.remarkField(), describe, url, param));
//获取用户信息。 login,logout,oss登录特殊处理
User user = CurrentUserInfo.getUser();
log.setUserId(user.getId());
log.setUserName(user.getUserName());
Object res = pjp.proceed();
if (Objects.isNull(log.getUserId())){
//没获取到用户信息,直接return
return res;
}
log.setCreateTime(new Date());
//模块描述可以写在类的RequestMapping 的 name中,或者写在OperationMethodLog 的module中,OperationMethodLog的级别更高
String module = Objects.isNull(pjp.getTarget().getClass().getAnnotation(RequestMapping.class)) ?
"" :
pjp.getTarget().getClass().getAnnotation(RequestMapping.class).name();
if (StringUtils.isEmpty(module) || !StringUtils.isEmpty(operationMethodLog.module())){
module = operationMethodLog.module();
}
log.setModule(module);
//返回的结果可能不是Result类型,比如void响应流,不存
if (res instanceof ResponseVo) {
ResponseVo result = (ResponseVo)res;
String resultJson = JsonUtils.obj2jsonIgnoreNull(result);
logger.info("【请求结果】" + resultJson);
//太长存不进数据库。把data去掉
if (resultJson.length() > 255){
Map<String, Object> r = JsonUtils.json2map(resultJson);
r.remove("data");
resultJson = JsonUtils.objectToJson(r);
if (resultJson.length() > 255){
r.put("msg", localeMessageUtil.getMessage("config_aspect_length_error"));
resultJson = JsonUtils.objectToJson(r);
}
}
log.setResult(resultJson);
}
// 日志插入数据库
logger.info("插入日志:" + JsonUtils.objectToJson(log));
operationRepository.insert(log);
return res;
}
//自定义的解析方法,根据自身情况调整。
public String getRemark(int remarkType, String remarkTable, String remarkField, String describe, String url, Object[] paramArray){
Map<String, Object> param = new HashMap<>();
if (paramArray != null && paramArray.length > 0){
Object po = paramArray[0];
if (po instanceof Map){
param = (Map<String, Object>) po;
} else if (po.getClass().isArray()){
param.put("list", Arrays.asList((Object[]) po));
} else if (po instanceof List){
param.put("list", (List) po);
} else {
param = JsonUtils.pojo2Map(po);
}
}
String remark = "";
//remark += getOperation(describe, param);
if (AnnotationConstants.LOG_REMARK_TYPE_REQUEST == remarkType){
remark += getRemarkFromRequest(remarkField, param);
}
if (AnnotationConstants.LOG_REMARK_TYPE_TABLE == remarkType){
remark += getRemarkFromTable(remarkTable, remarkField, param);
}
if (AnnotationConstants.LOG_REMARK_TYPE_SPECIAL == remarkType){
}
return remark;
}
public String getRemarkFromRequest(String remarkField, Map<String, Object> param){
if (StringUtils.isEmpty(remarkField)){
return param.get("list").toString();
}
String remark = "\n";
//从参数中获取备注,reamrkExt保存的是参数名,分号分隔
String[] split = remarkField.split(";");
for (String key : split){
if (Objects.nonNull(param.get(key)) && !StringUtils.isEmpty(param.get(key))) {
remark += param.get(key) + " ";
}
}
return remark;
}
public String getRemarkFromTable(String remarkTable, String remarkField, Map<String, Object> param){
return "" + remarkTable;
/*Map<String , Object> searchTable = new HashMap<>();
List<Long> idArray = new ArrayList<>();
searchTable.put("tableName", remarkTable);
if (param.containsKey("id")){
idArray.add(Long.parseLong(param.get("id").toString()));
}else if (param.containsKey("ids")){
idArray = (List<Long>) param.get("ids");
}else if (param.containsKey("updateIds")){
idArray = (List<Long>) param.get("updateIds");
}else {
idArray = (List<Long>) param.get("list");
}
searchTable.put("id", idArray);
List<Map<String, Object>> resList = systemOperationLogMapperExt.searchTable(searchTable);
String[] split = remarkField.split(";");
for (Map item : resList){
remark += "\n";
for (String key : split){
if (Objects.nonNull(item.get(key))) {
remark += item.get(key) + " ";
}
}
}
return remark;*/
}
}
package com.fedex.connect.common.dependencies.contants;
/**
* 定义操作日志使用的常量
* @author EDY
*/
public class AnnotationConstants {
/**
* 日志是否展示, 0-不展示, 1-展示
*/
public static final long LOG_STATUS_SHOW = 1;
// 0-无特殊备注
// 1-从参数中获取备注,reamrkExt保存的是参数名,分号分隔
// 2-从参数中获取id查询,remarkExt保存的是查询表格
// 3-需要根据url特殊处理
public static final int LOG_REMARK_TYPE_REQUEST = 1;
public static final int LOG_REMARK_TYPE_TABLE = 2;
public static final int LOG_REMARK_TYPE_SPECIAL = 3;
}
package com.fedex.connect.common.dependencies.repository.base;
import com.fedex.connect.common.dao.bi.DictionaryEntriesMapper;
import com.fedex.connect.common.dao.log.OperationMapper;
import com.fedex.connect.common.dao.sys.RedisSlabMapper;
import com.fedex.connect.common.dependencies.repository.dao.UserMapperExt;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -12,4 +13,6 @@ public class BaseDao {
public RedisSlabMapper redisSlabMapper;
@Autowired
public DictionaryEntriesMapper dictionaryEntriesMapper;
@Autowired
public OperationMapper operationMapper;
}
\ No newline at end of file
......
......@@ -6,5 +6,5 @@ import com.fedex.connect.common.model.bi.DictionaryEntriesExample;
import java.util.List;
public interface IDictionaryEntriesRepository {
List<DictionaryEntries> selectByExample(DictionaryEntriesExample example);
List<DictionaryEntries> findAll(DictionaryEntriesExample example);
}
......
......@@ -13,7 +13,7 @@ import java.util.List;
public class DictionaryEntriesImpl extends BaseDao implements IDictionaryEntriesRepository {
@Override
public List<DictionaryEntries> selectByExample(DictionaryEntriesExample example) {
public List<DictionaryEntries> findAll(DictionaryEntriesExample example) {
DictionaryEntriesExample.Criteria criteria = example.createCriteria();
criteria.andStatusEqualTo(DatabaseConstants.GLOBAL_STATUS_VALID);
example.setOrderByClause("CREATE_TIME DESC");
......
package com.fedex.connect.common.dependencies.repository.repo.log;
import com.fedex.connect.common.model.log.Operation;
/**
* @Author mt
* @Description 记录操作日志
* @Date 2024/11/6
*/
public interface IOperationRepository {
void insert(Operation record);
}
package com.fedex.connect.common.dependencies.repository.repo.log.impl;
import com.fedex.connect.common.dependencies.repository.base.BaseDao;
import com.fedex.connect.common.dependencies.repository.repo.log.IOperationRepository;
import com.fedex.connect.common.model.log.Operation;
/**
* @Author mt
* @Description 操作日志
* @Date 2024/11/6
*/
public class OperationRepositoryImpl extends BaseDao implements IOperationRepository {
public void insert(Operation record){
operationMapper.insert(record);
}
}
......@@ -19,7 +19,7 @@ public class DictionaryEntriesServiceImpl extends BaseService implements IDictio
public List<DictionaryEntries> findAll() {
try{
DictionaryEntriesExample example = new DictionaryEntriesExample();
return dictionaryEntriesRepository.selectByExample(example);
return dictionaryEntriesRepository.findAll(example);
} catch (Exception e){
log.error(LogShowModel.showException("Exception",e));
return null;
......
......@@ -3,6 +3,7 @@ package com.fedex.connect.manager.controller.base;
import com.fedex.connect.common.dependencies.i18n.LocaleMessageUtil;
import com.fedex.connect.manager.config.PropertiesConfig;
import com.fedex.connect.manager.service.bi.IDicEntriesService;
import com.fedex.connect.manager.service.log.ILogLoginService;
import com.fedex.connect.manager.service.sys.ISysAuthService;
import com.fedex.connect.manager.service.sys.ISysUserService;
......@@ -24,4 +25,6 @@ public class BaseController {
protected ISysAuthService sysAuthService;
@Autowired
protected ILogLoginService logLoginService;
@Autowired
protected IDicEntriesService dicEntriesService;
}
......
package com.fedex.connect.manager.controller.bi.impl;
import com.fedex.connect.common.dependencies.date.vo.ResponseVo;
import com.fedex.connect.common.model.bi.DictionaryEntries;
import com.fedex.connect.manager.controller.base.BaseController;
import com.fedex.connect.manager.controller.bi.IDicEntriesController;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
@RequestMapping(value = "/dicEntries", name = "字典相关操作")
@Api(value="DicEntriesController",tags={"字典相关操作"})
public class DicEntriesController {
public class DicEntriesController extends BaseController implements IDicEntriesController {
@PostMapping("/init")
@ApiOperation(value = "初始化进入首页获取FCL登录地址")
public ResponseVo init(){
return ResponseVo.succ(fclIndexLoginUrl);
@GetMapping("/getCountryAll")
@ApiOperation(value = "获取所有国家字典信息")
public ResponseVo getCountryAll(){
List<DictionaryEntries> countryList = dicEntriesService.getCountryAll();
return ResponseVo.succ(countryList);
}
}
......
package com.fedex.connect.manager.repository.repo.bi;
import com.fedex.connect.common.model.bi.DictionaryEntries;
import java.util.List;
public interface IDicEntriesRepository {
List<DictionaryEntries> getCountryAll();
}
package com.fedex.connect.manager.repository.repo.bi.impl;
import com.fedex.connect.common.dependencies.cache.CacheSystem;
import com.fedex.connect.common.dependencies.contants.DictionaryConstants;
import com.fedex.connect.common.model.bi.DictionaryEntries;
import com.fedex.connect.manager.repository.base.BaseDao;
import com.fedex.connect.manager.repository.repo.bi.IDicEntriesRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import java.util.List;
/**
* @Author mt
* @Description 字典查询repository
* @Date 2024/11/6
*/
@Repository
public class DicEntriesRepositoryImpl extends BaseDao implements IDicEntriesRepository {
@Autowired
CacheSystem cacheSystem;
/**
* @Author mt
* @Description 获取所有国家字典
* @Date 2024/11/6
* @param
* @return java.util.List<com.fedex.connect.common.model.bi.DictionaryEntries>
*/
public List<DictionaryEntries> getCountryAll(){
return cacheSystem.getDictionarysByDicCode(DictionaryConstants.COUNTRY);
}
}
......@@ -6,6 +6,7 @@ import com.fedex.connect.common.dao.sys.RoleMapper;
import com.fedex.connect.common.dao.sys.UserMapper;
import com.fedex.connect.common.dao.sys.UserRoleMapper;
import com.fedex.connect.common.dependencies.i18n.LocaleMessageUtil;
import com.fedex.connect.manager.repository.repo.bi.IDicEntriesRepository;
import com.fedex.connect.manager.repository.repo.log.IUserLoginLogRepository;
import com.fedex.connect.manager.repository.repo.sys.*;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -31,25 +32,5 @@ public class BaseService {
@Autowired
public IUserRepository userRepository;
@Autowired
public IDictionaryEntriesRepository dictionaryEntriesRepository;
/**
* Mapper---------------------------------------------
*/
@Autowired
protected UserMapper userMapper;
@Autowired
protected UserRoleMapper userRoleMapper;
@Autowired
protected RoleMapper roleMapper;
@Autowired
protected UserLoginInfoMapper userLoginInfoMapper;
/**
* MapperExt---------------------------------------------
*/
public IDicEntriesRepository dicEntriesRepository;
}
......
package com.fedex.connect.manager.service.bi;
import com.fedex.connect.common.model.bi.DictionaryEntries;
import java.util.List;
public interface IDicEntriesService {
List<DictionaryEntries> getCountryAll();
}
\ No newline at end of file
package com.fedex.connect.manager.service.bi.impl;
import com.fedex.connect.common.model.bi.DictionaryEntries;
import com.fedex.connect.manager.service.base.BaseService;
import com.fedex.connect.manager.service.bi.IDicEntriesService;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class DicEntriesServiceImpl extends BaseService implements IDicEntriesService {
@Override
public List<DictionaryEntries> getCountryAll() {
return dicEntriesRepository.getCountryAll();
}
}
......@@ -4,6 +4,7 @@ import com.fedex.connect.manager.data.dto.LogLoginDto;
import com.fedex.connect.manager.data.model.LogShowModel;
import com.fedex.connect.manager.service.base.BaseService;
import com.fedex.connect.manager.service.log.ILogLoginService;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
......@@ -13,12 +14,10 @@ import org.springframework.transaction.annotation.Transactional;
* 日志相关service
* @author EDY
*/
@Slf4j
@Service
public class LogLoginServiceImpl extends BaseService implements ILogLoginService {
private Logger logger = LoggerFactory.getLogger(LogLoginServiceImpl.class);
/**
* 保存登录日志
* @param dto
......@@ -26,11 +25,6 @@ public class LogLoginServiceImpl extends BaseService implements ILogLoginService
*/
@Transactional(rollbackFor = Exception.class)
public int saveLoginLog(LogLoginDto dto){
try{
return userLoginLogRepository.insert(LogLoginDto.dtoToDao(dto));
} catch (Exception e){
logger.error(LogShowModel.showException("Exception",e));
throw e;
}
return userLoginLogRepository.insert(LogLoginDto.dtoToDao(dto));
}
}
......