ting.yin %!s(int64=5) %!d(string=hai) anos
pai
achega
9139b41b73

+ 10 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/dao/OperationLogDao.java

@@ -0,0 +1,10 @@
+package cn.com.qmth.stmms.biz.exam.dao;
+
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.repository.PagingAndSortingRepository;
+
+import cn.com.qmth.stmms.biz.exam.model.OperationLog;
+
+public interface OperationLogDao extends PagingAndSortingRepository<OperationLog, Integer>, JpaSpecificationExecutor<OperationLog> {
+
+}

+ 148 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/OperationLog.java

@@ -0,0 +1,148 @@
+package cn.com.qmth.stmms.biz.exam.model;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.EnumType;
+import javax.persistence.Enumerated;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.persistence.Temporal;
+import javax.persistence.TemporalType;
+
+import cn.com.qmth.stmms.common.enums.LogType;
+
+@Entity
+@Table(name = "eb_operation_log")
+public class OperationLog implements Serializable {
+
+    private static final long serialVersionUID = 6113624004905118738L;
+
+    @Id
+    @GeneratedValue
+    private Integer id;
+
+    @Column(name = "exam_id")
+    private Integer examId;
+
+    @Column(name = "school_id")
+    private Integer schoolId;
+
+    @Enumerated(EnumType.STRING)
+    @Column(name = "type", length = 16, nullable = false)
+    private LogType type;
+
+    @Column(name = "menu", length = 128, nullable = true)
+    private String menu;
+
+    @Column(name = "description", length = 128, nullable = true)
+    private String description;
+
+    @Temporal(TemporalType.TIMESTAMP)
+    @Column(name = "create_time")
+    private Date createTime;
+
+    @Column(name = "is_marker")
+    private boolean marker;
+
+    @Column(name = "operator_id")
+    private Integer operatorId;
+
+    @Column(name = "login_name")
+    private String loginName;
+
+    @Column(name = "ip_address")
+    private String ipAddress;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getExamId() {
+        return examId;
+    }
+
+    public void setExamId(Integer examId) {
+        this.examId = examId;
+    }
+
+    public Integer getSchoolId() {
+        return schoolId;
+    }
+
+    public void setSchoolId(Integer schoolId) {
+        this.schoolId = schoolId;
+    }
+
+    public LogType getType() {
+        return type;
+    }
+
+    public void setType(LogType type) {
+        this.type = type;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    public String getLoginName() {
+        return loginName;
+    }
+
+    public void setLoginName(String loginName) {
+        this.loginName = loginName;
+    }
+
+    public String getIpAddress() {
+        return ipAddress;
+    }
+
+    public void setIpAddress(String ipAddress) {
+        this.ipAddress = ipAddress;
+    }
+
+    public String getMenu() {
+        return menu;
+    }
+
+    public void setMenu(String menu) {
+        this.menu = menu;
+    }
+
+    public Integer getOperatorId() {
+        return operatorId;
+    }
+
+    public void setOperatorId(Integer operatorId) {
+        this.operatorId = operatorId;
+    }
+
+    public boolean isMarker() {
+        return marker;
+    }
+
+    public void setMarker(boolean marker) {
+        this.marker = marker;
+    }
+
+}

+ 9 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/OperationLogService.java

@@ -0,0 +1,9 @@
+package cn.com.qmth.stmms.biz.exam.service;
+
+import cn.com.qmth.stmms.biz.exam.model.OperationLog;
+
+public interface OperationLogService {
+
+    OperationLog save(OperationLog examLog);
+
+}

+ 24 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/impl/OperationLogServiceImpl.java

@@ -0,0 +1,24 @@
+package cn.com.qmth.stmms.biz.exam.service.impl;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import cn.com.qmth.stmms.biz.common.BaseQueryService;
+import cn.com.qmth.stmms.biz.exam.dao.OperationLogDao;
+import cn.com.qmth.stmms.biz.exam.model.OperationLog;
+import cn.com.qmth.stmms.biz.exam.service.OperationLogService;
+
+@Service
+public class OperationLogServiceImpl extends BaseQueryService<OperationLog> implements OperationLogService {
+
+    @Autowired
+    private OperationLogDao logDao;
+
+    @Transactional
+    @Override
+    public OperationLog save(OperationLog log) {
+        return logDao.save(log);
+    }
+
+}

+ 34 - 0
stmms-common/src/main/java/cn/com/qmth/stmms/common/enums/LogType.java

@@ -0,0 +1,34 @@
+package cn.com.qmth.stmms.common.enums;
+
+public enum LogType {
+
+    QUERY("查询", 1), ADD("新增", 2), UPDATE("更新", 3), DELETE("删除", 4), IMPORT_FILE("导入", 5), EXPORT("导出", 6);
+
+    private String name;
+
+    private int value;
+
+    private LogType(String name, int value) {
+        this.name = name;
+        this.value = value;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public int getValue() {
+        return value;
+    }
+
+    public static LogType findByValue(int value) {
+        LogType type = null;
+        for (LogType s : LogType.values()) {
+            if (s.getValue() == value) {
+                type = s;
+                break;
+            }
+        }
+        return type;
+    }
+}

+ 59 - 0
stmms-web/src/main/java/cn/com/qmth/stmms/api/controller/CoreController.java

@@ -0,0 +1,59 @@
+package cn.com.qmth.stmms.api.controller;
+
+import javax.servlet.http.HttpServletRequest;
+
+import net.sf.json.JSONArray;
+import net.sf.json.JSONObject;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import cn.com.qmth.stmms.biz.exam.model.Exam;
+import cn.com.qmth.stmms.biz.exam.service.ExamService;
+import cn.com.qmth.stmms.biz.exam.service.ExamSubjectService;
+
+@Controller("coreApiController")
+@RequestMapping("/api/core")
+public class CoreController extends BaseApiController {
+
+    @Autowired
+    private ExamService examService;
+
+    @Autowired
+    private ExamSubjectService subjectService;
+
+    @RequestMapping(value = "/exam/save", method = RequestMethod.POST)
+    @ResponseBody
+    public JSONObject save(HttpServletRequest request, Exam exam) {
+        JSONObject result = new JSONObject();
+        exam = examService.save(exam);
+        result.accumulate("id", exam.getId());
+        result.accumulate("updateTime", exam.getId());
+        return result;
+    }
+
+    @RequestMapping(value = "/exam/student/save", method = RequestMethod.POST)
+    @ResponseBody
+    public JSONObject studentSave(HttpServletRequest request) {
+        JSONObject result = new JSONObject();
+        return result;
+    }
+
+    @RequestMapping(value = "/student/query", method = RequestMethod.POST)
+    @ResponseBody
+    public JSONArray studentQuery(HttpServletRequest request) {
+        JSONArray result = new JSONArray();
+        return result;
+    }
+
+    @RequestMapping(value = "/exam/student/score", method = RequestMethod.POST)
+    @ResponseBody
+    public JSONArray getScore(HttpServletRequest request) {
+        JSONArray result = new JSONArray();
+        return result;
+    }
+
+}

+ 30 - 0
stmms-web/src/main/java/cn/com/qmth/stmms/common/annotation/Logging.java

@@ -0,0 +1,30 @@
+package cn.com.qmth.stmms.common.annotation;
+
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+import cn.com.qmth.stmms.common.enums.LogType;
+
+/**
+ * 
+ * @Description: 日志注解定义
+ * @author ting.yin
+ */
+@Target({ METHOD })
+@Retention(RUNTIME)
+public @interface Logging {
+
+    /**
+     * 操作类型
+     */
+    LogType type();
+
+    /**
+     * 操作菜单
+     *
+     */
+    String menu() default "";
+}

+ 4 - 5
stmms-web/src/main/java/cn/com/qmth/stmms/common/domain/WebUser.java

@@ -1,13 +1,8 @@
 package cn.com.qmth.stmms.common.domain;
 
-import cn.com.qmth.stmms.biz.school.model.School;
-import cn.com.qmth.stmms.biz.user.model.OpenAccount;
-import org.apache.commons.lang.StringUtils;
-
 import cn.com.qmth.stmms.biz.exam.model.Marker;
 import cn.com.qmth.stmms.biz.user.model.User;
 import cn.com.qmth.stmms.common.enums.Role;
-import cn.com.qmth.stmms.common.session.model.StmmsSession;
 
 /**
  * web端访问用户抽象描述类
@@ -89,4 +84,8 @@ public class WebUser {
         return role == Role.SCHOOL_VIEWER;
     }
 
+    public boolean isMarker() {
+        return role == Role.MARKER;
+    }
+
 }

+ 108 - 0
stmms-web/src/main/java/cn/com/qmth/stmms/common/interceptor/LogInterceptor.java

@@ -0,0 +1,108 @@
+package cn.com.qmth.stmms.common.interceptor;
+
+import java.util.Date;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.method.HandlerMethod;
+import org.springframework.web.servlet.ModelAndView;
+import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
+
+import cn.com.qmth.stmms.admin.utils.SessionExamUtils;
+import cn.com.qmth.stmms.biz.exam.model.Exam;
+import cn.com.qmth.stmms.biz.exam.model.OperationLog;
+import cn.com.qmth.stmms.biz.exam.service.ExamService;
+import cn.com.qmth.stmms.biz.exam.service.MarkerService;
+import cn.com.qmth.stmms.biz.exam.service.OperationLogService;
+import cn.com.qmth.stmms.biz.user.service.UserService;
+import cn.com.qmth.stmms.common.annotation.Logging;
+import cn.com.qmth.stmms.common.domain.WebUser;
+import cn.com.qmth.stmms.common.utils.RequestUtils;
+
+/**
+ * @Description: 日志操作拦截器
+ * @author ting.yin
+ */
+public class LogInterceptor extends HandlerInterceptorAdapter {
+
+    private static Logger log = LoggerFactory.getLogger(LogInterceptor.class);
+
+    @Autowired
+    private OperationLogService logService;
+
+    @Autowired
+    private ExamService examService;
+
+    @Autowired
+    private MarkerService markerService;
+
+    @Autowired
+    private UserService userService;
+
+    @Override
+    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
+            ModelAndView modelAndView) {
+        WebUser wu = RequestUtils.getWebUser(request);
+        String uri = request.getRequestURI();
+        HandlerMethod method = (HandlerMethod) handler;
+        if (uri.startsWith("/login")) {
+            // wu = buildWebUser(request, response);
+        }
+        Logging logging = method.getMethodAnnotation(Logging.class);
+        if (wu != null && logging != null) {
+            saveLog(logging, wu, request, response);
+        }
+    }
+
+    private void saveLog(Logging logging, WebUser wu, HttpServletRequest request, HttpServletResponse response) {
+        int examId = SessionExamUtils.getExamId(request);
+
+        OperationLog log = new OperationLog();
+        log.setCreateTime(new Date());
+        log.setExamId(examId > 0 ? null : examId);
+        log.setMenu(logging.menu());
+        log.setType(logging.type());
+        log.setMarker(wu.isMarker());
+        if (wu.isMarker()) {
+            log.setMarker(true);
+            log.setOperatorId(wu.getMarker().getId());
+            log.setIpAddress(wu.getMarker().getLastLoginIp());
+            log.setLoginName(wu.getMarker().getLoginName());
+            Exam exam = examService.findById(wu.getMarker().getExamId());
+            log.setSchoolId(exam.getSchoolId());
+        } else {
+            log.setMarker(false);
+            log.setOperatorId(wu.getUser().getId());
+            log.setIpAddress(wu.getUser().getLastLoginIp());
+            log.setLoginName(wu.getUser().getLoginName());
+            log.setSchoolId(wu.getUser().getSchoolId());
+        }
+        log.setDescription(RequestUtils.getLog(request));
+        logService.save(log);
+    }
+
+    /**
+     * 从session中构造WebUser对象
+     * 
+     * @param request
+     * @param response
+     * @throws Exception
+     */
+    // private WebUser buildWebUser(HttpServletRequest request,
+    // HttpServletResponse response) {
+    // WebUser wu = WebUser.buildFromSession(RequestUtils.getSession(request));
+    // if (wu != null) {
+    // RequestUtils.setWebUser(request, wu);
+    // if (wu.isMarker()) {
+    // wu.setDataObject(markerService.findById(wu.getId()));
+    // } else {
+    // wu.setDataObject(userService.findById(wu.getId()));
+    // }
+    // }
+    // return wu;
+    // }
+}

+ 31 - 12
stmms-web/src/main/java/cn/com/qmth/stmms/common/utils/RequestUtils.java

@@ -8,8 +8,6 @@ import javax.servlet.http.Cookie;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
-import cn.com.qmth.stmms.api.exception.ApiException;
-import cn.com.qmth.stmms.biz.user.model.User;
 import cn.com.qmth.stmms.common.domain.ApiUser;
 import cn.com.qmth.stmms.common.domain.OpenUser;
 import cn.com.qmth.stmms.common.domain.WebUser;
@@ -28,6 +26,8 @@ public class RequestUtils {
 
     private static final String REQUEST_OPEN_USER_KEY = "open_user";
 
+    private static final String REQUEST_OPERATION_LOG_KEY = "operation_log";
+
     public static StmmsSession getSession(HttpServletRequest request) {
         Object obj = request.getAttribute(REQUEST_SESSION_KEY);
         if (obj != null && obj instanceof StmmsSession) {
@@ -85,9 +85,12 @@ public class RequestUtils {
     /**
      * 设置 Cookie
      *
-     * @param name   名称
-     * @param value  值
-     * @param maxAge 生存时间(单位秒)
+     * @param name
+     *            名称
+     * @param value
+     *            值
+     * @param maxAge
+     *            生存时间(单位秒)
      */
     public static void setCookie(HttpServletResponse response, String name, String value, int maxAge) {
         Cookie cookie = new Cookie(name, null);
@@ -104,7 +107,8 @@ public class RequestUtils {
     /**
      * 获得指定Cookie的值
      *
-     * @param name 名称
+     * @param name
+     *            名称
      * @return 值
      */
     public static String getCookie(HttpServletRequest request, String name) {
@@ -114,7 +118,8 @@ public class RequestUtils {
     /**
      * 获得指定Cookie的值,并删除。
      *
-     * @param name 名称
+     * @param name
+     *            名称
      * @return 值
      */
     public static String getCookie(HttpServletRequest request, HttpServletResponse response, String name) {
@@ -124,13 +129,18 @@ public class RequestUtils {
     /**
      * 获得指定Cookie的值
      *
-     * @param request  请求对象
-     * @param response 响应对象
-     * @param name     名字
-     * @param isRemove 是否移除
+     * @param request
+     *            请求对象
+     * @param response
+     *            响应对象
+     * @param name
+     *            名字
+     * @param isRemove
+     *            是否移除
      * @return 值
      */
-    public static String getCookie(HttpServletRequest request, HttpServletResponse response, String name, boolean isRemove) {
+    public static String getCookie(HttpServletRequest request, HttpServletResponse response, String name,
+            boolean isRemove) {
         String value = null;
         Cookie[] cookies = request.getCookies();
         if (cookies != null) {
@@ -150,4 +160,13 @@ public class RequestUtils {
         }
         return value;
     }
+
+    public static String getLog(HttpServletRequest request) {
+        Object obj = request.getAttribute(REQUEST_OPERATION_LOG_KEY);
+        if (obj != null && obj instanceof String) {
+            return (String) obj;
+        } else {
+            return "";
+        }
+    }
 }

+ 7 - 0
stmms-web/src/main/webapp/WEB-INF/spring-mvc.xml

@@ -72,6 +72,13 @@
             <mvc:mapping path="/api/**"/>
             <bean id="apiInterceptor" class="cn.com.qmth.stmms.api.interceptor.ApiInterceptor"/>
         </mvc:interceptor>
+        <mvc:interceptor>
+            <mvc:mapping path="/**"/>
+            <mvc:exclude-mapping path="/resources/**"/>
+            <mvc:exclude-mapping path="/static/**"/>
+            <mvc:exclude-mapping path="/file/**"/>
+            <bean id="logInterceptor" class="cn.com.qmth.stmms.common.interceptor.LogInterceptor"/>
+        </mvc:interceptor>
     </mvc:interceptors>
 
     <!-- <bean