From 99d2bd60356eda69103acab6278eca81195755d9 Mon Sep 17 00:00:00 2001
From: liaozan <378024053@qq.com>
Date: Thu, 28 Apr 2022 17:01:34 +0800
Subject: [PATCH] feature: auto create gitlab repo
---
initializer-backend/pom.xml | 5 +
.../InitializerBackendApplication.java | 10 +-
.../initializer/config/GitConfiguration.java | 32 +++++++
.../config/properties/GitProperties.java | 18 ++++
.../controller/GitlabController.java | 26 ++++++
.../listener/ProjectWarmUpListener.java | 21 +++--
.../initializer/maven/MavenUtils.java | 41 ++++++++-
.../param/ArchetypeGenerateParam.java | 4 +
.../initializer/runner/ArchetypePreparer.java | 13 ++-
.../schedule/GitlabGroupFetchTask.java | 55 +++++++++++
.../initializer/service/ArchetypeService.java | 6 ++
.../spring-configuration-metadata.json | 22 +++++
.../src/main/resources/application.yaml | 5 +-
initializer-ui/package.json | 10 +-
initializer-ui/src/App.vue | 12 ++-
initializer-ui/src/components/starter.vue | 92 +++++++++++++++++--
16 files changed, 328 insertions(+), 44 deletions(-)
create mode 100644 initializer-backend/src/main/java/com/schbrain/archetype/initializer/config/GitConfiguration.java
create mode 100644 initializer-backend/src/main/java/com/schbrain/archetype/initializer/config/properties/GitProperties.java
create mode 100644 initializer-backend/src/main/java/com/schbrain/archetype/initializer/controller/GitlabController.java
create mode 100644 initializer-backend/src/main/java/com/schbrain/archetype/initializer/schedule/GitlabGroupFetchTask.java
create mode 100644 initializer-backend/src/main/resources/META-INF/spring-configuration-metadata.json
diff --git a/initializer-backend/pom.xml b/initializer-backend/pom.xml
index 70108ff..166ab9d 100644
--- a/initializer-backend/pom.xml
+++ b/initializer-backend/pom.xml
@@ -46,6 +46,11 @@
org.eclipse.jgit
org.eclipse.jgit
+
+ org.gitlab4j
+ gitlab4j-api
+ 5.0.1
+
diff --git a/initializer-backend/src/main/java/com/schbrain/archetype/initializer/InitializerBackendApplication.java b/initializer-backend/src/main/java/com/schbrain/archetype/initializer/InitializerBackendApplication.java
index 724f094..78c0a4d 100644
--- a/initializer-backend/src/main/java/com/schbrain/archetype/initializer/InitializerBackendApplication.java
+++ b/initializer-backend/src/main/java/com/schbrain/archetype/initializer/InitializerBackendApplication.java
@@ -1,17 +1,15 @@
package com.schbrain.archetype.initializer;
-import com.schbrain.archetype.initializer.listener.ProjectWarmUpListener;
+import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
-import org.springframework.boot.builder.SpringApplicationBuilder;
+import org.springframework.scheduling.annotation.EnableScheduling;
+@EnableScheduling
@SpringBootApplication
public class InitializerBackendApplication {
public static void main(String[] args) {
- SpringApplicationBuilder builder = new SpringApplicationBuilder();
- builder.listeners(new ProjectWarmUpListener());
- builder.sources(InitializerBackendApplication.class);
- builder.run(args);
+ SpringApplication.run(InitializerBackendApplication.class, args);
}
}
\ No newline at end of file
diff --git a/initializer-backend/src/main/java/com/schbrain/archetype/initializer/config/GitConfiguration.java b/initializer-backend/src/main/java/com/schbrain/archetype/initializer/config/GitConfiguration.java
new file mode 100644
index 0000000..d05903d
--- /dev/null
+++ b/initializer-backend/src/main/java/com/schbrain/archetype/initializer/config/GitConfiguration.java
@@ -0,0 +1,32 @@
+package com.schbrain.archetype.initializer.config;
+
+import com.schbrain.archetype.initializer.config.properties.GitProperties;
+import org.eclipse.jgit.transport.UsernamePasswordCredentialsProvider;
+import org.gitlab4j.api.GitLabApi;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * @author liaozan
+ * @since 2022/4/28
+ */
+@Configuration(proxyBeanMethods = false)
+@EnableConfigurationProperties(GitProperties.class)
+public class GitConfiguration {
+
+ @Autowired
+ private GitProperties gitProperties;
+
+ @Bean
+ public GitLabApi gitLabApi() {
+ return new GitLabApi(gitProperties.getServerUrl(), gitProperties.getPersonalAccessToken());
+ }
+
+ @Bean
+ public UsernamePasswordCredentialsProvider credentialsProvider() {
+ return new UsernamePasswordCredentialsProvider("PRIVATE-TOKEN", gitProperties.getPersonalAccessToken());
+ }
+
+}
\ No newline at end of file
diff --git a/initializer-backend/src/main/java/com/schbrain/archetype/initializer/config/properties/GitProperties.java b/initializer-backend/src/main/java/com/schbrain/archetype/initializer/config/properties/GitProperties.java
new file mode 100644
index 0000000..8005e0b
--- /dev/null
+++ b/initializer-backend/src/main/java/com/schbrain/archetype/initializer/config/properties/GitProperties.java
@@ -0,0 +1,18 @@
+package com.schbrain.archetype.initializer.config.properties;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+
+/**
+ * @author liaozan
+ * @since 2022/4/28
+ */
+@Data
+@ConfigurationProperties(prefix = "gitlab")
+public class GitProperties {
+
+ private String serverUrl;
+
+ private String personalAccessToken;
+
+}
\ No newline at end of file
diff --git a/initializer-backend/src/main/java/com/schbrain/archetype/initializer/controller/GitlabController.java b/initializer-backend/src/main/java/com/schbrain/archetype/initializer/controller/GitlabController.java
new file mode 100644
index 0000000..f60a6d0
--- /dev/null
+++ b/initializer-backend/src/main/java/com/schbrain/archetype/initializer/controller/GitlabController.java
@@ -0,0 +1,26 @@
+package com.schbrain.archetype.initializer.controller;
+
+import cn.hutool.core.lang.tree.Tree;
+import com.schbrain.archetype.initializer.schedule.GitlabGroupFetchTask;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * @author liaozan
+ * @since 2022/4/28
+ */
+@RestController
+public class GitlabController {
+
+ @Autowired
+ private GitlabGroupFetchTask gitlabGroupFetchTask;
+
+ @GetMapping("/gitlab/groups")
+ public List> groupList() {
+ return gitlabGroupFetchTask.getGroupTree();
+ }
+
+}
\ No newline at end of file
diff --git a/initializer-backend/src/main/java/com/schbrain/archetype/initializer/listener/ProjectWarmUpListener.java b/initializer-backend/src/main/java/com/schbrain/archetype/initializer/listener/ProjectWarmUpListener.java
index d293daf..5afcb00 100644
--- a/initializer-backend/src/main/java/com/schbrain/archetype/initializer/listener/ProjectWarmUpListener.java
+++ b/initializer-backend/src/main/java/com/schbrain/archetype/initializer/listener/ProjectWarmUpListener.java
@@ -2,11 +2,11 @@ package com.schbrain.archetype.initializer.listener;
import com.schbrain.archetype.initializer.maven.MavenUtils;
import com.schbrain.archetype.initializer.param.ArchetypeGenerateParam;
+import com.schbrain.common.util.EnvUtils;
import lombok.SneakyThrows;
-import org.springframework.boot.cloud.CloudPlatform;
import org.springframework.boot.context.event.ApplicationStartedEvent;
import org.springframework.context.ApplicationListener;
-import org.springframework.core.env.ConfigurableEnvironment;
+import org.springframework.stereotype.Component;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
@@ -15,6 +15,7 @@ import java.util.concurrent.Executors;
* @author liaozan
* @since 2022/3/20
*/
+@Component
public class ProjectWarmUpListener implements ApplicationListener {
private final Executor executor = Executors.newSingleThreadExecutor();
@@ -22,15 +23,15 @@ public class ProjectWarmUpListener implements ApplicationListener {
- ArchetypeGenerateParam mockParam = new ArchetypeGenerateParam();
- mockParam.setGroupId("com.schbrain");
- mockParam.setArtifactId("schbrain-init");
- MavenUtils.generate(mockParam);
- });
+ if (!EnvUtils.runningOnCloudPlatform(event.getApplicationContext().getEnvironment())) {
+ return;
}
+ executor.execute(() -> {
+ ArchetypeGenerateParam mockParam = new ArchetypeGenerateParam();
+ mockParam.setGroupId("com.schbrain");
+ mockParam.setArtifactId("schbrain-init");
+ MavenUtils.generate(mockParam);
+ });
}
}
\ No newline at end of file
diff --git a/initializer-backend/src/main/java/com/schbrain/archetype/initializer/maven/MavenUtils.java b/initializer-backend/src/main/java/com/schbrain/archetype/initializer/maven/MavenUtils.java
index 7e50bd8..30eaefb 100644
--- a/initializer-backend/src/main/java/com/schbrain/archetype/initializer/maven/MavenUtils.java
+++ b/initializer-backend/src/main/java/com/schbrain/archetype/initializer/maven/MavenUtils.java
@@ -1,6 +1,7 @@
package com.schbrain.archetype.initializer.maven;
import cn.hutool.core.io.FileUtil;
+import cn.hutool.extra.spring.SpringUtil;
import com.schbrain.archetype.initializer.param.ArchetypeGenerateParam;
import com.schbrain.common.exception.BaseException;
import com.schbrain.common.util.IdWorker;
@@ -13,12 +14,19 @@ import org.apache.maven.settings.Settings;
import org.apache.maven.settings.io.DefaultSettingsWriter;
import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.api.errors.GitAPIException;
+import org.eclipse.jgit.transport.CredentialsProvider;
+import org.eclipse.jgit.transport.URIish;
+import org.gitlab4j.api.GitLabApi;
+import org.gitlab4j.api.GitLabApiException;
+import org.gitlab4j.api.models.Group;
import java.io.File;
import java.io.IOException;
+import java.net.URISyntaxException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Collections;
+import java.util.List;
import static org.apache.maven.cli.MavenCli.MULTIMODULE_PROJECT_DIRECTORY;
@@ -31,6 +39,8 @@ public class MavenUtils {
private static final File SETTINGS_FILE = new File(MavenCli.USER_MAVEN_CONFIGURATION_HOME, "settings.xml");
+ private static final List ADDITIONAL_BRANCHES = List.of("release", "develop");
+
static {
System.getProperties().setProperty(MULTIMODULE_PROJECT_DIRECTORY, "$M2_HOME");
getSettingsFile();
@@ -53,7 +63,8 @@ public class MavenUtils {
mavenCli.doMain(args, null, System.out, System.err);
log.info("Generate archetype project at {}", outputDirectory);
if (param.isInitGitRepo()) {
- initGitRepo(Paths.get(archetype.getAbsolutePath(), param.getArtifactId()));
+ Path directory = Paths.get(archetype.getAbsolutePath(), param.getArtifactId());
+ initGitRepo(directory, param.getRepoGroupId(), param);
}
return id;
}
@@ -63,15 +74,35 @@ public class MavenUtils {
return new File(tmpDirPath, id);
}
- private static void initGitRepo(Path directory) {
+ private static void initGitRepo(Path directory, Long repoGroupId, ArchetypeGenerateParam param) {
try {
Git git = Git.init().setInitialBranch("master").setDirectory(directory.toFile()).call();
git.add().addFilepattern(".").call();
git.commit().setAllowEmpty(true).setAuthor("initializer", "no-reply@schbrain.com").setMessage("Initial Commit").call();
- git.checkout().setCreateBranch(true).setName("release").call();
- git.checkout().setCreateBranch(true).setName("develop").call();
+
+ boolean pushToRemote = repoGroupId != null;
+ if (pushToRemote) {
+ GitLabApi gitLabApi = SpringUtil.getBean(GitLabApi.class);
+ Group group = gitLabApi.getGroupApi().getGroup(repoGroupId);
+ String groupPath = group.getFullPath();
+ String repositoryUrl = String.format("%s/%s/%s.git", gitLabApi.getGitLabServerUrl(), groupPath, param.getArtifactId());
+ URIish urIish = new URIish(repositoryUrl);
+ git.remoteSetUrl().setRemoteName("origin").setRemoteUri(urIish).call();
+ }
+
+ for (String branch : ADDITIONAL_BRANCHES) {
+ git.checkout().setName(branch).setCreateBranch(true).call();
+ }
+ if (pushToRemote) {
+ git.push()
+ .setRemote("origin")
+ .setCredentialsProvider(SpringUtil.getBean(CredentialsProvider.class))
+ .setPushAll()
+ .setForce(true)
+ .call();
+ }
git.close();
- } catch (GitAPIException e) {
+ } catch (GitAPIException | GitLabApiException | URISyntaxException e) {
log.warn("Git repo init failed", e);
throw new BaseException("Git仓库初始化失败");
}
diff --git a/initializer-backend/src/main/java/com/schbrain/archetype/initializer/param/ArchetypeGenerateParam.java b/initializer-backend/src/main/java/com/schbrain/archetype/initializer/param/ArchetypeGenerateParam.java
index 7cdf493..a2e4090 100644
--- a/initializer-backend/src/main/java/com/schbrain/archetype/initializer/param/ArchetypeGenerateParam.java
+++ b/initializer-backend/src/main/java/com/schbrain/archetype/initializer/param/ArchetypeGenerateParam.java
@@ -40,6 +40,10 @@ public class ArchetypeGenerateParam {
* 是否初始化 git 仓库
*/
private boolean initGitRepo;
+ /**
+ * 仓库 groupId
+ */
+ private Long repoGroupId;
public String getSubModuleNamePrefix() {
if (!StringUtils.hasText(this.subModuleNamePrefix)) {
diff --git a/initializer-backend/src/main/java/com/schbrain/archetype/initializer/runner/ArchetypePreparer.java b/initializer-backend/src/main/java/com/schbrain/archetype/initializer/runner/ArchetypePreparer.java
index 9066f4f..cdd7b5e 100644
--- a/initializer-backend/src/main/java/com/schbrain/archetype/initializer/runner/ArchetypePreparer.java
+++ b/initializer-backend/src/main/java/com/schbrain/archetype/initializer/runner/ArchetypePreparer.java
@@ -43,13 +43,12 @@ public class ArchetypePreparer implements ApplicationRunner {
}
private void checkoutArchetype(File archetypeTemplateDirectory) {
- try {
- Git.cloneRepository()
- .setTagOption(TagOpt.FETCH_TAGS)
- .setNoCheckout(false)
- .setDirectory(archetypeTemplateDirectory)
- .setURI(ARCHETYPE_REPO_URL)
- .call();
+ try (Git ignored = Git.cloneRepository()
+ .setTagOption(TagOpt.FETCH_TAGS)
+ .setNoCheckout(false)
+ .setDirectory(archetypeTemplateDirectory)
+ .setURI(ARCHETYPE_REPO_URL)
+ .call()) {
log.info("Success checkout archetype source from {}", ARCHETYPE_REPO_URL);
} catch (GitAPIException e) {
throw new BaseException("Failed to checkout archetype source from git repository", e);
diff --git a/initializer-backend/src/main/java/com/schbrain/archetype/initializer/schedule/GitlabGroupFetchTask.java b/initializer-backend/src/main/java/com/schbrain/archetype/initializer/schedule/GitlabGroupFetchTask.java
new file mode 100644
index 0000000..89aa484
--- /dev/null
+++ b/initializer-backend/src/main/java/com/schbrain/archetype/initializer/schedule/GitlabGroupFetchTask.java
@@ -0,0 +1,55 @@
+package com.schbrain.archetype.initializer.schedule;
+
+import cn.hutool.core.lang.tree.Tree;
+import cn.hutool.core.lang.tree.TreeNode;
+import cn.hutool.core.lang.tree.TreeUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.gitlab4j.api.GitLabApi;
+import org.gitlab4j.api.GroupApi;
+import org.gitlab4j.api.models.Group;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
+
+/**
+ * @author liaozan
+ * @since 2022/4/28
+ */
+@Slf4j
+@Component
+public class GitlabGroupFetchTask {
+
+ @Autowired
+ private GitLabApi gitLabApi;
+
+ private List> groupTree = Collections.emptyList();
+
+ public List> getGroupTree() {
+ return groupTree;
+ }
+
+ @Scheduled(fixedRate = 1, timeUnit = TimeUnit.HOURS)
+ public void fetchGroups() {
+ try {
+ GroupApi groupApi = gitLabApi.getGroupApi();
+ List groups = groupApi.getGroups();
+ List> treeNodes = groups.stream()
+ .map(group -> {
+ TreeNode treeNode = new TreeNode<>();
+ treeNode.setId(group.getId());
+ treeNode.setName(group.getName());
+ treeNode.setParentId(group.getParentId());
+ return treeNode;
+ }).collect(Collectors.toList());
+ this.groupTree = TreeUtil.build(treeNodes, null);
+ } catch (Exception e) {
+ log.warn("Failed to fetch Gitlab groups", e);
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/initializer-backend/src/main/java/com/schbrain/archetype/initializer/service/ArchetypeService.java b/initializer-backend/src/main/java/com/schbrain/archetype/initializer/service/ArchetypeService.java
index baeeddf..6bae63a 100644
--- a/initializer-backend/src/main/java/com/schbrain/archetype/initializer/service/ArchetypeService.java
+++ b/initializer-backend/src/main/java/com/schbrain/archetype/initializer/service/ArchetypeService.java
@@ -3,11 +3,13 @@ package com.schbrain.archetype.initializer.service;
import cn.hutool.cache.impl.TimedCache;
import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.ZipUtil;
+import com.schbrain.archetype.initializer.config.properties.GitProperties;
import com.schbrain.archetype.initializer.maven.MavenUtils;
import com.schbrain.archetype.initializer.param.ArchetypeGenerateParam;
import com.schbrain.archetype.initializer.response.PreviewFileTree;
import com.schbrain.archetype.initializer.runner.ArchetypePreparer;
import com.schbrain.common.util.ServletUtils;
+import org.gitlab4j.api.GitLabApi;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ContentDisposition;
import org.springframework.http.HttpHeaders;
@@ -38,6 +40,10 @@ public class ArchetypeService {
@Autowired
private ArchetypePreparer archetypePreparer;
+ @Autowired
+ private GitLabApi gitLabApi;
+ @Autowired
+ private GitProperties gitProperties;
public String generate(ArchetypeGenerateParam param) {
String generateId = MavenUtils.generate(param);
diff --git a/initializer-backend/src/main/resources/META-INF/spring-configuration-metadata.json b/initializer-backend/src/main/resources/META-INF/spring-configuration-metadata.json
new file mode 100644
index 0000000..c0626d1
--- /dev/null
+++ b/initializer-backend/src/main/resources/META-INF/spring-configuration-metadata.json
@@ -0,0 +1,22 @@
+{
+ "groups": [
+ {
+ "name": "gitlab",
+ "type": "com.schbrain.archetype.initializer.config.properties.GitProperties",
+ "sourceType": "com.schbrain.archetype.initializer.config.properties.GitProperties"
+ }
+ ],
+ "properties": [
+ {
+ "name": "gitlab.personal-access-token",
+ "type": "java.lang.String",
+ "sourceType": "com.schbrain.archetype.initializer.config.properties.GitProperties"
+ },
+ {
+ "name": "gitlab.server-url",
+ "type": "java.lang.String",
+ "sourceType": "com.schbrain.archetype.initializer.config.properties.GitProperties"
+ }
+ ],
+ "hints": []
+}
\ No newline at end of file
diff --git a/initializer-backend/src/main/resources/application.yaml b/initializer-backend/src/main/resources/application.yaml
index 212b5b6..2a1bdfe 100644
--- a/initializer-backend/src/main/resources/application.yaml
+++ b/initializer-backend/src/main/resources/application.yaml
@@ -3,4 +3,7 @@ spring:
name: initializer-backend
web:
resources:
- add-mappings: true
\ No newline at end of file
+ add-mappings: true
+gitlab:
+ server-url: http://gitlab.schbrain.com/gitlab
+ personal-access-token: AzRH1rZ2HysUkHeycsaU
\ No newline at end of file
diff --git a/initializer-ui/package.json b/initializer-ui/package.json
index 4011581..f4014f4 100644
--- a/initializer-ui/package.json
+++ b/initializer-ui/package.json
@@ -7,15 +7,15 @@
},
"dependencies": {
"vue": "^3.2.33",
- "axios": "^0.26.1",
- "ant-design-vue": "^3.2.0",
+ "axios": "^0.27.2",
+ "ant-design-vue": "^3.2.2",
"highlight.js": "^11.5.1",
"@highlightjs/vue-plugin": "^2.1.0"
},
"devDependencies": {
"@vitejs/plugin-vue": "^2.3.1",
- "typescript": "^4.6.3",
- "vite": "^2.9.5",
- "vue-tsc": "^0.34.8"
+ "typescript": "^4.6.4",
+ "vite": "^2.9.7",
+ "vue-tsc": "^0.34.11"
}
}
\ No newline at end of file
diff --git a/initializer-ui/src/App.vue b/initializer-ui/src/App.vue
index ae33f4b..e4961eb 100644
--- a/initializer-ui/src/App.vue
+++ b/initializer-ui/src/App.vue
@@ -1,6 +1,14 @@
-
+
+
+
+
\ No newline at end of file
+import Starter from "./components/starter.vue"
+import zhCN from 'ant-design-vue/es/locale/zh_CN';
+import {ref} from "vue";
+
+const locale = ref(zhCN);
+
\ No newline at end of file
diff --git a/initializer-ui/src/components/starter.vue b/initializer-ui/src/components/starter.vue
index bbdb3a1..3c63736 100644
--- a/initializer-ui/src/components/starter.vue
+++ b/initializer-ui/src/components/starter.vue
@@ -15,8 +15,14 @@
+
+
+
+
+
+
- 初始化 Git 仓库
+ 初始化 Git 仓库
@@ -51,6 +61,8 @@ interface FormState {
version: string,
packageName: string,
initGitRepo: boolean
+ repoGroup: string
+ repoGroupId: number
}
interface FileNode {
@@ -60,11 +72,20 @@ interface FileNode {
isFile: boolean
}
+interface GroupNode {
+ id: number,
+ name: string,
+ children: GroupNode[],
+}
+
const fileNodeList = ref([])
-const treeData = ref([])
+const groupNodeList = ref([])
+const fileTreeData = ref([])
+const gitlabGroupTreeData = ref([])
const id = ref(-1)
const structPreviewVisible = ref(false)
const contentPreviewVisible = ref(false)
+const gitlabGroupVisible = ref(false)
const fileContent = ref()
const fileExtension = ref()
const loading = computed(() => isLoading.value)
@@ -75,7 +96,9 @@ const formState = reactive({
artifactId: '',
version: '1.0.0-SNAPSHOT',
packageName: '',
- initGitRepo: true
+ initGitRepo: false,
+ repoGroup: '',
+ repoGroupId: -1
})
const formRules = {
@@ -83,6 +106,17 @@ const formRules = {
artifactId: [{required: true, message: '请输入artifactId', trigger: 'change'}],
}
+const fetchGroupTreeList = async (initGitRepo: boolean) => {
+ if (initGitRepo) {
+ groupNodeList.value = await fetchGroupList()
+ gitlabGroupTreeData.value = createGroupTreeData(groupNodeList.value)
+ gitlabGroupVisible.value = true
+ } else {
+ formState.repoGroup = ''
+ formState.repoGroupId = -1
+ }
+}
+
const onGenerate = async () => {
let result = await downloadForm.value?.validate()
if (result) {
@@ -90,6 +124,13 @@ const onGenerate = async () => {
result.packageName = result.groupId
}
+ if (result.initGitRepo) {
+ if (result.repoGroupId === -1) {
+ message.warn('Gitlab 群组不能为空!')
+ return
+ }
+ }
+
let data: BaseResponse = await request.post('/archetype/generate', result)
if (data.code === 0) {
id.value = data.result
@@ -100,7 +141,7 @@ const onGenerate = async () => {
const onPreview = async () => {
fileNodeList.value = await fetchFileList(id.value)
- treeData.value = createTreeData(fileNodeList.value)
+ fileTreeData.value = createFileTreeData(fileNodeList.value)
structPreviewVisible.value = true
}
@@ -111,13 +152,26 @@ const onDownload = async (id: number) => {
downloadGeneratedProject(data, fileName)
}
-const onSelect = async (selectedKeys: string[], event: { node: TreeDataNode }) => {
+const onFileTreeNodeSelect = async (selectedKeys: string[], event: { node: TreeDataNode }) => {
const {node} = event
fileContent.value = node.fileContent
fileExtension.value = node.title.substring(node.title.lastIndexOf('.') + 1)
contentPreviewVisible.value = true
}
+const onGroupTreeNodeSelect = async (selectedKeys: string[], event: { node: TreeDataNode }) => {
+ const {node} = event
+ formState.repoGroupId = node.key as number
+ formState.repoGroup = node.title
+}
+
+const onGroupModalClose = async () => {
+ if (formState.repoGroupId === -1) {
+ formState.initGitRepo = false
+ }
+ gitlabGroupVisible.value = false
+}
+
const downloadGeneratedProject = (data: BlobPart, fileName: string) => {
const blob = new Blob([data])
const link = document.createElement('a')
@@ -137,7 +191,14 @@ const fetchFileList = async (id: number) => {
}
}
-const createTreeData = (fileNodeList: FileNode[]): any => {
+const fetchGroupList = async () => {
+ let data: BaseResponse = await request.get(`/gitlab/groups`)
+ if (data.code === 0) {
+ return data.result
+ }
+}
+
+const createFileTreeData = (fileNodeList: FileNode[]): any => {
if (!fileNodeList) {
return []
}
@@ -145,13 +206,28 @@ const createTreeData = (fileNodeList: FileNode[]): any => {
return {
key: Math.random(),
title: item.fileName,
- children: createTreeData(item.children),
+ children: createFileTreeData(item.children),
selectable: item.isFile,
isLeaf: item.isFile,
fileContent: item.fileContent
}
})
}
+
+const createGroupTreeData = (groupNodeList: GroupNode[]): any => {
+ if (!groupNodeList) {
+ return []
+ }
+ return groupNodeList.map((item: GroupNode) => {
+ return {
+ key: item.id,
+ title: item.name,
+ children: createGroupTreeData(item.children),
+ selectable: true,
+ isLeaf: !item.children
+ }
+ })
+}