瀏覽代碼

feat:1.修改用户登录的相关借口,接入统一登录服务;2.增加日志打印

shanshan 2 年之前
父節點
當前提交
512ef261d1
共有 25 個文件被更改,包括 403 次插入38 次删除
  1. 20 3
      pom.xml
  2. 25 4
      src/main/java/cn/seecoder/fdroidrepository/Controller/AppController.java
  3. 24 11
      src/main/java/cn/seecoder/fdroidrepository/Controller/UserController.java
  4. 41 0
      src/main/java/cn/seecoder/fdroidrepository/DataObject/Enum/UserIdentity.java
  5. 6 1
      src/main/java/cn/seecoder/fdroidrepository/DataObject/PO/AppInfoPO.java
  6. 63 0
      src/main/java/cn/seecoder/fdroidrepository/DataObject/PO/UserPO.java
  7. 0 2
      src/main/java/cn/seecoder/fdroidrepository/DataObject/VO/AppInfoVO.java
  8. 16 0
      src/main/java/cn/seecoder/fdroidrepository/DataObject/VO/BuildTaskCreateVO.java
  9. 5 1
      src/main/java/cn/seecoder/fdroidrepository/FdroidRepositoryApplication.java
  10. 5 0
      src/main/java/cn/seecoder/fdroidrepository/Mapper/AppInfoMapper.java
  11. 6 1
      src/main/java/cn/seecoder/fdroidrepository/Mapper/UserMapper.java
  12. 4 1
      src/main/java/cn/seecoder/fdroidrepository/Pipeline/Handlers/BuildHandler.java
  13. 5 1
      src/main/java/cn/seecoder/fdroidrepository/Pipeline/Handlers/CleanHandler.java
  14. 4 1
      src/main/java/cn/seecoder/fdroidrepository/Pipeline/Handlers/GitPullingHandler.java
  15. 4 0
      src/main/java/cn/seecoder/fdroidrepository/Pipeline/Handlers/GradleHandler.java
  16. 4 1
      src/main/java/cn/seecoder/fdroidrepository/Service/AppService.java
  17. 18 2
      src/main/java/cn/seecoder/fdroidrepository/Service/ServiceImpl/AppServiceImpl.java
  18. 24 0
      src/main/java/cn/seecoder/fdroidrepository/Service/ServiceImpl/UserServiceImpl.java
  19. 10 0
      src/main/java/cn/seecoder/fdroidrepository/Service/UserService.java
  20. 22 0
      src/main/java/cn/seecoder/fdroidrepository/security/JwtAuthenticationTokenFilter.java
  21. 49 0
      src/main/java/cn/seecoder/fdroidrepository/security/WebSecurityConstants.java
  22. 0 9
      src/main/resources/application.properties
  23. 16 0
      src/main/resources/application.yml
  24. 7 0
      src/main/resources/mybatis-config.xml
  25. 25 0
      src/main/resources/sql/table_init.sql

+ 20 - 3
pom.xml

@@ -31,13 +31,16 @@
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-test</artifactId>
-            <scope>test</scope>
         </dependency>
         <dependency>
             <groupId>org.mybatis.spring.boot</groupId>
             <artifactId>mybatis-spring-boot-starter-test</artifactId>
-            <version>2.3.1</version>
-            <scope>test</scope>
+            <version>2.1.4</version>
+        </dependency>
+        <dependency>
+            <groupId>org.mybatis.spring.boot</groupId>
+            <artifactId>mybatis-spring-boot-starter</artifactId>
+            <version>2.1.4</version>
         </dependency>
         <dependency>
             <groupId>org.springframework.boot</groupId>
@@ -65,6 +68,20 @@
             <artifactId>org.eclipse.jgit</artifactId>
             <version>5.9.0.202009080501-r</version>
         </dependency>
+        <dependency>
+            <groupId>com.auth0</groupId>
+            <artifactId>java-jwt</artifactId>
+            <version>3.4.0</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-security</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.security</groupId>
+            <artifactId>spring-security-test</artifactId>
+            <scope>test</scope>
+        </dependency>
 
     </dependencies>
 

+ 25 - 4
src/main/java/cn/seecoder/fdroidrepository/Controller/AppController.java

@@ -1,25 +1,46 @@
 package cn.seecoder.fdroidrepository.Controller;
 
 import cn.seecoder.fdroidrepository.DataObject.VO.AppInfoVO;
+import cn.seecoder.fdroidrepository.DataObject.VO.BuildTaskCreateVO;
 import cn.seecoder.fdroidrepository.DataObject.VO.BuildTaskVO;
 import cn.seecoder.fdroidrepository.DataObject.VO.Response;
+import cn.seecoder.fdroidrepository.Service.AppService;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
 @RestController
 @RequestMapping("/app")
 public class AppController {
+    private final AppService appService;
+
+    @Autowired
+    public AppController(AppService appService) {
+        this.appService = appService;
+    }
+
     @PostMapping("/createApp")
     private Response createApp(@RequestBody AppInfoVO appInfoVO) {
-        return Response.buildSuccess();
+//        try {
+//            Integer appId = appService.createAppInfo(appInfoVO);
+//            return Response.buildSuccess(appId);
+//        } catch (Exception exception) {
+//            return Response.buildFailure(500, exception.getMessage());
+//        }
+        return Response.buildSuccess(appService.createAppInfo(appInfoVO));
     }
 
     @PostMapping("/buildApp")
-    private Response buildApp(@RequestBody BuildTaskVO buildTaskVO) {
-        return Response.buildSuccess();
+    private Response buildApp(@RequestBody BuildTaskCreateVO buildTaskCreateVO) {
+        int result = appService.createBuildTask(buildTaskCreateVO.getAppId(), buildTaskCreateVO.getCreateUserId(),
+                buildTaskCreateVO.getBranch(), buildTaskCreateVO.getBuildTypeEnum());
+        if (result == -1) {
+            return Response.buildFailure(400, "对应的AppId不存在");
+        }
+        return Response.buildSuccess(result);
     }
 
     @GetMapping("/checkStatus")
     private Response checkStatus(@RequestParam("taskId") Integer taskId) {
-        return Response.buildSuccess();
+        return Response.buildSuccess(appService.checkTaskStatus(taskId));
     }
 }

+ 24 - 11
src/main/java/cn/seecoder/fdroidrepository/Controller/UserController.java

@@ -2,15 +2,21 @@ package cn.seecoder.fdroidrepository.Controller;
 
 
 
+import cn.seecoder.fdroidrepository.DataObject.Enum.UserIdentity;
+import cn.seecoder.fdroidrepository.DataObject.PO.UserPO;
 import cn.seecoder.fdroidrepository.DataObject.User;
+import cn.seecoder.fdroidrepository.DataObject.VO.Response;
 import cn.seecoder.fdroidrepository.Service.UserService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
+import org.springframework.security.core.context.SecurityContextHolder;
+import org.springframework.security.core.userdetails.UserDetails;
+import org.springframework.security.web.authentication.WebAuthenticationDetailsSource;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Map;
 
 // UserController.java
 @RestController
@@ -30,13 +36,20 @@ public class UserController {
     }
 
     @PostMapping("/login")
-    public ResponseEntity<String> login(@RequestBody User user) {
-        User existingUser = userService.findByUsername(user.getUsername());
-
-        if (existingUser == null || !existingUser.getPassword().equals(user.getPassword())) {
-            return new ResponseEntity<>("Invalid username or password", HttpStatus.UNAUTHORIZED);
+    public Response login(@RequestParam("token") String token) {
+        try{
+            Map<String, Object> userInfo = userService.getUserInfoMap(token);
+            UserDetails userPO = UserPO.builder()
+                    .id((Integer) userInfo.get("id"))
+                    .email((String) userInfo.get("email"))
+                    .phone((String) userInfo.get("phone"))
+                    .role(UserIdentity.valueOf((String) userInfo.get("role")))
+                    .build();
+            UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(userPO, null);
+            SecurityContextHolder.getContext().setAuthentication(authentication);
+            return Response.buildSuccess(null);
+        } catch (RuntimeException exception) {
+            return Response.buildFailure(500, exception.getMessage());
         }
-
-        return new ResponseEntity<>("Login successful", HttpStatus.OK);
     }
 }

+ 41 - 0
src/main/java/cn/seecoder/fdroidrepository/DataObject/Enum/UserIdentity.java

@@ -0,0 +1,41 @@
+package cn.seecoder.fdroidrepository.DataObject.Enum;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+public enum UserIdentity {
+
+    @JsonProperty("学生")
+    STUDENT("学生"),
+
+    @JsonProperty("教师")
+    TEACHER("教师"),
+
+    @JsonProperty("管理员")
+    ADMIN("管理员"),
+
+    @JsonProperty("职员")
+    STAFF("职员"),
+
+    @JsonProperty("HR")
+    HR("HR"),
+
+    @JsonProperty("SEEC")
+    SEEC("SEEC"),
+
+    @JsonProperty("SEECX")
+    SEECX("SEECX"),
+
+    @JsonProperty("ASSISTANT")
+    ASSISTANT("ASSISTANT");
+
+    private final String name;
+
+    UserIdentity(String name) {
+        this.name = name;
+    }
+
+    @Override
+    public String toString() {
+        return name;
+    }
+}

+ 6 - 1
src/main/java/cn/seecoder/fdroidrepository/DataObject/PO/AppInfoPO.java

@@ -1,8 +1,14 @@
 package cn.seecoder.fdroidrepository.DataObject.PO;
 
+import lombok.AllArgsConstructor;
+import lombok.Builder;
 import lombok.Data;
+import lombok.NoArgsConstructor;
 
 @Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
 public class AppInfoPO {
     Integer id;
     String appName;
@@ -12,5 +18,4 @@ public class AppInfoPO {
     String dailyBuildBranch;
     Boolean enableDailyBuild; // 是否开启daily build功能
 
-    Integer metadataId;
 }

+ 63 - 0
src/main/java/cn/seecoder/fdroidrepository/DataObject/PO/UserPO.java

@@ -0,0 +1,63 @@
+package cn.seecoder.fdroidrepository.DataObject.PO;
+
+import cn.seecoder.fdroidrepository.DataObject.Enum.UserIdentity;
+import cn.seecoder.fdroidrepository.security.WebSecurityConstants;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.springframework.security.core.GrantedAuthority;
+import org.springframework.security.core.userdetails.UserDetails;
+
+import java.util.Collection;
+import java.util.Collections;
+
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class UserPO implements UserDetails {
+
+    /**
+     * 注意用户id并非由此后端数据库生成,而是gitlab创建后填入,以确保两者的关联性的正确
+     */
+    private Integer id;
+
+    private String username;
+
+    private String phone;
+
+    private String email;
+
+    private UserIdentity role;
+
+    @Override
+    public Collection<? extends GrantedAuthority> getAuthorities() {
+        return null;
+    }
+
+    @Override
+    public String getPassword() {
+        return null;
+    }
+
+    @Override
+    public boolean isAccountNonExpired() {
+        return false;
+    }
+
+    @Override
+    public boolean isAccountNonLocked() {
+        return false;
+    }
+
+    @Override
+    public boolean isCredentialsNonExpired() {
+        return false;
+    }
+
+    @Override
+    public boolean isEnabled() {
+        return false;
+    }
+}

+ 0 - 2
src/main/java/cn/seecoder/fdroidrepository/DataObject/VO/AppInfoVO.java

@@ -13,6 +13,4 @@ public class AppInfoVO implements Serializable {
     String buildBranch;
     String dailyBuildBranch;
     Boolean enableDailyBuild; // 是否开启daily build功能
-
-    Integer metadataId;
 }

+ 16 - 0
src/main/java/cn/seecoder/fdroidrepository/DataObject/VO/BuildTaskCreateVO.java

@@ -0,0 +1,16 @@
+package cn.seecoder.fdroidrepository.DataObject.VO;
+
+import cn.seecoder.fdroidrepository.DataObject.Enum.BuildTypeEnum;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class BuildTaskCreateVO {
+    private Integer appId;
+    private Integer createUserId;
+    private String branch;
+    private BuildTypeEnum buildTypeEnum;
+}

+ 5 - 1
src/main/java/cn/seecoder/fdroidrepository/FdroidRepositoryApplication.java

@@ -1,9 +1,13 @@
 package cn.seecoder.fdroidrepository;
 
+import org.mybatis.spring.annotation.MapperScan;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration;
+import org.springframework.stereotype.Repository;
 
-@SpringBootApplication
+@SpringBootApplication(exclude = {HibernateJpaAutoConfiguration.class})
+@MapperScan(basePackages = {"cn.seecoder.fdroidrepository"}, annotationClass = Repository.class)
 public class FdroidRepositoryApplication {
 
     public static void main(String[] args) {

+ 5 - 0
src/main/java/cn/seecoder/fdroidrepository/Mapper/AppInfoMapper.java

@@ -1,11 +1,16 @@
 package cn.seecoder.fdroidrepository.Mapper;
 
 import cn.seecoder.fdroidrepository.DataObject.PO.AppInfoPO;
+import org.apache.ibatis.annotations.InsertProvider;
+import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Select;
 import org.springframework.stereotype.Repository;
 
 @Repository
 public interface AppInfoMapper {
+    @InsertProvider(type = GeneralInsertUpdateSqlProvider.class, method = "insert")
+    Integer insertAppInfo(@Param("obj") AppInfoPO appInfoPO, String... ignoredCols);
+
     @Select("select * from app_info where id = #{id}")
     AppInfoPO selectById(Integer id);
 }

+ 6 - 1
src/main/java/cn/seecoder/fdroidrepository/Mapper/UserMapper.java

@@ -1,11 +1,16 @@
 package cn.seecoder.fdroidrepository.Mapper;
 
 import cn.seecoder.fdroidrepository.DataObject.User;
+import org.apache.ibatis.annotations.InsertProvider;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Select;
+import org.springframework.stereotype.Repository;
 
-@Mapper
+@Repository
 public interface UserMapper {
+    @Select("select * from user where username = #{username}")
     User findByUsername(String username);
 
+    @InsertProvider(type = GeneralInsertUpdateSqlProvider.class, method = "insert")
     void save(User user);
 }

+ 4 - 1
src/main/java/cn/seecoder/fdroidrepository/Pipeline/Handlers/BuildHandler.java

@@ -12,6 +12,8 @@ import com.github.dockerjava.api.command.CreateContainerCmd;
 import com.github.dockerjava.api.command.CreateContainerResponse;
 import com.github.dockerjava.api.model.Bind;
 import org.apache.tomcat.jni.Proc;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import java.io.BufferedReader;
 import java.io.File;
@@ -20,6 +22,7 @@ import java.io.InputStreamReader;
 import java.util.Date;
 
 public class BuildHandler extends AbstractHandler{
+    private static final Logger logger = LoggerFactory.getLogger(BuildHandler.class);
     private static final String ANDROID_PATH = "/root/bin:/opt/android-sdk";
     private static final String DIR = "/fdroid/code/";
     private static final String GRADLE = "gradle assemble";
@@ -27,7 +30,6 @@ public class BuildHandler extends AbstractHandler{
     @Override
     public void process(Context context) throws PipelineException {
         ApplicationProperties app = context.getApplicationProperties();
-        app.setStatusEnum(BuildTaskStatusEnum.BUILDING);
         try {
             ProcessBuilder processBuilder = new ProcessBuilder(GRADLE, MOVE);
             processBuilder.directory(new File(DIR + app.getAppName()));
@@ -53,6 +55,7 @@ public class BuildHandler extends AbstractHandler{
                 result.setStatus(BuildTaskStatusEnum.FAILED);
                 result.setUpdateTime(new Date(System.currentTimeMillis()));
             }
+            logger.error("执行Gradle脚本出现问题, 错误信息:{}", exception.getMessage());
             throw new PipelineException(400, "执行Gradle脚本出现问题");
         }
 

+ 5 - 1
src/main/java/cn/seecoder/fdroidrepository/Pipeline/Handlers/CleanHandler.java

@@ -6,11 +6,14 @@ import cn.seecoder.fdroidrepository.Pipeline.Config.CommonValueTable;
 import cn.seecoder.fdroidrepository.Pipeline.Context;
 import cn.seecoder.fdroidrepository.Pipeline.ExecuteResult;
 import cn.seecoder.fdroidrepository.Pipeline.PipelineException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import java.io.File;
 import java.util.Date;
 
 public class CleanHandler extends AbstractHandler{
+    private static final Logger logger = LoggerFactory.getLogger(CleanHandler.class);
     private static final String filePath = "/fdroid/code/";
     @Override
     public void process(Context context) throws PipelineException {
@@ -30,9 +33,10 @@ public class CleanHandler extends AbstractHandler{
             ExecuteResult result = CommonValueTable.ResultTable.get(context.getTaskId());
             synchronized (result) {
                 result.setStatus(BuildTaskStatusEnum.FAILED);
-                app.setMessage("清理文件发生异常," + exception.getMessage());
+                result.setMessage("清理文件发生异常," + exception.getMessage());
                 result.setUpdateTime(new Date(System.currentTimeMillis()));
             }
+            logger.error("清理文件发生异常: {}", exception.getMessage());
             throw new PipelineException(400, "清理文件发生异常");
         }
     }

+ 4 - 1
src/main/java/cn/seecoder/fdroidrepository/Pipeline/Handlers/GitPullingHandler.java

@@ -8,11 +8,14 @@ import cn.seecoder.fdroidrepository.Pipeline.ExecuteResult;
 import cn.seecoder.fdroidrepository.Pipeline.PipelineException;
 import org.eclipse.jgit.api.CloneCommand;
 import org.eclipse.jgit.api.Git;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import java.io.File;
 import java.util.Date;
 
 public class GitPullingHandler extends AbstractHandler{
+    private static final Logger logger = LoggerFactory.getLogger(GitPullingHandler.class);
     private static final String localPath = "/fdroid/code/";
     @Override
     public void process(Context context) throws PipelineException {
@@ -24,7 +27,6 @@ public class GitPullingHandler extends AbstractHandler{
                 result.setStatus(BuildTaskStatusEnum.PULLING);
                 result.setUpdateTime(new Date(System.currentTimeMillis()));
             }
-            app.setStatusEnum(BuildTaskStatusEnum.PULLING);
             CloneCommand cloneCommand = Git.cloneRepository()
                     .setURI(app.getRepoUrl())
                     .setBranch(app.getBranch())
@@ -41,6 +43,7 @@ public class GitPullingHandler extends AbstractHandler{
                 result.setMessage("拉取Git远程仓库代码出现错误," + exception.getMessage());
                 result.setUpdateTime(new Date(System.currentTimeMillis()));
             }
+            logger.error("拉取Git远程仓库代码出现错误,错误信息:{}", exception.getMessage());
             throw new PipelineException(500, "拉取Git远程仓库代码出现错误");
         }
     }

+ 4 - 0
src/main/java/cn/seecoder/fdroidrepository/Pipeline/Handlers/GradleHandler.java

@@ -7,10 +7,13 @@ import cn.seecoder.fdroidrepository.Pipeline.Context;
 import cn.seecoder.fdroidrepository.Pipeline.ExecuteResult;
 import cn.seecoder.fdroidrepository.Pipeline.PipelineException;
 import cn.seecoder.fdroidrepository.Pipeline.WaitLock;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import java.util.Date;
 
 public class GradleHandler extends AbstractHandler{
+    private static final Logger logger = LoggerFactory.getLogger(GradleHandler.class);
     @Override
     public void process(Context context) throws PipelineException {
         // 等待用户手动修改Gradle文件后才可以执行后续步骤
@@ -38,6 +41,7 @@ public class GradleHandler extends AbstractHandler{
                         result.setMessage("Wait-notify机制出现问题," + exception.getMessage());
                         result.setUpdateTime(new Date(System.currentTimeMillis()));
                     }
+                    logger.error("Wait-notify机制出现问题,错误信息: {}", exception.getMessage());
                     throw new PipelineException(400, "Wait-notify机制出现问题");
                 }
             }

+ 4 - 1
src/main/java/cn/seecoder/fdroidrepository/Service/AppService.java

@@ -3,10 +3,13 @@ package cn.seecoder.fdroidrepository.Service;
 
 import cn.seecoder.fdroidrepository.DataObject.Enum.BuildTypeEnum;
 import cn.seecoder.fdroidrepository.DataObject.PO.BuildTaskPO;
+import cn.seecoder.fdroidrepository.DataObject.VO.AppInfoVO;
 
 public interface AppService {
+    Integer createAppInfo(AppInfoVO appInfoVO);
+
     Boolean rewriteGradleFile(Integer pipelineId, String fileName, String content);
-    BuildTaskPO checkStatus(Integer taskId);
+    BuildTaskPO checkTaskStatus(Integer taskId);
 
     Integer createBuildTask(Integer appId, Integer userId, String branch, BuildTypeEnum typeEnum);
 }

+ 18 - 2
src/main/java/cn/seecoder/fdroidrepository/Service/ServiceImpl/AppServiceImpl.java

@@ -5,11 +5,15 @@ import cn.seecoder.fdroidrepository.DataObject.Enum.BuildTaskStatusEnum;
 import cn.seecoder.fdroidrepository.DataObject.Enum.BuildTypeEnum;
 import cn.seecoder.fdroidrepository.DataObject.PO.AppInfoPO;
 import cn.seecoder.fdroidrepository.DataObject.PO.BuildTaskPO;
+import cn.seecoder.fdroidrepository.DataObject.VO.AppInfoVO;
 import cn.seecoder.fdroidrepository.Mapper.AppInfoMapper;
 import cn.seecoder.fdroidrepository.Mapper.BuildTaskMapper;
 import cn.seecoder.fdroidrepository.Pipeline.*;
 import cn.seecoder.fdroidrepository.Pipeline.Config.CommonValueTable;
 import cn.seecoder.fdroidrepository.Service.AppService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -22,6 +26,7 @@ import java.util.concurrent.*;
 @Service
 public class AppServiceImpl implements AppService {
     private static final ThreadPoolExecutor THREAD_POOL_EXECUTOR = new ThreadPoolExecutor(4, 8, 1000, TimeUnit.SECONDS, new LinkedBlockingQueue<>(512), new ThreadPoolExecutor.DiscardPolicy());
+    private static final Logger logger = LoggerFactory.getLogger(AppServiceImpl.class);
     private final BuildTaskMapper buildTaskMapper;
     private final AppInfoMapper appInfoMapper;
 
@@ -31,6 +36,14 @@ public class AppServiceImpl implements AppService {
         this.appInfoMapper = appInfoMapper;
     }
 
+    @Override
+    public Integer createAppInfo(AppInfoVO appInfoVO) {
+        AppInfoPO appInfoPO = new AppInfoPO();
+        BeanUtils.copyProperties(appInfoVO, appInfoPO);
+        Integer appId = appInfoMapper.insertAppInfo(appInfoPO);
+        return appId;
+    }
+
     @Override
     public Boolean rewriteGradleFile(Integer taskId, String fileName, String content) {
         try {
@@ -57,12 +70,13 @@ public class AppServiceImpl implements AppService {
             }
             return true;
         } catch (Exception exception) {
+            logger.error("重写Gradle文件失败,错误信息: {}", exception.getMessage());
             return false;
         }
     }
 
     @Override
-    public BuildTaskPO checkStatus(Integer taskId) {
+    public BuildTaskPO checkTaskStatus(Integer taskId) {
         ExecuteResult result = CommonValueTable.ResultTable.get(taskId);
         BuildTaskPO buildTaskPO = this.buildTaskMapper.selectById(taskId);
         if (result != null) {
@@ -86,6 +100,8 @@ public class AppServiceImpl implements AppService {
         AppInfoPO appInfoPO = appInfoMapper.selectById(appId);
         if (appInfoPO == null) {
             // AppInfo不存在
+            logger.error("对应的AppInfo不存在");
+            return -1;
         }
         BuildTaskPO buildTaskPO = BuildTaskPO.builder()
                 .appId(appId)
@@ -110,7 +126,7 @@ public class AppServiceImpl implements AppService {
                     pipeline = PipelineFactory.init(taskId, appInfoPO.getAppName(), buildTaskPO, app);
                     pipeline.start();
                 } catch (PipelineException e) {
-
+                    logger.error("PipelineException : {}", e.getMessage());
                 }
             }
         });

+ 24 - 0
src/main/java/cn/seecoder/fdroidrepository/Service/ServiceImpl/UserServiceImpl.java

@@ -3,9 +3,14 @@ package cn.seecoder.fdroidrepository.Service.ServiceImpl;
 import cn.seecoder.fdroidrepository.DataObject.User;
 import cn.seecoder.fdroidrepository.Mapper.UserMapper;
 import cn.seecoder.fdroidrepository.Service.UserService;
+import com.auth0.jwt.JWT;
+import com.auth0.jwt.exceptions.JWTDecodeException;
+import com.auth0.jwt.interfaces.DecodedJWT;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.util.Map;
+
 @Service
 public class UserServiceImpl implements UserService {
     @Autowired
@@ -26,4 +31,23 @@ public class UserServiceImpl implements UserService {
         User existingUser = findByUsername(username);
         return existingUser == null;
     }
+
+    @Override
+    public Map<String, Object> getUserInfoMap(String token) throws RuntimeException {
+        Map<String, Object> userInfo;
+        String auth;
+        Long exp;
+        try {
+            DecodedJWT decodedJWT = JWT.decode(token);
+            exp = decodedJWT.getClaim("exp").asLong();
+            auth = decodedJWT.getClaim("auth").asString();
+            userInfo = decodedJWT.getClaim("user_info").asMap();
+        } catch (JWTDecodeException exception) {
+            throw new RuntimeException(exception.getMessage());
+        }
+        if (exp < System.currentTimeMillis() / 1000) {
+            throw new RuntimeException("error: exp < System.currentTimeMillis() / 1000");
+        }
+        return userInfo;
+    }
 }

+ 10 - 0
src/main/java/cn/seecoder/fdroidrepository/Service/UserService.java

@@ -1,8 +1,12 @@
 package cn.seecoder.fdroidrepository.Service;
 
+import cn.seecoder.fdroidrepository.DataObject.PO.UserPO;
 import cn.seecoder.fdroidrepository.DataObject.User;
+import org.springframework.security.core.context.SecurityContextHolder;
 import org.springframework.stereotype.Service;
 
+import java.util.Map;
+
 
 public interface UserService {
     User findByUsername(String username);
@@ -10,4 +14,10 @@ public interface UserService {
     void save(User user);
 
     boolean isUsernameUnique(String username);
+
+    Map<String, Object> getUserInfoMap(String token) throws RuntimeException;
+
+    static UserPO getCurrentUser() {
+        return (UserPO) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
+    }
 }

+ 22 - 0
src/main/java/cn/seecoder/fdroidrepository/security/JwtAuthenticationTokenFilter.java

@@ -0,0 +1,22 @@
+package cn.seecoder.fdroidrepository.security;
+
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Component;
+import org.springframework.web.filter.OncePerRequestFilter;
+
+import javax.servlet.FilterChain;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+
+@Component
+public class JwtAuthenticationTokenFilter extends OncePerRequestFilter {
+    @Override
+    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
+        String authHeader = request.getHeader("Authorization");
+        if (StringUtils.isNotEmpty(authHeader)) {
+
+        }
+    }
+}

+ 49 - 0
src/main/java/cn/seecoder/fdroidrepository/security/WebSecurityConstants.java

@@ -0,0 +1,49 @@
+package cn.seecoder.fdroidrepository.security;
+
+import cn.seecoder.fdroidrepository.DataObject.Enum.UserIdentity;
+import org.springframework.security.core.GrantedAuthority;
+import org.springframework.security.core.authority.SimpleGrantedAuthority;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public abstract class WebSecurityConstants {
+    private static final String ROLE_PREFIX = "ROLE_";
+
+    public static final String STUDENT_ROLE = "STUDENT";
+    public static final String TEACHER_ROLE = "TEACHER";
+    public static final String ADMIN_ROLE = "ADMIN";
+    public static final String STAFF_ROLE = "STAFF";
+    public static final String HR_ROLE = "HR";
+    public static final String SEEC_ROLE = "SEEC";
+    public static final String SEECX_ROLE = "SEECX";
+    public static final String ASSISTANT_ROLE = "ASSISTANT";
+
+    public static final GrantedAuthority STUDENT_AUTHORITY = new SimpleGrantedAuthority(ROLE_PREFIX + STUDENT_ROLE);
+    public static final GrantedAuthority TEACHER_AUTHORITY = new SimpleGrantedAuthority(ROLE_PREFIX + TEACHER_ROLE);
+    public static final GrantedAuthority ADMIN_AUTHORITY = new SimpleGrantedAuthority(ROLE_PREFIX + ADMIN_ROLE);
+    public static final GrantedAuthority STAFF_AUTHORITY = new SimpleGrantedAuthority(ROLE_PREFIX + STAFF_ROLE);
+    public static final GrantedAuthority HR_AUTHORITY = new SimpleGrantedAuthority(ROLE_PREFIX + HR_ROLE);
+    public static final GrantedAuthority SEEC_AUTHORITY = new SimpleGrantedAuthority(ROLE_PREFIX + SEEC_ROLE);
+    public static final GrantedAuthority SEECX_AUTHORITY = new SimpleGrantedAuthority(ROLE_PREFIX + SEECX_ROLE);
+    public static final GrantedAuthority ASSISTANT_AUTHORITY = new SimpleGrantedAuthority(ROLE_PREFIX + ASSISTANT_ROLE);
+
+
+
+    private static final Map<UserIdentity,GrantedAuthority> authorityTable= new HashMap<>();
+
+    static {
+        authorityTable.put(UserIdentity.STUDENT, STUDENT_AUTHORITY);
+        authorityTable.put(UserIdentity.TEACHER, TEACHER_AUTHORITY);
+        authorityTable.put(UserIdentity.ADMIN, ADMIN_AUTHORITY);
+        authorityTable.put(UserIdentity.STAFF, STAFF_AUTHORITY);
+        authorityTable.put(UserIdentity.HR, HR_AUTHORITY);
+        authorityTable.put(UserIdentity.SEEC, SEEC_AUTHORITY);
+        authorityTable.put(UserIdentity.SEECX, SEECX_AUTHORITY);
+        authorityTable.put(UserIdentity.ASSISTANT, ASSISTANT_AUTHORITY);
+    }
+
+    public static GrantedAuthority getAuthority(UserIdentity identity){
+        return authorityTable.get(identity);
+    }
+}

+ 0 - 9
src/main/resources/application.properties

@@ -1,9 +0,0 @@
-
-# 数据库连接配置
-spring.datasource.url=jdbc:mysql://localhost:3306/fdroid
-spring.datasource.username=root
-spring.datasource.password=root
-spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
-
-# MyBatis配置
-mybatis.mapper-locations=classpath:mapper/*.xml

+ 16 - 0
src/main/resources/application.yml

@@ -0,0 +1,16 @@
+spring:
+  datasource:
+    url: jdbc:mysql://localhost:3306/fdroid?allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8&useSSL=false
+    username: root
+    password: Czh13935748710.
+  sql:
+    init:
+      mode: always
+      continue-on-error: false
+      schema-locations: classpath:sql/table_init.sql
+server:
+  port: 8080
+
+mybatis:
+  configuration:
+    map-underscore-to-camel-case: true

+ 7 - 0
src/main/resources/mybatis-config.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
+<configuration>
+
+    <typeHandlers>
+    </typeHandlers>
+</configuration>

+ 25 - 0
src/main/resources/sql/table_init.sql

@@ -0,0 +1,25 @@
+create table if not exists fdroid.app_info
+(
+    id int auto_increment primary key,
+    author_id int not null,
+    app_name varchar(64) not null,
+    repo_url varchar(128) not null,
+    build_branch varchar(64) null,
+    daily_build_branch varchar(64) null,
+    enable_daily_build boolean default false not null
+) charset = utf8;
+
+create table if not exists fdroid.build_task
+(
+    id int auto_increment primary key,
+    app_id int not null,
+    create_user_id int not null,
+    create_time timestamp default current_timestamp not null,
+    update_time timestamp,
+    status varchar(20) not null,
+    build_type varchar(20) not null,
+    repo_url varchar(128) not null,
+    branch varchar(64) not null,
+    message text,
+    result text
+) charset = utf8;