cauto 2 years ago
parent
commit
3e4ce94531
10 changed files with 302 additions and 152 deletions
  1. 2 2
      package.json
  2. 8 40
      src/App.vue
  3. 4 10
      src/apis/node.ts
  4. 6 0
      src/assets/css/all.css
  5. 3 2
      src/components/submenu.vue
  6. 9 0
      src/model/node.ts
  7. 5 4
      src/request/index.ts
  8. 8 10
      src/style.css
  9. 254 83
      src/view/node/index.vue
  10. 3 1
      vite.config.ts

+ 2 - 2
package.json

@@ -12,12 +12,12 @@
     "@ant-design/icons-vue": "^6.1.0",
     "ant-design-vue": "^3.2.13",
     "axios": "^1.1.3",
-    "less": "^4.1.3",
-    "less-loader": "^11.1.0",
     "vue": "^3.2.41",
     "vue-router": "4"
   },
   "devDependencies": {
+    "less": "^4.1.3",
+    "less-loader": "^11.1.0",
     "@types/node": "^18.11.9",
     "@vitejs/plugin-vue": "^3.2.0",
     "typescript": "^4.6.4",

+ 8 - 40
src/App.vue

@@ -1,31 +1,10 @@
 <template>
   <a-layout>
-<!--    <a-layout-sider v-model:collapsed="collapsed" :trigger="null" collapsible>-->
-<!--      <div class="logo" />-->
-<!--      <a-menu theme="dark" mode="inline" v-model:selectedKeys="selectedKeys">-->
-<!--        <router-link to="/">-->
-<!--          <a-menu-item key="1">-->
-<!--            <user-outlined />-->
-<!--            <span>-->
-<!--              首页-->
-<!--            </span>-->
-<!--          </a-menu-item>-->
-<!--        </router-link>-->
-<!--        <router-link to="/node">-->
-<!--          <a-menu-item key="2">-->
-<!--            <user-outlined />-->
-<!--            <span>-->
-<!--              节点-->
-<!--            </span>-->
-<!--          </a-menu-item>-->
-<!--        </router-link>-->
-<!--      </a-menu>-->
-<!--    </a-layout-sider>-->
     <a-layout-sider v-model:collapsed="collapsed" :trigger="null" collapsible>
       <Sider />
     </a-layout-sider>
     <a-layout>
-      <a-layout-header style="background: #fff; padding: 0">
+      <a-layout-header style="background: #fff; padding: 10px">
         <menu-unfold-outlined
             v-if="collapsed"
             class="trigger"
@@ -71,26 +50,15 @@ export default defineComponent({
   },
 });
 </script>
-<style scoped>
-#components-layout-demo-custom-trigger .trigger {
-  font-size: 18px;
-  line-height: 64px;
-  padding: 0 24px;
-  cursor: pointer;
-  transition: color 0.3s;
-}
+<style lang="less" scoped>
 
-#components-layout-demo-custom-trigger .trigger:hover {
-  color: #1890ff;
-}
 
-#components-layout-demo-custom-trigger .logo {
-  height: 32px;
-  background: rgba(255, 255, 255, 0.3);
-  margin: 16px;
-}
 
-.site-layout .site-layout-background {
-  background: #fff;
+.ant-layout {
+  display: flex;
+  width: 100%;
+  min-height: 100%;
 }
+
+
 </style>

+ 4 - 10
src/apis/node.ts

@@ -1,6 +1,6 @@
 
 import httprequest from "/@/request/index";
-import {INodeList, NodeinfoParam} from "/@/model/node"
+import {INodeList, NodeAddParam, NodeinfoParam} from "/@/model/node"
 
 
 // 用户登录
@@ -10,12 +10,6 @@ export const nodeReqUse = (params: NodeinfoParam) => {
 }
 
 
-// //获取全部节点
-// export function apiGetNode(patam: NodeinfoParam){
-//     return httRequse({
-//         url : 'api/api/v1/node/all',
-//         method : 'get',
-//         data : patam
-//     })
-// }
-
+export const nodeAddReqUse = (params : any) => {
+    return httprequest.post<any>("api/api/v1/node/add",params)
+}

+ 6 - 0
src/assets/css/all.css

@@ -0,0 +1,6 @@
+#root,body,html {
+    height: 100vh;
+    width: 100%;
+    margin: 0;
+    padding: 0;
+}

+ 3 - 2
src/components/submenu.vue

@@ -20,14 +20,15 @@
 <script lang="ts">
 // import { ComponentInternalInstance, getCurrentInstance } from 'vue';
 // const { proxy } = getCurrentInstance() as ComponentInternalInstance
-export default {
+import {defineComponent} from "vue";
+export default defineComponent({
   props: ["menuInfo"],
   setup(){
     return {
       
     }
   }
-};
+})
 </script>
 
 <style scoped>

+ 9 - 0
src/model/node.ts

@@ -3,6 +3,15 @@ export interface NodeinfoParam {
 
 }
 
+export interface NodeAddParam {
+  name: string;
+  host: string;
+  port: number;
+  url: string;
+  pingType: number;
+}
+
+
 export interface INodeList{
   nodeList : INode[]
 }

+ 5 - 4
src/request/index.ts

@@ -1,5 +1,6 @@
 import axios, {AxiosInstance, AxiosError, AxiosRequestConfig, AxiosResponse} from 'axios'
 import { message } from 'ant-design-vue';
+import {log} from "util";
 // 数据返回的接口
 // 定义请求响应参数,不含data
 interface Result {
@@ -72,7 +73,7 @@ class RequestHttp {
 				}
 				// 全局错误信息拦截(防止下载文件得时候返回数据流,没有code,直接报错)
 				if (data.code && data.code !== RequestEnums.SUCCESS) {
-					message.error(data); // 此处也可以使用组件提示报错信息
+					message.error(data.message,2).then(r => console.log(r.message)); // 此处也可以使用组件提示报错信息
 					return Promise.reject(data)
 				}
 				return data;
@@ -83,7 +84,7 @@ class RequestHttp {
 					this.handleCode(response.status)
 				}
 				if (!window.navigator.onLine) {
-					message.error('网络连接失败');
+					message.error('网络连接失败',2).then(r => console.log(r.message));
 					// 可以跳转到错误页面,也可以不做操作
 					// return router.replace({
 					//   path: '/404'
@@ -95,10 +96,10 @@ class RequestHttp {
 	handleCode(code: number):void {
 		switch(code) {
 			case 401:
-				message.error('登录失败,请重新登录');
+				message.error('登录失败,请重新登录',2).then(r => console.log(r.message));
 				break;
 			default:
-				message.error('请求失败');
+				message.error('请求失败',2).then(r => console.log(r.message));
 				break;
 		}
 	}

+ 8 - 10
src/style.css

@@ -1,7 +1,11 @@
-#app {
-  margin: 0 auto;
+html,
+body,#app {
+  width: 100%;
+  height: 100vh;
+  margin: 0;
+  padding: 0;
+  background: red;
 }
-
 /* :root {
   font-family: Inter, Avenir, Helvetica, Arial, sans-serif;
   font-size: 16px;
@@ -28,13 +32,7 @@ a:hover {
   color: #535bf2;
 }
 
-body {
-  margin: 0;
-  display: flex;
-  place-items: center;
-  min-width: 320px;
-  min-height: 100vh;
-}
+
 
 h1 {
   font-size: 3.2em;

+ 254 - 83
src/view/node/index.vue

@@ -1,75 +1,130 @@
 <template>
+  <a-space>
+    <a-button type="primary" class="role_btn role_add" @click="showAddNode">添加节点</a-button>
+<!--    <a-button type="primary" class="role_btn role_add" @click="onDeleteALlNode">删除节点</a-button>-->
+<!--    <a-button type="primary" class="role_btn role_add" @click="onEditNode">编辑节点</a-button>-->
+  </a-space>
 
-  <a-button type="primary" class="role_btn role_add" @click="showAddRole">添加角色</a-button>
+  <!-- 添加点击对话框 -->
+  <a-modal v-model:visible="Visible" title="Title" @ok="handleOk">
+    <template #footer>
+      <a-button key="back" @click="cancel">关闭</a-button>
+      <a-button key="back" @click="resetForm">Reset</a-button>
+      <a-button key="submit" type="primary" @click="onSubmit">Submit</a-button>
+    </template>
+    <a-form
+        ref="formRef"
+        :model="formState"
+        :rules="rules"
+        :label-col="labelCol"
+        :wrapper-col="wrapperCol"
+    >
+      <a-form-item ref="name" name="name">
+        <label>name:</label>
+        <a-input v-model:value="formState.name" />
+      </a-form-item>
+
+      <a-form-item ref="host" name="host">
+        <label>host:</label>
+        <a-input v-model:value="formState.host" />
+      </a-form-item>
+
+      <a-form-item ref="port" name="port">
+        <label>port:</label>
+        <a-input v-model:value="formState.port" placeholder="输入服务器端口" />
+      </a-form-item>
+
+      <a-form-item ref="url" name="url">
+        <label>url:</label>
+        <a-input v-model:value="formState.url" placeholder="输入切换地址url"/>
+      </a-form-item>
+      <a-form-item>
+        <label>ping类型:</label>
+        <a-select v-model:value="formState.pingType" placeholder="选择ping类型">
+          <a-select-option :value=0>icmp</a-select-option>
+          <a-select-option :value=1>tcpping</a-select-option>
+        </a-select>
+      </a-form-item>
+<!--      <a-form-item :wrapper-col="{ span: 14, offset: 4 }">-->
+<!--        <a-button type="primary" @click="onSubmit">Create</a-button>-->
+<!--        <a-button style="margin-left: 10px" @click="resetForm">Reset</a-button>-->
+<!--      </a-form-item>-->
+    </a-form>
+  </a-modal>
 
-    <!-- 添加角色的对话框 -->
-  <Edit :show="addRoleVisible" title="添加用户" :addForm="addForm" @cancelAddRole="cancelAddRole" @resatRole="resatRole" @addRole="addRole"></Edit>
+    <!-- 加载节点信息 -->
+  <a-table :row-selection="rowSelection" :columns="columns" :data-source="datalist" rowKey="id" :style="{ height: '100%', borderRight: 0 }">
 
-  <a-table :columns="columns" :data-source="nodeList" :style="{ height: '100%', borderRight: 0 }">
-    <template #bodyCell="{ column }">
-      <template v-if="column.key === 'mg_state'">
-        <a-switch checked-children="??" un-checked-children="??" />
+      <template #delete="{ record }">
+          <a-popconfirm
+              v-if="datalist.length"
+              title="是否删除这条记录"
+              @confirm="onDeleteNode(record)"
+          >
+              <a>删除</a>
+          </a-popconfirm>
       </template>
-    </template>
+
+    <template #edit="{ record }">
+      <a @click="onEditNode(record)">编辑</a>
+<!--          <a-popconfirm-->
+<!--              v-if="datalist.length"-->
+<!--              title="编辑"-->
+<!--              @confirm="onDeleteNode(record)"-->
+<!--          >-->
+<!--              <a>Delete</a>-->
+<!--          </a-popconfirm>-->
+      </template>
+
+
   </a-table>
 </template>
 
 <script lang="ts">
-import {defineComponent, onMounted, reactive, ref, toRefs} from "vue";
-import {INode} from "/@/model/node";
-import {nodeReqUse} from "/@/apis/node";
-import Edit from "/@/components/edit.vue"
+import {
+  computed,
+  defineComponent,
+  getCurrentInstance,
+  inject,
+  onMounted,
+  reactive,
+  ref,
+  toRaw,
+  toRefs,
+  unref
+} from "vue";
+import {INode, NodeAddParam} from "/@/model/node";
+import {nodeAddReqUse, nodeReqUse} from "/@/apis/node";
+import { ColumnProps } from "ant-design-vue/lib/table";
+import {it} from "node:test";
+import {message} from "ant-design-vue";
+import router from "/@/router";
+type Key = ColumnProps['key'];
 export default defineComponent({
   name:"node",
   components:{
-    Edit
+
   },
   data(){
     return {
-      addRoleVisible : false,
-      addForm: {
-            id: '',
-            createTime: new Date(),
-            createBy: '',
-            roleCode: '001',
-            roleName: '测试',
-            description: '',
-          },
+      labelCol: {
+        span: 4,
+      },
+      wrapperCol: {
+        span: 14,
+      },
+
     }
   },
-  methods : {
-    // 显示添加角色对话框
-    showAddRole () {
-      this.addRoleVisible = true;
-    },
-
- // 对话框的中的取消按钮
-    cancelAddRole () {
-              this.addRoleVisible = false;
-              this.editRoleVisible = false;
-            },
-    // 点击 添加角色对话框的保存
-    addRole () {
-      // 注意点:这边的 addRoleVisible 设置为false 需要在数据请求回来设置的!
-      // this.addRoleVisible = false;
-      let addFormObj = JSON.parse(JSON.stringify(this.addForm));
-      this.postAddRole({
-        query: addFormObj,
-      }).then(res => {
-        this.$message.info(res.msg);
-        this.getDate();
-        this.addRoleVisible = false;
-        this.addForm = {};
-      }).finally(_ => {
-        // this.$loading.hide();
-      });
-    },
-    // 对话框的中的重置按钮
-    resatRole (obj) {
-        this.addForm = obj;
-      },
+  mounted() {
+    console.log(this.addRoleVisible);
+    console.log('mounted!')
   },
   setup() {
+    const formRef = ref()
+    const reload: any = inject('reload')
+    //const reload = inject("reload");
+
     const columns = [
       {
         title: 'Id',
@@ -119,51 +174,167 @@ export default defineComponent({
         dataIndex: 'urlStatus',
       },
       {
-        title: 'mg_state',
-        key: 'mg_state',
-        dataIndex: 'mg_state',
+        title: 'Delete',
+        key: 'delete',
+        dataIndex: 'delete',
+        slots: { customRender: 'delete' },
+      },
+      {
+        title: 'Edit',
+        key: 'edit',
+        dataIndex: 'edit',
+        slots: { customRender: 'edit' },
       },
     ];
+    let ids = ""
+    const state = reactive({
+      datalist : [] as INode[],
+      selectedTableRow: [] as INode[],
+      loading : false,
+      Visible : false,
+      code: false,
+    })
 
-    const datalist = reactive({
-      nodeList : [] as INode[]
+    const rowSelection = {
+      onChange: (selectedRowKeys: Key[], selectedRows) => {
+        //第一个参数控制选不选中,第二个参数是选中列表的数据的集合
+        state.selectedTableRow = selectedRows
+        console.log(state.selectedTableRow);
+      },
+      getCheckboxProps: (record) => ({
+        disabled: record.releaseState === "ONLINE", //控制禁用那个按钮
+        releaseState: record.releaseState,
+      }),
+    };
+
+    const getNodeList = async () => {
+      const node_list = await nodeReqUse(null)
+      state.datalist = node_list.data.nodeList
+      reload()
+    }
+
+    const addNodeList = async (data) => {
+
+      let ret = await nodeAddReqUse(data)
+
+      if (ret.code == 0)
+      {
+        console.log(state.Visible);
+        state.Visible = false
+        await getNodeList()
+      }
+      else {
+        console.log(state.Visible);
+        state.Visible = true
+
+      }
+
+    }
+
+    onMounted(  () =>{
+       getNodeList()
     })
 
-    const loading = ref<boolean>(false);
-    const visible = ref<boolean>(false);
+    const formState = reactive({
+        name: "",
+        host: "",
+        port: 22,
+        url:  "",
+        pingType: undefined,
+    })
 
-    const AddNodeModel = () => {
-      visible.value = true;
-    };
 
-    const handleOk = () => {
-      loading.value = true;
-      visible.value= false;
-      // setTimeout(() => {
-      //   loading.value = false;
-      //   visible.value = false;
-      // }, 2000);
+    const rules = {
+      name: [
+        { required: true, message: "输入服务器名称", trigger: "blur" },
+        { min: 1, max: 100, message: "Length should be 3 to 5", trigger: "blur" }
+      ],
+      host: [
+        { required: true, message: "输入服务器IP", trigger: "blur" },
+        { min: 1, max: 100, message: "Length should be 3 to 5", trigger: "blur" }
+      ]
+    }
+    const resetForm = () => {
+      formRef.value.resetFields();
     };
 
-    const handleCancel = () => {
-      visible.value = false;
-    };
+    const onSubmit = () =>{
 
+      const reqdata = {
+        "name" : toRaw(formState).name,
+        "host" : toRaw(formState).host,
+        "port" : toRaw(formState).port,
+        "url"  : toRaw(formState).url,
+        "pingType": toRaw(formState).pingType
+      }
+      addNodeList(reqdata)
+      console.log(reqdata);
 
 
-    onMounted(async () => {
-      const node_list  = await nodeReqUse(null)
-      datalist.nodeList = node_list.data.nodeList
-      console.log(datalist)
-    })
+    }
+
+    const onEditNode = (record) => {
+      formState.name = record.name
+      formState.host = record.host
+      formState.port = record.port
+      formState.url = record.url
+      formState.pingType = record.pingType
+      state.Visible = true
+
+    }
+
+    const  showAddNode = () => {
+      formState.name = ""
+      formState.host = ""
+      formState.port = 22
+      formState.url = ""
+      formState.pingType = undefined
+      state.Visible = true;
+    }
+    const handleOk= () =>{
+
+      //addNodeList(data.value)
+      state.Visible = false
+    }
+    // 对话框的中的取消按钮
+    const cancel = () => {
+      state.loading = false
+      state.Visible = false
+    }
+
+    const { datalist ,selectedTableRow,loading,Visible } =  toRefs(state)
+
+    const onDeleteALlNode = () => {
+      const idsTmp = []
+      selectedTableRow.value.forEach(item => idsTmp.push(item.id))
+      ids = idsTmp.join(",")
+      console.log(ids);
+    }
+
+    const onDeleteNode = ( record )=>{
+      console.log(record.id);
+    }
+
 
-    const { nodeList } = toRefs(datalist)
     return{
-      visible,
+
+      onDeleteALlNode,
+      showAddNode,
       handleOk,
-      AddNodeModel,
-      nodeList,
-      columns
+      cancel,
+      onEditNode,
+      onDeleteNode,
+      rowSelection,
+      resetForm,
+      onSubmit,
+      datalist,
+      selectedTableRow,
+      formRef,
+      formState,
+      rules,
+      columns,
+      loading,
+      Visible,
     }
   }
 })

+ 3 - 1
vite.config.ts

@@ -46,7 +46,9 @@ export default defineConfig({
     // css预处理器
     preprocessorOptions: {
       less: {
-        charset: false,
+        lessOptions: {
+          javascriptEnabled: true
+        }
       },
     },
   }