Prechádzať zdrojové kódy

更新 DockerRegistry 配置页面和接口

reghao 1 rok pred
rodič
commit
966c8b263e

+ 1 - 1
common/src/main/java/cn/reghao/bnt/common/docker/po/DockerRegistry.java → common/src/main/java/cn/reghao/bnt/common/docker/po/DockerAuth.java

@@ -9,7 +9,7 @@ import lombok.Getter;
  */
 @AllArgsConstructor
 @Getter
-public class DockerRegistry {
+public class DockerAuth {
     private String registryUrl;
     private String username;
     private String password;

+ 41 - 0
web/src/main/java/cn/reghao/bnt/web/devops/app/controller/DockerRegistryController.java

@@ -0,0 +1,41 @@
+package cn.reghao.bnt.web.devops.app.controller;
+
+import cn.reghao.bnt.common.docker.po.DockerAuth;
+import cn.reghao.bnt.web.devops.app.service.DockerRegistryService;
+import cn.reghao.jutil.jdk.result.WebResult;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.http.MediaType;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * @author reghao
+ * @date 2024-07-26 19:15:15
+ */
+@Slf4j
+@Api(tags = "DockerRegistry 配置接口")
+@RestController
+@RequestMapping("/api/app/config/docker")
+public class DockerRegistryController {
+    private final DockerRegistryService dockerRegistryService;
+
+    public DockerRegistryController(DockerRegistryService dockerRegistryService) {
+        this.dockerRegistryService = dockerRegistryService;
+    }
+
+    @ApiOperation(value = "添加/修改 DockerRegistry 配置")
+    @PostMapping(value = "/registry", produces = MediaType.APPLICATION_JSON_VALUE)
+    public String addOrModifyRepoConfig(@Validated DockerAuth dockerAuth) {
+        dockerRegistryService.addOrModify(dockerAuth);
+        return WebResult.success();
+    }
+
+    @ApiOperation(value = "删除 DockerRegistry 配置")
+    @DeleteMapping(value = "/registry/{id}", produces = MediaType.APPLICATION_JSON_VALUE)
+    public String deleteRepoConfig(@PathVariable("id") Integer id) {
+        dockerRegistryService.delete(id);
+        return WebResult.success();
+    }
+}

+ 0 - 83
web/src/main/java/cn/reghao/bnt/web/devops/app/controller/page/DockerAuthPageController.java

@@ -1,83 +0,0 @@
-package cn.reghao.bnt.web.devops.app.controller.page;
-
-import cn.reghao.bnt.web.devops.app.db.repository.DockerAuthRepository;
-import cn.reghao.bnt.web.devops.app.model.po.DockerAuth;
-import cn.reghao.bnt.web.devops.app.model.vo.KeyValue;
-import cn.reghao.bnt.web.devops.build.model.constant.RepoAuthType;
-import cn.reghao.bnt.web.devops.build.model.constant.RepoType;
-import cn.reghao.bnt.web.util.db.PageSort;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import org.springframework.data.domain.Page;
-import org.springframework.data.domain.PageRequest;
-import org.springframework.stereotype.Controller;
-import org.springframework.ui.Model;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestMapping;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * @author reghao
- * @date 2024-07-26 17:36:37
- */
-@Api(tags = "Docker 认证配置页面")
-@Controller
-@RequestMapping("/app/config/docker")
-public class DockerAuthPageController {
-    private final DockerAuthRepository dockerAuthRepository;
-
-    public DockerAuthPageController(DockerAuthRepository dockerAuthRepository) {
-        this.dockerAuthRepository = dockerAuthRepository;
-    }
-
-    @ApiOperation(value = "仓库认证列表页面")
-    @GetMapping("/auth")
-    public String repoAuthPage(Model model) {
-        PageRequest pageRequest = PageSort.pageRequest();
-        Page<DockerAuth> page = dockerAuthRepository.findAll(pageRequest);
-
-        model.addAttribute("page", page);
-        model.addAttribute("list", page.getContent());
-        return "/devops/app/config/docker/index";
-    }
-
-    @ApiOperation(value = "仓库认证添加页面")
-    @GetMapping("/auth/add")
-    public String addRepoAuthPage(Model model) {
-        setRepoAuthModel(model);
-        return "/devops/app/config/docker/add";
-    }
-
-    @ApiOperation(value = "仓库认证编辑页面")
-    @GetMapping("/auth/edit/{id}")
-    public String editRepoAuthPage(@PathVariable("id") DockerAuth repoAuth, Model model) {
-        repoAuth.setNull();
-        model.addAttribute("repoAuth", repoAuth);
-        return "/devops/app/config/docker/edit";
-    }
-
-    private void setRepoAuthModel(Model model) {
-        List<KeyValue> repos = new ArrayList<>();
-        for (RepoType repoType : RepoType.values()) {
-            repos.add(new KeyValue(repoType.name(), repoType.name()));
-        }
-
-        List<KeyValue> auths = new ArrayList<>();
-        for (RepoAuthType authType : RepoAuthType.values()) {
-            auths.add(new KeyValue(authType.name(), authType.name()));
-        }
-
-        model.addAttribute("repos", repos);
-        model.addAttribute("auths", auths);
-    }
-
-    @GetMapping("/auth/detail/{id}")
-    public String repoAuthDetailPage(@PathVariable("id") DockerAuth repoAuth, Model model) {
-        repoAuth.setPassword("******");
-        model.addAttribute("repoAuth", repoAuth);
-        return "/devops/app/config/docker/detail";
-    }
-}

+ 67 - 0
web/src/main/java/cn/reghao/bnt/web/devops/app/controller/page/DockerRegistryPageController.java

@@ -0,0 +1,67 @@
+package cn.reghao.bnt.web.devops.app.controller.page;
+
+import cn.reghao.bnt.web.devops.app.db.repository.DockerRegistryRepository;
+import cn.reghao.bnt.web.devops.app.model.po.DockerRegistry;
+import cn.reghao.bnt.web.devops.app.model.vo.KeyValue;
+import cn.reghao.bnt.web.devops.build.model.constant.RepoAuthType;
+import cn.reghao.bnt.web.devops.build.model.constant.RepoType;
+import cn.reghao.bnt.web.util.db.PageSort;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author reghao
+ * @date 2024-07-26 17:36:37
+ */
+@Api(tags = "Docker 认证配置页面")
+@Controller
+@RequestMapping("/app/config/docker")
+public class DockerRegistryPageController {
+    private final DockerRegistryRepository dockerAuthRepository;
+
+    public DockerRegistryPageController(DockerRegistryRepository dockerAuthRepository) {
+        this.dockerAuthRepository = dockerAuthRepository;
+    }
+
+    @ApiOperation(value = "DockerRegistry 列表页面")
+    @GetMapping("/registry")
+    public String repoAuthPage(Model model) {
+        PageRequest pageRequest = PageSort.pageRequest();
+        Page<DockerRegistry> page = dockerAuthRepository.findAll(pageRequest);
+
+        model.addAttribute("page", page);
+        model.addAttribute("list", page.getContent());
+        return "/devops/app/config/docker/index";
+    }
+
+    @ApiOperation(value = "DockerRegistry 添加页面")
+    @GetMapping("/registry/add")
+    public String addRepoAuthPage(Model model) {
+        return "/devops/app/config/docker/add";
+    }
+
+    @ApiOperation(value = "DockerRegistry 编辑页面")
+    @GetMapping("/registry/edit/{id}")
+    public String editRepoAuthPage(@PathVariable("id") DockerRegistry dockerRegistry, Model model) {
+        dockerRegistry.setNull();
+        model.addAttribute("dockerRegistry", dockerRegistry);
+        return "/devops/app/config/docker/edit";
+    }
+
+    @GetMapping("/registry/detail/{id}")
+    public String repoAuthDetailPage(@PathVariable("id") DockerRegistry dockerRegistry, Model model) {
+        dockerRegistry.setPassword("******");
+        model.addAttribute("dockerRegistry", dockerRegistry);
+        return "/devops/app/config/docker/detail";
+    }
+}

+ 0 - 12
web/src/main/java/cn/reghao/bnt/web/devops/app/db/repository/DockerAuthRepository.java

@@ -1,12 +0,0 @@
-package cn.reghao.bnt.web.devops.app.db.repository;
-
-import cn.reghao.bnt.web.devops.app.model.po.DockerAuth;
-import org.springframework.data.jpa.repository.JpaRepository;
-
-/**
- * @author reghao
- * @date 2024-07-26 17:26:16
- */
-public interface DockerAuthRepository extends JpaRepository<DockerAuth, Integer> {
-    DockerAuth findByRegistryUrl(String registryUrl);
-}

+ 12 - 0
web/src/main/java/cn/reghao/bnt/web/devops/app/db/repository/DockerRegistryRepository.java

@@ -0,0 +1,12 @@
+package cn.reghao.bnt.web.devops.app.db.repository;
+
+import cn.reghao.bnt.web.devops.app.model.po.DockerRegistry;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+/**
+ * @author reghao
+ * @date 2024-07-26 17:26:16
+ */
+public interface DockerRegistryRepository extends JpaRepository<DockerRegistry, Integer> {
+    DockerRegistry findByRegistryUrl(String registryUrl);
+}

+ 9 - 2
web/src/main/java/cn/reghao/bnt/web/devops/app/model/po/DockerAuth.java → web/src/main/java/cn/reghao/bnt/web/devops/app/model/po/DockerRegistry.java

@@ -1,5 +1,6 @@
 package cn.reghao.bnt.web.devops.app.model.po;
 
+import cn.reghao.bnt.common.docker.po.DockerAuth;
 import cn.reghao.bnt.web.util.db.BaseEntity;
 import lombok.Getter;
 import lombok.NoArgsConstructor;
@@ -18,11 +19,17 @@ import javax.validation.constraints.NotBlank;
 @Getter
 @Setter
 @Entity
-@Table(name = "devops_docker_auth")
-public class DockerAuth extends BaseEntity {
+@Table(name = "devops_docker_registry")
+public class DockerRegistry extends BaseEntity {
     @Column(nullable = false, unique = true)
     @NotBlank(message = "docker registry 不能为空字符串")
     private String registryUrl;
     private String username;
     private String password;
+
+    public DockerRegistry(DockerAuth dockerAuth) {
+        this.registryUrl = dockerAuth.getRegistryUrl();
+        this.username = dockerAuth.getUsername();
+        this.password = dockerAuth.getPassword();
+    }
 }

+ 38 - 0
web/src/main/java/cn/reghao/bnt/web/devops/app/service/DockerRegistryService.java

@@ -0,0 +1,38 @@
+package cn.reghao.bnt.web.devops.app.service;
+
+import cn.reghao.bnt.common.docker.po.DockerAuth;
+import cn.reghao.bnt.web.devops.app.db.repository.DockerRegistryRepository;
+import cn.reghao.bnt.web.devops.app.model.po.DockerRegistry;
+import org.springframework.stereotype.Service;
+
+/**
+ * @author reghao
+ * @date 2024-07-26 19:16:57
+ */
+@Service
+public class DockerRegistryService {
+    private final DockerRegistryRepository dockerAuthRepository;
+
+    public DockerRegistryService(DockerRegistryRepository dockerAuthRepository) {
+        this.dockerAuthRepository = dockerAuthRepository;
+    }
+
+    public void addOrModify(DockerAuth dockerAuth) {
+        String registryUrl = dockerAuth.getRegistryUrl();
+        DockerRegistry dockerRegistry = dockerAuthRepository.findByRegistryUrl(registryUrl);
+        if (dockerRegistry == null) {
+            dockerRegistry = new DockerRegistry(dockerAuth);
+        } else {
+            dockerRegistry.setUsername(dockerAuth.getUsername());
+            dockerRegistry.setPassword(dockerAuth.getPassword());
+        }
+
+        dockerAuthRepository.save(dockerRegistry);
+    }
+
+    public void delete(Integer id) {
+        dockerAuthRepository.deleteById(id);
+    }
+
+
+}

+ 3 - 49
web/src/main/resources/templates/devops/app/config/docker/add.html

@@ -5,27 +5,11 @@
 
 <body>
 <div class="layui-form timo-compile">
-    <form th:action="@{/api/app/config/build/repoauth}">
+    <form th:action="@{/api/app/config/docker/registry}">
         <div class="layui-form-item">
-            <label class="layui-form-label required">仓库类型<i id="repo_type_tips" class="fa fa-question-circle"></i></label>
+            <label class="layui-form-label required">Registry Url</label>
             <div class="layui-input-inline">
-                <select name="type">
-                    <option th:each="item : ${repos}" th:value="${item.key}">[[${item.value}]]</option>
-                </select>
-            </div>
-        </div>
-        <div class="layui-form-item">
-            <label class="layui-form-label required">认证名字</label>
-            <div class="layui-input-inline">
-                <input class="layui-input" type="text" name="name" placeholder="请输入认证名字" required>
-            </div>
-        </div>
-        <div class="layui-form-item">
-            <label class="layui-form-label required">认证类型<i id="repo_auth_type_tips" class="fa fa-question-circle"></i></label>
-            <div class="layui-input-inline">
-                <select name="authType">
-                    <option th:each="item : ${auths}" th:value="${item.key}">[[${item.value}]]</option>
-                </select>
+                <input class="layui-input" type="text" name="registryUrl" placeholder="请输入 Registry Url" required>
             </div>
         </div>
         <div class="layui-form-item">
@@ -40,12 +24,6 @@
                 <input class="layui-input" type="text" name="password" placeholder="请输入密码">
             </div>
         </div>
-        <div class="layui-form-item">
-            <label class="layui-form-label">RSA 私钥</label>
-            <div class="layui-input-inline">
-                <textarea class="layui-textarea" name="rsaPrikey" placeholder="请输入 RSA 私钥"></textarea>
-            </div>
-        </div>
         <div class="layui-form-item timo-finally">
             <button class="layui-btn ajax-submit"><i class="fa fa-check-circle"></i> 保存</button>
             <button class="layui-btn btn-secondary close-popup"><i class="fa fa-times-circle"></i> 关闭</button>
@@ -54,29 +32,5 @@
 </div>
 
 <script th:replace="/common/template :: script"></script>
-<script type="text/javascript" th:src="@{/js/plugins/jquery-2.2.4.min.js}"></script>
-<script type="text/javascript" th:inline="javascript">
-    $(function () {
-        $("#repo_type_tips").hover(function () {
-            var tips = layer.tips('目前仅支持 git 仓库<br />', '#repo_type_tips',{
-                tips: [1, '#555555']
-            });
-            sleep(1000);
-            layer.close(tips);
-        })
-
-        $("#repo_auth_type_tips").hover(function () {
-            var tips = layer.tips(
-                '仓库不需要认证则选择 none 类型<br/>' +
-                'http 认证类型必须填写用户名和密码<br/>' +
-                'ssh 认证必须填写 RSA 私钥<br/>',
-                '#repo_auth_type_tips',{
-                tips: [1, '#555555']
-            });
-            sleep(1000);
-            layer.close(tips);
-        })
-    })
-</script>
 </body>
 </html>

+ 7 - 15
web/src/main/resources/templates/devops/app/config/docker/detail.html

@@ -6,25 +6,17 @@
         <table class="layui-table timo-detail-table">
             <tbody>
             <tr>
-                <th>仓库类型</th>
-                <td th:text="${repoAuth.type}"></td>
-                <th>认证名字</th>
-                <td th:text="${repoAuth.name}"></td>
+                <span>
+                    <th>RegistryUrl</th>
+                    <td th:text="${dockerRegistry.registryUrl}"></td>
+                </span>
             </tr>
             <tr>
-                <th>认证方式</th>
-                <td th:text="${repoAuth.authType}"></td>
-                <span th:if="${repoAuth.authType} == 'ssh'">
-                    <th>RSA 私钥</th>
-                    <td>
-                        <textarea class="layui-textarea" readonly="readonly" th:text="${repoAuth.rsaPrikey}"></textarea>
-                    </td>
-                </span>
-                <span th:if="${repoAuth.authType} == 'http'">
+                <span>
                     <th>用户名</th>
-                    <td th:text="${repoAuth.username}"></td>
+                    <td th:text="${dockerRegistry.username}"></td>
                     <th>密码</th>
-                    <td th:text="${repoAuth.password}"></td>
+                    <td th:text="${dockerRegistry.password}"></td>
                 </span>
             </tr>
             </tbody>

+ 6 - 24
web/src/main/resources/templates/devops/app/config/docker/edit.html

@@ -5,45 +5,27 @@
 
 <body>
 <div class="layui-form timo-compile">
-    <form th:action="@{/api/app/config/build/repoauth}">
+    <form th:action="@{/api/app/config/docker/registry}">
         <div class="layui-form-item">
-            <label class="layui-form-label required">仓库类型</label>
+            <label class="layui-form-label required">RegistryUrl</label>
             <div class="layui-input-inline">
-                <input class="layui-input" type="text" name="type" th:value="${repoAuth.type}" readonly>
+                <input class="layui-input" type="text" name="registryUrl" th:value="${dockerRegistry.registryUrl}" readonly>
             </div>
         </div>
-        <div class="layui-form-item">
-            <label class="layui-form-label required">认证名字</label>
-            <div class="layui-input-inline">
-                <input class="layui-input" type="text" name="name" th:value="${repoAuth.name}" readonly>
-            </div>
-        </div>
-        <div class="layui-form-item">
-            <label class="layui-form-label required">认证类型</label>
-            <div class="layui-input-inline">
-                <input class="layui-input" type="text" name="authType" th:value="${repoAuth.authType}" readonly>
-            </div>
-        </div>
-        <div th:if="${repoAuth.getAuthType()} == 'http'">
+        <div>
             <div class="layui-form-item">
                 <label class="layui-form-label required">用户名</label>
                 <div class="layui-input-inline">
-                    <input class="layui-input" type="text" name="username" placeholder="请输入用户名" required>
+                    <input class="layui-input" type="text" name="username" th:value="${dockerRegistry.username}" required>
                 </div>
             </div>
             <div class="layui-form-item">
                 <label class="layui-form-label required">密码</label>
                 <div class="layui-input-inline">
-                    <input class="layui-input" type="text" name="password" placeholder="请输入密码" required>
+                    <input class="layui-input" type="text" name="password" th:value="${dockerRegistry.password}" required>
                 </div>
             </div>
         </div>
-        <div class="layui-form-item" th:if="${repoAuth.getAuthType()} == 'ssh'">
-            <label class="layui-form-label required">RSA 私钥</label>
-            <div class="layui-input-inline">
-                <textarea class="layui-textarea" name="rsaPrikey" placeholder="请输入 RSA 私钥"></textarea>
-            </div>
-        </div>
         <div class="layui-form-item timo-finally">
             <button class="layui-btn ajax-submit"><i class="fa fa-check-circle"></i> 更新</button>
             <button class="layui-btn btn-secondary close-popup"><i class="fa fa-times-circle"></i> 关闭</button>

+ 8 - 12
web/src/main/resources/templates/devops/app/config/docker/index.html

@@ -5,14 +5,14 @@
 <body class="timo-layout-page">
 <div class="layui-card">
     <div class="layui-card-header timo-card-header">
-        <span><i class="fa fa-bars"></i> 仓库认证</span>
+        <span><i class="fa fa-bars"></i> Registry 认证</span>
         <i class="layui-icon layui-icon-refresh refresh-btn"></i>
     </div>
     <div class="layui-card-body">
         <div class="layui-row timo-card-screen put-row">
             <div class="pull-right screen-btn-group">
                 <div class="btn-group-right">
-                    <button class="layui-btn open-popup" data-title="添加仓库认证" th:attr="data-url=@{/app/config/build/repoauth/add}"
+                    <button class="layui-btn open-popup" data-title="添加 Docker Registry" th:attr="data-url=@{/app/config/docker/registry/add}"
                             data-size="640,480">
                         <i class="fa fa-plus"></i> 添加
                     </button>
@@ -23,24 +23,20 @@
             <table class="layui-table timo-table">
                 <thead>
                 <tr>
-                    <th class="sortable" data-field="type">仓库类型</th>
-                    <th class="sortable" data-field="name">认证名字</th>
-                    <th class="sortable" data-field="authType">认证类型</th>
+                    <th class="sortable" data-field="type">Registry Url</th>
                     <th>操作</th>
                 </tr>
                 </thead>
                 <tbody>
                 <tr th:each="item:${list}">
-                    <td th:text="${item.type}">仓库类型</td>
-                    <td th:text="${item.name}">认证名字</td>
-                    <td th:text="${item.authType}">认证类型</td>
+                    <td th:text="${item.registryUrl}">仓库类型</td>
                     <td>
-                        <a class="open-popup" data-title="详细" th:attr="data-url=@{'/app/config/build/repoauth/detail/'+${item.id}}"
+                        <a class="open-popup" data-title="详细" th:attr="data-url=@{'/app/config/docker/registry/detail/'+${item.id}}"
                            data-size="640,480" href="#">详细</a>
-                        <a class="open-popup" data-title="编辑" th:attr="data-url=@{'/app/config/build/repoauth/edit/'+${item.id}}"
+                        <a class="open-popup" data-title="编辑" th:attr="data-url=@{'/app/config/docker/registry/edit/'+${item.id}}"
                            data-size="640,480" href="#">编辑</a>
-                        <a class="ajax-delete" th:attr="data-msg='确定要删除 '+ ${item.name} + '?'"
-                           th:href="@{'/api/app/config/build/repoauth/' + ${item.id}}">删除</a>
+                        <a class="ajax-delete" th:attr="data-msg='确定要删除 '+ ${item.registryUrl} + '?'"
+                           th:href="@{'/api/app/config/docker/registry/' + ${item.id}}">删除</a>
                     </td>
                 </tr>
                 </tbody>