瀏覽代碼

1、完善反馈控制器逻辑;2、添加Web文件服务映射配置;3、添加日志模块和日志实现类;4、添加服务IP追踪;5、重新配置数据库用户名和密码;6、变更打包方式为‘war’。

Yumin 6 年之前
父節點
當前提交
fb9957e428

+ 7 - 1
pom.xml

@@ -6,7 +6,7 @@
     <groupId>cn.minbb</groupId>
     <artifactId>evaluationsystemserver</artifactId>
     <version>0.0.1-SNAPSHOT</version>
-    <packaging>jar</packaging>
+    <packaging>war</packaging>
 
     <name>EvaluationSystemServer</name>
     <description>Evaluation System Server for Spring Boot</description>
@@ -29,6 +29,12 @@
     </properties>
 
     <dependencies>
+        <!-- Tomcat -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-tomcat</artifactId>
+            <scope>provided</scope>
+        </dependency>
         <!-- Web -->
         <dependency>
             <groupId>org.springframework.boot</groupId>

+ 17 - 10
src/main/java/cn/minbb/evaluationsystemserver/EvaluationSystemServerApplication.java

@@ -6,21 +6,28 @@ import org.springframework.boot.Banner;
 import org.springframework.boot.CommandLineRunner;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.builder.SpringApplicationBuilder;
 import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
 import org.springframework.context.annotation.Bean;
 
 @SpringBootApplication
 @EnableConfigurationProperties(StorageProperties.class)
-public class EvaluationSystemServerApplication {
+public class EvaluationSystemServerApplication extends SpringBootServletInitializer {
 
-	public static void main(String[] args) {
-		SpringApplication springApplication = new SpringApplication(EvaluationSystemServerApplication.class);
-		springApplication.setBannerMode(Banner.Mode.CONSOLE);
-		springApplication.run(args);
-	}
+    @Override
+    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
+        return builder.sources(EvaluationSystemServerApplication.class);
+    }
 
-	@Bean
-	CommandLineRunner init(StorageService storageService) {
-		return args -> storageService.init();
-	}
+    public static void main(String[] args) {
+        SpringApplication springApplication = new SpringApplication(EvaluationSystemServerApplication.class);
+        springApplication.setBannerMode(Banner.Mode.CONSOLE);
+        springApplication.run(args);
+    }
+
+    @Bean
+    CommandLineRunner init(StorageService storageService) {
+        return args -> storageService.init();
+    }
 }

+ 4 - 2
src/main/java/cn/minbb/evaluationsystemserver/controller/FeedbackController.java

@@ -42,8 +42,10 @@ public class FeedbackController {
                     responseMap.putResult(Result.SUCCESS);
                     responseMap.putSummary("反馈成功,非常感谢您的关注!");
                 } else {
-                    responseMap.putResult(Result.FAILED);
-                    responseMap.putSummary("用户身份信息有误");
+                    feedback.setUser(null);
+                    feedbackService.save(feedback);
+                    responseMap.putResult(Result.SUCCESS);
+                    responseMap.putSummary("反馈成功,非常感谢您的关注!");
                 }
             } catch (Exception e) {
                 e.printStackTrace();

+ 32 - 11
src/main/java/cn/minbb/evaluationsystemserver/controller/UserController.java

@@ -1,19 +1,25 @@
 package cn.minbb.evaluationsystemserver.controller;
 
+import cn.minbb.evaluationsystemserver.entity.Logs;
 import cn.minbb.evaluationsystemserver.entity.User;
+import cn.minbb.evaluationsystemserver.service.LogsService;
 import cn.minbb.evaluationsystemserver.service.UserService;
 import cn.minbb.evaluationsystemserver.stroage.StorageService;
+import cn.minbb.evaluationsystemserver.util.IPUtils;
 import cn.minbb.evaluationsystemserver.util.ResponseMap;
 import cn.minbb.evaluationsystemserver.util.Result;
 import com.alibaba.fastjson.JSONObject;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.core.io.Resource;
+import org.springframework.http.HttpHeaders;
 import org.springframework.http.ResponseEntity;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
+import javax.servlet.http.HttpServletRequest;
+
 @Controller
 @RequestMapping("/user")
 public class UserController {
@@ -23,11 +29,13 @@ public class UserController {
 
     private final UserService userService;
     private final StorageService storageService;
+    private final LogsService logsService;
 
     @Autowired
-    public UserController(UserService userService, StorageService storageService) {
+    public UserController(UserService userService, StorageService storageService, LogsService logsService) {
         this.userService = userService;
         this.storageService = storageService;
+        this.logsService = logsService;
     }
 
     @GetMapping(value = "/login")
@@ -39,15 +47,16 @@ public class UserController {
     /**
      * 用户注册
      *
+     * @param userJSON
      * @param request
      * @return
      */
     @PostMapping(value = "/register", produces = "text/plain; charset=UTF-8")
     @ResponseBody
-    public String register(@RequestBody String request) {
+    public String register(@RequestBody String userJSON, HttpServletRequest request) {
         ResponseMap responseMap = new ResponseMap();
         try {
-            User user = JSONObject.parseObject(request, User.class);
+            User user = JSONObject.parseObject(userJSON, User.class);
             if (user != null) {
                 if (userService.findUserByUsername(user.getUsername()) == null) {
                     User u = userService.save(user);
@@ -56,18 +65,21 @@ public class UserController {
                         responseMap.putResult(Result.SUCCESS);
                         responseMap.putSummary("注册成功");
                         responseMap.putData(u);
+                        logsService.save(new Logs("用户注册", "注册成功", user, IPUtils.getIPAddress(request)));
                     } else {
                         // 注册失败
                         responseMap.putResult(Result.FAILED);
                         responseMap.putSummary("注册失败");
+                        logsService.save(new Logs("用户注册", "注册失败,用户未成功保存", user, IPUtils.getIPAddress(request)));
                     }
                 } else {
                     // 用户名已存在
                     responseMap.putResult(Result.FAILED);
                     responseMap.putSummary("用户名已存在");
+                    logsService.save(new Logs("用户注册", "注册失败,用户名已存在", user, IPUtils.getIPAddress(request)));
                 }
             } else {
-                System.out.println("错误注册请求 = " + request);
+                logsService.save(new Logs("用户注册", "错误的注册请求 = " + userJSON, null, IPUtils.getIPAddress(request)));
             }
         } catch (Exception e) {
             e.printStackTrace();
@@ -80,11 +92,15 @@ public class UserController {
      *
      * @param username 用户名
      * @param password 密码
+     * @param request
      * @return
      */
     @PostMapping(value = "/login", produces = "text/plain; charset=UTF-8")
     @ResponseBody
-    public String login(@RequestParam(value = "username") String username, @RequestParam(value = "password") String password) {
+    public String login(
+            @RequestParam(value = "username") String username,
+            @RequestParam(value = "password") String password,
+            HttpServletRequest request) {
         User user = userService.findUserByUsername(username);
         ResponseMap responseMap = new ResponseMap();
         if (user != null) {
@@ -100,25 +116,27 @@ public class UserController {
                     user.setAvatar(USER_AVATAR_URL + userAvatar);
                 }
                 responseMap.putData(user);
+                logsService.save(new Logs("用户登录", "登陆成功", user, IPUtils.getIPAddress(request)));
             } else {
                 // 密码错误
                 responseMap.putResult(Result.FAILED);
                 responseMap.putSummary("密码错误");
+                logsService.save(new Logs("用户登录", "登陆失败,密码错误", user, IPUtils.getIPAddress(request)));
             }
         } else {
             // 此用户名的用户不存在
             responseMap.putResult(Result.FAILED);
             responseMap.putSummary("用户不存在");
+            logsService.save(new Logs("用户登录", "登陆失败,用户名不存在", null, IPUtils.getIPAddress(request)));
         }
         return JSONObject.toJSONString(responseMap.getMap());
     }
 
-    @GetMapping(value = "/avatars/{filename:.+}")
-    @ResponseBody
+    @GetMapping(value = "/avatars/{filename:.+}/download")
     public ResponseEntity<Resource> serveAvatars(@PathVariable String filename) {
         Resource file = storageService.loadAvatarsAsResource(filename);
-        // return ResponseEntity.ok().header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + file.getFilename() + "\"").body(file);
-        return ResponseEntity.ok().body(file);
+        return ResponseEntity.ok().header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + file.getFilename() + "\"").body(file);
+        // return ResponseEntity.ok().body(file);
     }
 
     @PostMapping(value = "/alter/avatar", produces = "text/plain; charset=UTF-8")
@@ -126,8 +144,8 @@ public class UserController {
     public String alterUserAvatar(
             @RequestParam(value = "username") String username,
             @RequestParam(value = "password") String password,
-            @RequestParam(value = "avatar", required = true) MultipartFile avatar) {
-        System.out.println(username + " / " + password);
+            @RequestParam(value = "avatar", required = true) MultipartFile avatar,
+            HttpServletRequest request) {
         User user = userService.findUserByUsername(username);
         ResponseMap responseMap = new ResponseMap();
         if (user != null) {
@@ -148,15 +166,18 @@ public class UserController {
                     user.setAvatar(USER_AVATAR_URL + userAvatar);
                 }
                 responseMap.putData(user);
+                logsService.save(new Logs("用户修改头像", "修改成功,新头像地址 = " + user.getAvatar(), user, IPUtils.getIPAddress(request)));
             } else {
                 // 密码错误
                 responseMap.putResult(Result.FAILED);
                 responseMap.putSummary("密码错误");
+                logsService.save(new Logs("用户修改头像", "修改失败,密码错误", user, IPUtils.getIPAddress(request)));
             }
         } else {
             // 此用户名的用户不存在
             responseMap.putResult(Result.FAILED);
             responseMap.putSummary("用户不存在");
+            logsService.save(new Logs("用户修改头像", "修改失败,用户名不存在", null, IPUtils.getIPAddress(request)));
         }
         return JSONObject.toJSONString(responseMap.getMap());
     }

+ 18 - 0
src/main/java/cn/minbb/evaluationsystemserver/controller/WebFileConfiguration.java

@@ -0,0 +1,18 @@
+package cn.minbb.evaluationsystemserver.controller;
+
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+@Configuration
+public class WebFileConfiguration implements WebMvcConfigurer {
+
+    @Override
+    public void addResourceHandlers(ResourceHandlerRegistry registry) {
+        // 和页面有关的静态目录都放在项目的 static 目录下
+        registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
+        // 上传的图片在 C 盘下的 Evaluation 目录下,访问路径如:http://localhost:80/user/***/123.jpg
+        // 其中 user 表示访问的前缀。"file:C:/Evaluation/"是文件真实的存储路径
+        registry.addResourceHandler("/user/**").addResourceLocations("file:C:/Evaluation/");
+    }
+}

+ 56 - 0
src/main/java/cn/minbb/evaluationsystemserver/entity/Logs.java

@@ -0,0 +1,56 @@
+package cn.minbb.evaluationsystemserver.entity;
+
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+import org.hibernate.annotations.CreationTimestamp;
+
+import javax.persistence.*;
+import java.util.Date;
+
+@Entity
+@Table(name = "logs")
+@NoArgsConstructor
+public class Logs {
+
+    @Getter
+    @Setter
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    @Column(name = "e_id", nullable = false, columnDefinition = "BIGINT COMMENT '日志实体ID'")
+    private Long e_id;
+
+    @Getter
+    @Setter
+    @Column(name = "action", nullable = false, columnDefinition = "VARCHAR(64) COMMENT '产生的动作'")
+    private String action;
+
+    @Getter
+    @Setter
+    @Column(name = "data", nullable = false, columnDefinition = "VARCHAR(64) COMMENT '产生的数据'")
+    private String data;
+
+    @Getter
+    @Setter
+    @ManyToOne(cascade = {CascadeType.MERGE, CascadeType.REFRESH}, optional = true)
+    @JoinColumn(name = "user_id", columnDefinition = "BIGINT COMMENT '发起用户实体ID'")
+    private User user;
+
+    @Getter
+    @Setter
+    @Column(name = "ip", nullable = false, columnDefinition = "VARCHAR(64) COMMENT '日志产生的IP'")
+    private String ip;
+
+    @Getter
+    @Setter
+    @Column(name = "created_at", columnDefinition = "DATETIME COMMENT '创建时间'")
+    @CreationTimestamp
+    private Date createdAt;
+
+    public Logs(String action, String data, User user, String ip) {
+        this.action = action;
+        this.data = data;
+        this.user = user;
+        this.ip = ip;
+    }
+}

+ 6 - 0
src/main/java/cn/minbb/evaluationsystemserver/entity/User.java

@@ -112,6 +112,12 @@ public class User {
     // 消息接收者(集合)
     private Set<Message> messageSetTo;
 
+    @Getter
+    @Setter
+    @OneToMany(cascade = {CascadeType.REFRESH}, mappedBy = "user", fetch = FetchType.LAZY)
+    // 试卷(列表)
+    private List<Logs> logsList;
+
     @Getter
     @Setter
     @Column(name = "created_at", columnDefinition = "DATETIME COMMENT '创建时间'")

+ 7 - 0
src/main/java/cn/minbb/evaluationsystemserver/entity/repository/LogsRepository.java

@@ -0,0 +1,7 @@
+package cn.minbb.evaluationsystemserver.entity.repository;
+
+import cn.minbb.evaluationsystemserver.entity.Logs;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+public interface LogsRepository extends JpaRepository<Logs, Long> {
+}

+ 7 - 0
src/main/java/cn/minbb/evaluationsystemserver/service/LogsService.java

@@ -0,0 +1,7 @@
+package cn.minbb.evaluationsystemserver.service;
+
+import cn.minbb.evaluationsystemserver.entity.Logs;
+
+public interface LogsService {
+    Logs save(Logs logs);
+}

+ 23 - 0
src/main/java/cn/minbb/evaluationsystemserver/service/impl/LogsServiceImpl.java

@@ -0,0 +1,23 @@
+package cn.minbb.evaluationsystemserver.service.impl;
+
+import cn.minbb.evaluationsystemserver.entity.Logs;
+import cn.minbb.evaluationsystemserver.entity.repository.LogsRepository;
+import cn.minbb.evaluationsystemserver.service.LogsService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Service
+public class LogsServiceImpl implements LogsService {
+
+    private LogsRepository logsRepository;
+
+    @Autowired
+    public LogsServiceImpl(LogsRepository logsRepository) {
+        this.logsRepository = logsRepository;
+    }
+
+    @Override
+    public Logs save(Logs logs) {
+        return logsRepository.save(logs);
+    }
+}

+ 65 - 0
src/main/java/cn/minbb/evaluationsystemserver/util/IPUtils.java

@@ -0,0 +1,65 @@
+package cn.minbb.evaluationsystemserver.util;
+
+import javax.servlet.http.HttpServletRequest;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+
+public class IPUtils {
+
+    public static String getIPAddress(HttpServletRequest request) {
+        String ipAddress = null;
+        try {
+            ipAddress = request.getHeader("x-forwarded-for");
+            if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
+                ipAddress = request.getHeader("Proxy-Client-IP");
+            }
+            if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
+                ipAddress = request.getHeader("WL-Proxy-Client-IP");
+            }
+            if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
+                ipAddress = request.getRemoteAddr();
+                if (ipAddress.equals("127.0.0.1")) {
+                    // 根据网卡取本机配置的IP
+                    InetAddress inetAddress;
+                    try {
+                        inetAddress = InetAddress.getLocalHost();
+                        ipAddress = inetAddress.getHostAddress();
+                    } catch (UnknownHostException e) {
+                        e.printStackTrace();
+                    }
+                }
+            }
+            // 对于通过多个代理的情况,第一个IP为客户端真实IP,多个IP按照','分割
+            if (ipAddress != null && ipAddress.length() > 15) { // "***.***.***.***".length()
+                // = 15
+                if (ipAddress.indexOf(",") > 0) {
+                    ipAddress = ipAddress.substring(0, ipAddress.indexOf(","));
+                }
+            }
+        } catch (Exception e) {
+            ipAddress = "";
+        }
+        // ipAddress = this.getRequest().getRemoteAddr();
+        return ipAddress;
+    }
+
+    public static String getIpAddr(HttpServletRequest request) {
+        String ip = request.getHeader("X-Forwarded-For");
+        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+            ip = request.getHeader("Proxy-Client-IP");
+        }
+        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+            ip = request.getHeader("WL-Proxy-Client-IP");
+        }
+        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+            ip = request.getHeader("HTTP_CLIENT_IP");
+        }
+        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+            ip = request.getHeader("HTTP_X_FORWARDED_FOR");
+        }
+        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+            ip = request.getRemoteAddr();
+        }
+        return ip;
+    }
+}

+ 6 - 2
src/main/java/cn/minbb/evaluationsystemserver/websocket/WebSocketController.java

@@ -38,13 +38,17 @@ public class WebSocketController {
                 } catch (InterruptedException e) {
                     e.printStackTrace();
                 }
-                template.convertAndSend("/topic/chat/all", App.getCurrentStringTime());
+                Message messageTest = new Message();
+                messageTest.setContent(App.getCurrentStringTime());
+                messageTest.setCreatedAt(App.getCurrentDateTime());
+                template.convertAndSend("/topic/chat/all", JSONObject.toJSONString(messageTest));
                 try {
                     Thread.sleep(3000);
                 } catch (InterruptedException e) {
                     e.printStackTrace();
                 }
-                template.convertAndSend("/topic/chat/all", webSocketMessageBrokerStats.getWebSocketSessionStatsInfo());
+                messageTest.setContent(webSocketMessageBrokerStats.getWebSocketSessionStatsInfo());
+                template.convertAndSend("/topic/chat/all", JSONObject.toJSONString(messageTest));
             }
         }).start();
     }

+ 1 - 0
src/main/java/cn/minbb/evaluationsystemserver/websocket/WebSocketHandshakeInterceptor.java

@@ -11,6 +11,7 @@ public class WebSocketHandshakeInterceptor extends HttpSessionHandshakeIntercept
 
     @Override
     public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map<String, Object> attributes) {
+        System.out.println("///" + request.getHeaders().toString());
         // 继续握手返回 true, 中断握手返回 false。返回 false 会导致无限循环执行
         return true;
     }

+ 6 - 6
src/main/resources/application.properties

@@ -1,17 +1,17 @@
 server.port=80
 #server.context-path=/evaluation
-server.servlet.context-path=/evaluation
+server.servlet.context-path=/evaluation_system
 #server.session.timeout=3600
-spring.datasource.url=jdbc:mysql://localhost:3306/evaluation?useUnicode=true&characterEncoding=utf-8&useSSL=false
-spring.datasource.username=root
-spring.datasource.password=root
+spring.datasource.url=jdbc:mysql://localhost:3306/evaluation_system?useUnicode=true&characterEncoding=utf-8&useSSL=false
+spring.datasource.username=Yumin
+spring.datasource.password=Wang19970305
 spring.datasource.driver-class-name=com.mysql.jdbc.Driver
 spring.datasource.sql-script-encoding=UTF-8
-spring.jpa.show-sql=true
+spring.jpa.show-sql=false
 spring.jpa.properties.hibernate.hbm2ddl.auto=update
 spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect
 spring.thymeleaf.mode=HTML
 spring.mvc.favicon.enabled=true
 spring.http.encoding.charset=UTF-8
 #spring.http.multipart.max-file-size=10MB
-USER_AVATAR_URL=http://123.207.151.92/evaluation/user/avatars/
+USER_AVATAR_URL=http://minbb.cn/evaluation_system/user/avatars/

+ 1 - 1
src/main/resources/templates/index.html

@@ -66,7 +66,7 @@
 
 <script>
     $(document).ready(function () {
-        var socket = new SockJS('/evaluation/ws');
+        var socket = new SockJS('/evaluation_system/ws');
         stompClient = Stomp.over(socket);
         stompClient.connect({}, function (frame) {
             console.log('Connected: ' + frame);

+ 2 - 2
src/test/java/cn/minbb/innovationabilityevaluationsystemserver/InnovationAbilityEvaluationSystemServerApplicationTests.java → src/test/java/cn/minbb/evaluationsystemserver/EvaluationSystemServerApplicationTests.java

@@ -1,4 +1,4 @@
-package cn.minbb.innovationabilityevaluationsystemserver;
+package cn.minbb.evaluationsystemserver;
 
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -7,7 +7,7 @@ import org.springframework.test.context.junit4.SpringRunner;
 
 @RunWith(SpringRunner.class)
 @SpringBootTest
-public class InnovationAbilityEvaluationSystemServerApplicationTests {
+public class EvaluationSystemServerApplicationTests {
 
 	@Test
 	public void contextLoads() {