From 61f5950b4fbc0c9d59ac755314c0d1a9efb702bc Mon Sep 17 00:00:00 2001
From: 648540858 <18010473990@163.com>
Date: 星期六, 07 八月 2021 14:05:42 +0800
Subject: [PATCH] 添加日志存储与查询功能 登录接口返回用户详细信息

---
 src/main/java/com/genersoft/iot/vmp/VManageBootstrap.java                    |    2 
 src/main/java/com/genersoft/iot/vmp/conf/ApiAccessFilter.java                |  114 ++++++++++
 src/main/java/com/genersoft/iot/vmp/conf/UserSetup.java                      |   10 
 src/main/java/com/genersoft/iot/vmp/vmanager/log/LogController.java          |   93 ++++++++
 src/main/resources/wvp.sqlite                                                |    0 
 src/main/resources/all-application.yml                                       |    2 
 src/main/java/com/genersoft/iot/vmp/service/ILogService.java                 |   34 +++
 src/main/java/com/genersoft/iot/vmp/service/impl/LogServiceImpl.java         |   36 +++
 sql/mysql.sql                                                                |   14 +
 src/main/java/com/genersoft/iot/vmp/common/ApiSaveConstant.java              |  172 +++++++++++++++
 src/main/java/com/genersoft/iot/vmp/conf/security/SecurityUtils.java         |    2 
 src/main/java/com/genersoft/iot/vmp/storager/dao/LogMapper.java              |   39 +++
 src/main/java/com/genersoft/iot/vmp/service/impl/MediaServerServiceImpl.java |    6 
 src/main/java/com/genersoft/iot/vmp/storager/dao/dto/LogDto.java             |   86 +++++++
 src/main/java/com/genersoft/iot/vmp/vmanager/user/UserController.java        |   18 +
 15 files changed, 617 insertions(+), 11 deletions(-)

diff --git a/sql/mysql.sql b/sql/mysql.sql
index ba78cd2..9a41b82 100644
--- a/sql/mysql.sql
+++ b/sql/mysql.sql
@@ -74,7 +74,19 @@
     alarmType         varchar(50)
 );
 
-
+create table log
+(
+    id                int auto_increment
+        primary key,
+    name        varchar(50)     not null,
+    type        varchar(50)     not null,
+    uri         varchar(200)    not null,
+    address     varchar(50)     not null,
+    result      varchar(50)     not null,
+    timing      bigint          not null,
+    username    varchar(50)     not null,
+    createTime  varchar(50)     not null
+);
 
 create table device_mobile_position
 (
diff --git a/src/main/java/com/genersoft/iot/vmp/VManageBootstrap.java b/src/main/java/com/genersoft/iot/vmp/VManageBootstrap.java
index 027efaf..56038bd 100644
--- a/src/main/java/com/genersoft/iot/vmp/VManageBootstrap.java
+++ b/src/main/java/com/genersoft/iot/vmp/VManageBootstrap.java
@@ -4,6 +4,7 @@
 
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.web.servlet.ServletComponentScan;
 import org.springframework.context.ConfigurableApplicationContext;
 import org.springframework.scheduling.annotation.EnableScheduling;
 import springfox.documentation.oas.annotations.EnableOpenApi;
@@ -11,6 +12,7 @@
 /**
  *
  */
+@ServletComponentScan("com.genersoft.iot.vmp.conf")
 @SpringBootApplication
 @EnableScheduling
 @EnableOpenApi
diff --git a/src/main/java/com/genersoft/iot/vmp/common/ApiSaveConstant.java b/src/main/java/com/genersoft/iot/vmp/common/ApiSaveConstant.java
new file mode 100644
index 0000000..ec2a725
--- /dev/null
+++ b/src/main/java/com/genersoft/iot/vmp/common/ApiSaveConstant.java
@@ -0,0 +1,172 @@
+package com.genersoft.iot.vmp.common;
+
+public class ApiSaveConstant {
+
+    public static String getVal(String key) {
+        String[] keyItemArray = key.split("/");
+        if (keyItemArray.length <= 1 || !"api".equals(keyItemArray[1])) {
+            return null;
+        }
+        if (keyItemArray.length >= 4) {
+            switch (keyItemArray[2]) {
+                case "alarm":
+                    if ("delete".equals(keyItemArray[3])) {
+                        return "鍒犻櫎鎶ヨ";
+                    }
+                    break;
+                case "device":
+                    switch (keyItemArray[3]) {
+                        case "config":
+                            if (keyItemArray.length >= 5 && "basicParam".equals(keyItemArray[4])) {
+                                return "[璁惧閰嶇疆] 鍩烘湰閰嶇疆璁剧疆鍛戒护";
+                            }
+                            break;
+                        case "control":
+                            switch (keyItemArray[4]) {
+                                case "teleboot":
+                                    return "[璁惧鎺у埗] 杩滅▼鍚姩";
+                                case "record":
+                                    return "[璁惧鎺у埗] 褰曞儚鎺у埗";
+                                case "guard":
+                                    return "[璁惧鎺у埗] 甯冮槻/鎾ら槻鍛戒护";
+                                case "reset_alarm":
+                                    return "[璁惧鎺у埗] 鎶ヨ澶嶄綅";
+                                case "i_frame":
+                                    return "[璁惧鎺у埗] 寮哄埗鍏抽敭甯�";
+                                case "home_position":
+                                    return "[璁惧鎺у埗] 鐪嬪畧浣嶆帶鍒�";
+                            }
+                            break;
+                            case "query":
+                                if (keyItemArray.length <= 5) return null;
+                                switch (keyItemArray[4]) {
+                                    case "devices":
+                                        if (keyItemArray.length < 7) return null;
+                                        switch (keyItemArray[6]) {
+                                            case "sync":
+                                                return "[璁惧鏌ヨ] 鍚屾璁惧閫氶亾";
+                                            case "delete":
+                                                return "[璁惧鏌ヨ] 绉婚櫎璁惧";
+                                        }
+                                        break;
+                                    case "channel":
+                                        return "[璁惧鏌ヨ] 鏇存柊閫氶亾淇℃伅";
+                                    case "transport":
+                                        return "[璁惧鏌ヨ] 淇敼鏁版嵁娴佷紶杈撴ā寮�";
+                                }
+                                break;
+                            }
+                case "gbStream":
+                    switch (keyItemArray[3]) {
+                        case "del":
+                            return "绉婚櫎閫氶亾涓庡浗鏍囩殑鍏宠仈";
+                        case "add":
+                            return "娣诲姞閫氶亾涓庡浗鏍囩殑鍏宠仈";
+                    }
+                    break;
+                case "media":
+                    break;
+                case "position":
+                    if ("subscribe".equals(keyItemArray[3])) {
+                        return "璁㈤槄浣嶇疆淇℃伅";
+                    }
+                    break;
+                case "platform":
+                    switch (keyItemArray[3]) {
+                        case "save":
+                            return "娣诲姞涓婄骇骞冲彴";
+                        case "delete":
+                            return "绉婚櫎涓婄骇骞冲彴";
+                        case "update_channel_for_gb":
+                            return "鍚戜笂绾у钩鍙版坊鍔犲浗鏍囬�氶亾";
+                        case "del_channel_for_gb":
+                            return "浠庝笂绾у钩鍙扮Щ闄ゅ浗鏍囬�氶亾";
+                    }
+                    break;
+                case "platform_gb_stream":
+                    break;
+                case "play":
+                    switch (keyItemArray[3]) {
+                        case "start":
+                            return "寮�濮嬬偣鎾�";
+                        case "stop":
+                            return "鍋滄鐐规挱";
+                        case "convert":
+                            return "杞爜";
+                        case "convertStop":
+                            return "缁撴潫杞爜";
+                        case "broadcast":
+                            return "璇煶骞挎挱";
+                    }
+                    break;
+                case "download":
+                    switch (keyItemArray[3]) {
+                        case "start":
+                            return "寮�濮嬪巻鍙插獟浣撲笅杞�";
+                        case "stop":
+                            return "鍋滄鍘嗗彶濯掍綋涓嬭浇";
+                    }
+                    break;
+                case "playback":
+                    switch (keyItemArray[3]) {
+                        case "start":
+                            return "寮�濮嬭棰戝洖鏀�";
+                        case "stop":
+                            return "鍋滄瑙嗛鍥炴斁";
+                    }
+                    break;
+                case "ptz":
+                    switch (keyItemArray[3]) {
+                        case "control":
+                            return "浜戝彴鎺у埗";
+                        case "front_end_command":
+                            return "閫氱敤鍓嶇鎺у埗鍛戒护";
+                    }
+                    break;
+                case "gb_record":
+                    break;
+                case "onvif":
+                    break;
+                case "server":
+                    if ("restart".equals(keyItemArray[3])) {
+                        return "閲嶅惎娴佸獟浣撴湇鍔�";
+                    }
+                    break;
+                case "proxy":
+                    switch (keyItemArray[3]) {
+                        case "save":
+                            return "淇濆瓨浠g悊";
+                        case "del":
+                            return "绉婚櫎浠g悊";
+                        case "start":
+                            return "鍚敤浠g悊";
+                        case "stop":
+                            return "鍋滅敤浠g悊";
+                    }
+                    break;
+                case "push":
+                    switch (keyItemArray[3]) {
+                        case "save_to_gb":
+                            return "灏嗘帹娴佹坊鍔犲埌鍥芥爣";
+                        case "remove_form_gb":
+                            return "灏嗘帹娴佺Щ鍑哄埌鍥芥爣";
+                    }
+                    break;
+                case "user":
+                    switch (keyItemArray[3]) {
+                        case "login":
+                            return "鐧诲綍";
+                        case "changePassword":
+                            return "淇敼瀵嗙爜";
+                        case "add":
+                            return "娣诲姞鐢ㄦ埛";
+                        case "delete":
+                            return "鍒犻櫎鐢ㄦ埛";
+                    }
+                    break;
+            }
+        }
+        return null;
+    }
+}
+
diff --git a/src/main/java/com/genersoft/iot/vmp/conf/ApiAccessFilter.java b/src/main/java/com/genersoft/iot/vmp/conf/ApiAccessFilter.java
new file mode 100644
index 0000000..9831ddb
--- /dev/null
+++ b/src/main/java/com/genersoft/iot/vmp/conf/ApiAccessFilter.java
@@ -0,0 +1,114 @@
+package com.genersoft.iot.vmp.conf;
+
+import com.genersoft.iot.vmp.common.ApiSaveConstant;
+import com.genersoft.iot.vmp.conf.security.SecurityUtils;
+import com.genersoft.iot.vmp.service.ILogService;
+import com.genersoft.iot.vmp.storager.dao.dto.LogDto;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.web.filter.OncePerRequestFilter;
+
+import javax.servlet.*;
+import javax.servlet.annotation.WebFilter;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.text.SimpleDateFormat;
+
+@WebFilter(filterName = "ApiAccessFilter", urlPatterns = "/api/*", asyncSupported=true)
+public class ApiAccessFilter extends OncePerRequestFilter {
+
+    private final static Logger logger = LoggerFactory.getLogger(ApiAccessFilter.class);
+
+    private final SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+
+    @Autowired
+    private UserSetup userSetup;
+
+    @Autowired
+    private ILogService logService;
+
+
+    @Override
+    protected void doFilterInternal(HttpServletRequest servletRequest, HttpServletResponse servletResponse, FilterChain filterChain) throws ServletException, IOException {
+        String username = null;
+        if (SecurityUtils.getUserInfo() == null) {
+            username = servletRequest.getParameter("username");
+        }else {
+            username = SecurityUtils.getUserInfo().getUsername();
+        }
+        long start = System.currentTimeMillis(); // 璇锋眰杩涘叆鏃堕棿
+        String uriName = ApiSaveConstant.getVal(servletRequest.getRequestURI());
+
+        filterChain.doFilter(servletRequest, servletResponse);
+
+        if (uriName != null && userSetup.getLogInDatebase()) {
+
+            LogDto logDto = new LogDto();
+            logDto.setName(uriName);
+            logDto.setUsername(username);
+            logDto.setAddress(servletRequest.getRemoteAddr());
+            logDto.setResult(HttpStatus.valueOf(servletResponse.getStatus()).toString());
+            logDto.setTiming(System.currentTimeMillis() - start);
+            logDto.setType(servletRequest.getMethod());
+            logDto.setUri(servletRequest.getRequestURI());
+            logDto.setCreateTime(format.format(System.currentTimeMillis()));
+            logService.add(logDto);
+//            logger.warn("[Api Access]  [{}] [{}] [{}] [{}] [{}] {}ms",
+//                    uriName, servletRequest.getMethod(), servletRequest.getRequestURI(), servletRequest.getRemoteAddr(), HttpStatus.valueOf(servletResponse.getStatus()),
+//                    System.currentTimeMillis() - start);
+
+        }
+    }
+
+    /**
+     * 鑾峰彇IP鍦板潃
+     *
+     * @param request 璇锋眰
+     * @return request鍙戣捣瀹㈡埛绔殑IP鍦板潃
+     */
+    private String getIP(HttpServletRequest request) {
+        if (request == null) {
+            return "0.0.0.0";
+        }
+
+        String Xip = request.getHeader("X-Real-IP");
+        String XFor = request.getHeader("X-Forwarded-For");
+
+        String UNKNOWN_IP = "unknown";
+        if (StringUtils.isNotEmpty(XFor) && !UNKNOWN_IP.equalsIgnoreCase(XFor)) {
+            //澶氭鍙嶅悜浠g悊鍚庝細鏈夊涓猧p鍊硷紝绗竴涓猧p鎵嶆槸鐪熷疄ip
+            int index = XFor.indexOf(",");
+            if (index != -1) {
+                return XFor.substring(0, index);
+            } else {
+                return XFor;
+            }
+        }
+
+        XFor = Xip;
+        if (StringUtils.isNotEmpty(XFor) && !UNKNOWN_IP.equalsIgnoreCase(XFor)) {
+            return XFor;
+        }
+
+        if (StringUtils.isBlank(XFor) || UNKNOWN_IP.equalsIgnoreCase(XFor)) {
+            XFor = request.getHeader("Proxy-Client-IP");
+        }
+        if (StringUtils.isBlank(XFor) || UNKNOWN_IP.equalsIgnoreCase(XFor)) {
+            XFor = request.getHeader("WL-Proxy-Client-IP");
+        }
+        if (StringUtils.isBlank(XFor) || UNKNOWN_IP.equalsIgnoreCase(XFor)) {
+            XFor = request.getHeader("HTTP_CLIENT_IP");
+        }
+        if (StringUtils.isBlank(XFor) || UNKNOWN_IP.equalsIgnoreCase(XFor)) {
+            XFor = request.getHeader("HTTP_X_FORWARDED_FOR");
+        }
+        if (StringUtils.isBlank(XFor) || UNKNOWN_IP.equalsIgnoreCase(XFor)) {
+            XFor = request.getRemoteAddr();
+        }
+        return XFor;
+    }
+}
diff --git a/src/main/java/com/genersoft/iot/vmp/conf/UserSetup.java b/src/main/java/com/genersoft/iot/vmp/conf/UserSetup.java
index 87ad01a..8b1b5b0 100644
--- a/src/main/java/com/genersoft/iot/vmp/conf/UserSetup.java
+++ b/src/main/java/com/genersoft/iot/vmp/conf/UserSetup.java
@@ -25,6 +25,8 @@
 
     private Boolean recordPushLive = Boolean.FALSE;
 
+    private Boolean logInDatebase = Boolean.TRUE;
+
     private List<String> interfaceAuthenticationExcludes = new ArrayList<>();
 
     public Boolean getSavePositionHistory() {
@@ -94,4 +96,12 @@
     public void setInterfaceAuthenticationExcludes(List<String> interfaceAuthenticationExcludes) {
         this.interfaceAuthenticationExcludes = interfaceAuthenticationExcludes;
     }
+
+    public Boolean getLogInDatebase() {
+        return logInDatebase;
+    }
+
+    public void setLogInDatebase(Boolean logInDatebase) {
+        this.logInDatebase = logInDatebase;
+    }
 }
diff --git a/src/main/java/com/genersoft/iot/vmp/conf/security/SecurityUtils.java b/src/main/java/com/genersoft/iot/vmp/conf/security/SecurityUtils.java
index 81b3408..fd29d11 100644
--- a/src/main/java/com/genersoft/iot/vmp/conf/security/SecurityUtils.java
+++ b/src/main/java/com/genersoft/iot/vmp/conf/security/SecurityUtils.java
@@ -48,7 +48,7 @@
         Authentication authentication = getAuthentication();
         if(authentication!=null){
             Object principal = authentication.getPrincipal();
-            if(principal!=null){
+            if(principal!=null && !"anonymousUser".equals(principal)){
                 LoginUser user = (LoginUser) authentication.getPrincipal();
                 return user;
             }
diff --git a/src/main/java/com/genersoft/iot/vmp/service/ILogService.java b/src/main/java/com/genersoft/iot/vmp/service/ILogService.java
new file mode 100644
index 0000000..b7a67ed
--- /dev/null
+++ b/src/main/java/com/genersoft/iot/vmp/service/ILogService.java
@@ -0,0 +1,34 @@
+package com.genersoft.iot.vmp.service;
+
+import com.genersoft.iot.vmp.storager.dao.dto.LogDto;
+import com.github.pagehelper.PageInfo;
+
+/**
+ * 绯荤粺鏃ュ織
+ */
+public interface ILogService {
+
+    /**
+     * 鏌ヨ鏃ュ織
+     * @param page 褰撳墠椤�
+     * @param count 姣忛〉鏁伴噺
+     * @param query 鎼滅储鍐呭
+     * @param type 绫诲瀷
+     * @param startTime 寮�濮嬫椂闂�
+     * @param endTime 缁撴潫鏃堕棿
+     * @return 鏃ュ織鍒楄〃
+     */
+    PageInfo<LogDto> getAll(int page, int count, String query, String type, String startTime, String endTime);
+
+    /**
+     * 娣诲姞鏃ュ織
+     * @param logDto 鏃ュ織
+     */
+    void add(LogDto logDto);
+
+    /**
+     * 娓呯┖
+     */
+    int clear();
+
+}
diff --git a/src/main/java/com/genersoft/iot/vmp/service/impl/LogServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/service/impl/LogServiceImpl.java
new file mode 100644
index 0000000..92fa596
--- /dev/null
+++ b/src/main/java/com/genersoft/iot/vmp/service/impl/LogServiceImpl.java
@@ -0,0 +1,36 @@
+package com.genersoft.iot.vmp.service.impl;
+
+import com.genersoft.iot.vmp.gb28181.bean.DeviceAlarm;
+import com.genersoft.iot.vmp.service.ILogService;
+import com.genersoft.iot.vmp.storager.dao.LogMapper;
+import com.genersoft.iot.vmp.storager.dao.dto.LogDto;
+import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+public class LogServiceImpl implements ILogService {
+
+    @Autowired
+    private LogMapper logMapper;
+
+    @Override
+    public PageInfo<LogDto> getAll(int page, int count, String query, String type, String startTime, String endTime) {
+        PageHelper.startPage(page, count);
+        List<LogDto> all = logMapper.query(query, type, startTime, endTime);
+        return new PageInfo<>(all);
+    }
+
+    @Override
+    public void add(LogDto logDto) {
+        logMapper.add(logDto);
+    }
+
+    @Override
+    public int clear() {
+        return logMapper.clear();
+    }
+}
diff --git a/src/main/java/com/genersoft/iot/vmp/service/impl/MediaServerServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/service/impl/MediaServerServiceImpl.java
index 6234073..d928d87 100644
--- a/src/main/java/com/genersoft/iot/vmp/service/impl/MediaServerServiceImpl.java
+++ b/src/main/java/com/genersoft/iot/vmp/service/impl/MediaServerServiceImpl.java
@@ -342,12 +342,14 @@
 
         if (redisUtil.zSize(key)  == null || redisUtil.zSize(key) == 0) {
             logger.info("鑾峰彇璐熻浇鏈�浣庣殑鑺傜偣鏃舵棤鍦ㄧ嚎鑺傜偣");
+            return null;
         }
 
         // 鑾峰彇鍒嗘暟鏈�浣庣殑锛屽強骞跺彂鏈�浣庣殑
         Set<Object> objects = redisUtil.ZRange(key, 0, -1);
-        ArrayList<Object> MediaServerObjectS = new ArrayList<>(objects);
-        String mediaServerId = (String)MediaServerObjectS.get(0);
+        ArrayList<Object> mediaServerObjectS = new ArrayList<>(objects);
+
+        String mediaServerId = (String)mediaServerObjectS.get(0);
         return getOne(mediaServerId);
     }
 
diff --git a/src/main/java/com/genersoft/iot/vmp/storager/dao/LogMapper.java b/src/main/java/com/genersoft/iot/vmp/storager/dao/LogMapper.java
new file mode 100644
index 0000000..18fa91b
--- /dev/null
+++ b/src/main/java/com/genersoft/iot/vmp/storager/dao/LogMapper.java
@@ -0,0 +1,39 @@
+package com.genersoft.iot.vmp.storager.dao;
+
+import com.genersoft.iot.vmp.gb28181.bean.DeviceAlarm;
+import com.genersoft.iot.vmp.storager.dao.dto.LogDto;
+import org.apache.ibatis.annotations.Delete;
+import org.apache.ibatis.annotations.Insert;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Select;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+/**
+ * 鐢ㄤ簬瀛樺偍璁炬湇鍔$殑鏃ュ織
+ */
+@Mapper
+@Repository
+public interface LogMapper {
+
+    @Insert("insert into log ( name, type, uri, address, result, timing, username, createTime) " +
+            "values ('${name}', '${type}', '${uri}', '${address}', '${result}', ${timing}, '${username}', '${createTime}')")
+    int add(LogDto logDto);
+
+
+    @Select(value = {"<script>" +
+            " SELECT * FROM log " +
+            " WHERE 1=1 " +
+            " <if test=\"query != null\"> AND (name LIKE '%${query}%')</if> " +
+            " <if test=\"type != null\" >  AND type = '${type}'</if>" +
+            " <if test=\"startTime != null\" >  AND createTime &gt;= '${startTime}' </if>" +
+            " <if test=\"endTime != null\" >  AND createTime &lt;= '${endTime}' </if>" +
+            " ORDER BY createTime DESC " +
+            " </script>"})
+    List<LogDto> query(String query, String type, String startTime, String endTime);
+
+
+    @Delete("DELETE FROM log")
+    int clear();
+}
diff --git a/src/main/java/com/genersoft/iot/vmp/storager/dao/dto/LogDto.java b/src/main/java/com/genersoft/iot/vmp/storager/dao/dto/LogDto.java
new file mode 100644
index 0000000..cfe29f5
--- /dev/null
+++ b/src/main/java/com/genersoft/iot/vmp/storager/dao/dto/LogDto.java
@@ -0,0 +1,86 @@
+package com.genersoft.iot.vmp.storager.dao.dto;
+
+public class LogDto {
+
+    private int id;
+    private String name;
+    private String type;
+    private String uri;
+    private String address;
+    private String result;
+    private long timing;
+    private String username;
+    private String createTime;
+
+    public int getId() {
+        return id;
+    }
+
+    public void setId(int id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    public String getUri() {
+        return uri;
+    }
+
+    public void setUri(String uri) {
+        this.uri = uri;
+    }
+
+    public String getAddress() {
+        return address;
+    }
+
+    public void setAddress(String address) {
+        this.address = address;
+    }
+
+    public String getResult() {
+        return result;
+    }
+
+    public void setResult(String result) {
+        this.result = result;
+    }
+
+    public long getTiming() {
+        return timing;
+    }
+
+    public void setTiming(long timing) {
+        this.timing = timing;
+    }
+
+    public String getUsername() {
+        return username;
+    }
+
+    public void setUsername(String username) {
+        this.username = username;
+    }
+
+    public String getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(String createTime) {
+        this.createTime = createTime;
+    }
+}
diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/log/LogController.java b/src/main/java/com/genersoft/iot/vmp/vmanager/log/LogController.java
new file mode 100644
index 0000000..6dfb569
--- /dev/null
+++ b/src/main/java/com/genersoft/iot/vmp/vmanager/log/LogController.java
@@ -0,0 +1,93 @@
+package com.genersoft.iot.vmp.vmanager.log;
+
+import com.genersoft.iot.vmp.service.ILogService;
+import com.genersoft.iot.vmp.storager.dao.dto.LogDto;
+import com.genersoft.iot.vmp.vmanager.bean.WVPResult;
+import com.github.pagehelper.PageInfo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.util.StringUtils;
+import org.springframework.web.bind.annotation.*;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+
+@Api(tags = "鏃ュ織绠$悊")
+@CrossOrigin
+@RestController
+@RequestMapping("/api/log")
+public class LogController {
+
+    @Autowired
+    private ILogService logService;
+
+    private SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+
+    /**
+     *  鍒嗛〉鏌ヨ鏃ュ織
+     *
+     * @param query 鏌ヨ鍐呭
+     * @param page 褰撳墠椤�
+     * @param count 姣忛〉鏌ヨ鏁伴噺
+     * @param type  绫诲瀷
+     * @param startTime  寮�濮嬫椂闂�
+     * @param endTime 缁撴潫鏃堕棿
+     * @return
+     */
+    @ApiOperation("鍒嗛〉鏌ヨ鎶ヨ")
+    @GetMapping("/all")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name="query", value = "鏌ヨ鍐呭", dataTypeClass = String.class),
+            @ApiImplicitParam(name="page", value = "褰撳墠椤�", required = true ,dataTypeClass = Integer.class),
+            @ApiImplicitParam(name="count", value = "姣忛〉鏌ヨ鏁伴噺", required = true ,dataTypeClass = Integer.class),
+            @ApiImplicitParam(name="type", value = "绫诲瀷" ,dataTypeClass = String.class),
+            @ApiImplicitParam(name="startTime", value = "鏌ヨ鍐呭" ,dataTypeClass = String.class),
+            @ApiImplicitParam(name="endTime", value = "鏌ヨ鍐呭" ,dataTypeClass = String.class),
+    })
+    public ResponseEntity<PageInfo<LogDto>> getAll(
+            @RequestParam int page,
+            @RequestParam int count,
+            @RequestParam(required = false)  String query,
+            @RequestParam(required = false) String type,
+            @RequestParam(required = false) String startTime,
+            @RequestParam(required = false) String endTime
+    ) {
+        if (StringUtils.isEmpty(query)) query = null;
+        if (StringUtils.isEmpty(startTime)) startTime = null;
+        if (StringUtils.isEmpty(endTime)) endTime = null;
+
+
+        try {
+            if (startTime != null)  format.parse(startTime);
+            if (endTime != null)  format.parse(endTime);
+        } catch (ParseException e) {
+            return new ResponseEntity<>(null, HttpStatus.BAD_REQUEST);
+        }
+
+        PageInfo<LogDto> allLog = logService.getAll(page, count, query, type, startTime, endTime);
+        return new ResponseEntity<>(allLog, HttpStatus.OK);
+    }
+
+    /**
+     *  娓呯┖鏃ュ織
+     *
+     */
+    @ApiOperation("娓呯┖鏃ュ織")
+    @DeleteMapping("/clear")
+    @ApiImplicitParams({})
+    public ResponseEntity<WVPResult<String>> clear() {
+
+        int count = logService.clear();
+        WVPResult wvpResult = new WVPResult();
+        wvpResult.setCode(0);
+        wvpResult.setMsg("success");
+        wvpResult.setData(count);
+        return new ResponseEntity<WVPResult<String>>(wvpResult, HttpStatus.OK);
+    }
+
+}
diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/user/UserController.java b/src/main/java/com/genersoft/iot/vmp/vmanager/user/UserController.java
index de40c2c..6e4c416 100644
--- a/src/main/java/com/genersoft/iot/vmp/vmanager/user/UserController.java
+++ b/src/main/java/com/genersoft/iot/vmp/vmanager/user/UserController.java
@@ -17,9 +17,7 @@
 import org.springframework.web.bind.annotation.*;
 
 import javax.security.sasl.AuthenticationException;
-import javax.xml.crypto.Data;
 import java.text.SimpleDateFormat;
-import java.util.Date;
 import java.util.List;
 
 @Api(tags = "鐢ㄦ埛绠$悊")
@@ -42,19 +40,25 @@
             @ApiImplicitParam(name = "password", required = true, value = "瀵嗙爜锛�32浣峬d5鍔犲瘑锛�", dataTypeClass = String.class),
     })
     @GetMapping("/login")
-    public String login(@RequestParam String username, @RequestParam String password){
-        LoginUser user;
+    public WVPResult<LoginUser> login(@RequestParam String username, @RequestParam String password){
+        LoginUser user = null;
+        WVPResult<LoginUser> result = new WVPResult<>();
         try {
             user = SecurityUtils.login(username, password, authenticationManager);
         } catch (AuthenticationException e) {
             e.printStackTrace();
-            return "fail";
+            result.setCode(-1);
+            result.setMsg("fail");
         }
         if (user != null) {
-            return "success";
+            result.setCode(0);
+            result.setMsg("success");
+            result.setData(user);
         }else {
-            return "fail";
+            result.setCode(-1);
+            result.setMsg("fail");
         }
+        return result;
     }
 
     @ApiOperation("淇敼瀵嗙爜")
diff --git a/src/main/resources/all-application.yml b/src/main/resources/all-application.yml
index fdd81b1..140ef0a 100644
--- a/src/main/resources/all-application.yml
+++ b/src/main/resources/all-application.yml
@@ -150,6 +150,8 @@
         - /api/v1/**
     # 鎺ㄦ祦鐩存挱鏄惁褰曞埗
     record-push-live: true
+    # 鏄惁灏嗘棩蹇楀瓨鍌ㄨ繘鏁版嵁搴�
+    logInDatebase: true
 
 # 鍦ㄧ嚎鏂囨。锛� swagger-ui锛堢敓浜х幆澧冨缓璁叧闂級
 swagger-ui:
diff --git a/src/main/resources/wvp.sqlite b/src/main/resources/wvp.sqlite
index a76d7ee..908d585 100644
--- a/src/main/resources/wvp.sqlite
+++ b/src/main/resources/wvp.sqlite
Binary files differ

--
Gitblit v1.8.0