Commit 99d2bd60 authored by liaozan's avatar liaozan 🏀

feature: auto create gitlab repo

parent 46f1072f
...@@ -46,6 +46,11 @@ ...@@ -46,6 +46,11 @@
<groupId>org.eclipse.jgit</groupId> <groupId>org.eclipse.jgit</groupId>
<artifactId>org.eclipse.jgit</artifactId> <artifactId>org.eclipse.jgit</artifactId>
</dependency> </dependency>
<dependency>
<groupId>org.gitlab4j</groupId>
<artifactId>gitlab4j-api</artifactId>
<version>5.0.1</version>
</dependency>
</dependencies> </dependencies>
<build> <build>
......
package com.schbrain.archetype.initializer; 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.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.scheduling.annotation.EnableScheduling;
@EnableScheduling
@SpringBootApplication @SpringBootApplication
public class InitializerBackendApplication { public class InitializerBackendApplication {
public static void main(String[] args) { public static void main(String[] args) {
SpringApplicationBuilder builder = new SpringApplicationBuilder(); SpringApplication.run(InitializerBackendApplication.class, args);
builder.listeners(new ProjectWarmUpListener());
builder.sources(InitializerBackendApplication.class);
builder.run(args);
} }
} }
\ No newline at end of file
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
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
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<Tree<Long>> groupList() {
return gitlabGroupFetchTask.getGroupTree();
}
}
\ No newline at end of file
...@@ -2,11 +2,11 @@ package com.schbrain.archetype.initializer.listener; ...@@ -2,11 +2,11 @@ package com.schbrain.archetype.initializer.listener;
import com.schbrain.archetype.initializer.maven.MavenUtils; import com.schbrain.archetype.initializer.maven.MavenUtils;
import com.schbrain.archetype.initializer.param.ArchetypeGenerateParam; import com.schbrain.archetype.initializer.param.ArchetypeGenerateParam;
import com.schbrain.common.util.EnvUtils;
import lombok.SneakyThrows; import lombok.SneakyThrows;
import org.springframework.boot.cloud.CloudPlatform;
import org.springframework.boot.context.event.ApplicationStartedEvent; import org.springframework.boot.context.event.ApplicationStartedEvent;
import org.springframework.context.ApplicationListener; 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.Executor;
import java.util.concurrent.Executors; import java.util.concurrent.Executors;
...@@ -15,6 +15,7 @@ import java.util.concurrent.Executors; ...@@ -15,6 +15,7 @@ import java.util.concurrent.Executors;
* @author liaozan * @author liaozan
* @since 2022/3/20 * @since 2022/3/20
*/ */
@Component
public class ProjectWarmUpListener implements ApplicationListener<ApplicationStartedEvent> { public class ProjectWarmUpListener implements ApplicationListener<ApplicationStartedEvent> {
private final Executor executor = Executors.newSingleThreadExecutor(); private final Executor executor = Executors.newSingleThreadExecutor();
...@@ -22,8 +23,9 @@ public class ProjectWarmUpListener implements ApplicationListener<ApplicationSta ...@@ -22,8 +23,9 @@ public class ProjectWarmUpListener implements ApplicationListener<ApplicationSta
@SneakyThrows @SneakyThrows
@Override @Override
public void onApplicationEvent(ApplicationStartedEvent event) { public void onApplicationEvent(ApplicationStartedEvent event) {
ConfigurableEnvironment environment = event.getApplicationContext().getEnvironment(); if (!EnvUtils.runningOnCloudPlatform(event.getApplicationContext().getEnvironment())) {
if (CloudPlatform.KUBERNETES.isActive(environment)) { return;
}
executor.execute(() -> { executor.execute(() -> {
ArchetypeGenerateParam mockParam = new ArchetypeGenerateParam(); ArchetypeGenerateParam mockParam = new ArchetypeGenerateParam();
mockParam.setGroupId("com.schbrain"); mockParam.setGroupId("com.schbrain");
...@@ -31,6 +33,5 @@ public class ProjectWarmUpListener implements ApplicationListener<ApplicationSta ...@@ -31,6 +33,5 @@ public class ProjectWarmUpListener implements ApplicationListener<ApplicationSta
MavenUtils.generate(mockParam); MavenUtils.generate(mockParam);
}); });
} }
}
} }
\ No newline at end of file
package com.schbrain.archetype.initializer.maven; package com.schbrain.archetype.initializer.maven;
import cn.hutool.core.io.FileUtil; import cn.hutool.core.io.FileUtil;
import cn.hutool.extra.spring.SpringUtil;
import com.schbrain.archetype.initializer.param.ArchetypeGenerateParam; import com.schbrain.archetype.initializer.param.ArchetypeGenerateParam;
import com.schbrain.common.exception.BaseException; import com.schbrain.common.exception.BaseException;
import com.schbrain.common.util.IdWorker; import com.schbrain.common.util.IdWorker;
...@@ -13,12 +14,19 @@ import org.apache.maven.settings.Settings; ...@@ -13,12 +14,19 @@ import org.apache.maven.settings.Settings;
import org.apache.maven.settings.io.DefaultSettingsWriter; import org.apache.maven.settings.io.DefaultSettingsWriter;
import org.eclipse.jgit.api.Git; import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.api.errors.GitAPIException; 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.File;
import java.io.IOException; import java.io.IOException;
import java.net.URISyntaxException;
import java.nio.file.Path; import java.nio.file.Path;
import java.nio.file.Paths; import java.nio.file.Paths;
import java.util.Collections; import java.util.Collections;
import java.util.List;
import static org.apache.maven.cli.MavenCli.MULTIMODULE_PROJECT_DIRECTORY; import static org.apache.maven.cli.MavenCli.MULTIMODULE_PROJECT_DIRECTORY;
...@@ -31,6 +39,8 @@ public class MavenUtils { ...@@ -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 File SETTINGS_FILE = new File(MavenCli.USER_MAVEN_CONFIGURATION_HOME, "settings.xml");
private static final List<String> ADDITIONAL_BRANCHES = List.of("release", "develop");
static { static {
System.getProperties().setProperty(MULTIMODULE_PROJECT_DIRECTORY, "$M2_HOME"); System.getProperties().setProperty(MULTIMODULE_PROJECT_DIRECTORY, "$M2_HOME");
getSettingsFile(); getSettingsFile();
...@@ -53,7 +63,8 @@ public class MavenUtils { ...@@ -53,7 +63,8 @@ public class MavenUtils {
mavenCli.doMain(args, null, System.out, System.err); mavenCli.doMain(args, null, System.out, System.err);
log.info("Generate archetype project at {}", outputDirectory); log.info("Generate archetype project at {}", outputDirectory);
if (param.isInitGitRepo()) { 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; return id;
} }
...@@ -63,15 +74,35 @@ public class MavenUtils { ...@@ -63,15 +74,35 @@ public class MavenUtils {
return new File(tmpDirPath, id); return new File(tmpDirPath, id);
} }
private static void initGitRepo(Path directory) { private static void initGitRepo(Path directory, Long repoGroupId, ArchetypeGenerateParam param) {
try { try {
Git git = Git.init().setInitialBranch("master").setDirectory(directory.toFile()).call(); Git git = Git.init().setInitialBranch("master").setDirectory(directory.toFile()).call();
git.add().addFilepattern(".").call(); git.add().addFilepattern(".").call();
git.commit().setAllowEmpty(true).setAuthor("initializer", "no-reply@schbrain.com").setMessage("Initial Commit").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(); git.close();
} catch (GitAPIException e) { } catch (GitAPIException | GitLabApiException | URISyntaxException e) {
log.warn("Git repo init failed", e); log.warn("Git repo init failed", e);
throw new BaseException("Git仓库初始化失败"); throw new BaseException("Git仓库初始化失败");
} }
......
...@@ -40,6 +40,10 @@ public class ArchetypeGenerateParam { ...@@ -40,6 +40,10 @@ public class ArchetypeGenerateParam {
* 是否初始化 git 仓库 * 是否初始化 git 仓库
*/ */
private boolean initGitRepo; private boolean initGitRepo;
/**
* 仓库 groupId
*/
private Long repoGroupId;
public String getSubModuleNamePrefix() { public String getSubModuleNamePrefix() {
if (!StringUtils.hasText(this.subModuleNamePrefix)) { if (!StringUtils.hasText(this.subModuleNamePrefix)) {
......
...@@ -43,13 +43,12 @@ public class ArchetypePreparer implements ApplicationRunner { ...@@ -43,13 +43,12 @@ public class ArchetypePreparer implements ApplicationRunner {
} }
private void checkoutArchetype(File archetypeTemplateDirectory) { private void checkoutArchetype(File archetypeTemplateDirectory) {
try { try (Git ignored = Git.cloneRepository()
Git.cloneRepository()
.setTagOption(TagOpt.FETCH_TAGS) .setTagOption(TagOpt.FETCH_TAGS)
.setNoCheckout(false) .setNoCheckout(false)
.setDirectory(archetypeTemplateDirectory) .setDirectory(archetypeTemplateDirectory)
.setURI(ARCHETYPE_REPO_URL) .setURI(ARCHETYPE_REPO_URL)
.call(); .call()) {
log.info("Success checkout archetype source from {}", ARCHETYPE_REPO_URL); log.info("Success checkout archetype source from {}", ARCHETYPE_REPO_URL);
} catch (GitAPIException e) { } catch (GitAPIException e) {
throw new BaseException("Failed to checkout archetype source from git repository", e); throw new BaseException("Failed to checkout archetype source from git repository", e);
......
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<Tree<Long>> groupTree = Collections.emptyList();
public List<Tree<Long>> getGroupTree() {
return groupTree;
}
@Scheduled(fixedRate = 1, timeUnit = TimeUnit.HOURS)
public void fetchGroups() {
try {
GroupApi groupApi = gitLabApi.getGroupApi();
List<Group> groups = groupApi.getGroups();
List<TreeNode<Long>> treeNodes = groups.stream()
.map(group -> {
TreeNode<Long> 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
...@@ -3,11 +3,13 @@ package com.schbrain.archetype.initializer.service; ...@@ -3,11 +3,13 @@ package com.schbrain.archetype.initializer.service;
import cn.hutool.cache.impl.TimedCache; import cn.hutool.cache.impl.TimedCache;
import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.ZipUtil; 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.maven.MavenUtils;
import com.schbrain.archetype.initializer.param.ArchetypeGenerateParam; import com.schbrain.archetype.initializer.param.ArchetypeGenerateParam;
import com.schbrain.archetype.initializer.response.PreviewFileTree; import com.schbrain.archetype.initializer.response.PreviewFileTree;
import com.schbrain.archetype.initializer.runner.ArchetypePreparer; import com.schbrain.archetype.initializer.runner.ArchetypePreparer;
import com.schbrain.common.util.ServletUtils; import com.schbrain.common.util.ServletUtils;
import org.gitlab4j.api.GitLabApi;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ContentDisposition; import org.springframework.http.ContentDisposition;
import org.springframework.http.HttpHeaders; import org.springframework.http.HttpHeaders;
...@@ -38,6 +40,10 @@ public class ArchetypeService { ...@@ -38,6 +40,10 @@ public class ArchetypeService {
@Autowired @Autowired
private ArchetypePreparer archetypePreparer; private ArchetypePreparer archetypePreparer;
@Autowired
private GitLabApi gitLabApi;
@Autowired
private GitProperties gitProperties;
public String generate(ArchetypeGenerateParam param) { public String generate(ArchetypeGenerateParam param) {
String generateId = MavenUtils.generate(param); String generateId = MavenUtils.generate(param);
......
{
"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
...@@ -4,3 +4,6 @@ spring: ...@@ -4,3 +4,6 @@ spring:
web: web:
resources: resources:
add-mappings: true add-mappings: true
gitlab:
server-url: http://gitlab.schbrain.com/gitlab
personal-access-token: AzRH1rZ2HysUkHeycsaU
\ No newline at end of file
...@@ -7,15 +7,15 @@ ...@@ -7,15 +7,15 @@
}, },
"dependencies": { "dependencies": {
"vue": "^3.2.33", "vue": "^3.2.33",
"axios": "^0.26.1", "axios": "^0.27.2",
"ant-design-vue": "^3.2.0", "ant-design-vue": "^3.2.2",
"highlight.js": "^11.5.1", "highlight.js": "^11.5.1",
"@highlightjs/vue-plugin": "^2.1.0" "@highlightjs/vue-plugin": "^2.1.0"
}, },
"devDependencies": { "devDependencies": {
"@vitejs/plugin-vue": "^2.3.1", "@vitejs/plugin-vue": "^2.3.1",
"typescript": "^4.6.3", "typescript": "^4.6.4",
"vite": "^2.9.5", "vite": "^2.9.7",
"vue-tsc": "^0.34.8" "vue-tsc": "^0.34.11"
} }
} }
\ No newline at end of file
<template> <template>
<!--suppress HtmlUnknownTag -->
<a-config-provider :locale="locale">
<Starter/> <Starter/>
</a-config-provider>
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import Starter from "./components/starter.vue"</script> import Starter from "./components/starter.vue"
\ No newline at end of file import zhCN from 'ant-design-vue/es/locale/zh_CN';
import {ref} from "vue";
const locale = ref(zhCN);
</script>
\ No newline at end of file
...@@ -15,8 +15,14 @@ ...@@ -15,8 +15,14 @@
<a-form-item has-feedback label="PackageName" name="packageName"> <a-form-item has-feedback label="PackageName" name="packageName">
<a-input v-model:value="formState.packageName" placeholder="默认为GroupId"/> <a-input v-model:value="formState.packageName" placeholder="默认为GroupId"/>
</a-form-item> </a-form-item>
<a-form-item has-feedback label="仓库群组" name="repoGroup" v-if="formState.initGitRepo">
<a-input v-model:value="formState.repoGroup" @click="gitlabGroupVisible=true"/>
</a-form-item>
<a-form-item has-feedback name="repoGroupId" v-show="false">
<a-input v-model:value="formState.repoGroupId"/>
</a-form-item>
<a-form-item has-feedback name="initGitRepo"> <a-form-item has-feedback name="initGitRepo">
<a-checkbox v-model:checked="formState.initGitRepo">初始化 Git 仓库</a-checkbox> <a-checkbox v-model:checked="formState.initGitRepo" @change="fetchGroupTreeList(formState.initGitRepo)">初始化 Git 仓库</a-checkbox>
</a-form-item> </a-form-item>
</a-form> </a-form>
<div class="button-group"> <div class="button-group">
...@@ -27,13 +33,17 @@ ...@@ -27,13 +33,17 @@
</a-spin> </a-spin>
<a-modal v-model:visible="structPreviewVisible" :footer="null" title="预览"> <a-modal v-model:visible="structPreviewVisible" :footer="null" title="预览">
<a-directory-tree :tree-data="treeData" @select="onSelect"/> <a-directory-tree :tree-data="fileTreeData" @select="onFileTreeNodeSelect"/>
</a-modal> </a-modal>
<a-modal v-model:visible="contentPreviewVisible" :footer="null" title="文件内容预览" width="1000px"> <a-modal v-model:visible="contentPreviewVisible" :footer="null" title="文件内容预览" width="1000px">
<!--suppress HtmlUnknownTag --> <!--suppress HtmlUnknownTag -->
<highlightjs :autodetect="false" :code="fileContent" :language="fileExtension"></highlightjs> <highlightjs :autodetect="false" :code="fileContent" :language="fileExtension"></highlightjs>
</a-modal> </a-modal>
<a-modal v-model:visible="gitlabGroupVisible" @close="onGroupModalClose" @ok="onGroupModalClose" @cancel="onGroupModalClose" title="Gitlab 群组" width="500px">
<a-directory-tree :tree-data="gitlabGroupTreeData" @select="onGroupTreeNodeSelect"/>
</a-modal>
</div> </div>
</template> </template>
...@@ -51,6 +61,8 @@ interface FormState { ...@@ -51,6 +61,8 @@ interface FormState {
version: string, version: string,
packageName: string, packageName: string,
initGitRepo: boolean initGitRepo: boolean
repoGroup: string
repoGroupId: number
} }
interface FileNode { interface FileNode {
...@@ -60,11 +72,20 @@ interface FileNode { ...@@ -60,11 +72,20 @@ interface FileNode {
isFile: boolean isFile: boolean
} }
interface GroupNode {
id: number,
name: string,
children: GroupNode[],
}
const fileNodeList = ref<FileNode[]>([]) const fileNodeList = ref<FileNode[]>([])
const treeData = ref<TreeProps['treeData']>([]) const groupNodeList = ref<GroupNode[]>([])
const fileTreeData = ref<TreeProps['treeData']>([])
const gitlabGroupTreeData = ref<TreeProps['treeData']>([])
const id = ref(-1) const id = ref(-1)
const structPreviewVisible = ref(false) const structPreviewVisible = ref(false)
const contentPreviewVisible = ref(false) const contentPreviewVisible = ref(false)
const gitlabGroupVisible = ref(false)
const fileContent = ref<string | null>() const fileContent = ref<string | null>()
const fileExtension = ref<string | null>() const fileExtension = ref<string | null>()
const loading = computed(() => isLoading.value) const loading = computed(() => isLoading.value)
...@@ -75,7 +96,9 @@ const formState = reactive<FormState>({ ...@@ -75,7 +96,9 @@ const formState = reactive<FormState>({
artifactId: '', artifactId: '',
version: '1.0.0-SNAPSHOT', version: '1.0.0-SNAPSHOT',
packageName: '', packageName: '',
initGitRepo: true initGitRepo: false,
repoGroup: '',
repoGroupId: -1
}) })
const formRules = { const formRules = {
...@@ -83,6 +106,17 @@ const formRules = { ...@@ -83,6 +106,17 @@ const formRules = {
artifactId: [{required: true, message: '请输入artifactId', trigger: 'change'}], 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 () => { const onGenerate = async () => {
let result = await downloadForm.value?.validate() let result = await downloadForm.value?.validate()
if (result) { if (result) {
...@@ -90,6 +124,13 @@ const onGenerate = async () => { ...@@ -90,6 +124,13 @@ const onGenerate = async () => {
result.packageName = result.groupId result.packageName = result.groupId
} }
if (result.initGitRepo) {
if (result.repoGroupId === -1) {
message.warn('Gitlab 群组不能为空!')
return
}
}
let data: BaseResponse = await request.post('/archetype/generate', result) let data: BaseResponse = await request.post('/archetype/generate', result)
if (data.code === 0) { if (data.code === 0) {
id.value = data.result id.value = data.result
...@@ -100,7 +141,7 @@ const onGenerate = async () => { ...@@ -100,7 +141,7 @@ const onGenerate = async () => {
const onPreview = async () => { const onPreview = async () => {
fileNodeList.value = await fetchFileList(id.value) fileNodeList.value = await fetchFileList(id.value)
treeData.value = createTreeData(fileNodeList.value) fileTreeData.value = createFileTreeData(fileNodeList.value)
structPreviewVisible.value = true structPreviewVisible.value = true
} }
...@@ -111,13 +152,26 @@ const onDownload = async (id: number) => { ...@@ -111,13 +152,26 @@ const onDownload = async (id: number) => {
downloadGeneratedProject(data, fileName) downloadGeneratedProject(data, fileName)
} }
const onSelect = async (selectedKeys: string[], event: { node: TreeDataNode }) => { const onFileTreeNodeSelect = async (selectedKeys: string[], event: { node: TreeDataNode }) => {
const {node} = event const {node} = event
fileContent.value = node.fileContent fileContent.value = node.fileContent
fileExtension.value = node.title.substring(node.title.lastIndexOf('.') + 1) fileExtension.value = node.title.substring(node.title.lastIndexOf('.') + 1)
contentPreviewVisible.value = true 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 downloadGeneratedProject = (data: BlobPart, fileName: string) => {
const blob = new Blob([data]) const blob = new Blob([data])
const link = document.createElement('a') const link = document.createElement('a')
...@@ -137,7 +191,14 @@ const fetchFileList = async (id: number) => { ...@@ -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) { if (!fileNodeList) {
return [] return []
} }
...@@ -145,13 +206,28 @@ const createTreeData = (fileNodeList: FileNode[]): any => { ...@@ -145,13 +206,28 @@ const createTreeData = (fileNodeList: FileNode[]): any => {
return { return {
key: Math.random(), key: Math.random(),
title: item.fileName, title: item.fileName,
children: createTreeData(item.children), children: createFileTreeData(item.children),
selectable: item.isFile, selectable: item.isFile,
isLeaf: item.isFile, isLeaf: item.isFile,
fileContent: item.fileContent 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
}
})
}
</script> </script>
<style scoped> <style scoped>
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment