rewerma 6 年之前
父節點
當前提交
4efc0f6078

+ 5 - 5
canal-admin/canal-admin-server/src/main/java/com/alibaba/otter/canal/admin/controller/CanalInstanceController.java

@@ -16,30 +16,30 @@ public class CanalInstanceController {
     @Autowired
     CanalInstanceService canalInstanceConfigService;
 
-    @GetMapping(value = "/canalInstances")
+    @GetMapping(value = "/instances")
     public BaseModel<List<CanalInstanceConfig>> nodeServers(CanalInstanceConfig canalInstanceConfig,
                                                             @PathVariable String env) {
         return BaseModel.getInstance(canalInstanceConfigService.findList(canalInstanceConfig));
     }
 
-    @PostMapping(value = "/canalInstance")
+    @PostMapping(value = "/iInstance")
     public BaseModel<String> save(@RequestBody CanalInstanceConfig canalInstanceConfig, @PathVariable String env) {
         canalInstanceConfigService.save(canalInstanceConfig);
         return BaseModel.getInstance("success");
     }
 
-    @GetMapping(value = "/canalInstance/{id}")
+    @GetMapping(value = "/instance/{id}")
     public BaseModel<CanalInstanceConfig> detail(@PathVariable Long id, @PathVariable String env) {
         return BaseModel.getInstance(canalInstanceConfigService.detail(id));
     }
 
-    @PutMapping(value = "/canalInstance")
+    @PutMapping(value = "/instance")
     public BaseModel<String> update(@RequestBody  CanalInstanceConfig canalInstanceConfig, @PathVariable String env) {
         canalInstanceConfigService.updateContent(canalInstanceConfig);
         return BaseModel.getInstance("success");
     }
 
-    @DeleteMapping(value = "/nodeServer/{id}")
+    @DeleteMapping(value = "/instance/{id}")
     public BaseModel<String> delete(@PathVariable Long id, @PathVariable String env) {
         canalInstanceConfigService.delete(id);
         return BaseModel.getInstance("success");

+ 1 - 1
canal-admin/canal-admin-server/src/main/java/com/alibaba/otter/canal/admin/jmx/JMXConnection.java

@@ -34,7 +34,7 @@ public class JMXConnection {
             CanalServerMXBean canalServerMXBean = jmxConnection.getCanalServerMXBean();
             return function.apply(canalServerMXBean);
         } catch (Exception e) {
-            logger.error(e.getMessage(), e);
+            logger.error(e.getMessage());
         } finally {
             jmxConnection.close();
         }

+ 9 - 19
canal-admin/canal-admin-server/src/main/java/com/alibaba/otter/canal/admin/model/CanalInstanceConfig.java

@@ -24,15 +24,13 @@ public class CanalInstanceConfig extends Model {
     }
 
     @Id
-    private Long       id;
-    private String     name;
-    private String     content;
-    private Date       modifiedTime;
+    private Long   id;
+    private String name;
+    private String content;
+    private Date   modifiedTime;
 
     @Transient
-    private NodeServer nodeServer;
-    @Transient
-    private Integer    status = 0;
+    private String nodeIp;
 
     public Long getId() {
         return id;
@@ -66,19 +64,11 @@ public class CanalInstanceConfig extends Model {
         this.modifiedTime = modifiedTime;
     }
 
-    public NodeServer getNodeServer() {
-        return nodeServer;
-    }
-
-    public void setNodeServer(NodeServer nodeServer) {
-        this.nodeServer = nodeServer;
-    }
-
-    public Integer getStatus() {
-        return status;
+    public String getNodeIp() {
+        return nodeIp;
     }
 
-    public void setStatus(Integer status) {
-        this.status = status;
+    public void setNodeIp(String nodeIp) {
+        this.nodeIp = nodeIp;
     }
 }

+ 4 - 4
canal-admin/canal-admin-server/src/main/java/com/alibaba/otter/canal/admin/service/impl/CanalInstanceServiceImpl.java

@@ -2,16 +2,16 @@ package com.alibaba.otter.canal.admin.service.impl;
 
 import java.util.List;
 
-import com.alibaba.otter.canal.admin.service.CanalInstanceService;
 import org.apache.commons.lang.StringUtils;
+import org.springframework.stereotype.Service;
 
 import com.alibaba.otter.canal.admin.jmx.CanalServerMXBean;
 import com.alibaba.otter.canal.admin.jmx.JMXConnection;
 import com.alibaba.otter.canal.admin.model.CanalInstanceConfig;
 import com.alibaba.otter.canal.admin.model.NodeServer;
+import com.alibaba.otter.canal.admin.service.CanalInstanceService;
 
 import io.ebean.Query;
-import org.springframework.stereotype.Service;
 
 @Service
 public class CanalInstanceServiceImpl implements CanalInstanceService {
@@ -25,6 +25,7 @@ public class CanalInstanceServiceImpl implements CanalInstanceService {
                 query.where().like("name", "%" + canalInstanceConfig.getName() + "%");
             }
         }
+        query.order().asc("id");
         List<CanalInstanceConfig> canalInstanceConfigs = query.findList();
 
         // check all canal instances running status
@@ -39,8 +40,7 @@ public class CanalInstanceServiceImpl implements CanalInstanceService {
             for (String instance : instances) {
                 for (CanalInstanceConfig cig : canalInstanceConfigs) {
                     if (instance.equals(cig.getName())) {
-                        cig.setNodeServer(nodeServer);
-                        cig.setStatus(1);
+                        cig.setNodeIp(nodeServer.getIp());
                         break;
                     }
                 }

+ 24 - 0
canal-admin/canal-admin-ui/src/api/canalInstance.js

@@ -0,0 +1,24 @@
+import request from '@/utils/request'
+
+export function getCanalInstances(params) {
+  return request({
+    url: '/canal/instances',
+    method: 'get',
+    params: params
+  })
+}
+
+export function canalInstanceDetail(id) {
+  return request({
+    url: '/canal/instance/' + id,
+    method: 'get'
+  })
+}
+
+export function updateCanalInstance(data) {
+  return request({
+    url: '/canal/instance',
+    method: 'put',
+    data
+  })
+}

+ 2 - 2
canal-admin/canal-admin-ui/src/router/index.js

@@ -75,9 +75,9 @@ export const constantRoutes = [
         meta: { title: 'Canal主配置', icon: 'form' }
       },
       {
-        path: 'tree',
+        path: 'canalInstance',
         name: '实例管理',
-        component: () => import('@/views/tree/index'),
+        component: () => import('@/views/canalServer/canalInstance'),
         meta: { title: '实例管理', icon: 'nested' }
       }
     ]

+ 78 - 0
canal-admin/canal-admin-ui/src/views/canalServer/canalInstance.vue

@@ -0,0 +1,78 @@
+<template>
+  <div class="app-container">
+    <el-table
+      v-loading="listLoading"
+      :data="list"
+      element-loading-text="Loading"
+      border
+      fit
+      highlight-current-row
+    >
+      <el-table-column label="实例名称" min-width="200" align="center">
+        <template slot-scope="scope">
+          {{ scope.row.name }}
+        </template>
+      </el-table-column>
+      <el-table-column label="运行节点" min-width="200" align="center">
+        <template slot-scope="scope">
+          <span>{{ scope.row.nodeIp }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="修改时间" min-width="200" align="center">
+        <template slot-scope="scope">
+          {{ scope.row.modifiedTime }}
+        </template>
+      </el-table-column>
+      <el-table-column align="center" prop="created_at" label="操作" min-width="150">
+        <template slot-scope="scope">
+          <el-dropdown trigger="click">
+            <el-button type="primary" size="mini">
+              操作<i class="el-icon-arrow-down el-icon--right" />
+            </el-button>
+            <el-dropdown-menu slot="dropdown">
+              <el-dropdown-item @click.native="handleUpdate(scope.row)">修改节点</el-dropdown-item>
+              <el-dropdown-item @click.native="handleDelete(scope.row)">删除节点</el-dropdown-item>
+              <el-dropdown-item @click.native="handleStart(scope.row)">启动服务</el-dropdown-item>
+              <el-dropdown-item @click.native="handleStop(scope.row)">停止服务</el-dropdown-item>
+            </el-dropdown-menu>
+          </el-dropdown>
+        </template>
+      </el-table-column>
+    </el-table>
+  </div>
+</template>
+
+<script>
+import { getCanalInstances } from '@/api/canalInstance'
+
+export default {
+  filters: {
+    statusFilter(status) {
+      const statusMap = {
+        published: 'success',
+        draft: 'gray',
+        deleted: 'danger'
+      }
+      return statusMap[status]
+    }
+  },
+  data() {
+    return {
+      list: null,
+      listLoading: true
+    }
+  },
+  created() {
+    this.fetchData()
+  },
+  methods: {
+    fetchData() {
+      this.listLoading = true
+      getCanalInstances().then(res => {
+        this.list = res.data
+        this.listLoading = false
+      })
+    }
+  }
+}
+</script>

+ 92 - 0
canal-admin/canal-admin-ui/src/views/canalServer/canalInstanceUpdate.vue

@@ -0,0 +1,92 @@
+<template>
+  <div>
+    <el-form ref="form" :model="form">
+      <div style="padding-left: 10px;padding-top: 20px;">
+        <el-form-item>
+          {{ form.name }}&nbsp;&nbsp;&nbsp;&nbsp;
+          <el-button type="primary" @click="onSubmit">修改</el-button>
+          <el-button @click="onCancel">重置</el-button>
+        </el-form-item>
+      </div>
+      <editor v-model="form.content" lang="properties" theme="chrome" width="100%" :height="800" @init="editorInit" />
+    </el-form>
+  </div>
+</template>
+
+<script>
+import { getCanalConfig, updateCanalConfig } from '@/api/canalConfig'
+
+export default {
+  components: {
+    editor: require('vue2-ace-editor')
+  },
+  data() {
+    return {
+      form: {
+        id: null,
+        name: '',
+        content: ''
+      }
+    }
+  },
+  created() {
+    this.loadCanalConfig()
+  },
+  methods: {
+    editorInit() {
+      require('brace/ext/language_tools')
+      require('brace/mode/html')
+      require('brace/mode/yaml')
+      require('brace/mode/properties')
+      require('brace/mode/javascript')
+      require('brace/mode/less')
+      require('brace/theme/chrome')
+      require('brace/snippets/javascript')
+    },
+    loadCanalConfig() {
+      getCanalConfig().then(response => {
+        const data = response.data
+        this.form.id = data.id
+        this.form.name = data.name
+        this.form.content = data.content
+      })
+    },
+    onSubmit() {
+      this.$confirm(
+        '修改Canal主配置可能会导致Server重启,是否继续?',
+        '确定修改',
+        {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          type: 'warning'
+        }
+      ).then(() => {
+        updateCanalConfig(this.form).then(response => {
+          if (response.data === 'success') {
+            this.$message({
+              message: '修改成功',
+              type: 'success'
+            })
+            this.loadCanalConfig()
+          } else {
+            this.$message({
+              message: '修改失败',
+              type: 'error'
+            })
+          }
+        })
+      })
+    },
+    onCancel() {
+      this.loadCanalConfig()
+    }
+  }
+}
+</script>
+
+<style scoped>
+.line{
+  text-align: center;
+}
+</style>
+