平台增加适配 品高云和海云和华为云
							parent
							
								
									94b3ccffeb
								
							
						
					
					
						commit
						0aca3945e8
					
				
							
								
								
									
										53
									
								
								.eslintrc.js
								
								
								
								
							
							
						
						
									
										53
									
								
								.eslintrc.js
								
								
								
								
							| 
						 | 
				
			
			@ -1,29 +1,24 @@
 | 
			
		|||
module.exports = {
 | 
			
		||||
  root: true,
 | 
			
		||||
  env: {
 | 
			
		||||
    node: true
 | 
			
		||||
  },
 | 
			
		||||
  extends: ['plugin:vue/essential', '@vue/standard', '@vue/typescript'],
 | 
			
		||||
  rules: {
 | 
			
		||||
    'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off',
 | 
			
		||||
    'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off',
 | 
			
		||||
    'no-unused-vars': [
 | 
			
		||||
      0,
 | 
			
		||||
      {
 | 
			
		||||
        vars: 'all',
 | 
			
		||||
        args: 'none'
 | 
			
		||||
      }
 | 
			
		||||
    ],
 | 
			
		||||
    semi: 0,
 | 
			
		||||
    eqeqeq: 0,
 | 
			
		||||
    'one-var': 0,
 | 
			
		||||
    camelcase: 0,
 | 
			
		||||
    'no-case-declarations': 0,
 | 
			
		||||
    'space-before-function-paren': 0,
 | 
			
		||||
    'vue/no-parsing-error': [2, { "x-invalid-end-tag": false }],
 | 
			
		||||
    '@typescript-eslint/indent': ['error', 2] 
 | 
			
		||||
  },
 | 
			
		||||
  parserOptions: {
 | 
			
		||||
    parser: '@typescript-eslint/parser'
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
module.exports = {
 | 
			
		||||
  root: true,
 | 
			
		||||
  env: {
 | 
			
		||||
    node: true,
 | 
			
		||||
  },
 | 
			
		||||
  extends: ['plugin:vue/essential', '@vue/standard', '@vue/typescript'],
 | 
			
		||||
  rules: {
 | 
			
		||||
    'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off',
 | 
			
		||||
    'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off',
 | 
			
		||||
    'no-unused-vars': [0, { vars: 'all', args: 'none' }],
 | 
			
		||||
    semi: 0,
 | 
			
		||||
    eqeqeq: 0,
 | 
			
		||||
    'one-var': 0,
 | 
			
		||||
    camelcase: 0,
 | 
			
		||||
    'no-case-declarations': 0,
 | 
			
		||||
    'space-before-function-paren': 0,
 | 
			
		||||
    'vue/no-parsing-error': [2, { 'x-invalid-end-tag': false }],
 | 
			
		||||
    '@typescript-eslint/indent': ['error', 2],
 | 
			
		||||
    'comma-dangle': ['error', 2],
 | 
			
		||||
  },
 | 
			
		||||
  parserOptions: {
 | 
			
		||||
    parser: '@typescript-eslint/parser',
 | 
			
		||||
  },
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,10 +1,9 @@
 | 
			
		|||
@media screen and(-ms-high-contrast:active),
 | 
			
		||||
(-ms-high-contrast:none) {
 | 
			
		||||
    .el-table__header,
 | 
			
		||||
    .el-table__body {
 | 
			
		||||
        width: 100% !important;
 | 
			
		||||
    }
 | 
			
		||||
    /* .basic-form-item{
 | 
			
		||||
@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) {
 | 
			
		||||
  .el-table__header,
 | 
			
		||||
  .el-table__body {
 | 
			
		||||
    width: 100% !important;
 | 
			
		||||
  }
 | 
			
		||||
  /* .basic-form-item{
 | 
			
		||||
    height: 32.76px;
 | 
			
		||||
  } */
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,3 +1,5 @@
 | 
			
		|||
import Vue from 'vue'
 | 
			
		||||
 | 
			
		||||
// 正反编译
 | 
			
		||||
export function booleanFilter(value) {
 | 
			
		||||
  const obj = {
 | 
			
		||||
| 
						 | 
				
			
			@ -6,7 +8,7 @@ export function booleanFilter(value) {
 | 
			
		|||
    1: '是',
 | 
			
		||||
    0: '否',
 | 
			
		||||
    YES: '是',
 | 
			
		||||
    NO: '否'
 | 
			
		||||
    NO: '否',
 | 
			
		||||
  }
 | 
			
		||||
  return obj[value] || value
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -29,7 +31,10 @@ export function vmStatusFilter(status) {
 | 
			
		|||
    UNKNOWN: '已断开',
 | 
			
		||||
    UNKNOWNON: '已断开',
 | 
			
		||||
    UNKNOWNOFF: '已断开',
 | 
			
		||||
    UNKNOWNSUSPEND: '已断开'
 | 
			
		||||
    UNKNOWNSUSPEND: '已断开',
 | 
			
		||||
    RECYCLING: '回收中',
 | 
			
		||||
    MIGRATING: '迁移中',
 | 
			
		||||
    FAULT_RESUMING: '故障恢复中',
 | 
			
		||||
  }
 | 
			
		||||
  return statusMap[status] || '未知'
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -95,7 +100,10 @@ export function vmStatusColorFilter(status) {
 | 
			
		|||
    DISABLED: 'danger',
 | 
			
		||||
    DEALLOCATEING: 'warning',
 | 
			
		||||
    PROTECTING: 'warning',
 | 
			
		||||
    DOWN: 'info'
 | 
			
		||||
    DOWN: 'info',
 | 
			
		||||
    RECYCLING: 'warning',
 | 
			
		||||
    MIGRATING: 'warning',
 | 
			
		||||
    FAULT_RESUMING: 'warning',
 | 
			
		||||
  }
 | 
			
		||||
  return statusMap[status] || 'danger'
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -104,12 +112,12 @@ export function taskStatusFilter(value, type) {
 | 
			
		|||
  const statusMap = {
 | 
			
		||||
    DEVELOPING: '开发中',
 | 
			
		||||
    APPROVING: '发布中',
 | 
			
		||||
    APPROVED: ' 已发布'
 | 
			
		||||
    APPROVED: ' 已发布',
 | 
			
		||||
  }
 | 
			
		||||
  const colorMap = {
 | 
			
		||||
    DEVELOPING: 'normal',
 | 
			
		||||
    APPROVING: 'warning',
 | 
			
		||||
    APPROVED: 'success'
 | 
			
		||||
    APPROVED: 'success',
 | 
			
		||||
  }
 | 
			
		||||
  return type === 'color' ? colorMap[value] : statusMap[value]
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -123,7 +131,7 @@ export function taskTypeFilter(value) {
 | 
			
		|||
    RECOVERY: '文件恢复',
 | 
			
		||||
    HTTP: 'HTTP请求',
 | 
			
		||||
    DATABASE: '数据库',
 | 
			
		||||
    POINT: '聚合节点'
 | 
			
		||||
    POINT: '聚合节点',
 | 
			
		||||
  }
 | 
			
		||||
  return obj[value]
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -140,20 +148,20 @@ export function applyStatusFilter(value, type) {
 | 
			
		|||
    // },
 | 
			
		||||
    APPROVED: {
 | 
			
		||||
      name: '已发布',
 | 
			
		||||
      color: 'success'
 | 
			
		||||
      color: 'success',
 | 
			
		||||
    },
 | 
			
		||||
    DEVELOPING: {
 | 
			
		||||
      name: '开发中',
 | 
			
		||||
      color: 'normal'
 | 
			
		||||
      color: 'normal',
 | 
			
		||||
    },
 | 
			
		||||
    UNAPPLY: {
 | 
			
		||||
      name: '未发布',
 | 
			
		||||
      color: 'primary'
 | 
			
		||||
      color: 'primary',
 | 
			
		||||
    },
 | 
			
		||||
    CREATED: {
 | 
			
		||||
      name: '新创建',
 | 
			
		||||
      color: 'normal'
 | 
			
		||||
    }
 | 
			
		||||
      color: 'normal',
 | 
			
		||||
    },
 | 
			
		||||
  }
 | 
			
		||||
  return obj[value] && obj[value][type]
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -162,48 +170,62 @@ export function taskExeStatusFilter(value, type = 'name') {
 | 
			
		|||
  const obj = {
 | 
			
		||||
    CREATED: {
 | 
			
		||||
      name: '未执行',
 | 
			
		||||
      color: 'normal'
 | 
			
		||||
      color: 'normal',
 | 
			
		||||
    },
 | 
			
		||||
    NOREADY: {
 | 
			
		||||
      name: '已跳过',
 | 
			
		||||
      color: 'warning'
 | 
			
		||||
      color: 'warning',
 | 
			
		||||
    },
 | 
			
		||||
    READY: {
 | 
			
		||||
      name: '准备中',
 | 
			
		||||
      color: 'normal'
 | 
			
		||||
      color: 'normal',
 | 
			
		||||
    },
 | 
			
		||||
    WAITTING: {
 | 
			
		||||
      name: '等待执行',
 | 
			
		||||
      color: 'primary'
 | 
			
		||||
      color: 'primary',
 | 
			
		||||
    },
 | 
			
		||||
    CANCELING: {
 | 
			
		||||
      name: '取消中',
 | 
			
		||||
      color: 'primary'
 | 
			
		||||
      color: 'primary',
 | 
			
		||||
    },
 | 
			
		||||
    RUNNING: {
 | 
			
		||||
      name: '正在执行',
 | 
			
		||||
      color: 'normal'
 | 
			
		||||
      color: 'normal',
 | 
			
		||||
    },
 | 
			
		||||
    SUCCESS: {
 | 
			
		||||
      name: '执行成功',
 | 
			
		||||
      color: 'success'
 | 
			
		||||
      color: 'success',
 | 
			
		||||
    },
 | 
			
		||||
    SUSPENDED: {
 | 
			
		||||
      name: '已暂停',
 | 
			
		||||
      color: 'warning'
 | 
			
		||||
      color: 'warning',
 | 
			
		||||
    },
 | 
			
		||||
    FAILED: {
 | 
			
		||||
      name: '执行失败',
 | 
			
		||||
      color: 'danger'
 | 
			
		||||
      color: 'danger',
 | 
			
		||||
    },
 | 
			
		||||
    CANCELED: {
 | 
			
		||||
      name: '手动结束',
 | 
			
		||||
      color: 'warning'
 | 
			
		||||
      color: 'warning',
 | 
			
		||||
    },
 | 
			
		||||
    EXCEPTION: {
 | 
			
		||||
      name: '执行异常',
 | 
			
		||||
      color: 'danger'
 | 
			
		||||
    }
 | 
			
		||||
      color: 'danger',
 | 
			
		||||
    },
 | 
			
		||||
  }
 | 
			
		||||
  return obj[value] && obj[value][type] // 容错处理(初始化值不存在)
 | 
			
		||||
}
 | 
			
		||||
const filters = {
 | 
			
		||||
  booleanFilter,
 | 
			
		||||
  vmStatusFilter,
 | 
			
		||||
  vmStatusColorFilter,
 | 
			
		||||
  taskStatusFilter,
 | 
			
		||||
  taskTypeFilter,
 | 
			
		||||
  applyStatusFilter,
 | 
			
		||||
  taskExeStatusFilter,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 注册全局过滤器
 | 
			
		||||
Object.keys(filters).forEach((key) => {
 | 
			
		||||
  Vue.filter(key, filters[key])
 | 
			
		||||
})
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										21
									
								
								src/main.ts
								
								
								
								
							
							
						
						
									
										21
									
								
								src/main.ts
								
								
								
								
							| 
						 | 
				
			
			@ -21,21 +21,22 @@ import './icons'
 | 
			
		|||
import VueCompositionAPI from '@vue/composition-api'
 | 
			
		||||
import rules from '@/validate/index'
 | 
			
		||||
import actions from './shared/action'
 | 
			
		||||
import './filters'
 | 
			
		||||
 | 
			
		||||
Vue.use(ElementUI, { size: 'small' });
 | 
			
		||||
Vue.use(ElementUI, { size: 'small' })
 | 
			
		||||
Vue.use(VueCompositionAPI)
 | 
			
		||||
Vue.use(CmpElement, { rules })
 | 
			
		||||
Vue.use(CmpEcharts)
 | 
			
		||||
Vue.config.productionTip = false
 | 
			
		||||
 | 
			
		||||
let instance: any = null
 | 
			
		||||
function render(props:any) {
 | 
			
		||||
  const { appPath = '', container } = props;
 | 
			
		||||
function render(props: any) {
 | 
			
		||||
  const { appPath = '', container } = props
 | 
			
		||||
  instance = new Vue({
 | 
			
		||||
    router,
 | 
			
		||||
    store,
 | 
			
		||||
    render: h => h(App)
 | 
			
		||||
  }).$mount(container ? container.querySelector('#app') : '#app');
 | 
			
		||||
    render: (h) => h(App),
 | 
			
		||||
  }).$mount(container ? container.querySelector('#app') : '#app')
 | 
			
		||||
  store.commit('SET_APP_PATH', appPath)
 | 
			
		||||
}
 | 
			
		||||
if (!(window as any).__POWERED_BY_QIANKUN__) {
 | 
			
		||||
| 
						 | 
				
			
			@ -48,8 +49,8 @@ export async function bootstrap() {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
export async function mount(props: any) {
 | 
			
		||||
  console.log('cop app mounted');
 | 
			
		||||
  const getStyle = window.getComputedStyle;
 | 
			
		||||
  console.log('cop app mounted')
 | 
			
		||||
  const getStyle = window.getComputedStyle
 | 
			
		||||
  // @ts-ignore
 | 
			
		||||
  // window.getComputedStyle = (element, property) => {
 | 
			
		||||
  //   if (!element || element.nodeType === 9) return {};
 | 
			
		||||
| 
						 | 
				
			
			@ -57,10 +58,10 @@ export async function mount(props: any) {
 | 
			
		|||
  // };
 | 
			
		||||
  render(props)
 | 
			
		||||
  actions.init(props, (state: any) => {
 | 
			
		||||
    const { permissions, userData } = state;
 | 
			
		||||
    userData && store.commit('SET_USERDATA', userData);
 | 
			
		||||
    const { permissions, userData } = state
 | 
			
		||||
    userData && store.commit('SET_USERDATA', userData)
 | 
			
		||||
    if (!store.getters.addRoutes && permissions) {
 | 
			
		||||
      store.dispatch('permission/GenerateRoutes');
 | 
			
		||||
      store.dispatch('permission/GenerateRoutes')
 | 
			
		||||
    }
 | 
			
		||||
  })
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -83,9 +83,7 @@
 | 
			
		|||
        </template>
 | 
			
		||||
        <el-table-column label="状态">
 | 
			
		||||
          <template slot-scope="scope">
 | 
			
		||||
            <status-icon :type="vmStatusColorFilter(scope.row.status)">
 | 
			
		||||
              {{ vmStatusFilter(scope.row.status) }}
 | 
			
		||||
            </status-icon>
 | 
			
		||||
            <status-icon :type="scope.row.status | vmStatusColorFilter"> {{ scope.row.status | vmStatusFilter }} </status-icon>
 | 
			
		||||
          </template>
 | 
			
		||||
        </el-table-column>
 | 
			
		||||
        <el-table-column label="平台名称" prop="vendorName"></el-table-column>
 | 
			
		||||
| 
						 | 
				
			
			@ -110,36 +108,34 @@ export default {
 | 
			
		|||
  mixins: [show],
 | 
			
		||||
  props: {
 | 
			
		||||
    itemData: {
 | 
			
		||||
      type: Object
 | 
			
		||||
      type: Object,
 | 
			
		||||
    },
 | 
			
		||||
    osCategory: {
 | 
			
		||||
      type: String,
 | 
			
		||||
      default: ''
 | 
			
		||||
      default: '',
 | 
			
		||||
    },
 | 
			
		||||
    hasResource: {
 | 
			
		||||
      type: Boolean,
 | 
			
		||||
      default: false
 | 
			
		||||
    }
 | 
			
		||||
      default: false,
 | 
			
		||||
    },
 | 
			
		||||
  },
 | 
			
		||||
  data() {
 | 
			
		||||
    return {
 | 
			
		||||
      vmStatusFilter,
 | 
			
		||||
      vmStatusColorFilter,
 | 
			
		||||
      list: null,
 | 
			
		||||
      total: null,
 | 
			
		||||
      listQuery: {
 | 
			
		||||
        name: '',
 | 
			
		||||
        privateIps: ''
 | 
			
		||||
        privateIps: '',
 | 
			
		||||
      },
 | 
			
		||||
      params: {
 | 
			
		||||
        page: 1,
 | 
			
		||||
        rows: 10
 | 
			
		||||
        rows: 10,
 | 
			
		||||
      },
 | 
			
		||||
      dialogServerVisible: false,
 | 
			
		||||
      vendorOptions: '',
 | 
			
		||||
      selectList: [],
 | 
			
		||||
      idList: [],
 | 
			
		||||
      http: getResource
 | 
			
		||||
      http: getResource,
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
  created() {
 | 
			
		||||
| 
						 | 
				
			
			@ -148,12 +144,12 @@ export default {
 | 
			
		|||
  computed: {
 | 
			
		||||
    path() {
 | 
			
		||||
      return this.$route.path
 | 
			
		||||
    }
 | 
			
		||||
    },
 | 
			
		||||
  },
 | 
			
		||||
  watch: {
 | 
			
		||||
    path(val) {
 | 
			
		||||
      this.http = val.includes('PatchDeploy') ? getHosts : getResource
 | 
			
		||||
    }
 | 
			
		||||
    },
 | 
			
		||||
  },
 | 
			
		||||
  methods: {
 | 
			
		||||
    clearCustomParams() {
 | 
			
		||||
| 
						 | 
				
			
			@ -183,7 +179,7 @@ export default {
 | 
			
		|||
      this.listQuery = {
 | 
			
		||||
        name: '',
 | 
			
		||||
        privateIps: '',
 | 
			
		||||
        vendorId: ''
 | 
			
		||||
        vendorId: '',
 | 
			
		||||
      }
 | 
			
		||||
      this.params.page = 1
 | 
			
		||||
      this.selectList = []
 | 
			
		||||
| 
						 | 
				
			
			@ -196,7 +192,7 @@ export default {
 | 
			
		|||
          host: data.host,
 | 
			
		||||
          username: data.user,
 | 
			
		||||
          password: data.pasd,
 | 
			
		||||
          osCategory: data.category
 | 
			
		||||
          osCategory: data.category,
 | 
			
		||||
        })
 | 
			
		||||
      })
 | 
			
		||||
      this.dialogServerVisible = true
 | 
			
		||||
| 
						 | 
				
			
			@ -206,7 +202,7 @@ export default {
 | 
			
		|||
      this.$confirm('您确定要清空所选主机吗?', '提示', {
 | 
			
		||||
        confirmButtonText: '清空',
 | 
			
		||||
        confirmButtonClass: 'el-button--danger',
 | 
			
		||||
        type: 'warning'
 | 
			
		||||
        type: 'warning',
 | 
			
		||||
      }).then(() => {
 | 
			
		||||
        this.clearCustomParams()
 | 
			
		||||
        this.itemData.hostList = []
 | 
			
		||||
| 
						 | 
				
			
			@ -223,7 +219,7 @@ export default {
 | 
			
		|||
    },
 | 
			
		||||
    getVendor() {
 | 
			
		||||
      getCloudVendor({
 | 
			
		||||
        simple: true
 | 
			
		||||
        simple: true,
 | 
			
		||||
      }).then((data) => {
 | 
			
		||||
        if (data.success) {
 | 
			
		||||
          this.vendorOptions = data.data.rows
 | 
			
		||||
| 
						 | 
				
			
			@ -305,7 +301,7 @@ export default {
 | 
			
		|||
        category: this.path.includes('PatchDeploy') ? '' : 'Computer',
 | 
			
		||||
        catalog: this.path.includes('PatchDeploy') ? 'Computer' : '',
 | 
			
		||||
        osCategory: this.osCategory,
 | 
			
		||||
        vendorId: this.listQuery.vendorId
 | 
			
		||||
        vendorId: this.listQuery.vendorId,
 | 
			
		||||
      })
 | 
			
		||||
      this.getList()
 | 
			
		||||
    },
 | 
			
		||||
| 
						 | 
				
			
			@ -326,7 +322,7 @@ export default {
 | 
			
		|||
          pasd: data.password || getPassword(data),
 | 
			
		||||
          port: data.osCategory.toUpperCase() === 'WINDOWS' ? 5986 : 22,
 | 
			
		||||
          category: data.osCategory,
 | 
			
		||||
          privateIps: this.path.includes('PatchDeploy') ? '' : data.privateIps
 | 
			
		||||
          privateIps: this.path.includes('PatchDeploy') ? '' : data.privateIps,
 | 
			
		||||
        }
 | 
			
		||||
        if (data.paramsList) {
 | 
			
		||||
          tmp.paramsList = data.paramsList
 | 
			
		||||
| 
						 | 
				
			
			@ -339,13 +335,13 @@ export default {
 | 
			
		|||
        this.itemData.resourceList = this.itemData.hostList.slice()
 | 
			
		||||
        this.itemData.resourceList.unshift({
 | 
			
		||||
          id: 0,
 | 
			
		||||
          rawName: '选择全部'
 | 
			
		||||
          rawName: '选择全部',
 | 
			
		||||
        })
 | 
			
		||||
      }
 | 
			
		||||
      this.clearCustomParams()
 | 
			
		||||
      this.dialogServerVisible = false
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
    },
 | 
			
		||||
  },
 | 
			
		||||
}
 | 
			
		||||
</script>
 | 
			
		||||
<style scoped>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -15,32 +15,24 @@
 | 
			
		|||
    <el-col :span="24">
 | 
			
		||||
      <el-form-item label="">
 | 
			
		||||
        <smart-table :data="itemData.targets" class="target-table">
 | 
			
		||||
          <el-table-column label="主机名称" prop="name" show-overflow-tooltip>
 | 
			
		||||
          </el-table-column>
 | 
			
		||||
          <el-table-column label="主机名称" prop="name" show-overflow-tooltip> </el-table-column>
 | 
			
		||||
          <el-table-column label="IP">
 | 
			
		||||
            <template slot-scope="scope">
 | 
			
		||||
              <el-select v-model="scope.row.host" placeholder="请选择">
 | 
			
		||||
                <el-option
 | 
			
		||||
                  v-for="(item, index) in scope.row.privateIps"
 | 
			
		||||
                  :key="index"
 | 
			
		||||
                  :label="item"
 | 
			
		||||
                  :value="item">
 | 
			
		||||
                </el-option>
 | 
			
		||||
                <el-option v-for="(item, index) in scope.row.privateIps" :key="index" :label="item" :value="item"> </el-option>
 | 
			
		||||
              </el-select>
 | 
			
		||||
            </template>
 | 
			
		||||
          </el-table-column>
 | 
			
		||||
          <el-table-column label="端口">
 | 
			
		||||
            <template slot-scope="scope">
 | 
			
		||||
              <el-form-item class="m-b-none" :prop="'targets.'+scope.row.indexKey+'.port'"
 | 
			
		||||
                            :rules="{required: true, message: '请填写端口号'}">
 | 
			
		||||
              <el-form-item class="m-b-none" :prop="'targets.' + scope.row.indexKey + '.port'" :rules="{ required: true, message: '请填写端口号' }">
 | 
			
		||||
                <el-input v-model="scope.row.port" type="number"></el-input>
 | 
			
		||||
              </el-form-item>
 | 
			
		||||
            </template>
 | 
			
		||||
          </el-table-column>
 | 
			
		||||
          <el-table-column label="用户名">
 | 
			
		||||
            <template slot-scope="scope">
 | 
			
		||||
              <el-form-item class="m-b-none" :prop="'targets.'+scope.row.indexKey+'.user'"
 | 
			
		||||
                            :rules="{required: true, message: '请填写用户名'}">
 | 
			
		||||
              <el-form-item class="m-b-none" :prop="'targets.' + scope.row.indexKey + '.user'" :rules="{ required: true, message: '请填写用户名' }">
 | 
			
		||||
                <el-input v-model="scope.row.user"></el-input>
 | 
			
		||||
              </el-form-item>
 | 
			
		||||
            </template>
 | 
			
		||||
| 
						 | 
				
			
			@ -61,47 +53,37 @@
 | 
			
		|||
        </smart-table>
 | 
			
		||||
      </el-form-item>
 | 
			
		||||
    </el-col>
 | 
			
		||||
    <el-dialog width="70%" title="服务器列表" :close-on-click-modal="false" :visible.sync="dialogServerVisible"
 | 
			
		||||
               append-to-body>
 | 
			
		||||
    <el-dialog width="70%" title="服务器列表" :close-on-click-modal="false" :visible.sync="dialogServerVisible" append-to-body>
 | 
			
		||||
      <el-form :inline="true">
 | 
			
		||||
        <el-form-item>
 | 
			
		||||
          <el-select clearable v-model="listQuery.vendorId" placeholder="所属平台">
 | 
			
		||||
            <el-option v-for="item in vendorOptions" :key="item.id" :label="item.name" :value="item.id">
 | 
			
		||||
            </el-option>
 | 
			
		||||
            <el-option v-for="item in vendorOptions" :key="item.id" :label="item.name" :value="item.id"> </el-option>
 | 
			
		||||
          </el-select>
 | 
			
		||||
        </el-form-item>
 | 
			
		||||
        <el-form-item>
 | 
			
		||||
          <el-input placeholder="IP地址" v-model="listQuery.ip">
 | 
			
		||||
          </el-input>
 | 
			
		||||
          <el-input placeholder="IP地址" v-model="listQuery.ip"> </el-input>
 | 
			
		||||
        </el-form-item>
 | 
			
		||||
        <el-form-item>
 | 
			
		||||
          <el-input placeholder="主机名" v-model="listQuery.name">
 | 
			
		||||
          </el-input>
 | 
			
		||||
          <el-input placeholder="主机名" v-model="listQuery.name"> </el-input>
 | 
			
		||||
        </el-form-item>
 | 
			
		||||
        <el-form-item>
 | 
			
		||||
          <el-button type="ghost" icon="el-icon-search" @click="handleSearch">搜索</el-button>
 | 
			
		||||
        </el-form-item>
 | 
			
		||||
      </el-form>
 | 
			
		||||
      <basic-table :data="list" :params="params" :get-list="getList" :total="total" ref="serverTable1"
 | 
			
		||||
                   @select="handleSelectItem" @select-all="handleSelectAll">
 | 
			
		||||
        <el-table-column type="selection" :selectable="selectAble" width="60">
 | 
			
		||||
        </el-table-column>
 | 
			
		||||
        <el-table-column label="主机名" prop="name">
 | 
			
		||||
        </el-table-column>
 | 
			
		||||
      <basic-table :data="list" :params="params" :get-list="getList" :total="total" ref="serverTable1" @select="handleSelectItem" @select-all="handleSelectAll">
 | 
			
		||||
        <el-table-column type="selection" :selectable="selectAble" width="60"> </el-table-column>
 | 
			
		||||
        <el-table-column label="主机名" prop="name"> </el-table-column>
 | 
			
		||||
        <el-table-column label="IP">
 | 
			
		||||
          <template slot-scope="scope">
 | 
			
		||||
            <div v-for="(item, index) in scope.row.privateIps" :key="index">{{item}}</div>
 | 
			
		||||
            <div v-for="(item, index) in scope.row.privateIps" :key="index">{{ item }}</div>
 | 
			
		||||
          </template>
 | 
			
		||||
        </el-table-column>
 | 
			
		||||
        <el-table-column label="状态">
 | 
			
		||||
          <template slot-scope="scope">
 | 
			
		||||
            <status-icon :type="vmStatusColorFilter(scope.row.status)">
 | 
			
		||||
              {{vmStatusFilter(scope.row.status)}}
 | 
			
		||||
            </status-icon>
 | 
			
		||||
            <status-icon :type="scope.row.status | vmStatusColorFilter"> {{ scope.row.status | vmStatusFilter }} </status-icon>
 | 
			
		||||
          </template>
 | 
			
		||||
        </el-table-column>
 | 
			
		||||
        <el-table-column label="平台名称" prop="vendorName">
 | 
			
		||||
        </el-table-column>
 | 
			
		||||
        <el-table-column label="平台名称" prop="vendorName"> </el-table-column>
 | 
			
		||||
      </basic-table>
 | 
			
		||||
      <div slot="footer" class="dialog-footer">
 | 
			
		||||
        <el-button type="ghost" @click.native="dialogServerVisible = false">取消</el-button>
 | 
			
		||||
| 
						 | 
				
			
			@ -118,47 +100,42 @@ import { vmStatusFilter, vmStatusColorFilter } from '@/filters/index'
 | 
			
		|||
export default {
 | 
			
		||||
  props: {
 | 
			
		||||
    itemData: {
 | 
			
		||||
      type: Object
 | 
			
		||||
    }
 | 
			
		||||
      type: Object,
 | 
			
		||||
    },
 | 
			
		||||
  },
 | 
			
		||||
  data () {
 | 
			
		||||
  data() {
 | 
			
		||||
    return {
 | 
			
		||||
      vmStatusFilter,
 | 
			
		||||
      vmStatusColorFilter,
 | 
			
		||||
      list: null,
 | 
			
		||||
      total: null,
 | 
			
		||||
      listQuery: {
 | 
			
		||||
        name: '',
 | 
			
		||||
        privateIps: '',
 | 
			
		||||
        catalog: ''
 | 
			
		||||
        catalog: '',
 | 
			
		||||
      },
 | 
			
		||||
      params: {
 | 
			
		||||
        page: 1,
 | 
			
		||||
        rows: 10
 | 
			
		||||
        rows: 10,
 | 
			
		||||
      },
 | 
			
		||||
      dialogServerVisible: false,
 | 
			
		||||
      vendorOptions: '',
 | 
			
		||||
      selectList: [],
 | 
			
		||||
      idList: []
 | 
			
		||||
      idList: [],
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
  created () {
 | 
			
		||||
  },
 | 
			
		||||
  created() {},
 | 
			
		||||
  methods: {
 | 
			
		||||
    selectAble (row) {
 | 
			
		||||
    selectAble(row) {
 | 
			
		||||
      if (row.osCategory && row.osCategory.toLowerCase() == 'linux' && row.status && row.status.toLowerCase() == 'running') {
 | 
			
		||||
        if (row.catalog.toLowerCase() == 'physical') {
 | 
			
		||||
          const server = JSON.parse(row.inventory)
 | 
			
		||||
          if ((server.config && server.config.osName && server.config.osName.trim().replace(/\s*/g, '').toLowerCase().indexOf('centos') > -1) ||
 | 
			
		||||
          (server.config && server.config.osName && server.config.osName.trim().replace(/\s*/g, '').toLowerCase().indexOf('redhat') > -1)) {
 | 
			
		||||
          if ((server.config && server.config.osName && server.config.osName.trim().replace(/\s*/g, '').toLowerCase().indexOf('centos') > -1) || (server.config && server.config.osName && server.config.osName.trim().replace(/\s*/g, '').toLowerCase().indexOf('redhat') > -1)) {
 | 
			
		||||
            if (server.powerState.toLowerCase() == 'running') {
 | 
			
		||||
              return true
 | 
			
		||||
            }
 | 
			
		||||
          }
 | 
			
		||||
        } else if (row.catalog.toLowerCase() == 'logical') {
 | 
			
		||||
          const cloud_server = JSON.parse(row.inventory)
 | 
			
		||||
          if ((cloud_server.osName && cloud_server.osName.trim().replace(/\s*/g, '').toLowerCase().indexOf('centos') > -1) ||
 | 
			
		||||
          (cloud_server.osName && cloud_server.osName.trim().replace(/\s*/g, '').toLowerCase().indexOf('redhat') > -1)) {
 | 
			
		||||
          if ((cloud_server.osName && cloud_server.osName.trim().replace(/\s*/g, '').toLowerCase().indexOf('centos') > -1) || (cloud_server.osName && cloud_server.osName.trim().replace(/\s*/g, '').toLowerCase().indexOf('redhat') > -1)) {
 | 
			
		||||
            if (cloud_server.status.toLowerCase() == 'running') {
 | 
			
		||||
              return true
 | 
			
		||||
            }
 | 
			
		||||
| 
						 | 
				
			
			@ -167,41 +144,41 @@ export default {
 | 
			
		|||
      }
 | 
			
		||||
      return false
 | 
			
		||||
    },
 | 
			
		||||
    selectServer () {
 | 
			
		||||
    selectServer() {
 | 
			
		||||
      this.getVendor()
 | 
			
		||||
      // 初始化数据
 | 
			
		||||
      this.listQuery = {
 | 
			
		||||
        name: '',
 | 
			
		||||
        privateIps: '',
 | 
			
		||||
        catalog: '',
 | 
			
		||||
        vendorId: ''
 | 
			
		||||
        vendorId: '',
 | 
			
		||||
      }
 | 
			
		||||
      this.params.page = 1
 | 
			
		||||
      this.selectList = []
 | 
			
		||||
      // 对数据进行格式化以适应后端的传参需求
 | 
			
		||||
      this.itemData.targets.forEach(data => {
 | 
			
		||||
      this.itemData.targets.forEach((data) => {
 | 
			
		||||
        this.selectList.push({
 | 
			
		||||
          id: data.resourceId,
 | 
			
		||||
          name: data.name,
 | 
			
		||||
          host: data.host,
 | 
			
		||||
          username: data.user,
 | 
			
		||||
          password: data.pasd ? crypto.encrypt(data.pasd) : data.pasd,
 | 
			
		||||
          osCategory: data.category
 | 
			
		||||
          osCategory: data.category,
 | 
			
		||||
        })
 | 
			
		||||
      })
 | 
			
		||||
      this.dialogServerVisible = true
 | 
			
		||||
      this.handleSearch()
 | 
			
		||||
    },
 | 
			
		||||
    clearServer () {
 | 
			
		||||
    clearServer() {
 | 
			
		||||
      this.$confirm('您确定要清空所选主机吗?', '提示', {
 | 
			
		||||
        confirmButtonText: '清空',
 | 
			
		||||
        confirmButtonClass: 'el-button--danger',
 | 
			
		||||
        type: 'warning'
 | 
			
		||||
        type: 'warning',
 | 
			
		||||
      }).then(() => {
 | 
			
		||||
        this.itemData.targets = []
 | 
			
		||||
      })
 | 
			
		||||
    },
 | 
			
		||||
    delServer (id) {
 | 
			
		||||
    delServer(id) {
 | 
			
		||||
      for (let i = 0, len = this.itemData.targets.length; i < len; i++) {
 | 
			
		||||
        if (this.itemData.targets[i].id === id) {
 | 
			
		||||
          this.itemData.targets.splice(i, 1)
 | 
			
		||||
| 
						 | 
				
			
			@ -209,16 +186,16 @@ export default {
 | 
			
		|||
        }
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    getVendor () {
 | 
			
		||||
    getVendor() {
 | 
			
		||||
      getCloudVendor({
 | 
			
		||||
        simple: true
 | 
			
		||||
      }).then(data => {
 | 
			
		||||
        simple: true,
 | 
			
		||||
      }).then((data) => {
 | 
			
		||||
        if (data.success) {
 | 
			
		||||
          this.vendorOptions = data.data.rows
 | 
			
		||||
        }
 | 
			
		||||
      })
 | 
			
		||||
    },
 | 
			
		||||
    handleSelectItem (selection, row) {
 | 
			
		||||
    handleSelectItem(selection, row) {
 | 
			
		||||
      this.refreshId()
 | 
			
		||||
      if (this.idList.indexOf(row.id) > -1) {
 | 
			
		||||
        for (let j = 0; j < this.selectList.length; j++) {
 | 
			
		||||
| 
						 | 
				
			
			@ -232,16 +209,18 @@ export default {
 | 
			
		|||
        this.selectList.push(row)
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    handleSelectAll (selection) {
 | 
			
		||||
    handleSelectAll(selection) {
 | 
			
		||||
      this.refreshId()
 | 
			
		||||
      if (selection.length) { // 全选情况下
 | 
			
		||||
        this.list.forEach(item => {
 | 
			
		||||
      if (selection.length) {
 | 
			
		||||
        // 全选情况下
 | 
			
		||||
        this.list.forEach((item) => {
 | 
			
		||||
          if (this.idList.indexOf(item.id) == -1 && item.privateIps.length && item.status != 'STOPPED') {
 | 
			
		||||
            this.selectList.push(item)
 | 
			
		||||
          }
 | 
			
		||||
        })
 | 
			
		||||
      } else { // 全不选情况下
 | 
			
		||||
        this.list.forEach(item => {
 | 
			
		||||
      } else {
 | 
			
		||||
        // 全不选情况下
 | 
			
		||||
        this.list.forEach((item) => {
 | 
			
		||||
          if (this.idList.indexOf(item.id) > -1) {
 | 
			
		||||
            for (let j = 0; j < this.selectList.length; j++) {
 | 
			
		||||
              const row = this.selectList[j]
 | 
			
		||||
| 
						 | 
				
			
			@ -254,13 +233,13 @@ export default {
 | 
			
		|||
        })
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    refreshId () {
 | 
			
		||||
    refreshId() {
 | 
			
		||||
      this.idList = []
 | 
			
		||||
      this.selectList.forEach(item => {
 | 
			
		||||
      this.selectList.forEach((item) => {
 | 
			
		||||
        this.idList.push(item.id)
 | 
			
		||||
      })
 | 
			
		||||
    },
 | 
			
		||||
    getList () {
 | 
			
		||||
    getList() {
 | 
			
		||||
      const self = this
 | 
			
		||||
      this.refreshId()
 | 
			
		||||
      const handleData = function (data) {
 | 
			
		||||
| 
						 | 
				
			
			@ -271,7 +250,7 @@ export default {
 | 
			
		|||
          })
 | 
			
		||||
        })
 | 
			
		||||
      }
 | 
			
		||||
      getResource(this.params).then(data => {
 | 
			
		||||
      getResource(this.params).then((data) => {
 | 
			
		||||
        if (data.success) {
 | 
			
		||||
          this.list = data.data.rows
 | 
			
		||||
          this.total = data.data.total
 | 
			
		||||
| 
						 | 
				
			
			@ -279,20 +258,20 @@ export default {
 | 
			
		|||
        }
 | 
			
		||||
      })
 | 
			
		||||
    },
 | 
			
		||||
    handleSearch () {
 | 
			
		||||
    handleSearch() {
 | 
			
		||||
      this.params.page = 1
 | 
			
		||||
      this.params.params = this.$tools.handleSearchParam({
 | 
			
		||||
        vendorId: this.listQuery.vendorId,
 | 
			
		||||
        category: 'Computer',
 | 
			
		||||
        catalog: this.listQuery.catalog,
 | 
			
		||||
        'name:LK': this.listQuery.name,
 | 
			
		||||
        'privateIps:LK': this.listQuery.ip
 | 
			
		||||
        'privateIps:LK': this.listQuery.ip,
 | 
			
		||||
      })
 | 
			
		||||
      this.getList()
 | 
			
		||||
    },
 | 
			
		||||
    ok () {
 | 
			
		||||
    ok() {
 | 
			
		||||
      this.itemData.targets = []
 | 
			
		||||
      this.selectList.forEach(data => {
 | 
			
		||||
      this.selectList.forEach((data) => {
 | 
			
		||||
        this.itemData.targets.push({
 | 
			
		||||
          resourceId: data.id,
 | 
			
		||||
          name: data.name,
 | 
			
		||||
| 
						 | 
				
			
			@ -302,17 +281,16 @@ export default {
 | 
			
		|||
          pasd: data.password ? crypto.decrypt(data.password) : data.password,
 | 
			
		||||
          category: data.osCategory,
 | 
			
		||||
          sudo: true,
 | 
			
		||||
          privateIps: data.privateIps
 | 
			
		||||
          privateIps: data.privateIps,
 | 
			
		||||
        })
 | 
			
		||||
      })
 | 
			
		||||
      this.dialogServerVisible = false
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
    },
 | 
			
		||||
  },
 | 
			
		||||
}
 | 
			
		||||
</script>
 | 
			
		||||
<style scoped>
 | 
			
		||||
  .target-table .el-form-item.is-error {
 | 
			
		||||
    margin-bottom: 15px !important;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
.target-table .el-form-item.is-error {
 | 
			
		||||
  margin-bottom: 15px !important;
 | 
			
		||||
}
 | 
			
		||||
</style>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -11,32 +11,24 @@
 | 
			
		|||
    <el-col :span="24">
 | 
			
		||||
      <el-form-item label="">
 | 
			
		||||
        <smart-table :data="itemData.targets" class="target-table">
 | 
			
		||||
          <el-table-column label="主机名称" prop="name" show-overflow-tooltip>
 | 
			
		||||
          </el-table-column>
 | 
			
		||||
          <el-table-column label="主机名称" prop="name" show-overflow-tooltip> </el-table-column>
 | 
			
		||||
          <el-table-column label="IP">
 | 
			
		||||
            <template slot-scope="scope">
 | 
			
		||||
              <el-select v-model="scope.row.host" placeholder="请选择">
 | 
			
		||||
                <el-option
 | 
			
		||||
                  v-for="(item, index) in scope.row.privateIps"
 | 
			
		||||
                  :key="index"
 | 
			
		||||
                  :label="item"
 | 
			
		||||
                  :value="item">
 | 
			
		||||
                </el-option>
 | 
			
		||||
                <el-option v-for="(item, index) in scope.row.privateIps" :key="index" :label="item" :value="item"> </el-option>
 | 
			
		||||
              </el-select>
 | 
			
		||||
            </template>
 | 
			
		||||
          </el-table-column>
 | 
			
		||||
          <el-table-column label="端口">
 | 
			
		||||
            <template slot-scope="scope">
 | 
			
		||||
              <el-form-item class="m-b-none" :prop="'targets.'+scope.row.indexKey+'.port'"
 | 
			
		||||
                            :rules="{required: true, message: '请填写端口号'}">
 | 
			
		||||
              <el-form-item class="m-b-none" :prop="'targets.' + scope.row.indexKey + '.port'" :rules="{ required: true, message: '请填写端口号' }">
 | 
			
		||||
                <el-input v-model="scope.row.port" type="number"></el-input>
 | 
			
		||||
              </el-form-item>
 | 
			
		||||
            </template>
 | 
			
		||||
          </el-table-column>
 | 
			
		||||
          <el-table-column label="用户名">
 | 
			
		||||
            <template slot-scope="scope">
 | 
			
		||||
              <el-form-item class="m-b-none" :prop="'targets.'+scope.row.indexKey+'.user'"
 | 
			
		||||
                            :rules="{required: true, message: '请填写用户名'}">
 | 
			
		||||
              <el-form-item class="m-b-none" :prop="'targets.' + scope.row.indexKey + '.user'" :rules="{ required: true, message: '请填写用户名' }">
 | 
			
		||||
                <el-input v-model="scope.row.user"></el-input>
 | 
			
		||||
              </el-form-item>
 | 
			
		||||
            </template>
 | 
			
		||||
| 
						 | 
				
			
			@ -57,22 +49,18 @@
 | 
			
		|||
        </smart-table>
 | 
			
		||||
      </el-form-item>
 | 
			
		||||
    </el-col>
 | 
			
		||||
    <el-dialog width="70%" title="服务器列表" :close-on-click-modal="false" :visible.sync="dialogServerVisible"
 | 
			
		||||
               append-to-body>
 | 
			
		||||
    <el-dialog width="70%" title="服务器列表" :close-on-click-modal="false" :visible.sync="dialogServerVisible" append-to-body>
 | 
			
		||||
      <el-form :inline="true">
 | 
			
		||||
        <el-form-item>
 | 
			
		||||
          <el-select clearable v-model="listQuery.vendorId" placeholder="所属平台">
 | 
			
		||||
            <el-option v-for="item in vendorOptions" :key="item.id" :label="item.name" :value="item.id">
 | 
			
		||||
            </el-option>
 | 
			
		||||
            <el-option v-for="item in vendorOptions" :key="item.id" :label="item.name" :value="item.id"> </el-option>
 | 
			
		||||
          </el-select>
 | 
			
		||||
        </el-form-item>
 | 
			
		||||
        <el-form-item>
 | 
			
		||||
          <el-input placeholder="IP地址" v-model="listQuery.ip">
 | 
			
		||||
          </el-input>
 | 
			
		||||
          <el-input placeholder="IP地址" v-model="listQuery.ip"> </el-input>
 | 
			
		||||
        </el-form-item>
 | 
			
		||||
        <el-form-item>
 | 
			
		||||
          <el-input placeholder="主机名" v-model="listQuery.name">
 | 
			
		||||
          </el-input>
 | 
			
		||||
          <el-input placeholder="主机名" v-model="listQuery.name"> </el-input>
 | 
			
		||||
        </el-form-item>
 | 
			
		||||
        <el-form-item>
 | 
			
		||||
          <el-button type="ghost" icon="el-icon-search" @click="handleSearch">搜索</el-button>
 | 
			
		||||
| 
						 | 
				
			
			@ -82,24 +70,21 @@
 | 
			
		|||
        <el-table-column label="主机名称">
 | 
			
		||||
          <template slot-scope="scope">
 | 
			
		||||
            <el-radio :label="scope.row.id" v-model="targetId" :disabled="selectAble(scope.row)" @change.native="getCurrentRow(scope.row)">
 | 
			
		||||
              <span style="font-size: 12px;">{{scope.row.name}}</span>
 | 
			
		||||
              <span style="font-size: 12px">{{ scope.row.name }}</span>
 | 
			
		||||
            </el-radio>
 | 
			
		||||
          </template>
 | 
			
		||||
        </el-table-column>
 | 
			
		||||
        <el-table-column label="IP">
 | 
			
		||||
          <template slot-scope="scope">
 | 
			
		||||
            <div v-for="(item, index) in scope.row.privateIps" :key="index">{{item}}</div>
 | 
			
		||||
            <div v-for="(item, index) in scope.row.privateIps" :key="index">{{ item }}</div>
 | 
			
		||||
          </template>
 | 
			
		||||
        </el-table-column>
 | 
			
		||||
        <el-table-column label="状态">
 | 
			
		||||
          <template slot-scope="scope">
 | 
			
		||||
            <status-icon :type="vmStatusColorFilter(scope.row.status)">
 | 
			
		||||
              {{vmStatusFilter(scope.row.status)}}
 | 
			
		||||
            </status-icon>
 | 
			
		||||
            <status-icon :type="scope.row.status | vmStatusColorFilter"> {{ scope.row.status | vmStatusFilter }} </status-icon>
 | 
			
		||||
          </template>
 | 
			
		||||
        </el-table-column>
 | 
			
		||||
        <el-table-column label="平台名称" prop="vendorName">
 | 
			
		||||
        </el-table-column>
 | 
			
		||||
        <el-table-column label="平台名称" prop="vendorName"> </el-table-column>
 | 
			
		||||
      </basic-table>
 | 
			
		||||
      <div slot="footer" class="dialog-footer">
 | 
			
		||||
        <el-button type="ghost" @click.native="dialogServerVisible = false">取消</el-button>
 | 
			
		||||
| 
						 | 
				
			
			@ -116,48 +101,43 @@ import crypto from 'utils/crypto.js'
 | 
			
		|||
export default {
 | 
			
		||||
  props: {
 | 
			
		||||
    itemData: {
 | 
			
		||||
      type: Object
 | 
			
		||||
    }
 | 
			
		||||
      type: Object,
 | 
			
		||||
    },
 | 
			
		||||
  },
 | 
			
		||||
  data () {
 | 
			
		||||
  data() {
 | 
			
		||||
    return {
 | 
			
		||||
      vmStatusFilter,
 | 
			
		||||
      vmStatusColorFilter,
 | 
			
		||||
      list: null,
 | 
			
		||||
      total: null,
 | 
			
		||||
      listQuery: {
 | 
			
		||||
        name: '',
 | 
			
		||||
        privateIps: ''
 | 
			
		||||
        privateIps: '',
 | 
			
		||||
      },
 | 
			
		||||
      params: {
 | 
			
		||||
        page: 1,
 | 
			
		||||
        rows: 10
 | 
			
		||||
        rows: 10,
 | 
			
		||||
      },
 | 
			
		||||
      dialogServerVisible: false,
 | 
			
		||||
      groupOptions: '',
 | 
			
		||||
      vendorOptions: '',
 | 
			
		||||
      selectList: [],
 | 
			
		||||
      idList: [],
 | 
			
		||||
      targetId: null
 | 
			
		||||
      targetId: null,
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
  created () {
 | 
			
		||||
  },
 | 
			
		||||
  created() {},
 | 
			
		||||
  methods: {
 | 
			
		||||
    selectAble (row) {
 | 
			
		||||
    selectAble(row) {
 | 
			
		||||
      if (row.osCategory && row.osCategory.toLowerCase() == 'linux' && row.status.toLowerCase() == 'running') {
 | 
			
		||||
        if (row.catalog.toLowerCase() == 'physical') {
 | 
			
		||||
          const server = JSON.parse(row.inventory)
 | 
			
		||||
          if ((server.config && server.config.osName && server.config.osName.trim().replace(/\s*/g, '').toLowerCase().indexOf('centos') > -1) ||
 | 
			
		||||
          (server.config && server.config.osName && server.config.osName.trim().replace(/\s*/g, '').toLowerCase().indexOf('redhat') > -1)) {
 | 
			
		||||
          if ((server.config && server.config.osName && server.config.osName.trim().replace(/\s*/g, '').toLowerCase().indexOf('centos') > -1) || (server.config && server.config.osName && server.config.osName.trim().replace(/\s*/g, '').toLowerCase().indexOf('redhat') > -1)) {
 | 
			
		||||
            if (server.powerState.toLowerCase() == 'running') {
 | 
			
		||||
              return false
 | 
			
		||||
            }
 | 
			
		||||
          }
 | 
			
		||||
        } else if (row.catalog.toLowerCase() == 'logical') {
 | 
			
		||||
          const cloud_server = JSON.parse(row.inventory)
 | 
			
		||||
          if ((cloud_server.osName && cloud_server.osName.trim().replace(/\s*/g, '').toLowerCase().indexOf('centos') > -1) ||
 | 
			
		||||
          (cloud_server.osName && cloud_server.osName.trim().replace(/\s*/g, '').toLowerCase().indexOf('redhat') > -1)) {
 | 
			
		||||
          if ((cloud_server.osName && cloud_server.osName.trim().replace(/\s*/g, '').toLowerCase().indexOf('centos') > -1) || (cloud_server.osName && cloud_server.osName.trim().replace(/\s*/g, '').toLowerCase().indexOf('redhat') > -1)) {
 | 
			
		||||
            if (cloud_server.status.toLowerCase() == 'running') {
 | 
			
		||||
              return false
 | 
			
		||||
            }
 | 
			
		||||
| 
						 | 
				
			
			@ -166,51 +146,51 @@ export default {
 | 
			
		|||
      }
 | 
			
		||||
      return true
 | 
			
		||||
    },
 | 
			
		||||
    selectServer () {
 | 
			
		||||
    selectServer() {
 | 
			
		||||
      this.getVendor()
 | 
			
		||||
      // 初始化数据
 | 
			
		||||
      this.listQuery = {
 | 
			
		||||
        name: '',
 | 
			
		||||
        privateIps: '',
 | 
			
		||||
        vendorId: ''
 | 
			
		||||
        vendorId: '',
 | 
			
		||||
      }
 | 
			
		||||
      this.params.page = 1
 | 
			
		||||
      this.selectList = []
 | 
			
		||||
      // 对数据进行格式化以适应后端的传参需求
 | 
			
		||||
      this.itemData.targets.forEach(data => {
 | 
			
		||||
      this.itemData.targets.forEach((data) => {
 | 
			
		||||
        this.selectList.push({
 | 
			
		||||
          id: data.resourceId,
 | 
			
		||||
          name: data.name,
 | 
			
		||||
          host: data.host,
 | 
			
		||||
          username: data.user,
 | 
			
		||||
          password: data.pasd ? crypto.encrypt(data.pasd) : data.pasd,
 | 
			
		||||
          osCategory: data.category
 | 
			
		||||
          osCategory: data.category,
 | 
			
		||||
        })
 | 
			
		||||
      })
 | 
			
		||||
      this.dialogServerVisible = true
 | 
			
		||||
      this.handleSearch()
 | 
			
		||||
    },
 | 
			
		||||
    delServer () {
 | 
			
		||||
      this.selectList = [];
 | 
			
		||||
      this.itemData.targets = [];
 | 
			
		||||
      this.targetId = null;
 | 
			
		||||
    delServer() {
 | 
			
		||||
      this.selectList = []
 | 
			
		||||
      this.itemData.targets = []
 | 
			
		||||
      this.targetId = null
 | 
			
		||||
    },
 | 
			
		||||
    getVendor () {
 | 
			
		||||
    getVendor() {
 | 
			
		||||
      getCloudVendor({
 | 
			
		||||
        simple: true
 | 
			
		||||
      }).then(data => {
 | 
			
		||||
        simple: true,
 | 
			
		||||
      }).then((data) => {
 | 
			
		||||
        if (data.success) {
 | 
			
		||||
          this.vendorOptions = data.data.rows
 | 
			
		||||
        }
 | 
			
		||||
      })
 | 
			
		||||
    },
 | 
			
		||||
    refreshId () {
 | 
			
		||||
    refreshId() {
 | 
			
		||||
      this.idList = []
 | 
			
		||||
      this.selectList.forEach(item => {
 | 
			
		||||
      this.selectList.forEach((item) => {
 | 
			
		||||
        this.idList.push(item.id)
 | 
			
		||||
      })
 | 
			
		||||
    },
 | 
			
		||||
    getList () {
 | 
			
		||||
    getList() {
 | 
			
		||||
      const self = this
 | 
			
		||||
      this.refreshId()
 | 
			
		||||
      const handleData = function (data) {
 | 
			
		||||
| 
						 | 
				
			
			@ -218,7 +198,7 @@ export default {
 | 
			
		|||
          item.privateIps = JSON.parse(item.privateIps)
 | 
			
		||||
        })
 | 
			
		||||
      }
 | 
			
		||||
      getResource(this.params).then(data => {
 | 
			
		||||
      getResource(this.params).then((data) => {
 | 
			
		||||
        if (data.success) {
 | 
			
		||||
          this.list = data.data.rows
 | 
			
		||||
          this.total = data.data.total
 | 
			
		||||
| 
						 | 
				
			
			@ -226,22 +206,22 @@ export default {
 | 
			
		|||
        }
 | 
			
		||||
      })
 | 
			
		||||
    },
 | 
			
		||||
    handleSearch () {
 | 
			
		||||
    handleSearch() {
 | 
			
		||||
      this.params.page = 1
 | 
			
		||||
      this.params.params = this.$tools.handleSearchParam({
 | 
			
		||||
        vendorId: this.listQuery.vendorId,
 | 
			
		||||
        category: 'Computer',
 | 
			
		||||
        'name:LK': this.listQuery.name,
 | 
			
		||||
        'privateIps:LK': this.listQuery.ip
 | 
			
		||||
        'privateIps:LK': this.listQuery.ip,
 | 
			
		||||
      })
 | 
			
		||||
      this.getList()
 | 
			
		||||
    },
 | 
			
		||||
    getCurrentRow (data) {
 | 
			
		||||
      this.selectList = [data];
 | 
			
		||||
    getCurrentRow(data) {
 | 
			
		||||
      this.selectList = [data]
 | 
			
		||||
    },
 | 
			
		||||
    ok () {
 | 
			
		||||
    ok() {
 | 
			
		||||
      this.itemData.targets = []
 | 
			
		||||
      this.selectList.forEach(data => {
 | 
			
		||||
      this.selectList.forEach((data) => {
 | 
			
		||||
        this.itemData.targets.push({
 | 
			
		||||
          resourceId: data.id,
 | 
			
		||||
          name: data.name,
 | 
			
		||||
| 
						 | 
				
			
			@ -251,17 +231,16 @@ export default {
 | 
			
		|||
          pasd: data.password ? crypto.decrypt(data.password) : data.password,
 | 
			
		||||
          category: data.osCategory,
 | 
			
		||||
          sudo: true,
 | 
			
		||||
          privateIps: data.privateIps
 | 
			
		||||
          privateIps: data.privateIps,
 | 
			
		||||
        })
 | 
			
		||||
      })
 | 
			
		||||
      this.dialogServerVisible = false
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
    },
 | 
			
		||||
  },
 | 
			
		||||
}
 | 
			
		||||
</script>
 | 
			
		||||
<style scoped>
 | 
			
		||||
  .target-table .el-form-item.is-error {
 | 
			
		||||
    margin-bottom: 15px !important;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
.target-table .el-form-item.is-error {
 | 
			
		||||
  margin-bottom: 15px !important;
 | 
			
		||||
}
 | 
			
		||||
</style>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,9 +2,7 @@
 | 
			
		|||
  <div>
 | 
			
		||||
    <AdvanceTable :title="`${title}主机列表`" :data="tableData" :searchConfigs="searchConfigs" :params="params" :total="total" :columns="columns" :get-list="getData" :loading="loading" :key="path">
 | 
			
		||||
      <template v-slot:action>
 | 
			
		||||
        <el-button type="primary" @click="handleCreate(null, 1)" icon="el-icon-plus">
 | 
			
		||||
          新增
 | 
			
		||||
        </el-button>
 | 
			
		||||
        <el-button type="primary" @click="handleCreate(null, 1)" icon="el-icon-plus"> 新增 </el-button>
 | 
			
		||||
        <el-button type="primary" icon="el-icon-refresh" @click="handleSynchro(type)">同步</el-button>
 | 
			
		||||
        <!-- <el-button type="primary" icon="el-icon-refresh" @click="handleSynchro('RIS')">同步RIS</el-button> -->
 | 
			
		||||
        <el-button icon="el-icon-upload2" @click="importData"> 导入 </el-button>
 | 
			
		||||
| 
						 | 
				
			
			@ -127,7 +125,7 @@ export default {
 | 
			
		|||
          } else {
 | 
			
		||||
            callback(new Error('请输入正确的IP地址'))
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
        },
 | 
			
		||||
      },
 | 
			
		||||
      columns,
 | 
			
		||||
      vmSearchConfigs,
 | 
			
		||||
| 
						 | 
				
			
			@ -138,11 +136,11 @@ export default {
 | 
			
		|||
      params: {
 | 
			
		||||
        page: 1,
 | 
			
		||||
        rows: 20,
 | 
			
		||||
        sorter: JSON.stringify({ gmtCreate: '1' })
 | 
			
		||||
        sorter: JSON.stringify({ gmtCreate: '1' }),
 | 
			
		||||
      },
 | 
			
		||||
      setData: {
 | 
			
		||||
        dialog: false,
 | 
			
		||||
        data: {}
 | 
			
		||||
        data: {},
 | 
			
		||||
      },
 | 
			
		||||
      type: 'VM',
 | 
			
		||||
      searchConfigs: vmSearchConfigs,
 | 
			
		||||
| 
						 | 
				
			
			@ -151,7 +149,7 @@ export default {
 | 
			
		|||
      // 新增编辑
 | 
			
		||||
      textMap2: {
 | 
			
		||||
        update: '主机修改',
 | 
			
		||||
        create: '新增主机'
 | 
			
		||||
        create: '新增主机',
 | 
			
		||||
      },
 | 
			
		||||
      addHostVisible: false,
 | 
			
		||||
      addHostData: {
 | 
			
		||||
| 
						 | 
				
			
			@ -164,7 +162,7 @@ export default {
 | 
			
		|||
        ips: [],
 | 
			
		||||
        // ip: '',
 | 
			
		||||
        username: '',
 | 
			
		||||
        password: ''
 | 
			
		||||
        password: '',
 | 
			
		||||
      },
 | 
			
		||||
      typeName: 'ansible',
 | 
			
		||||
      statusList: [
 | 
			
		||||
| 
						 | 
				
			
			@ -174,54 +172,29 @@ export default {
 | 
			
		|||
        { id: 'PAUSED', name: '已停止' },
 | 
			
		||||
        { id: 'UNKNOWN', name: '已断开' },
 | 
			
		||||
        { id: 'EXCEPTION', name: '异常' },
 | 
			
		||||
        { id: 'UNKNOWSTATUS', name: '未知' }
 | 
			
		||||
        { id: 'UNKNOWSTATUS', name: '未知' },
 | 
			
		||||
      ],
 | 
			
		||||
      segmentIdList: [],
 | 
			
		||||
      flag: true,
 | 
			
		||||
      detail: {},
 | 
			
		||||
      importDialog: {
 | 
			
		||||
        visible: false
 | 
			
		||||
        visible: false,
 | 
			
		||||
      },
 | 
			
		||||
      idx: '',
 | 
			
		||||
      userConfig: {
 | 
			
		||||
        visible: false
 | 
			
		||||
      }
 | 
			
		||||
        visible: false,
 | 
			
		||||
      },
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
  computed: {
 | 
			
		||||
    path() {
 | 
			
		||||
      return this.$route.path
 | 
			
		||||
    }
 | 
			
		||||
    },
 | 
			
		||||
  },
 | 
			
		||||
  watch: {
 | 
			
		||||
    path(val) {
 | 
			
		||||
      this.judgeType(val)
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
  filters: {
 | 
			
		||||
    vmStatusFilter(val) {
 | 
			
		||||
      const statusMap = {
 | 
			
		||||
        RUNNING: '运行中',
 | 
			
		||||
        STOPPED: '已关机',
 | 
			
		||||
        SUSPENDED: '已挂起',
 | 
			
		||||
        PAUSED: '已停止',
 | 
			
		||||
        UNKNOWN: '已断开',
 | 
			
		||||
        EXCEPTION: '异常',
 | 
			
		||||
        UNKNOWSTATUS: '未知'
 | 
			
		||||
      }
 | 
			
		||||
      return statusMap[val] || '未知'
 | 
			
		||||
    },
 | 
			
		||||
    vmStatusColorFilter(val) {
 | 
			
		||||
      const statusMap = {
 | 
			
		||||
        RUNNING: 'success',
 | 
			
		||||
        STOPPED: 'danger',
 | 
			
		||||
        SUSPENDED: 'danger',
 | 
			
		||||
        PAUSED: 'danger',
 | 
			
		||||
        EXCEPTION: 'warning',
 | 
			
		||||
        UNKNOWN: 'warning'
 | 
			
		||||
      }
 | 
			
		||||
      return statusMap[val] || 'warning'
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
  created() {
 | 
			
		||||
    this.judgeType(this.path)
 | 
			
		||||
| 
						 | 
				
			
			@ -241,7 +214,7 @@ export default {
 | 
			
		|||
    // 导入任务
 | 
			
		||||
    importData() {
 | 
			
		||||
      this.importDialog = {
 | 
			
		||||
        visible: true
 | 
			
		||||
        visible: true,
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    async getsegmentIdList() {
 | 
			
		||||
| 
						 | 
				
			
			@ -256,7 +229,7 @@ export default {
 | 
			
		|||
    addIp() {
 | 
			
		||||
      this.addHostData.ipList.push({
 | 
			
		||||
        value: '',
 | 
			
		||||
        key: Date.now()
 | 
			
		||||
        key: Date.now(),
 | 
			
		||||
      })
 | 
			
		||||
      this.$forceUpdate()
 | 
			
		||||
    },
 | 
			
		||||
| 
						 | 
				
			
			@ -286,14 +259,14 @@ export default {
 | 
			
		|||
            category: this.type == 'VM' ? 'LOGICAL' : 'PHYSICAL',
 | 
			
		||||
            ipList: [
 | 
			
		||||
              {
 | 
			
		||||
                value: ''
 | 
			
		||||
              }
 | 
			
		||||
                value: '',
 | 
			
		||||
              },
 | 
			
		||||
            ],
 | 
			
		||||
            ips: [],
 | 
			
		||||
            // ip: '',
 | 
			
		||||
            username: '',
 | 
			
		||||
            password: '',
 | 
			
		||||
            updateMode: 'MANUAL'
 | 
			
		||||
            updateMode: 'MANUAL',
 | 
			
		||||
          }
 | 
			
		||||
          break
 | 
			
		||||
        case 2:
 | 
			
		||||
| 
						 | 
				
			
			@ -308,7 +281,7 @@ export default {
 | 
			
		|||
          ips.split(' ').forEach((item) => {
 | 
			
		||||
            this.addHostData.ipList.push({
 | 
			
		||||
              value: item,
 | 
			
		||||
              key: Date.now()
 | 
			
		||||
              key: Date.now(),
 | 
			
		||||
            })
 | 
			
		||||
          })
 | 
			
		||||
          break
 | 
			
		||||
| 
						 | 
				
			
			@ -340,7 +313,7 @@ export default {
 | 
			
		|||
            if (data.success) {
 | 
			
		||||
              this.$message({
 | 
			
		||||
                message: data.message,
 | 
			
		||||
                type: 'success'
 | 
			
		||||
                type: 'success',
 | 
			
		||||
              })
 | 
			
		||||
              that.addHostVisible = false
 | 
			
		||||
              that.getData()
 | 
			
		||||
| 
						 | 
				
			
			@ -354,13 +327,13 @@ export default {
 | 
			
		|||
        dialog: true,
 | 
			
		||||
        data: {
 | 
			
		||||
          ...row,
 | 
			
		||||
          ips: row.ips.includes('[') ? JSON.parse(row.ips).join('') : row.ips
 | 
			
		||||
        }
 | 
			
		||||
          ips: row.ips.includes('[') ? JSON.parse(row.ips).join('') : row.ips,
 | 
			
		||||
        },
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    handleSynchro(category) {
 | 
			
		||||
      this.$confirm('执行同步操作前,请先在【分组管理—>网段管理】页面创建网段数据,以免影响正常使用,您确定要同步?', '提示', {
 | 
			
		||||
        type: 'warning'
 | 
			
		||||
        type: 'warning',
 | 
			
		||||
      }).then(() => {
 | 
			
		||||
        syncHost(this.type == 'VM' ? 'LOGICAL' : 'PHYSICAL').then((res) => {
 | 
			
		||||
          const type = res.success ? 'success' : 'error'
 | 
			
		||||
| 
						 | 
				
			
			@ -371,7 +344,7 @@ export default {
 | 
			
		|||
    },
 | 
			
		||||
    settingAllow(row) {
 | 
			
		||||
      this.$confirm('您确定要设置HostsAllow配置嘛?', '提示', {
 | 
			
		||||
        type: 'warning'
 | 
			
		||||
        type: 'warning',
 | 
			
		||||
      }).then(() => {
 | 
			
		||||
        HostsAllow(row.id).then((res) => {
 | 
			
		||||
          const type = res.success ? 'success' : 'error'
 | 
			
		||||
| 
						 | 
				
			
			@ -382,7 +355,7 @@ export default {
 | 
			
		|||
    },
 | 
			
		||||
    handleDelete(row) {
 | 
			
		||||
      this.$confirm('您确定要删除该主机吗嘛?', '提示', {
 | 
			
		||||
        type: 'warning'
 | 
			
		||||
        type: 'warning',
 | 
			
		||||
      }).then(() => {
 | 
			
		||||
        deleteBsmHost(row.id).then((res) => {
 | 
			
		||||
          const type = res.success ? 'success' : 'error'
 | 
			
		||||
| 
						 | 
				
			
			@ -402,7 +375,7 @@ export default {
 | 
			
		|||
      if (document.querySelector('#inspect')) document.querySelector('#inspect').checked = true
 | 
			
		||||
      this.$confirm(`<div>您确定要对主机[${row.ip}]进行纳管巡检吗?<div> <div><input type="checkbox" id="inspect" autocomplete="off" checked>是否更新密码再进行纳管巡检</div>`, '提示', {
 | 
			
		||||
        type: 'warning',
 | 
			
		||||
        dangerouslyUseHTMLString: true
 | 
			
		||||
        dangerouslyUseHTMLString: true,
 | 
			
		||||
      }).then(() => {
 | 
			
		||||
        this.submitInspect({ id: row.id, force: document.querySelector('#inspect').checked })
 | 
			
		||||
      })
 | 
			
		||||
| 
						 | 
				
			
			@ -425,7 +398,7 @@ export default {
 | 
			
		|||
        OC = osCategory.toLocaleUpperCase()
 | 
			
		||||
      }
 | 
			
		||||
      this.$router.push({ name: 'serverConfig', params: { type: 'pm', osCategory: OC, host: data.ip, segmentId: data.segmentId } })
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
    },
 | 
			
		||||
  },
 | 
			
		||||
}
 | 
			
		||||
</script>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -47,7 +47,7 @@
 | 
			
		|||
      <el-dialog title="服务器列表" :close-on-click-modal="false" :visible.sync="dialogServerVisible" append-to-body width="1200px">
 | 
			
		||||
        <AdvanceTable :data="list" :card-border="false" row-key="id" :searchConfigs="searchConfigs" :params="params" :total="total" :columns="columns" :get-list="getList" :loading="loading" ref="tableRef" @select="handleSelectItem" @select-all="handleSelectAll">
 | 
			
		||||
          <template #status="status">
 | 
			
		||||
            <status-icon :type="vmStatusColorFilter(status, 'color')">{{ vmStatusFilter(status) }}</status-icon>
 | 
			
		||||
            <status-icon :type="status | vmStatusColorFilter">{{ status | vmStatusFilter }}</status-icon>
 | 
			
		||||
          </template>
 | 
			
		||||
        </AdvanceTable>
 | 
			
		||||
        <div slot="footer" class="dialog-footer">
 | 
			
		||||
| 
						 | 
				
			
			@ -69,24 +69,24 @@ import { vmStatusFilter, vmStatusColorFilter } from '@/filters/index'
 | 
			
		|||
import { ref, nextTick, unref, computed, reactive, watch, defineComponent, Ref } from '@vue/composition-api'
 | 
			
		||||
import { Message, MessageBox } from 'element-ui'
 | 
			
		||||
interface IHost {
 | 
			
		||||
  id: number,
 | 
			
		||||
  name: string,
 | 
			
		||||
  ip: string,
 | 
			
		||||
  port: number,
 | 
			
		||||
  segmentId: number,
 | 
			
		||||
  osCategory: string,
 | 
			
		||||
  username: string,
 | 
			
		||||
  pasd: string,
 | 
			
		||||
  id: number
 | 
			
		||||
  name: string
 | 
			
		||||
  ip: string
 | 
			
		||||
  port: number
 | 
			
		||||
  segmentId: number
 | 
			
		||||
  osCategory: string
 | 
			
		||||
  username: string
 | 
			
		||||
  pasd: string
 | 
			
		||||
  password: string
 | 
			
		||||
}
 | 
			
		||||
interface ITargetHost {
 | 
			
		||||
  id: number,
 | 
			
		||||
  rawName: string,
 | 
			
		||||
  host: string,
 | 
			
		||||
  port: number,
 | 
			
		||||
  segmentId: number,
 | 
			
		||||
  category: string,
 | 
			
		||||
  user: string,
 | 
			
		||||
  id: number
 | 
			
		||||
  rawName: string
 | 
			
		||||
  host: string
 | 
			
		||||
  port: number
 | 
			
		||||
  segmentId: number
 | 
			
		||||
  category: string
 | 
			
		||||
  user: string
 | 
			
		||||
  pasd: string
 | 
			
		||||
}
 | 
			
		||||
function formatHostData(list: IHost[]) {
 | 
			
		||||
| 
						 | 
				
			
			@ -100,23 +100,24 @@ function formatHostData(list: IHost[]) {
 | 
			
		|||
      segmentId,
 | 
			
		||||
      category,
 | 
			
		||||
      user,
 | 
			
		||||
      pasd: pasd && encrypt(pasd)
 | 
			
		||||
      pasd: pasd && encrypt(pasd),
 | 
			
		||||
    }
 | 
			
		||||
  })
 | 
			
		||||
}
 | 
			
		||||
export default defineComponent({
 | 
			
		||||
  props: {
 | 
			
		||||
    itemData: {
 | 
			
		||||
      type: Object
 | 
			
		||||
      type: Object,
 | 
			
		||||
    },
 | 
			
		||||
    osCategory: { // 通过osCategory过滤linux/windows机器
 | 
			
		||||
    osCategory: {
 | 
			
		||||
      // 通过osCategory过滤linux/windows机器
 | 
			
		||||
      type: String,
 | 
			
		||||
      default: ''
 | 
			
		||||
      default: '',
 | 
			
		||||
    },
 | 
			
		||||
    disabled: {
 | 
			
		||||
      type: Boolean,
 | 
			
		||||
      default: false
 | 
			
		||||
    }
 | 
			
		||||
      default: false,
 | 
			
		||||
    },
 | 
			
		||||
  },
 | 
			
		||||
  setup(props, context) {
 | 
			
		||||
    const hostData = reactive({
 | 
			
		||||
| 
						 | 
				
			
			@ -131,14 +132,17 @@ export default defineComponent({
 | 
			
		|||
          username,
 | 
			
		||||
          pasd: password,
 | 
			
		||||
          password,
 | 
			
		||||
          osCategory
 | 
			
		||||
          osCategory,
 | 
			
		||||
        }
 | 
			
		||||
      })
 | 
			
		||||
      }),
 | 
			
		||||
    })
 | 
			
		||||
    // 对主机数据监听,实时返回主机数据
 | 
			
		||||
    watch(() => hostData.list, () => {
 | 
			
		||||
      context.emit('host-change', formatHostData(hostData.list))
 | 
			
		||||
    });
 | 
			
		||||
    watch(
 | 
			
		||||
      () => hostData.list,
 | 
			
		||||
      () => {
 | 
			
		||||
        context.emit('host-change', formatHostData(hostData.list))
 | 
			
		||||
      }
 | 
			
		||||
    )
 | 
			
		||||
    const { list, total, params, loading, getList } = useTable({
 | 
			
		||||
      getService: getHosts,
 | 
			
		||||
      async afterGetList() {
 | 
			
		||||
| 
						 | 
				
			
			@ -148,7 +152,7 @@ export default defineComponent({
 | 
			
		|||
            unref(tableRef).toggleRowSelection(item, true)
 | 
			
		||||
          }
 | 
			
		||||
        })
 | 
			
		||||
      }
 | 
			
		||||
      },
 | 
			
		||||
    })
 | 
			
		||||
    const selectList: Ref<IHost[]> = ref([])
 | 
			
		||||
    function handleSelectItem(selection: IHost[], row: IHost) {
 | 
			
		||||
| 
						 | 
				
			
			@ -188,7 +192,7 @@ export default defineComponent({
 | 
			
		|||
          ...others,
 | 
			
		||||
          osCategory,
 | 
			
		||||
          pasd: pasd || (password && decrypt(password)),
 | 
			
		||||
          port: port || (osCategory.toUpperCase() === 'WINDOWS' ? 5986 : 22)
 | 
			
		||||
          port: port || (osCategory.toUpperCase() === 'WINDOWS' ? 5986 : 22),
 | 
			
		||||
        }
 | 
			
		||||
      })
 | 
			
		||||
      dialogServerVisible.value = false
 | 
			
		||||
| 
						 | 
				
			
			@ -211,7 +215,7 @@ export default defineComponent({
 | 
			
		|||
      MessageBox.confirm('您确定要清空所选主机吗?', '提示', {
 | 
			
		||||
        confirmButtonText: '清空',
 | 
			
		||||
        confirmButtonClass: 'el-button--danger',
 | 
			
		||||
        type: 'warning'
 | 
			
		||||
        type: 'warning',
 | 
			
		||||
      }).then(() => {
 | 
			
		||||
        hostData.list = []
 | 
			
		||||
      })
 | 
			
		||||
| 
						 | 
				
			
			@ -220,7 +224,7 @@ export default defineComponent({
 | 
			
		|||
      MessageBox.confirm(`您确定要删除主机【${name}】吗?`, '提示', {
 | 
			
		||||
        confirmButtonText: '清空',
 | 
			
		||||
        confirmButtonClass: 'el-button--danger',
 | 
			
		||||
        type: 'warning'
 | 
			
		||||
        type: 'warning',
 | 
			
		||||
      }).then(() => {
 | 
			
		||||
        const index = hostData.list.findIndex((item: IHost) => item.id === id)
 | 
			
		||||
        hostData.list.splice(index, 1)
 | 
			
		||||
| 
						 | 
				
			
			@ -246,8 +250,6 @@ export default defineComponent({
 | 
			
		|||
      total,
 | 
			
		||||
      params,
 | 
			
		||||
      loading,
 | 
			
		||||
      vmStatusFilter,
 | 
			
		||||
      vmStatusColorFilter,
 | 
			
		||||
      getList,
 | 
			
		||||
      handleSelectItem,
 | 
			
		||||
      handleSelectAll,
 | 
			
		||||
| 
						 | 
				
			
			@ -259,9 +261,9 @@ export default defineComponent({
 | 
			
		|||
      selectServer,
 | 
			
		||||
      clearServer,
 | 
			
		||||
      delServer,
 | 
			
		||||
      getPostData
 | 
			
		||||
      getPostData,
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  },
 | 
			
		||||
})
 | 
			
		||||
</script>
 | 
			
		||||
<style scoped>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -14,6 +14,7 @@
 | 
			
		|||
    "allowJs": true,
 | 
			
		||||
    "baseUrl": ".",
 | 
			
		||||
    "types": ["webpack-env"],
 | 
			
		||||
    "outDir": "dist",
 | 
			
		||||
    // "typeRoots": ["./node_modules/@types/", "./types"],
 | 
			
		||||
    "paths": {
 | 
			
		||||
      "@/*": ["src/*"],
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue