Forráskód Böngészése

系统添加日志记录

xian 6 éve
szülő
commit
d6a338b6b5

+ 65 - 0
watero-rst-core/src/main/java/com.iamberry.rst.core/sys/SystemLogs.java

@@ -0,0 +1,65 @@
+package com.iamberry.rst.core.sys;
+
+import java.util.Date;
+
+public class SystemLogs {
+    private Integer logsId;
+
+    private Integer adminId;
+
+    private String logsSymbol;
+
+    private Date logsCreateTime;
+
+    private String logsDetails;
+
+    private String logsRequest;
+
+    public String getLogsDetails() {
+        return logsDetails;
+    }
+
+    public void setLogsDetails(String logsDetails) {
+        this.logsDetails = logsDetails;
+    }
+
+    public Integer getLogsId() {
+        return logsId;
+    }
+
+    public void setLogsId(Integer logsId) {
+        this.logsId = logsId;
+    }
+
+    public Integer getAdminId() {
+        return adminId;
+    }
+
+    public void setAdminId(Integer adminId) {
+        this.adminId = adminId;
+    }
+
+    public String getLogsSymbol() {
+        return logsSymbol;
+    }
+
+    public void setLogsSymbol(String logsSymbol) {
+        this.logsSymbol = logsSymbol == null ? null : logsSymbol.trim();
+    }
+
+    public Date getLogsCreateTime() {
+        return logsCreateTime;
+    }
+
+    public void setLogsCreateTime(Date logsCreateTime) {
+        this.logsCreateTime = logsCreateTime;
+    }
+
+    public String getLogsRequest() {
+        return logsRequest;
+    }
+
+    public void setLogsRequest(String logsRequest) {
+        this.logsRequest = logsRequest == null ? null : logsRequest.trim();
+    }
+}

+ 10 - 4
watero-rst-interface/src/main/java/com/iamberry/rst/faces/sys/SysService.java

@@ -2,10 +2,7 @@ package com.iamberry.rst.faces.sys;
 
 import com.iamberry.rst.core.page.PageRequest;
 import com.iamberry.rst.core.page.PagedResult;
-import com.iamberry.rst.core.sys.Admin;
-import com.iamberry.rst.core.sys.AdminPocess;
-import com.iamberry.rst.core.sys.Menu;
-import com.iamberry.rst.core.sys.Relu;
+import com.iamberry.rst.core.sys.*;
 import org.apache.ibatis.type.IntegerTypeHandler;
 
 import java.util.List;
@@ -20,6 +17,8 @@ import java.util.List;
  */
 public interface SysService {
 
+    String getSymbolName(String symbol);
+
     String getSaltByLoginName(String loginName);
 
     /**
@@ -130,4 +129,11 @@ public interface SysService {
      * @return
      */
     List<Admin> listAdminInfo(Admin admin);
+
+    /**
+     * 添加操作日志
+     * @param logs
+     * @return
+     */
+    int addLogs(SystemLogs logs);
 }

+ 11 - 4
watero-rst-service/src/main/java/com/iamberry/rst/service/sys/SysServiceImpl.java

@@ -3,10 +3,7 @@ package com.iamberry.rst.service.sys;
 import com.github.pagehelper.PageHelper;
 import com.iamberry.rst.core.page.PageRequest;
 import com.iamberry.rst.core.page.PagedResult;
-import com.iamberry.rst.core.sys.Admin;
-import com.iamberry.rst.core.sys.AdminPocess;
-import com.iamberry.rst.core.sys.Menu;
-import com.iamberry.rst.core.sys.Relu;
+import com.iamberry.rst.core.sys.*;
 import com.iamberry.rst.faces.sys.SysService;
 import com.iamberry.rst.service.sys.mapper.SysMapper;
 import com.iamberry.rst.util.PageUtil;
@@ -33,6 +30,11 @@ public class SysServiceImpl implements SysService {
     private SysMapper sysMapper;
 
     @Override
+    public String getSymbolName(String symbol) {
+        return sysMapper.getSymbolName(symbol);
+    }
+
+    @Override
     public String getSaltByLoginName(String loginName) {
         return sysMapper.getSaltByLoginName(loginName);
     }
@@ -139,6 +141,11 @@ public class SysServiceImpl implements SysService {
     }
 
     @Override
+    public int addLogs(SystemLogs logs) {
+        return sysMapper.addLogs(logs);
+    }
+
+    @Override
     public List<Admin> listGetAdmin(Admin admin) {
         return sysMapper.listAdmin(admin);
     }

+ 10 - 4
watero-rst-service/src/main/java/com/iamberry/rst/service/sys/mapper/SysMapper.java

@@ -1,9 +1,6 @@
 package com.iamberry.rst.service.sys.mapper;
 
-import com.iamberry.rst.core.sys.Admin;
-import com.iamberry.rst.core.sys.AdminPocess;
-import com.iamberry.rst.core.sys.Menu;
-import com.iamberry.rst.core.sys.Relu;
+import com.iamberry.rst.core.sys.*;
 
 import java.util.List;
 
@@ -16,6 +13,8 @@ import java.util.List;
  */
 public interface SysMapper {
 
+    String getSymbolName(String symbol);
+
     String getSaltByLoginName(String loginName);
 
     /**
@@ -113,4 +112,11 @@ public interface SysMapper {
      * @return
      */
     Admin getAdminInfo(Admin admin);
+
+    /**
+     * 添加操作日志
+     * @param logs
+     * @return
+     */
+    int addLogs(SystemLogs logs);
 }

+ 10 - 0
watero-rst-service/src/main/java/com/iamberry/rst/service/sys/mapper/sysMapper.xml

@@ -21,6 +21,11 @@
 		</choose>
 	</select>
 
+	<!-- 根据操作符,获取操作名称 -->
+	<select id="getSymbolName" parameterType="String" resultType="String">
+		select perm_name from tb_rst_sys_menu_permisssion where perm_symbol = #{symbol} LIMIT 0,1
+	</select>
+
 	<!-- 根据管理员id,查询管理员的Shiro权限 -->
 	<select id="listPermissionSymbol" parameterType="Integer" resultType="String">
 		SELECT pocess_symbol FROM tb_rst_sys_admin_pocess WHERE pocess_admin_id = #{id}
@@ -238,4 +243,9 @@
 			</if>
 		</where>
 	</select>
+
+	<insert id="addLogs" parameterType="SystemLogs" >
+		insert into tb_rst_system_logs (admin_id, logs_symbol, logs_create_time, logs_request, logs_details)
+		values (#{adminId,jdbcType=INTEGER}, #{logsSymbol,jdbcType=VARCHAR}, NOW(), #{logsRequest,jdbcType=LONGVARCHAR}, #{logsDetails})
+	</insert>
 </mapper>

+ 97 - 0
watero-rst-web/src/main/java/com/iamberry/rst/controllers/log/LogAopHandler.java

@@ -0,0 +1,97 @@
+package com.iamberry.rst.controllers.log;
+
+import com.alibaba.fastjson.JSONObject;
+import com.iamberry.rst.core.sys.Admin;
+import com.iamberry.rst.core.sys.SystemLogs;
+import com.iamberry.rst.faces.sys.SysService;
+import com.iamberry.rst.utils.AdminUtils;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Pointcut;
+import org.aspectj.lang.reflect.MethodSignature;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.springframework.web.context.request.RequestAttributes;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Arrays;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 统一日志处理
+ * @author 献
+ */
+public class LogAopHandler {
+
+    @Autowired
+    private SysService sysService;
+
+    /**
+     * controller层面记录操作日志
+     * 注意此处是aop:around的 因为需要得到请求前的参数以及请求后接口返回的结果
+     * @throws Throwable 
+     */
+    public Object doSaveLog(ProceedingJoinPoint joinPoint) throws Throwable {
+
+        System.out.println("日日日日-----------------------------");
+
+        // 获取Reqest
+        RequestAttributes requestAttributes = RequestContextHolder.currentRequestAttributes();
+        if (requestAttributes == null) {
+            return joinPoint.proceed(joinPoint.getArgs());
+        }
+        // 获取请求方法
+        MethodSignature method = (MethodSignature) joinPoint.getSignature();
+        // 此处不能用getAnnotationByType 是JAVA8的特性,因为注解能够重名,所以得到的是数组
+        RequiresPermissions annotation = method.getMethod().getAnnotation(RequiresPermissions.class);
+        if (annotation == null) {
+            return joinPoint.proceed(joinPoint.getArgs());
+        }
+
+        /* 只是记录经过拦截的日志 */
+        HttpServletRequest request = ((ServletRequestAttributes) requestAttributes).getRequest();
+
+        // 请求参数实例化为JSON格式的字符串
+        Enumeration<String> params = request.getParameterNames();
+        Map<String, Object> paramMap = new HashMap<>();
+        while (params.hasMoreElements()) {
+            // 获取请求参数以及对应的值,防止多个值的问题
+            String param = params.nextElement();
+            String[] values = request.getParameterValues(param);
+            if (values == null) {
+                continue;
+            }
+            if (values.length == 1) {
+                paramMap.put(param, values[0]);
+            } else {
+                paramMap.put(param, values);
+            }
+        }
+        // 请求参数
+        String requestJSON = JSONObject.toJSONString(paramMap);
+        // 操作用户id
+        Integer adminId = AdminUtils.getLoginAdminId();
+        Admin temp = new Admin();
+        temp.setAdminId(adminId);
+        temp = sysService.getAdminInfo(temp);
+        // 操作权限
+        String symbol = annotation.value()[0];
+        String symbolName = sysService.getSymbolName(symbol);
+        // 描述 【XX】在【什么时候】操作了【什么】
+        String details = "【" + temp.getAdminName() + "】操作【" + symbolName + "】";
+        SystemLogs logs = new SystemLogs();
+        logs.setAdminId(adminId);
+        logs.setLogsSymbol(symbol);
+        logs.setLogsDetails(details);
+        logs.setLogsRequest(requestJSON);
+        sysService.addLogs(logs);
+        // 注意around的情况下需要返回result 否则将不会返回值给请求者
+        return joinPoint.proceed(joinPoint.getArgs());
+    }  
+}

+ 9 - 0
watero-rst-web/src/main/resources/watero-rst-ioc.xml

@@ -48,4 +48,13 @@
 	<!-- Activi -->
 	<import resource="classpath:activiti.xml"/>
 
+	<!-- 记录操作日志 -->
+	<bean id="operationLogAop" class="com.iamberry.rst.controllers.log.LogAopHandler"/>
+	<aop:config>
+		<aop:aspect id="logAOP" ref="operationLogAop">
+			<aop:pointcut id="target" expression="execution(* com.iamberry.rst.controllers..*Controller.*(..))"/>
+			<aop:around method="doSaveLog" pointcut-ref="target"/>
+		</aop:aspect>
+	</aop:config>
+
 </beans>

+ 1 - 0
watero-rst-web/src/main/resources/watero-rst-orm.xml

@@ -92,6 +92,7 @@
 		<typeAlias type="com.iamberry.rst.core.cm.StoreShip" alias="StoreShip"/>
 
 		<typeAlias type="com.iamberry.rst.core.sys.SysConfig" alias="SysConfig"/>
+		<typeAlias type="com.iamberry.rst.core.sys.SystemLogs" alias="SystemLogs"/>
 
 		<typeAlias type="com.iamberry.rst.core.address.City" alias="City"/>
 		<typeAlias type="com.iamberry.rst.core.address.Country" alias="Country"/>