소스 검색

添加系统第一次启动时的初始化代码

reghao 2 년 전
부모
커밋
a713613803

+ 2 - 2
manager/src/main/java/cn/reghao/devops/manager/account/model/constant/RoleType.java

@@ -8,10 +8,10 @@ package cn.reghao.devops.manager.account.model.constant;
  */
 public enum RoleType {
     ROLE_ADMIN("管理员", ""),
+    ROLE_USER("普通用户", ""),
     ROLE_BACKEND("后端", ""),
     ROLE_FRONTEND("前端", ""),
-    ROLE_TEST("测试", ""),
-    ROLE_USER("默认", "");
+    ROLE_TEST("测试", "");
 
     private final String name;
     private final String desc;

+ 2 - 2
manager/src/main/java/cn/reghao/devops/manager/account/model/dto/CreateAccountDto.java

@@ -22,10 +22,10 @@ public class CreateAccountDto {
     @NotNull(message = "必须选择用户角色")
     private Integer roleId;
 
-    public CreateAccountDto(String username, String password) {
+    public CreateAccountDto(String username, String password, int roleId) {
         this.username = username;
         this.screenName = username;
         this.password = password;
-        this.roleId = 1;
+        this.roleId = roleId;
     }
 }

+ 0 - 4
manager/src/main/java/cn/reghao/devops/manager/account/model/po/Menu.java

@@ -17,9 +17,6 @@ import java.util.*;
 @NoArgsConstructor
 @Setter
 @Getter
-/*@EqualsAndHashCode(callSuper = false, exclude = {"roles"})
-@ToString(exclude = {"roles"})*/
-//@Table
 @Table(name = "sys_menu")
 @Entity
 public class Menu extends BaseEntity {
@@ -38,7 +35,6 @@ public class Menu extends BaseEntity {
     // 在同一个 pid 组内的位置,作为排序使用
     @NotNull
     private Integer pos;
-    //private Boolean isEnabled;
     private Boolean enabled;
     // Menu 拥有的所有子 Menu(按排序顺序, 不持久化)
     @Transient

+ 3 - 2
manager/src/main/java/cn/reghao/devops/manager/account/model/po/Role.java

@@ -19,7 +19,6 @@ import java.util.Set;
 @Data
 @EqualsAndHashCode(callSuper = false, exclude = {"description", "menus"})
 @ToString(exclude = {"menus"})
-//@Table
 @Table(name = "sys_role")
 @Entity
 public class Role extends BaseEntity {
@@ -35,7 +34,9 @@ public class Role extends BaseEntity {
     private String description;
     // Role 端维护 Role 和 Menu 之间的关系
     @ManyToMany
-    @JoinTable(name = "sys_role_menu", joinColumns = @JoinColumn(name = "role_id"), inverseJoinColumns = @JoinColumn(name = "menu_id"))
+    @JoinTable(name = "sys_role_menu",
+            joinColumns = @JoinColumn(name = "role_id"),
+            inverseJoinColumns = @JoinColumn(name = "menu_id"))
     private Set<Menu> menus;
 
     public Role(String title, String name, String description) {

+ 0 - 1
manager/src/main/java/cn/reghao/devops/manager/account/model/po/User.java

@@ -22,7 +22,6 @@ import java.util.stream.Collectors;
 @NoArgsConstructor
 @Getter
 @Setter
-//@Table
 @Table(name = "sys_user")
 @Entity
 public class User extends BaseEntity implements UserDetails {

+ 4 - 144
manager/src/main/java/cn/reghao/devops/manager/account/service/FileService.java

@@ -1,155 +1,15 @@
 package cn.reghao.devops.manager.account.service;
 
-import cn.reghao.devops.manager.account.db.repository.DiskFileRepository;
-import cn.reghao.devops.manager.account.model.po.DiskFile;
-import cn.reghao.jutil.jdk.security.DigestUtil;
-import cn.reghao.jutil.web.ServletUtil;
-import org.apache.commons.io.FileUtils;
-import org.springframework.stereotype.Service;
 import org.springframework.web.multipart.MultipartFile;
 
-import javax.annotation.PostConstruct;
-import javax.servlet.http.HttpServletResponse;
 import java.io.*;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.StandardCopyOption;
-import java.util.List;
-import java.util.UUID;
 
 /**
  * @author reghao
  * @date 2024-01-19 21:29:24
  */
-@Service
-public class FileService {
-    // 1MiB
-    private final int bufSize = 1024*1024;
-    private final String storeDir = "";
-    private final DiskFileRepository diskFileRepository;
-
-    public FileService(DiskFileRepository diskFileRepository) {
-        this.diskFileRepository = diskFileRepository;
-    }
-
-    @PostConstruct
-    public void initLocalStore() throws IOException {
-        File dir1 = new File(storeDir);
-        if (!dir1.exists()) {
-            //FileUtils.forceMkdir(dir1);
-        }
-    }
-
-    public void getFile(String objectName) throws IOException {
-        DiskFile diskFile = diskFileRepository.findByObjectName(objectName);
-        if (diskFile == null) {
-            writeResponse(HttpServletResponse.SC_NOT_FOUND);
-            return;
-        }
-
-        String absolutePath = diskFile.getAbsolutePath();
-        String contentType = diskFile.getContentType();
-        long size = diskFile.getSize();
-        HttpServletResponse response = ServletUtil.getResponse();
-        response.setStatus(HttpServletResponse.SC_OK);
-        response.setContentType(contentType);
-        response.setContentLengthLong(size);
-
-        OutputStream outputStream = response.getOutputStream();
-        writeResponse(outputStream, absolutePath, 0, size);
-    }
-
-    private void writeResponse(int statusCode) throws IOException {
-        HttpServletResponse response = ServletUtil.getResponse();
-        response.setStatus(statusCode);
-        OutputStream outputStream = response.getOutputStream();
-        outputStream.flush();
-        outputStream.close();
-    }
-
-    private void writeResponse(OutputStream outputStream, String absolutePath, long start, long end) throws IOException {
-        RandomAccessFile raf = new RandomAccessFile(absolutePath, "r");
-        raf.seek(start);
-
-        long len = end-start+1;
-        if (len < bufSize) {
-            int len1 = (int) len;
-            byte[] buf1 = new byte[len1];
-            int readLen1 = raf.read(buf1, 0, len1);
-            outputStream.write(buf1, 0, readLen1);
-        } else {
-            byte[] buf = new byte[bufSize];
-            long totalRead = 0;
-            int readLen;
-            while ((readLen = raf.read(buf, 0, bufSize)) != -1) {
-                outputStream.write(buf, 0, readLen);
-                totalRead += readLen;
-
-                long left = len - totalRead;
-                if (left < bufSize) {
-                    int left1 = (int) left;
-                    byte[] buf1 = new byte[left1];
-                    int readLen1 = raf.read(buf1, 0, left1);
-                    outputStream.write(buf1, 0, readLen1);
-                    break;
-                }
-            }
-        }
-
-        outputStream.flush();
-        outputStream.close();
-        raf.close();
-    }
-
-    public String putFile(MultipartFile file) throws Exception {
-        long size = file.getSize();
-        String filename = file.getOriginalFilename();
-        String suffix = getSuffix(filename);
-
-        String objectId = UUID.randomUUID().toString().replace("-", "");;
-        String objectName;
-        if (suffix.isBlank()) {
-            objectName = String.format("file/%s", objectId);
-        } else {
-            objectName = String.format("file/%s%s", objectId, suffix);
-        }
-
-        String contentId = UUID.randomUUID().toString().replace("-", "");
-        File savedFile = saveFile(file.getInputStream(), contentId, suffix);
-        String contentType = Files.probeContentType(Path.of(savedFile.getAbsolutePath()));
-        String sha256sum = DigestUtil.sha256sum(savedFile.getAbsolutePath());
-
-        List<DiskFile> diskFiles = diskFileRepository.findBySha256sum(sha256sum);
-        DiskFile diskFile;
-        if (!diskFiles.isEmpty()) {
-            DiskFile existFile = diskFiles.get(0);
-            diskFile = new DiskFile(objectName, objectId, existFile, filename);
-            FileUtils.deleteQuietly(savedFile);
-        } else {
-            diskFile = new DiskFile(objectName, objectId, savedFile.getAbsolutePath(), sha256sum, filename, contentType, size);
-        }
-
-        diskFileRepository.save(diskFile);
-        return "/" + objectName;
-    }
-
-    private File saveFile(InputStream inputStream, String contentId, String suffix) throws IOException {
-        String absolutePath = String.format("%s/%s%s", storeDir, contentId, suffix);
-        File file = new File(absolutePath);
-        if (file.exists()) {
-            throw new IOException(absolutePath + " exist");
-        }
-
-        Files.copy(inputStream, Path.of(absolutePath), StandardCopyOption.REPLACE_EXISTING);
-        return file;
-    }
-
-    private String getSuffix(String filename) {
-        if (filename == null) {
-            return "";
-        }
-
-        int idx = filename.lastIndexOf(".");
-        return idx == -1 ? "" : filename.substring(idx);
-    }
+public interface FileService {
+    void initLocalStore() throws IOException;
+    void getFile(String objectName) throws IOException;
+    String putFile(MultipartFile file) throws Exception;
 }

+ 1 - 0
manager/src/main/java/cn/reghao/devops/manager/account/service/RoleService.java

@@ -10,6 +10,7 @@ import java.util.Set;
  * @date 2020-06-19 16:36:53
  */
 public interface RoleService {
+    void initRole();
     void addOrModify(Role role);
     void delete(Integer roleId);
     void setRoleMenus(Integer roleId, Set<Menu> menus);

+ 10 - 3
manager/src/main/java/cn/reghao/devops/manager/account/service/impl/AccountServiceImpl.java

@@ -2,6 +2,7 @@ package cn.reghao.devops.manager.account.service.impl;
 
 import cn.reghao.devops.manager.account.db.repository.RoleRepository;
 import cn.reghao.devops.manager.account.db.repository.UserRepository;
+import cn.reghao.devops.manager.account.model.constant.RoleType;
 import cn.reghao.devops.manager.account.model.dto.CreateAccountDto;
 import cn.reghao.devops.manager.account.model.po.Role;
 import cn.reghao.devops.manager.account.service.AccountService;
@@ -46,10 +47,16 @@ public class AccountServiceImpl implements AccountService {
         List<User> list = userRepository.findAll(PageRequest.of(0, 1)).getContent();
         if (list.isEmpty()) {
             String username = RandomString.getString(3).toLowerCase(Locale.ROOT);
+            username = "admin";
             String password = RandomString.getString(10);
-            CreateAccountDto createAccountDto = new CreateAccountDto(username, password);
-            createAccount(createAccountDto);
-            log.info("初始化完成, 帐号和密码分别是 {} 和 {}", username, password);
+
+            Role role = roleRepository.findByTitle(RoleType.ROLE_ADMIN.name());
+            if (role != null) {
+                int roleId = role.getId();
+                CreateAccountDto createAccountDto = new CreateAccountDto(username, password, roleId);
+                createAccount(createAccountDto);
+                log.info("初始化完成, 帐号和密码分别是 {} 和 {}", username, password);
+            }
         }
     }
 

+ 157 - 0
manager/src/main/java/cn/reghao/devops/manager/account/service/impl/FileServiceImpl.java

@@ -0,0 +1,157 @@
+package cn.reghao.devops.manager.account.service.impl;
+
+import cn.reghao.devops.manager.account.db.repository.DiskFileRepository;
+import cn.reghao.devops.manager.account.model.po.DiskFile;
+import cn.reghao.devops.manager.account.service.FileService;
+import cn.reghao.jutil.jdk.security.DigestUtil;
+import cn.reghao.jutil.web.ServletUtil;
+import org.apache.commons.io.FileUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.*;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.StandardCopyOption;
+import java.util.List;
+import java.util.UUID;
+
+/**
+ * @author reghao
+ * @date 2024-01-19 21:29:24
+ */
+@Service
+public class FileServiceImpl implements FileService {
+    // 1MiB
+    private final int bufSize = 1024*1024;
+    private final String storeDir = "";
+    private final DiskFileRepository diskFileRepository;
+
+    public FileServiceImpl(DiskFileRepository diskFileRepository) {
+        this.diskFileRepository = diskFileRepository;
+    }
+
+    @Override
+    public void initLocalStore() throws IOException {
+        File dir1 = new File(storeDir);
+        if (!dir1.exists()) {
+            //FileUtils.forceMkdir(dir1);
+        }
+    }
+
+    @Override
+    public void getFile(String objectName) throws IOException {
+        DiskFile diskFile = diskFileRepository.findByObjectName(objectName);
+        if (diskFile == null) {
+            writeResponse(HttpServletResponse.SC_NOT_FOUND);
+            return;
+        }
+
+        String absolutePath = diskFile.getAbsolutePath();
+        String contentType = diskFile.getContentType();
+        long size = diskFile.getSize();
+        HttpServletResponse response = ServletUtil.getResponse();
+        response.setStatus(HttpServletResponse.SC_OK);
+        response.setContentType(contentType);
+        response.setContentLengthLong(size);
+
+        OutputStream outputStream = response.getOutputStream();
+        writeResponse(outputStream, absolutePath, 0, size);
+    }
+
+    private void writeResponse(int statusCode) throws IOException {
+        HttpServletResponse response = ServletUtil.getResponse();
+        response.setStatus(statusCode);
+        OutputStream outputStream = response.getOutputStream();
+        outputStream.flush();
+        outputStream.close();
+    }
+
+    private void writeResponse(OutputStream outputStream, String absolutePath, long start, long end) throws IOException {
+        RandomAccessFile raf = new RandomAccessFile(absolutePath, "r");
+        raf.seek(start);
+
+        long len = end-start+1;
+        if (len < bufSize) {
+            int len1 = (int) len;
+            byte[] buf1 = new byte[len1];
+            int readLen1 = raf.read(buf1, 0, len1);
+            outputStream.write(buf1, 0, readLen1);
+        } else {
+            byte[] buf = new byte[bufSize];
+            long totalRead = 0;
+            int readLen;
+            while ((readLen = raf.read(buf, 0, bufSize)) != -1) {
+                outputStream.write(buf, 0, readLen);
+                totalRead += readLen;
+
+                long left = len - totalRead;
+                if (left < bufSize) {
+                    int left1 = (int) left;
+                    byte[] buf1 = new byte[left1];
+                    int readLen1 = raf.read(buf1, 0, left1);
+                    outputStream.write(buf1, 0, readLen1);
+                    break;
+                }
+            }
+        }
+
+        outputStream.flush();
+        outputStream.close();
+        raf.close();
+    }
+
+    @Override
+    public String putFile(MultipartFile file) throws Exception {
+        long size = file.getSize();
+        String filename = file.getOriginalFilename();
+        String suffix = getSuffix(filename);
+
+        String objectId = UUID.randomUUID().toString().replace("-", "");;
+        String objectName;
+        if (suffix.isBlank()) {
+            objectName = String.format("file/%s", objectId);
+        } else {
+            objectName = String.format("file/%s%s", objectId, suffix);
+        }
+
+        String contentId = UUID.randomUUID().toString().replace("-", "");
+        File savedFile = saveFile(file.getInputStream(), contentId, suffix);
+        String contentType = Files.probeContentType(Path.of(savedFile.getAbsolutePath()));
+        String sha256sum = DigestUtil.sha256sum(savedFile.getAbsolutePath());
+
+        List<DiskFile> diskFiles = diskFileRepository.findBySha256sum(sha256sum);
+        DiskFile diskFile;
+        if (!diskFiles.isEmpty()) {
+            DiskFile existFile = diskFiles.get(0);
+            diskFile = new DiskFile(objectName, objectId, existFile, filename);
+            FileUtils.deleteQuietly(savedFile);
+        } else {
+            diskFile = new DiskFile(objectName, objectId, savedFile.getAbsolutePath(), sha256sum, filename, contentType, size);
+        }
+
+        diskFileRepository.save(diskFile);
+        return "/" + objectName;
+    }
+
+    private File saveFile(InputStream inputStream, String contentId, String suffix) throws IOException {
+        String absolutePath = String.format("%s/%s%s", storeDir, contentId, suffix);
+        File file = new File(absolutePath);
+        if (file.exists()) {
+            throw new IOException(absolutePath + " exist");
+        }
+
+        Files.copy(inputStream, Path.of(absolutePath), StandardCopyOption.REPLACE_EXISTING);
+        return file;
+    }
+
+    private String getSuffix(String filename) {
+        if (filename == null) {
+            return "";
+        }
+
+        int idx = filename.lastIndexOf(".");
+        return idx == -1 ? "" : filename.substring(idx);
+    }
+}

+ 24 - 4
manager/src/main/java/cn/reghao/devops/manager/account/service/impl/RoleServiceImpl.java

@@ -1,7 +1,9 @@
 package cn.reghao.devops.manager.account.service.impl;
 
 import cn.reghao.devops.manager.account.db.query.RoleQuery;
+import cn.reghao.devops.manager.account.db.repository.MenuRepository;
 import cn.reghao.devops.manager.account.db.repository.RoleRepository;
+import cn.reghao.devops.manager.account.model.constant.RoleType;
 import cn.reghao.devops.manager.account.model.po.Menu;
 import cn.reghao.devops.manager.account.model.po.Role;
 import cn.reghao.devops.manager.account.model.po.User;
@@ -9,9 +11,7 @@ import cn.reghao.devops.manager.account.service.RoleService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 
-import java.util.List;
-import java.util.Locale;
-import java.util.Set;
+import java.util.*;
 
 /**
  * @author reghao
@@ -22,10 +22,30 @@ import java.util.Set;
 public class RoleServiceImpl implements RoleService {
     private final RoleQuery roleQuery;
     private final RoleRepository roleRepository;
+    private final MenuRepository menuRepository;
 
-    public RoleServiceImpl(RoleQuery roleQuery, RoleRepository roleRepository) {
+    public RoleServiceImpl(RoleQuery roleQuery, RoleRepository roleRepository, MenuRepository menuRepository) {
         this.roleQuery = roleQuery;
         this.roleRepository = roleRepository;
+        this.menuRepository = menuRepository;
+    }
+
+    public void initRole() {
+        List<Role> roleList = roleRepository.findAll();
+        if (roleList.isEmpty()) {
+            roleList = new ArrayList<>();
+            for (RoleType roleType : RoleType.values()) {
+                roleList.add(new Role(roleType.name(), roleType.getName(), roleType.getDesc()));
+            }
+            roleRepository.saveAll(roleList);
+
+            List<Menu> menus = menuRepository.findAll();
+            if (!menus.isEmpty()) {
+                Role role = roleRepository.findByTitle(RoleType.ROLE_ADMIN.name());
+                role.setMenus(new HashSet<>(menus));
+                roleRepository.save(role);
+            }
+        }
     }
 
     @Override

+ 25 - 28
manager/src/main/java/cn/reghao/devops/manager/config/spring/AppLifecycle.java

@@ -1,7 +1,12 @@
 package cn.reghao.devops.manager.config.spring;
 
 import cn.reghao.devops.common.build.model.constant.CompileType;
+import cn.reghao.devops.manager.account.db.repository.MenuRepository;
+import cn.reghao.devops.manager.account.model.dto.AccountRole;
+import cn.reghao.devops.manager.account.model.po.Menu;
 import cn.reghao.devops.manager.account.service.AccountService;
+import cn.reghao.devops.manager.account.service.FileService;
+import cn.reghao.devops.manager.account.service.RoleService;
 import cn.reghao.devops.manager.app.db.repository.config.build.CompilerConfigRepository;
 import cn.reghao.devops.manager.app.model.po.config.build.CompilerConfig;
 import cn.reghao.devops.manager.app.service.config.BuildDirService;
@@ -19,6 +24,7 @@ import org.springframework.boot.ApplicationRunner;
 import org.springframework.stereotype.Component;
 
 import java.io.File;
+import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -31,29 +37,27 @@ import java.util.List;
 public class AppLifecycle implements ApplicationRunner, DisposableBean {
     private final BuildDirService buildDirService;
     private final MachineService machineService;
-    private final RoleRepository roleRepository;
     private final LogHandler logHandler;
     private final CompilerConfigRepository compilerConfigRepository;
+    private final FileService fileService;
+    private final RoleService roleService;
     private final AccountService accountService;
 
-    public AppLifecycle(BuildDirService buildDirService, MachineService machineService, 
-                        RoleRepository roleRepository, LogHandler logHandler,
-                        CompilerConfigRepository compilerConfigRepository, AccountService accountService) {
+    public AppLifecycle(BuildDirService buildDirService, MachineService machineService, LogHandler logHandler,
+                        CompilerConfigRepository compilerConfigRepository, FileService fileService,
+                        RoleService roleService, AccountService accountService) {
         this.buildDirService = buildDirService;
         this.machineService = machineService;
-        this.roleRepository = roleRepository;
         this.logHandler = logHandler;
         this.compilerConfigRepository = compilerConfigRepository;
+        this.fileService = fileService;
+        this.roleService = roleService;
         this.accountService = accountService;
     }
 
     @Override
-    public void run(ApplicationArguments args) {
-        accountService.initAccount();
-        initLogConfig();
-        initBuildDir();
-        initRoles();
-        checkCompilerConfig();
+    public void run(ApplicationArguments args) throws IOException {
+        initSys();
         log.info("devops-manager started");
     }
 
@@ -63,6 +67,15 @@ public class AppLifecycle implements ApplicationRunner, DisposableBean {
         log.info("devops-manager shutdown...");
     }
 
+    private void initSys() throws IOException {
+        fileService.initLocalStore();
+        roleService.initRole();
+        accountService.initAccount();
+        initLogConfig();
+        initBuildDir();
+        checkCompilerConfig();
+    }
+
     private void initLogConfig() {
         String app = "devops-manager";
         String host = "localhost";
@@ -82,6 +95,7 @@ public class AppLifecycle implements ApplicationRunner, DisposableBean {
         }*/
     }
 
+    @Deprecated
     private void initBuildDir() {
         String userDir = System.getProperty("user.dir");
         String baseDir = String.format("%s/devops_data", userDir);
@@ -99,23 +113,6 @@ public class AppLifecycle implements ApplicationRunner, DisposableBean {
         }
     }
 
-    private void initRoles() {
-        List<Role> roleList = roleRepository.findAll();
-        if (roleList.isEmpty()) {
-            roleList = getRoles();
-            roleRepository.saveAll(roleList);
-        }
-    }
-    
-    private List<Role> getRoles() {
-        List<Role> list = new ArrayList<>();
-        for (RoleType roleType : RoleType.values()) {
-            list.add(new Role(roleType.name(), roleType.getName(), roleType.getDesc()));    
-        }
-        
-        return list;
-    }
-
     private void checkCompilerConfig() {
         List<CompilerConfig> list = compilerConfigRepository.findAll();
         for (CompilerConfig compilerConfig : list) {