| | |
| | | </el-submenu> |
| | | </el-menu> |
| | | </el-tab-pane> |
| | | <el-tab-pane label="集群" name="cluster" :style="`height:${height - 56}px;`" v-if="showCluster"> |
| | | |
| | | </el-tab-pane> |
| | | <el-tab-pane |
| | | label="数据栈" |
| | | name="dataStack" |
| | |
| | | showCam() { |
| | | return this.appName === "Camera" || this.appName === "Search"; |
| | | }, |
| | | showCluster() { |
| | | return this.appName === "Cluster" |
| | | }, |
| | | showDataStack() { |
| | | return this.appName === "DataStack" || this.appName === "Search"; |
| | | }, |
| | |
| | | } |
| | | }; |
| | | </script> |
| | | <style> |
| | | /* .net-svg{ |
| | | background-color: aquamarine; |
| | | border-radius: 50%; |
| | | } */ |
| | | </style> |
| | |
| | | <el-image |
| | | v-if="row.type==2" |
| | | style="width: 30x; height: 30px" |
| | | :src="`/files/${row.identifier}.jpg`" |
| | | :src="`/files/${row.path.substr(row.path.lastIndexOf('/')+1)}`" |
| | | fit="fill" |
| | | :preview-src-list="[`/files/${row.identifier}.jpg`]" |
| | | :preview-src-list="[`/files/${row.path.substr(row.path.lastIndexOf('/')+1)}`]" |
| | | > |
| | | <div slot="error" :class="snapshotClass"></div> |
| | | </el-image> |
| | |
| | | this.videoUrl = "/files/" + row.identifier + ".mp4" |
| | | }else if(row.type===2){ |
| | | |
| | | this.imgUrl = "/files/" + row.identifier + ".jpg" |
| | | this.imgUrl = "/files/" + row.path.substr(row.path.lastIndexOf('/')+1) |
| | | } |
| | | }, |
| | | // 清空输入框 |
| | |
| | | this.fileList = []; |
| | | }, |
| | | selectDir(node) { |
| | | debugger |
| | | |
| | | if (node.id === "") { |
| | | return |
| | | } |
| | |
| | | findAllFileByStackId({ name: this.searchInput, stackId: this.form.id, page: this.page, size: this.size, type: 0 }).then(rsp => { |
| | | if (rsp && rsp.success && rsp.data.total > 0) { |
| | | this.fileList = rsp.data.dataList; |
| | | |
| | | this.total = rsp.data.total; |
| | | |
| | | // 定时刷新会清空选中状态,在这里恢复 |
| | |
| | | time_rule_id: "", |
| | | }; |
| | | this.$refs.sceneEditor.cleanRule(); |
| | | this.$refs.sceneEditor.getSdkConnection(); |
| | | }, |
| | | handleCreate() { |
| | | |
| | |
| | | ></polygon-canvas> |
| | | </template> |
| | | <template v-else> |
| | | <div style="width:100%" v-loading='getStackFileLoading'> |
| | | <div style="width:100%" v-loading="getStackFileLoading"> |
| | | <swiper |
| | | ref="swiper" |
| | | :auto-update="true" |
| | |
| | | </div> |
| | | </swiper-slide> |
| | | </swiper> |
| | | <div class="swiper-local-prev" v-show="swipercanvasData.length>1" @click="prevClick"> |
| | | <div |
| | | class="swiper-local-prev" |
| | | v-show="swipercanvasData.length>1" |
| | | @click="prevClick" |
| | | > |
| | | <div class="icon-btn" slot="button-prev"> |
| | | <i class="iconfont iconzuo"></i> |
| | | </div> |
| | | </div> |
| | | <div class="swiper-local-next" v-show="swipercanvasData.length>1" @click="nextClick"> |
| | | <div |
| | | class="swiper-local-next" |
| | | v-show="swipercanvasData.length>1" |
| | | @click="nextClick" |
| | | > |
| | | <div class="icon-btn" slot="button-next"> |
| | | <i class="iconfont iconyou1"></i> |
| | | </div> |
| | |
| | | |
| | | }, |
| | | watch: { |
| | | 'Camera.cameraId':{ |
| | | handler(n,o){ |
| | | 'Camera.cameraId': { |
| | | handler (n, o) { |
| | | if (n) { |
| | | if (this.TreeDataPool.treeActiveName == "dataStack") { |
| | | this.stackFilesPage = 1; |
| | | this.stackFilesSize = 5; |
| | | this.stackId = n; |
| | | if(this.stackId){ |
| | | if (this.stackId) { |
| | | console.log('getStackFiles') |
| | | this.swipercanvasData = []; |
| | | this.getStackFiles() |
| | | } |
| | |
| | | } |
| | | }, |
| | | methods: { |
| | | prevClick(){ |
| | | prevClick () { |
| | | console.log(this.swiperIndex) |
| | | console.log(this.$refs.swiper.swiper.activeIndex) |
| | | if(this.swiperIndex == 0){ |
| | | if (this.swiperIndex == 0) { |
| | | console.log('本次分页的第一条') |
| | | //请求上一页 |
| | | if(this.stackFilesPage > 1){ |
| | | if (this.stackFilesPage > 1) { |
| | | this.stackFilesPage--; |
| | | this.getStackFiles(); |
| | | }else{ |
| | | } else { |
| | | this.$message({ |
| | | type:'info', |
| | | message:'当前已是第一页' |
| | | type: 'info', |
| | | message: '当前已是第一页' |
| | | }); |
| | | } |
| | | |
| | | |
| | | } |
| | | }, |
| | | nextClick(){ |
| | | nextClick () { |
| | | console.log(this.swiperIndex) |
| | | console.log(this.$refs.swiper.swiper.activeIndex) |
| | | if(this.swiperIndex == this.swipercanvasData.length-1){ |
| | | if (this.swiperIndex == this.swipercanvasData.length - 1) { |
| | | console.log('最后一张,加载更多') |
| | | //请求下一页 |
| | | this.stackFilesPage++; |
| | |
| | | }, |
| | | getStackFiles () { |
| | | this.getStackFileLoading = true; |
| | | let _this = this; |
| | | findAllFileByStackId({ name: '', stackId: this.stackId, page: this.stackFilesPage, size: this.stackFilesSize, type: 0 }).then(res => { |
| | | if (res && res.success ) { |
| | | if(res.data.dataList.length > 0){ |
| | | if (res && res.success) { |
| | | if (res.data.dataList.length > 0) { |
| | | this.swipercanvasData = []; |
| | | this.swipercanvasData = res.data.dataList.map(item => { |
| | | return { |
| | | name: item.name, |
| | | stackId: item.stack_id, |
| | | baseImg: item.type == 2 ? `/files/${item.identifier}.jpg` : item.snapshot_url, |
| | | baseImg: item.type == 2 ? `/files/${item.path.substr(item.path.lastIndexOf('/') + 1)}` : item.snapshot_url, |
| | | type: item.type, |
| | | id: item.id, |
| | | loading: false |
| | | } |
| | | }); |
| | | console.log(_this.swipercanvasData) |
| | | console.log(this.swipercanvasData) |
| | | this.swiperIndex = 0; |
| | | this.$refs.swiper.swiper.activeIndex = 0; |
| | | |
| | | }else{ |
| | | |
| | | } else { |
| | | console.log(this.swipercanvasData) |
| | | this.$message({ |
| | | type:'info', |
| | | message:'已无更多数据!' |
| | | type: 'info', |
| | | message: '已无更多数据!' |
| | | }); |
| | | } |
| | | }else{ |
| | | } else { |
| | | console.log(this.swipercanvasData) |
| | | this.$message({ |
| | | type:'error', |
| | | message:'数据请求失败,请稍后重试!' |
| | | type: 'error', |
| | | message: '数据请求失败,请稍后重试!' |
| | | }); |
| | | } |
| | | this.getStackFileLoading = false; |
| | | this.getStackFileLoading = false; |
| | | }).catch(e => { |
| | | console.log(e); |
| | | this.getStackFileLoading = false; |
| | |
| | | this.loading = false; |
| | | this.Camera.cameraId = id; |
| | | await this.Camera.update(); |
| | | debugger |
| | | |
| | | } |
| | | |
| | | this.$refs.timeSlider.activeTab = this.VideoManageData.TimeRules[0].id; |
| | |
| | | message: "策略保存成功!" |
| | | }); |
| | | //刷新左侧树 |
| | | debugger |
| | | |
| | | _this.$root.$children[0].$children[0].querySearchAsync('camera') |
| | | |
| | | } |
| | |
| | | }; |
| | | </script> |
| | | <style lang="scss"> |
| | | .el-message--info .el-message__content{ |
| | | .el-message--info .el-message__content { |
| | | color: #999; |
| | | } |
| | | .swiper-container { |
| | |
| | | placeholder="选关系"
|
| | | @change="selConnection(sdkItem)"
|
| | | >
|
| | | <el-option value="&&" title="and/且" label="and/且"></el-option>
|
| | | <el-option :value="item.value" :title="item.name" :label="item.name" v-for="item in sdkConnects" :key="item.id"></el-option>
|
| | | <!-- <el-option value="&&" title="and/且" label="and/且"></el-option>
|
| | | <el-option value="||" title="or/或" label="or/或"></el-option>
|
| | | <el-option value="=>" title="—>/触发" label="—>/触发"></el-option>
|
| | | <el-option value="=>" title="—>/触发" label="—>/触发"></el-option> -->
|
| | | </el-select>
|
| | | <el-checkbox
|
| | | v-show="sdkItem.rule_with_pre == '=>'"
|
| | | v-show="sdkItem.rule_with_pre == '=>' || sdkItem.rule_with_pre == '!=>'"
|
| | | v-model="sdkItem.is_save_anyhow"
|
| | | style="margin-left:30px"
|
| | | >保存过程数据</el-checkbox>
|
| | |
| | | sdkGroup: {
|
| | | handler(newV, oldV) {
|
| | | if (newV) {
|
| | | debugger
|
| | | |
| | | newV.forEach(sdk => {
|
| | | let rangeOne = sdk.defaultArg.find(
|
| | | arg => arg.operators[0].operator == 'range'
|
| | | )
|
| | | if (rangeOne) {
|
| | | debugger
|
| | | |
| | | if (rangeOne.min.trim() && rangeOne.max.trim()) {
|
| | | rangeOne.sdk_arg_value = rangeOne.min + '|' + rangeOne.max
|
| | | } else {
|
| | |
| | | }
|
| | | // ruleList: {
|
| | | // handler(newVal, oldVal) {
|
| | | // debugger
|
| | | // |
| | | // this.editHandle(newVal)
|
| | | // }
|
| | |
|
| | | // }
|
| | | },
|
| | | mounted() {
|
| | | |
| | | this.TaskMange.findAllSdk({ installed: true })
|
| | | //this.TaskMange.list1 = sdkJson.data;
|
| | |
|
| | |
| | | }
|
| | | },
|
| | | methods: {
|
| | | getSdkConnection(){
|
| | | console.log(this.VideoManageData.Dictionary)
|
| | | this.sdkConnects = this.VideoManageData.Dictionary['RULECOMPUTEBETWEEN'].map(r => {
|
| | | |
| | | return {
|
| | | name: r.name,
|
| | | value: r.value
|
| | | }
|
| | | });
|
| | | },
|
| | | selConnection(sdkItem) {
|
| | | debugger
|
| | | |
| | |
|
| | | },
|
| | | addSdkItem() {
|
| | |
| | | itemTemp.polygonObj = JSON.parse(JSON.stringify(this.allPolygonData[0]))
|
| | | this.selectPolygonOption(itemTemp)
|
| | | this.sdkGroup.push(itemTemp)
|
| | | |
| | | },
|
| | | delConfigItem(index) {
|
| | | debugger
|
| | | // if(index != 0){
|
| | | // this.sdkGroup.splice(index,1);
|
| | | // }else{
|
| | |
| | | }
|
| | | },
|
| | | selOptionalArg(sdkItem, optArgItem) {
|
| | | debugger
|
| | | |
| | | let newSort = 0
|
| | | sdkItem.optNames.forEach(name => {
|
| | | if (name.name == optArgItem.name) {
|
| | |
| | | console.log(argObj.valueOptions)
|
| | | },
|
| | | setOptArgValueOptions(optArg) {
|
| | | debugger
|
| | | |
| | | let alias = optArg.alias;
|
| | | console.log(this.VideoManageData.Dictionary[alias])
|
| | | optArg.valueOptions = this.VideoManageData.Dictionary[alias].map(r => {
|
| | |
| | | });
|
| | | },
|
| | | validateArgVal(sdkArgItem, e) {
|
| | | debugger
|
| | | |
| | | if (typeof (sdkArgItem.sdk_arg_value) == 'string' && sdkArgItem.sdk_arg_value == '') {
|
| | | this.$notify({
|
| | | type: 'warning',
|
| | |
| | | let res = sdkArgItem.range.match(reg)
|
| | | let min = Number(res[1]),
|
| | | max = Number(res[2])
|
| | | debugger
|
| | | |
| | |
|
| | | //判断非区间类
|
| | | if (sdkArgItem.sdk_arg_value && sdkArgItem.operator != 'range') {
|
| | |
| | | this.valideArgValue(rule)
|
| | | },
|
| | | selectPolygonOption(rule) {
|
| | | debugger
|
| | | |
| | | rule.polygon_id = rule.polygonObj.polygonId
|
| | | ? rule.polygonObj.polygonId
|
| | | : rule.polygon_id
|
| | |
| | | },
|
| | | //选择算法 resetArgs为true是添加为false是初始化编辑
|
| | | selectSDKOption(sdkItem, resetArgs) {
|
| | | debugger
|
| | | |
| | | //sdkItem.sdk_id = sdkItem.sdkObj.id;
|
| | | if (resetArgs) {
|
| | | sdkItem.argDef = JSON.parse(sdkItem.sdkObj.argDef)
|
| | |
| | |
|
| | | if (arg.operators[0].operator == 'range') {
|
| | | //区间值的处理
|
| | | debugger
|
| | | |
| | | //this.$set(arg, 'sdk_arg_value', arg.min+','+arg.max)
|
| | | //this.$set(arg, 'sdk_arg_value', arg.range.substring(1,arg.range.length-1));
|
| | | }
|
| | | }
|
| | | debugger
|
| | | |
| | | if(arg.type == 'option'){
|
| | | this.setOptArgValueOptions(arg)
|
| | | }
|
| | |
| | | sort: arg.sort,
|
| | | isSelected: false
|
| | | }))
|
| | | debugger
|
| | | |
| | | sdkItem.initAddOptional = sdkItem.optionalArg.length > 0 ? true : false
|
| | | sdkItem.optArg = []
|
| | | }
|
| | |
|
| | | //添加场景时,如果场景名称为空,就将选择的第一个算法名同步到场景名称
|
| | | if (this.sdkGroup[0] && resetArgs) {
|
| | | debugger
|
| | | |
| | | this.$emit('sdkNameChange', this.sdkGroup[0].sdkObj.sdk_name)
|
| | | }
|
| | |
|
| | |
| | | },
|
| | | //选择算法配置
|
| | | selOperator(rule) {
|
| | | debugger
|
| | | |
| | | },
|
| | | selectArgsOption(rule, resetArgValue) {
|
| | | // rule.operator_type = "";
|
| | |
| | | this.groupRules.splice(index + 1, 0, newRule)
|
| | | },
|
| | | editHandle(ruleTxt) {
|
| | | debugger
|
| | | |
| | | // if (ruleTxt.length < 1) {
|
| | | // return
|
| | | // }
|
| | |
| | | // }
|
| | | },
|
| | | editRule(ruleGroup) {
|
| | | debugger
|
| | | |
| | | this.sdkGroup = []
|
| | | this.group_id = ''
|
| | |
|
| | | ruleGroup.forEach(rule => {
|
| | | debugger
|
| | | |
| | | let tempObj = {}
|
| | |
|
| | | if (rule.group_id && rule.group_id != '') {
|
| | |
| | | sdkObj = this.TaskMange.list1.find(sdk => sdk.id == rule.sdk_id)
|
| | |
|
| | | argDef = JSON.parse(sdkObj.argDef)
|
| | | debugger
|
| | | |
| | | defaultArg = argDef.filter(arg => !arg.config.isOptional)
|
| | | optionalArg = argDef.filter(arg => arg.config.isOptional)
|
| | |
|
| | |
| | |
|
| | | }
|
| | | //在push之前,需要判断是否配置了这个可选项 在sdk_set配置数组里,
|
| | | debugger
|
| | | |
| | | optArg.push(optItem)
|
| | |
|
| | | } else {
|
| | |
| | | if (d.sort == arg.sort) {
|
| | |
|
| | | if (arg.sdk_arg_value.indexOf('|') > 0) {
|
| | | debugger
|
| | | |
| | | //区间值
|
| | | d.min = arg.sdk_arg_value.split(',')[0];
|
| | | d.max = arg.sdk_arg_value.split(',')[1];
|
| | | d.operator = 'range'
|
| | | //} else if(arg.sdk_arg_value.indexOf(',') > 0){
|
| | | } else if(arg.operator_type == 'option'){
|
| | | debugger
|
| | | |
| | | //多选类型的值
|
| | | d.sdk_arg_value = arg.sdk_arg_value.split(',');
|
| | | this.setOptArgValueOptions(d)
|
| | |
| | | tempObj.isAddable = false;
|
| | | }
|
| | | //this.selectSDKOption(tempObj, false)
|
| | | debugger
|
| | | |
| | | this.sdkGroup.push(tempObj)
|
| | | //设置算法
|
| | | })
|
| | |
| | | .catch(() => { })
|
| | | },
|
| | | submitRule() {
|
| | | debugger
|
| | | |
| | | let groupRule = { rules: [] }
|
| | |
|
| | | let group_text = ''
|
| | |
| | | } else {
|
| | | //校验必填项
|
| | | let undefinished = this.sdkGroup.some((sdk, index) => {
|
| | | debugger
|
| | | |
| | | //没有配置算法
|
| | | if (Object.keys(sdk.sdkObj).length == 0) {
|
| | | return sdk
|
| | |
| | | if (sdk.rule_with_pre === '' && index != 0) {
|
| | | return sdk
|
| | | }
|
| | | debugger
|
| | | |
| | | //处理未展示的参数的值
|
| | | sdk.defaultArg.forEach(arg => {
|
| | | if(!arg.config.isShow){
|
| | |
| | | } else {
|
| | | //区间类参数值最小,最大值是否都设置
|
| | | if (arg.operator == 'range') {
|
| | | debugger
|
| | | |
| | | if (!arg.min.trim() && arg.max.trim()) {
|
| | | return arg
|
| | | }
|
| | |
| | | }
|
| | | //校验若算法关系为触发,则算法名不能重
|
| | | let sameSdk = this.sdkGroup.some((sdk, index) => {
|
| | | debugger
|
| | | |
| | | if (sdk.index != 0 && sdk.rule_with_pre == '=>') {
|
| | | debugger
|
| | | |
| | | if (sdk.sdkObj.id == this.sdkGroup[index - 1].sdkObj.id) {
|
| | | return sdk
|
| | | }
|
| | |
| | | }
|
| | | if (arg.operator == 'range') {
|
| | | let valRange = '';
|
| | | debugger
|
| | | |
| | | valRange = arg.sdk_arg_value.replace(',', '-');
|
| | | defaultArgDesc += `${arg.name}${arg.operators[0].name}${valRange}${arg.unit || ''}, `
|
| | | } else {
|
| | |
| | | }
|
| | |
|
| | | });
|
| | | debugger;
|
| | | ;
|
| | | defaultArgDesc = defaultArgDesc.substring(0, defaultArgDesc.length - 2);
|
| | |
|
| | | //defaultArgDesc = defaultArgDesc.substring(0,defaultArgDesc.length-3)+defaultArgDesc.substring(defaultArgDesc.length-1,defaultArgDesc.length);
|
| | |
| | | case '=>':
|
| | | rule_with_pre = ' -> '
|
| | | break
|
| | | case '!=>':
|
| | | rule_with_pre = ' !-> '
|
| | | break
|
| | | default:
|
| | | rule_with_pre = ''
|
| | | }
|
| | | }
|
| | | debugger;
|
| | | ;
|
| | | group_text += `${rule_with_pre ? "<br/>" + rule_with_pre + "<br/>" : ""} <span style="background-color:RGB(183,183,183);">${
|
| | | sdk.sdkObj.sdk_name
|
| | | }</span> ${
|
| | |
| | | group_text.substring(0, group_text.length - 3) +
|
| | | group_text.substring(group_text.length - 2, group_text.length)
|
| | | }
|
| | | debugger
|
| | | |
| | | })
|
| | | console.log(group_text)
|
| | | }
|
| | |
| | | <template> |
| | | <div class v-loading="vLoading" :style="`width: ${currentWidth}px;height:${currentHeight}px`"> |
| | | <div class="web-site"> |
| | | <a href="http://www.aiotlink.com" target="_blank">www.aiotlink.com</a> |
| | | <a href="http://www.smartai.com" target="_blank">www.smartai.com</a> |
| | | </div> |
| | | <licence /> |
| | | <div class="right-bg" style> |
| | |
| | | </el-form-item> |
| | | </el-form> |
| | | </div> |
| | | <p class="gradient-text gradient-text-one">——— {{serverTitle || '智 能 计 算 节 点 — ReID'}} ———</p> |
| | | <p class="gradient-text gradient-text-one">——— {{serverTitle || 'SmartAI — ReID'}} ———</p> |
| | | </div> |
| | | </div> |
| | | </template> |
| | |
| | | async getServerName() { |
| | | let res = await getServerName() |
| | | if (res && res.success) { |
| | | console.log(res.data.serverName) |
| | | this.serverTitle = res.data.serverName |
| | | window.document.title = res.data.serverName |
| | | ? res.data.serverName |
| | | : '智 能 计 算 节 点' |
| | | : 'SmartAI' |
| | | sessionStorage.setItem('title', res.data.serverName) |
| | | } |
| | | }, |
| | |
| | | this.getServerName() |
| | | this.getScreenHeight() |
| | | }, |
| | | mounted(){ |
| | | console.log(this.serverTitle) |
| | | }, |
| | | watch: {}, |
| | | beforeDestroy() { |
| | | window.onresize = null |
| | |
| | | <el-tab-pane label="集群管理" name="third"> |
| | | <cluster-management></cluster-management> |
| | | </el-tab-pane> |
| | | <el-tab-pane label="外部访问" name="fourth"> |
| | | <!-- <el-tab-pane label="外部访问" name="fourth"> |
| | | <el-menu |
| | | :default-openeds="openeds" |
| | | background-color="#fff" |
| | |
| | | </el-submenu> |
| | | |
| | | </el-menu> |
| | | </el-tab-pane> |
| | | </el-tab-pane> --> |
| | | <el-tab-pane label="权限管理" name="user"> |
| | | <authority-management v-if="activeName === 'user'"></authority-management> |
| | | </el-tab-pane> |
| | |
| | | <el-col :span="12"> |
| | | <el-tabs v-model="activeName" id="e-alaycluster" v-if="!isHasColony"> |
| | | <el-tab-pane label="创建集群" name="1" :disabled="isHasColony"> |
| | | <el-form :model="ruleForm" :rules="rules" ref="ruleForm" label-width="80px"> |
| | | <el-form :model="ruleForm" :rules="rules" ref="ruleForm" label-width="100px"> |
| | | <el-form-item label="集群名称" prop="clustername"> |
| | | <el-input v-model="ruleForm.clustername" placeholder="手动输入, 如“集群A”" size="small"></el-input> |
| | | </el-form-item> |
| | |
| | | <el-button type="text" slot="suffix" @click="generatePassword">生成密码</el-button> |
| | | </el-input> |
| | | </el-form-item> |
| | | |
| | | <!-- <el-form-item label="虚拟IP" prop="virtualip"> |
| | | <ip-input :ip="ruleForm.virtualip" :on-blur="onIpBlur"></ip-input> |
| | | </el-form-item>--> |
| | | <el-form-item label="虚拟/外部IP" prop="virtualIp"> |
| | | <ip-input :ip="ruleForm.virtualIp" :on-blur="onIpBlur"></ip-input> |
| | | </el-form-item> |
| | | <el-form-item style="width:500px"> |
| | | <el-button type="primary" size="small" @click="submitForm('ruleForm')">保存</el-button> |
| | | </el-form-item> |
| | |
| | | </el-tabs> |
| | | <!-- 有集群的情况 --> |
| | | <div v-if="isHasColony" id="h-alaycluster"> |
| | | <el-form :model="ruleForm" ref="ruleForm" label-width="80px"> |
| | | <el-form :model="ruleForm" ref="ruleForm" label-width="100px"> |
| | | <el-form-item label="集群名称" prop="clustername"> |
| | | <el-input v-model="ruleForm.clustername" placeholder="手动输入, 如“集群A”" size="small"></el-input> |
| | | </el-form-item> |
| | |
| | | ></el-input> |
| | | </el-form-item> |
| | | |
| | | <!-- <el-form-item label="虚拟IP" prop="virtualip"> |
| | | <ip-input :ip="ruleForm.virtualip" :on-blur="onIpBlur"></ip-input> |
| | | </el-form-item>--> |
| | | <el-form-item label="虚拟IP" prop="virtualIp"> |
| | | <ip-input :ip="ruleForm.virtualIp" :on-blur="onIpBlur"></ip-input> |
| | | </el-form-item> |
| | | <el-form-item style="width:440px;text-align: right;"> |
| | | <el-button size="small" type="danger" @click="leave">退出集群</el-button> |
| | | <el-button |
| | |
| | | </el-form> |
| | | </div> |
| | | </el-col> |
| | | <el-col :span="10" style="height: 100%;" v-if="members.length !== 0"> |
| | | <el-col :span="12" style="height: 100%;" v-if="members.length !== 0"> |
| | | <serfDiagram |
| | | ref="diagram" |
| | | :members="members" |
| | | :agent="agentName" |
| | | v-loading="loading" |
| | | @selected-node="joinNode" |
| | | class="nodes-svg" |
| | | ></serfDiagram> |
| | | </el-col> |
| | | </el-row> |
| | | <div class="ui-top-view"> |
| | | <div class="ui-top-title">漂移IP</div> |
| | | </div> |
| | | <el-row> |
| | | <el-col :span="12"> |
| | | <el-form :model="vrIpForm" ref="vrIpForm" :rules="vrIpRules" style="padding:20px 40px;"> |
| | | <el-form-item label="虚拟IP" prop="virtual_ip"> |
| | | <ip-input :ip="vrIpForm.virtual_ip" :on-blur="onIpBlur"></ip-input> |
| | | <el-switch v-model="vrIpForm.enable" style="margin-left:30px;"></el-switch> |
| | | </el-form-item> |
| | | <el-form-item style="width:500px"> |
| | | <el-button type="primary" size="small" @click="saveForm('vrIpForm')">保存</el-button> |
| | | </el-form-item> |
| | | </el-form> |
| | | </el-col> |
| | | </el-row> |
| | | |
| | | <div class="ui-top-view"> |
| | | <div class="ui-top-title">存储集群管理</div> |
| | | </div> |
| | |
| | | </el-tabs> |
| | | </el-col> |
| | | </el-row> |
| | | |
| | | </div> |
| | | </template> |
| | | |
| | |
| | | |
| | | import serfDiagram from "@/components/serfDiagram"; |
| | | import ipInput from "@/components/subComponents/IPInput"; |
| | | |
| | | import {isIPv4} from "@/scripts/validate"; |
| | | export default { |
| | | components: { |
| | | serfDiagram, |
| | |
| | | } |
| | | }, 1000); |
| | | }; |
| | | |
| | | return { |
| | | activeName: "1", |
| | | sActiveName: "s-first", |
| | |
| | | ruleForm: { |
| | | clustername: "", |
| | | clusterpwd: "", |
| | | //virtualip: "" |
| | | virtualIp: "" |
| | | }, |
| | | vrIpForm: { |
| | | enable: true, |
| | |
| | | { required: true, message: "请输入集群名称", trigger: "change" } |
| | | ], |
| | | clusterpwd: [{ validator: checkPwd, trigger: "change" }], |
| | | // virtualip: [ |
| | | // { required: true, message: "请输入虚拟IP", trigger: "change" } |
| | | // ] |
| | | }, |
| | | vrIpRules: { |
| | | virtualip: [ |
| | | { required: true, message: "请输入虚拟IP", trigger: "change" } |
| | | virtualIp: [ |
| | | { required: true, validator: isIPv4, trigger: "change" } |
| | | ] |
| | | }, |
| | | // vrIpRules: { |
| | | // virtualIp: [ |
| | | // { required: true, message: "请输入虚拟IP", trigger: "change" } |
| | | // ] |
| | | // }, |
| | | joinRules: { |
| | | clusterpwd: [ |
| | | { required: true, message: "请输入集群密码", trigger: "change" }, |
| | |
| | | submitForm(formName) { |
| | | this.$refs[formName].validate(valid => { |
| | | if (valid) { |
| | | debugger |
| | | //alert("submit!"); |
| | | let json = { |
| | | clusterId: this.clusterid, |
| | | clusterName: this.ruleForm.clustername, |
| | | password: this.ruleForm.clusterpwd, |
| | | //virtualip: this.ruleForm.virtualip |
| | | virtualIp: this.ruleForm.virtualIp |
| | | }; |
| | | this.createCluster(json).then(() => { |
| | | this.findCluster(); |
| | |
| | | } |
| | | }); |
| | | }, |
| | | |
| | | saveForm(formName) { |
| | | this.$refs[formName].validate(valid => { |
| | | if (valid) { |
| | |
| | | } |
| | | }); |
| | | }, |
| | | join(formName) { |
| | | |
| | | join (formName) { |
| | | this.$refs[formName].validate(valid => { |
| | | if (valid) { |
| | | if (Object.keys(this.currentCluster).length === 0) { |
| | |
| | | this.clusterid = res.data.clusterId; |
| | | this.ruleForm.clustername = res.data.clusterName; |
| | | this.ruleForm.clusterpwd = res.data.clusterpwd |
| | | //this.ruleForm.virtualip = res.data.virtualip |
| | | this.ruleForm.virtualIp = res.data.virtualIp |
| | | let list = res.data.nodes.map(i => { |
| | | debugger |
| | | let obj = {}; |
| | | obj.device_type = i.device_type; |
| | | obj.cluster_id = i.cluster_id; |
| | | obj.clusterName = res.data.clusterName; |
| | | obj.create_time = i.create_time; |
| | |
| | | |
| | | this.ruleForm.clusterpwd = uuid.join(""); |
| | | }, |
| | | onIpBlur(ip) { |
| | | this.vrIpForm.virtual_ip = ip; |
| | | }, |
| | | |
| | | async getEsClusterNodes() { |
| | | let rsp = await getDevInfo(); |
| | | let hostIpAddr = ""; |
| | |
| | | message: rsp.msg |
| | | }); |
| | | }) |
| | | }, |
| | | onIpBlur (ip) { |
| | | //this.vrIpForm.virtual_ip = ip; |
| | | this.ruleForm.virtualIp = ip; |
| | | console.log(this.ruleForm.virtualIp) |
| | | } |
| | | } |
| | | |
| | | |
| | | |
| | | }, |
| | | mounted () { |
| | | this.findCluster(); |
| | | |
| | | }, |
| | | created () { } |
| | | |
| | | }; |
| | | </script> |
| | | <style lang="scss"> |
| | |
| | | height: 30px; |
| | | line-height: 30px; |
| | | } |
| | | .nodes-svg{ |
| | | background-color: aquamarine; |
| | | } |
| | | </style> |