文章目录

  • 岗位管理界面 /system/post
  • SysPostController控制岗位管理
  • 查询岗位列表 /system/post/list
    • service层
    • dao层
    • pojo - sys_post 岗位表
  • 新增岗位 /system/post/add
    • 显示add页面 GET请求
    • 新增保存 POST请求
  • 修改岗位 /system/post/edit/{postId}
    • 信息回显
    • 信息校验
      • 岗位名称校验 /system/post/checkPostNameUnique
      • 岗位编码校验 /system/post/checkPostCodeUnique
    • 保存修改
  • 删除岗位 /system/post/remove
  • 切面AOP - 日志记录切面LogAspect
    • pojo - sys_oper_log 操作日志记录表
    • 配置切入点:有@Log注解的类都会被切入
    • handleLog方法 - 记录日志
    • @AfterReturning方法
    • @AfterThrowing方法
    • 获取获取注解中对方法的描述信息(用于Controller层注解)
    • 获取请求的参数,放到log中
    • 是否存在注解,如果存在就获取

岗位管理界面 /system/post

SysPostController控制岗位管理

/*** 岗位信息操作处理* * @author ruoyi*/
@Controller
@RequestMapping("/system/post")
public class SysPostController extends BaseController
{private String prefix = "system/post";@Autowiredprivate ISysPostService postService;@RequiresPermissions("system:post:view")@GetMapping()public String operlog(){return prefix + "/post";}//之后是各种Controllers...

查询岗位列表 /system/post/list

    /*** 查询岗位列表* @param post* @return*/@RequiresPermissions("system:post:list")@PostMapping("/list")@ResponseBodypublic TableDataInfo list(SysPost post){startPage();List<SysPost> list = postService.selectPostList(post);return getDataTable(list);}

service层

    /*** 查询岗位信息集合* * @param post 岗位信息* @return 岗位信息集合*/@Overridepublic List<SysPost> selectPostList(SysPost post){return postMapper.selectPostList(post);}

dao层

 <select id="selectPostList" parameterType="SysPost" resultMap="SysPostResult"><include refid="selectPostVo"/><where><if test="postCode != null and postCode != ''">AND post_code like concat('%', #{postCode}, '%')</if><if test="status != null and status != ''">AND status = #{status}</if><if test="postName != null and postName != ''">AND post_name like concat('%', #{postName}, '%')</if></where>
</select>

pojo - sys_post 岗位表

package com.ruoyi.system.domain;import javax.validation.constraints.*;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import com.ruoyi.common.annotation.Excel;
import com.ruoyi.common.annotation.Excel.ColumnType;
import com.ruoyi.common.core.domain.BaseEntity;/*** 岗位表 sys_post* * @author ruoyi*/
public class SysPost extends BaseEntity
{private static final long serialVersionUID = 1L;/** 岗位序号 */@Excel(name = "岗位序号", cellType = ColumnType.NUMERIC)private Long postId;/** 岗位编码 */@Excel(name = "岗位编码")private String postCode;/** 岗位名称 */@Excel(name = "岗位名称")private String postName;/** 岗位排序 */@Excel(name = "岗位排序", cellType = ColumnType.NUMERIC)private String postSort;/** 状态(0正常 1停用) */@Excel(name = "状态", readConverterExp = "0=正常,1=停用")private String status;/** 用户是否存在此岗位标识 默认不存在 */private boolean flag = false;public Long getPostId(){return postId;}public void setPostId(Long postId){this.postId = postId;}@NotBlank(message = "岗位编码不能为空")@Size(min = 0, max = 64, message = "岗位编码长度不能超过64个字符")public String getPostCode(){return postCode;}public void setPostCode(String postCode){this.postCode = postCode;}@NotBlank(message = "岗位名称不能为空")@Size(min = 0, max = 50, message = "岗位名称长度不能超过50个字符")public String getPostName(){return postName;}public void setPostName(String postName){this.postName = postName;}@NotBlank(message = "显示顺序不能为空")public String getPostSort(){return postSort;}public void setPostSort(String postSort){this.postSort = postSort;}public String getStatus(){return status;}public void setStatus(String status){this.status = status;}public boolean isFlag(){return flag;}public void setFlag(boolean flag){this.flag = flag;}@Overridepublic String toString() {return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE).append("postId", getPostId()).append("postCode", getPostCode()).append("postName", getPostName()).append("postSort", getPostSort()).append("status", getStatus()).append("createBy", getCreateBy()).append("createTime", getCreateTime()).append("updateBy", getUpdateBy()).append("updateTime", getUpdateTime()).append("remark", getRemark()).toString();}
}

新增岗位 /system/post/add

显示add页面 GET请求

    /*** 新增岗位*/@GetMapping("/add")public String add(){return prefix + "/add";}

新增保存 POST请求

    /*** 新增保存岗位*/@RequiresPermissions("system:post:add")@Log(title = "岗位管理", businessType = BusinessType.INSERT)@PostMapping("/add")@ResponseBodypublic AjaxResult addSave(@Validated SysPost post){if (UserConstants.POST_NAME_NOT_UNIQUE.equals(postService.checkPostNameUnique(post))){return error("新增岗位'" + post.getPostName() + "'失败,岗位名称已存在");}else if (UserConstants.POST_CODE_NOT_UNIQUE.equals(postService.checkPostCodeUnique(post))){return error("新增岗位'" + post.getPostName() + "'失败,岗位编码已存在");}post.setCreateBy(ShiroUtils.getLoginName());return toAjax(postService.insertPost(post));}

修改岗位 /system/post/edit/{postId}

信息回显

    /*** 修改岗位*/@GetMapping("/edit/{postId}")public String edit(@PathVariable("postId") Long postId, ModelMap mmap){mmap.put("post", postService.selectPostById(postId));return prefix + "/edit";}

信息校验

岗位名称校验 /system/post/checkPostNameUnique

    /*** 校验岗位名称*/@PostMapping("/checkPostNameUnique")@ResponseBodypublic String checkPostNameUnique(SysPost post){return postService.checkPostNameUnique(post);}

岗位编码校验 /system/post/checkPostCodeUnique

    /*** 校验岗位编码*/@PostMapping("/checkPostCodeUnique")@ResponseBodypublic String checkPostCodeUnique(SysPost post){return postService.checkPostCodeUnique(post);}

保存修改

    /*** 修改保存岗位*/@RequiresPermissions("system:post:edit")@Log(title = "岗位管理", businessType = BusinessType.UPDATE)@PostMapping("/edit")@ResponseBodypublic AjaxResult editSave(@Validated SysPost post){if (UserConstants.POST_NAME_NOT_UNIQUE.equals(postService.checkPostNameUnique(post))){return error("修改岗位'" + post.getPostName() + "'失败,岗位名称已存在");}else if (UserConstants.POST_CODE_NOT_UNIQUE.equals(postService.checkPostCodeUnique(post))){return error("修改岗位'" + post.getPostName() + "'失败,岗位编码已存在");}post.setUpdateBy(ShiroUtils.getLoginName());return toAjax(postService.updatePost(post));}

删除岗位 /system/post/remove

    /*** 删除岗位* @param ids* @return*/@RequiresPermissions("system:post:remove")@Log(title = "岗位管理", businessType = BusinessType.DELETE)@PostMapping("/remove")@ResponseBodypublic AjaxResult remove(String ids){try{return toAjax(postService.deletePostByIds(ids));}catch (Exception e){return error(e.getMessage());}}

切面AOP - 日志记录切面LogAspect

package com.ruoyi.framework.aspectj;import java.lang.reflect.Method;
import java.util.Map;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.enums.BusinessStatus;
import com.ruoyi.common.json.JSON;
import com.ruoyi.common.utils.ServletUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.framework.manager.AsyncManager;
import com.ruoyi.framework.manager.factory.AsyncFactory;
import com.ruoyi.framework.util.ShiroUtils;
import com.ruoyi.system.domain.SysOperLog;
import com.ruoyi.system.domain.SysUser;/*** 操作日志记录处理* * @author ruoyi*/
@Aspect
@Component
public class LogAspect
{private static final Logger log = LoggerFactory.getLogger(LogAspect.class);//之后是切面类的配置及切面方法...
}

pojo - sys_oper_log 操作日志记录表

package com.ruoyi.system.domain;import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import java.util.Date;
import com.ruoyi.common.annotation.Excel;
import com.ruoyi.common.annotation.Excel.ColumnType;
import com.ruoyi.common.core.domain.BaseEntity;/*** 操作日志记录表 oper_log* * @author ruoyi*/
public class SysOperLog extends BaseEntity
{private static final long serialVersionUID = 1L;/** 日志主键 */@Excel(name = "操作序号", cellType = ColumnType.NUMERIC)private Long operId;/** 操作模块 */@Excel(name = "操作模块")private String title;/** 业务类型(0其它 1新增 2修改 3删除) */@Excel(name = "业务类型", readConverterExp = "0=其它,1=新增,2=修改,3=删除,4=授权,5=导出,6=导入,7=强退,8=生成代码,9=清空数据")private Integer businessType;/** 业务类型数组 */private Integer[] businessTypes;/** 请求方法 */@Excel(name = "请求方法")private String method;/** 请求方式 */@Excel(name = "请求方式")private String requestMethod;/** 操作类别(0其它 1后台用户 2手机端用户) */@Excel(name = "操作类别", readConverterExp = "0=其它,1=后台用户,2=手机端用户")private Integer operatorType;/** 操作人员 */@Excel(name = "操作人员")private String operName;/** 部门名称 */@Excel(name = "部门名称")private String deptName;/** 请求url */@Excel(name = "请求地址")private String operUrl;/** 操作地址 */@Excel(name = "操作地址")private String operIp;/** 操作地点 */@Excel(name = "操作地点")private String operLocation;/** 请求参数 */@Excel(name = "请求参数")private String operParam;/** 返回参数 */@Excel(name = "返回参数")private String jsonResult;/** 操作状态(0正常 1异常) */@Excel(name = "状态", readConverterExp = "0=正常,1=异常")private Integer status;/** 错误消息 */@Excel(name = "错误消息")private String errorMsg;/** 操作时间 */@Excel(name = "操作时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")private Date operTime;public Long getOperId(){return operId;}public void setOperId(Long operId){this.operId = operId;}public String getTitle(){return title;}public void setTitle(String title){this.title = title;}public Integer getBusinessType(){return businessType;}public void setBusinessType(Integer businessType){this.businessType = businessType;}public Integer[] getBusinessTypes(){return businessTypes;}public void setBusinessTypes(Integer[] businessTypes){this.businessTypes = businessTypes;}public String getMethod(){return method;}public void setMethod(String method){this.method = method;}public String getRequestMethod(){return requestMethod;}public void setRequestMethod(String requestMethod){this.requestMethod = requestMethod;}public Integer getOperatorType(){return operatorType;}public void setOperatorType(Integer operatorType){this.operatorType = operatorType;}public String getOperName(){return operName;}public void setOperName(String operName){this.operName = operName;}public String getDeptName(){return deptName;}public void setDeptName(String deptName){this.deptName = deptName;}public String getOperUrl(){return operUrl;}public void setOperUrl(String operUrl){this.operUrl = operUrl;}public String getOperIp(){return operIp;}public void setOperIp(String operIp){this.operIp = operIp;}public String getOperLocation(){return operLocation;}public void setOperLocation(String operLocation){this.operLocation = operLocation;}public String getOperParam(){return operParam;}public void setOperParam(String operParam){this.operParam = operParam;}public String getJsonResult(){return jsonResult;}public void setJsonResult(String jsonResult){this.jsonResult = jsonResult;}public Integer getStatus(){return status;}public void setStatus(Integer status){this.status = status;}public String getErrorMsg(){return errorMsg;}public void setErrorMsg(String errorMsg){this.errorMsg = errorMsg;}public Date getOperTime(){return operTime;}public void setOperTime(Date operTime){this.operTime = operTime;}@Overridepublic String toString() {return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE).append("operId", getOperId()).append("title", getTitle()).append("businessType", getBusinessType()).append("businessTypes", getBusinessTypes()).append("method", getMethod()).append("requestMethod", getRequestMethod()).append("operatorType", getOperatorType()).append("operName", getOperName()).append("deptName", getDeptName()).append("operUrl", getOperUrl()).append("operIp", getOperIp()).append("operLocation", getOperLocation()).append("operParam", getOperParam()).append("status", getStatus()).append("errorMsg", getErrorMsg()).append("operTime", getOperTime()).toString();}
}

配置切入点:有@Log注解的类都会被切入

    // 配置织入点@Pointcut("@annotation(com.ruoyi.common.annotation.Log)")public void logPointCut(){}

handleLog方法 - 记录日志

    protected void handleLog(final JoinPoint joinPoint, final Exception e, Object jsonResult){try{// 获得注解Log controllerLog = getAnnotationLog(joinPoint);if (controllerLog == null){return;}// 获取当前的用户SysUser currentUser = ShiroUtils.getSysUser();// *========数据库日志=========*//SysOperLog operLog = new SysOperLog();operLog.setStatus(BusinessStatus.SUCCESS.ordinal());// 请求的地址String ip = ShiroUtils.getIp();operLog.setOperIp(ip);// 返回参数operLog.setJsonResult(JSON.marshal(jsonResult));operLog.setOperUrl(ServletUtils.getRequest().getRequestURI());if (currentUser != null){operLog.setOperName(currentUser.getLoginName());if (StringUtils.isNotNull(currentUser.getDept())&& StringUtils.isNotEmpty(currentUser.getDept().getDeptName())){operLog.setDeptName(currentUser.getDept().getDeptName());}}if (e != null){operLog.setStatus(BusinessStatus.FAIL.ordinal());operLog.setErrorMsg(StringUtils.substring(e.getMessage(), 0, 2000));}// 设置方法名称String className = joinPoint.getTarget().getClass().getName();String methodName = joinPoint.getSignature().getName();operLog.setMethod(className + "." + methodName + "()");// 设置请求方式operLog.setRequestMethod(ServletUtils.getRequest().getMethod());// 处理设置注解上的参数getControllerMethodDescription(controllerLog, operLog);// 保存数据库AsyncManager.me().execute(AsyncFactory.recordOper(operLog));}catch (Exception exp){// 记录本地异常日志log.error("==前置通知异常==");log.error("异常信息:{}", exp.getMessage());exp.printStackTrace();}}

@AfterReturning方法

    /*** 处理完请求后执行** @param joinPoint 切点*/@AfterReturning(pointcut = "logPointCut()", returning = "jsonResult")public void doAfterReturning(JoinPoint joinPoint, Object jsonResult){handleLog(joinPoint, null, jsonResult);}

@AfterThrowing方法

    /*** 拦截异常操作* * @param joinPoint 切点* @param e 异常*/@AfterThrowing(value = "logPointCut()", throwing = "e")public void doAfterThrowing(JoinPoint joinPoint, Exception e){handleLog(joinPoint, e, null);}

获取获取注解中对方法的描述信息(用于Controller层注解)

    /*** 获取注解中对方法的描述信息 用于Controller层注解* * @param log 日志* @param operLog 操作日志* @throws Exception*/public void getControllerMethodDescription(Log log, SysOperLog operLog) throws Exception{// 设置action动作operLog.setBusinessType(log.businessType().ordinal());// 设置标题operLog.setTitle(log.title());// 设置操作人类别operLog.setOperatorType(log.operatorType().ordinal());// 是否需要保存request,参数和值if (log.isSaveRequestData()){// 获取参数的信息,传入到数据库中。setRequestValue(operLog);}}

获取请求的参数,放到log中

    /*** 获取请求的参数,放到log中* * @param operLog 操作日志* @throws Exception 异常*/private void setRequestValue(SysOperLog operLog) throws Exception{Map<String, String[]> map = ServletUtils.getRequest().getParameterMap();String params = JSON.marshal(map);operLog.setOperParam(StringUtils.substring(params, 0, 2000));}

是否存在注解,如果存在就获取

    /*** 是否存在注解,如果存在就获取*/private Log getAnnotationLog(JoinPoint joinPoint) throws Exception{Signature signature = joinPoint.getSignature();MethodSignature methodSignature = (MethodSignature) signature;Method method = methodSignature.getMethod();if (method != null){return method.getAnnotation(Log.class);}return null;}

若依源码分析(7)——岗位管理相关推荐

  1. RocketMQ4.0源码分析之-路由管理

    RocketMQ4.0源码分析之-路由管理 一 前言 路由管理功能是RocketMQ的核心功能之一,涵盖了订阅管理,连接管理,负载均衡管理等一系列功能,代码布在NameServer,Broker,Pr ...

  2. caffe源码分析--SyncedMemory 内存管理机制

    caffe源码分析–SyncedMemory 内存管理机制 ​ SyncedMemory 是caffe中用来管理内存分配和CPU.GPU数据及同步的类,只服务于Blob类.SyncedMemory 对 ...

  3. Linux内核源码分析《进程管理》

    Linux内核源码分析<进程管理> 前言 1. Linux 内核源码分析架构 2. 进程原理分析 2.1 进程基础知识 2.2 Linux进程四要素 2.3 进程描述符 task_stru ...

  4. v05.05 鸿蒙内核源码分析(任务管理) | 如何管理任务池 | 百篇博客分析HarmonyOS源码

    曾子曰:"吾日三省吾身:为人谋而不忠乎?与朋友交而不信乎?传不习乎?"<论语>:学而篇 百篇博客系列篇.本篇为: v05.xx 鸿蒙内核源码分析(任务管理篇) | 如何 ...

  5. istio源码分析——pilot-agent如何管理envoy生命周期

    原文:istio源码分析--pilot-agent如何管理envoy生命周期 声明 分析的源码为0.7.1版本 环境为k8s 由于没有C++ 基础,所以源码分析止步于 C++,但也学到很多东西 pil ...

  6. mybatis源码分析之事务管理器

    2019独角兽企业重金招聘Python工程师标准>>> 上一篇:mybatis源码分析之Configuration 主要分析了构建SqlSessionFactory的过程中配置文件的 ...

  7. Tomcat源码分析(九)--Session管理

    本系列转载自 http://blog.csdn.net/haitao111313/article/category/1179996 在明白Tomcat的Session机制之前,先要了解Session, ...

  8. Linux内核源码分析之内存管理

    本文站的角度更底层,基本都是从Linux内核出发,会更深入.所以当你都读完,然后再次审视这些功能的实现和设计时,我相信你会有种豁然开朗的感觉. 1.页 内核把物理页作为内存管理的基本单元. 尽管处理器 ...

  9. FFMPEG4.1源码分析之 内存管理APIs av_malloc() av_mallocz()

    1  av_malloc() av_malloc() 声明: 所属库:libavutil,该库是ffmpeg的功能库,提供了线程,内存,文件,加密等功能 头文件:libavutil/mem.h 该函数 ...

  10. FFMPEG4.1源码分析之 内存管理APIs av_freep() av_free()

    1. av_freep() av_freep() 声明: 所属库:libavutil(lavu),libavutil是ffmpeg的工具类库,本函数是其内存管理类库中的函数 头文件:libavutil ...

最新文章

  1. 2018QBXT刷题游记(15)
  2. luogu P3808 【模板】AC自动机(简单版)
  3. 图片识别文字, OCR
  4. jquery $(document).ready() 与window.onload的区别
  5. PCV相关指标控制要求
  6. Django简介以及安装
  7. Java并发编程实战~软件事务内存
  8. 【java】反射+poi 导出excel
  9. python的装饰器、迭代器、yield_python装饰器,迭代器,生成器,协程
  10. html设置数组的方法,js改变原数组的方法有哪些?
  11. Oracle 分区表的 FOR 语句,你这样用过吗?
  12. 初学者UI设计临摹素材模板,请先搞清楚这4个分类!
  13. 第一模块:开发基础 第1章·Python基础语法
  14. wdatepicker时间段控制
  15. Too_many_open_files_问题的解决
  16. 《写给大家看的设计书》封面设计基本要求
  17. Windows如何根据代码签名生态系统确定要信任的软件
  18. 欧冠 欧洲杯免费直播平台
  19. 短视频优质作者必备|配音神器分享|那些你刷视频时肯定听过的声音
  20. java计算机毕业设计BS用户小票系统(附源码、数据库)

热门文章

  1. 试用期不合格通知单可以签吗?
  2. Hive实战之Youtube数据集
  3. java工商银行项目_工商银行聚合支付,java开发实现
  4. BUUCTF web writeup
  5. Linux下查询外网IP地址方法集合
  6. 一种简单的zabbix客户端 主机hostid查看方法
  7. 使用FFmpeg将MP4转换为ts文件
  8. 串口助手是怎么做出来的 :第一节,串口助手界面的实现及串口通信原理的介绍
  9. vue中处理文本不换行问题
  10. ListView 设置 scrollbars 之后出现的细线白边的解决方法