Explorar o código

Merge branch 'feat/basic_log_utils' of LiuYiYe/DevManage into master

LiuYiYe %!s(int64=4) %!d(string=hai) anos
pai
achega
873f3e681f

+ 31 - 4
src/main/java/cn/seecoder/devmanage/controller/HelloController.java

@@ -1,14 +1,41 @@
 package cn.seecoder.devmanage.controller;
 
+import cn.seecoder.devmanage.model.po.LocalLog;
+import cn.seecoder.devmanage.model.vo.LocalLogVo;
 import cn.seecoder.devmanage.model.vo.Response;
+import cn.seecoder.devmanage.service.HelloService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.context.annotation.Profile;
+import org.springframework.http.ResponseEntity;
 import org.springframework.security.core.context.SecurityContextHolder;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * For test purpose only.
+ * This controller does not go valid in production.
+ */
 
 @RestController
+@Profile("lyy")
+@RequiredArgsConstructor
+@RequestMapping("/test")
 public class HelloController {
+    private final HelloService helloService;
+
     @GetMapping("/hello")
-    public Response<String> hello() {
-        return Response.buildSuccess("Hello Seecoder");
+    public ResponseEntity<Response<String>> hello() {
+        return ResponseEntity.accepted().body(Response.buildSuccess("Hello Seecoder"));
+    }
+
+    @PutMapping("/log")
+    public ResponseEntity<Response<LocalLogVo>> putLog(@RequestBody LocalLogVo localLogVo) {
+        LocalLog localLog = helloService.putLog(localLogVo);
+        if (localLog == null) {
+            return  ResponseEntity.badRequest().body(
+                    Response.buildFailure(400, "Error: invalid date format.", null)
+            );
+        } else {
+            return ResponseEntity.accepted().body(Response.buildSuccess(new LocalLogVo(localLog)));
+        }
     }
 }

+ 52 - 0
src/main/java/cn/seecoder/devmanage/log/LocalLogger.java

@@ -0,0 +1,52 @@
+package cn.seecoder.devmanage.log;
+
+import cn.seecoder.devmanage.model.po.LocalLog;
+import cn.seecoder.devmanage.repository.LocalLogRepository;
+import lombok.Data;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.security.core.context.SecurityContextHolder;
+import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
+
+
+import javax.annotation.PostConstruct;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.time.ZoneId;
+import java.util.Date;
+import java.util.TimeZone;
+
+@Component
+@RequiredArgsConstructor
+public class LocalLogger {
+    private final LocalLogRepository localLogRepository;
+
+    @Value("${locallogger.timezone.offset}")
+    private String timezoneOffset;
+    private static SimpleDateFormat dateFormat;
+
+    @PostConstruct
+    public void init() {
+        TimeZone timeZone = TimeZone.getTimeZone(ZoneId.of(timezoneOffset));
+        dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm");
+        dateFormat.setTimeZone(timeZone);
+    }
+
+    @Transactional
+    public void record(String message) {
+        String currentUser = (String) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
+        LocalLog localLog = new LocalLog(currentUser, message, System.currentTimeMillis());
+        localLogRepository.save(localLog);
+    }
+
+    public static String convertTime(Long timestamp) {
+        Date date = new Date(timestamp);
+        return dateFormat.format(date);
+    }
+
+    public static Long convertTime(String time) throws ParseException {
+        Date parse = dateFormat.parse(time);
+        return parse.getTime();
+    }
+}

+ 32 - 0
src/main/java/cn/seecoder/devmanage/model/po/LocalLog.java

@@ -0,0 +1,32 @@
+package cn.seecoder.devmanage.model.po;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.persistence.*;
+
+import static javax.persistence.GenerationType.*;
+
+@Entity
+@Getter
+@Setter
+public class LocalLog {
+    @Id
+    @GeneratedValue(strategy = AUTO)
+    private Long id;
+    @Column(nullable = false)
+    private String operator;
+    @Column(nullable = false)
+    private String message;
+    @Column(nullable = false)
+    private Long timestamp;
+
+    public LocalLog() {
+    }
+
+    public LocalLog(String operator, String message, Long timestamp) {
+        this.operator = operator;
+        this.message = message;
+        this.timestamp = timestamp;
+    }
+}

+ 0 - 19
src/main/java/cn/seecoder/devmanage/model/po/Test.java

@@ -1,19 +0,0 @@
-package cn.seecoder.devmanage.model.po;
-
-import lombok.Getter;
-import lombok.Setter;
-
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-
-import static javax.persistence.GenerationType.AUTO;
-
-@Entity
-@Getter
-@Setter
-public class Test {
-    @Id
-    @GeneratedValue(strategy = AUTO)
-    private Long id;
-}

+ 21 - 0
src/main/java/cn/seecoder/devmanage/model/vo/LocalLogVo.java

@@ -0,0 +1,21 @@
+package cn.seecoder.devmanage.model.vo;
+
+import cn.seecoder.devmanage.log.LocalLogger;
+import cn.seecoder.devmanage.model.po.LocalLog;
+import lombok.Data;
+
+@Data
+public class LocalLogVo {
+    private String operator;
+    private String message;
+    private String time;
+
+    public LocalLogVo() {
+    }
+
+    public LocalLogVo(LocalLog localLog) {
+        operator = localLog.getOperator();
+        message = localLog.getMessage();
+        time = LocalLogger.convertTime(localLog.getTimestamp());
+    }
+}

+ 4 - 0
src/main/java/cn/seecoder/devmanage/model/vo/Response.java

@@ -23,4 +23,8 @@ public class Response<T> implements Serializable {
     public static  Response<Object> buildFailure(Integer code, String message) {
         return new Response<>(code, message, null);
     }
+
+    public static <T> Response<T> buildFailure(Integer code, String message, T result) {
+        return new Response<>(code, message, result);
+    }
 }

+ 9 - 0
src/main/java/cn/seecoder/devmanage/repository/LocalLogRepository.java

@@ -0,0 +1,9 @@
+package cn.seecoder.devmanage.repository;
+
+import cn.seecoder.devmanage.model.po.LocalLog;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.transaction.annotation.Transactional;
+
+@Transactional(readOnly = true)
+public interface LocalLogRepository extends JpaRepository<LocalLog, Long> {
+}

+ 0 - 7
src/main/java/cn/seecoder/devmanage/repository/TestRepo.java

@@ -1,7 +0,0 @@
-package cn.seecoder.devmanage.repository;
-
-import cn.seecoder.devmanage.model.po.Test;
-import org.springframework.data.jpa.repository.JpaRepository;
-
-public interface TestRepo extends JpaRepository<Test, Long> {
-}

+ 8 - 0
src/main/java/cn/seecoder/devmanage/service/HelloService.java

@@ -0,0 +1,8 @@
+package cn.seecoder.devmanage.service;
+
+import cn.seecoder.devmanage.model.po.LocalLog;
+import cn.seecoder.devmanage.model.vo.LocalLogVo;
+
+public interface HelloService {
+    public LocalLog putLog(LocalLogVo localLogVo);
+}

+ 34 - 0
src/main/java/cn/seecoder/devmanage/service/impl/HelloServiceImpl.java

@@ -0,0 +1,34 @@
+package cn.seecoder.devmanage.service.impl;
+
+import cn.seecoder.devmanage.log.LocalLogger;
+import cn.seecoder.devmanage.model.po.LocalLog;
+import cn.seecoder.devmanage.model.vo.LocalLogVo;
+import cn.seecoder.devmanage.repository.LocalLogRepository;
+import cn.seecoder.devmanage.service.HelloService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.context.annotation.Profile;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.text.ParseException;
+
+@Service
+@Profile("lyy")
+@RequiredArgsConstructor
+@Transactional(readOnly = true)
+public class HelloServiceImpl implements HelloService {
+    private final LocalLogRepository localLogRepository;
+
+    @Transactional
+    @Override
+    public LocalLog putLog(LocalLogVo localLogVo) {
+        try {
+            LocalLog localLog = new LocalLog(localLogVo.getOperator(),
+                    localLogVo.getMessage(),
+                    LocalLogger.convertTime(localLogVo.getTime()));
+            return localLogRepository.save(localLog);
+        } catch (ParseException e) {
+            return null;
+        }
+    }
+}

+ 4 - 1
src/main/resources/application-lyy.yaml

@@ -10,4 +10,7 @@ spring:
     show-sql: true
 seecoder:
   jwt:
-    secret: testsecret
+    secret: testsecret
+locallogger:
+  timezone:
+    offset: "+8"