| | |
| | | }); |
| | | |
| | | //安装应用 |
| | | export const installApp = (data:any) => request({ |
| | | url: '/data/api-v/app/install', |
| | | method: 'post', |
| | | data |
| | | export const installApp = (query:any) => request({ |
| | | url: '/data/api-v/sdk/sdkDownload', |
| | | method: 'get', |
| | | params: query |
| | | }); |
| | | //卸载应用 |
| | | export const removeApp = (data:any)=> request({ |
| | |
| | | <template lang='pug'> |
| | | .net |
| | | .arrow_box(:style="toolTipStyle") |
| | | p {{toolTipAddr}} |
| | | d3-network( |
| | | ref='net' |
| | | :net-nodes="nodes" |
| | |
| | | // } |
| | | // this.selectNodesLinks() |
| | | // this.$set(this.nodes, node.index, node) |
| | | |
| | | console.log(event,node) |
| | | debugger |
| | | if (event.timeStamp - this.movement < 200) { |
| | | this.$emit("selected-node", event, this.members[node.id]); |
| | | } |
| | |
| | | </div>
|
| | | </div>
|
| | | </div>
|
| | | <el-dialog
|
| | | title="安装包信息"
|
| | | :visible.sync="installDialogVisible"
|
| | | width="40%"
|
| | | :close-on-click-modal="false"
|
| | | >
|
| | | <div class="installInfo">
|
| | | <template v-if="installAppPackage != null">
|
| | | <div>
|
| | | <div>
|
| | | <span>安装包名称:</span>
|
| | | <span>{{installAppPackage.productName}}</span>
|
| | | </div>
|
| | | <div>
|
| | | <span>安装版本:</span>
|
| | | <span>{{installAppPackage.version}}</span>
|
| | | </div>
|
| | | <div>
|
| | | <span>更新内容:</span>
|
| | | <span>{{installAppPackage.installContent}}</span>
|
| | | </div>
|
| | | </div>
|
| | | </template>
|
| | | <template v-if="installSdkPackage != null">
|
| | | <div>
|
| | | <div>
|
| | | <span>安装包名称:</span>
|
| | | <span>{{installSdkPackage.productName}}</span>
|
| | | </div>
|
| | | <div>
|
| | | <span>安装版本:</span>
|
| | | <span>{{installSdkPackage.version}}</span>
|
| | | </div>
|
| | | <div>
|
| | | <span>更新内容:</span>
|
| | | <span>{{installSdkPackage.installContent}}</span>
|
| | | </div>
|
| | | </div>
|
| | | </template>
|
| | | <p>确定安装?</p>
|
| | | </div>
|
| | | <div slot="footer" class="dialog-footer">
|
| | | <el-button @click="installDialogVisible = false">取 消</el-button>
|
| | | <el-button type="primary" @click="offlineInstall">安 装</el-button>
|
| | | </div>
|
| | | </el-dialog>
|
| | | </div>
|
| | | </template>
|
| | | <script>
|
| | |
| | | findByType,
|
| | | getTagList,
|
| | | downloadSdk,
|
| | | installSdk
|
| | | installSdk,
|
| | | getInstallInfo
|
| | | } from "./api";
|
| | | import { getApps, installApp, removeApp, getUnActivedSdk, actPageAlg, getUnActivedApp, actApp } from "@/api/app";
|
| | |
|
| | |
| | | sceneSdks: [],
|
| | | sceneRuleList: "",
|
| | | isInstall: false,
|
| | | installDialogVisible: false,
|
| | | installPackage: {},
|
| | | installAppPackage: null,
|
| | | installSdkPackage: null,
|
| | | installPercentage: 0,
|
| | | unActivedSDKList: [],
|
| | | unActivedAppList: [],
|
| | |
| | | // unloadLoading: false,
|
| | | // installLoading: false,
|
| | | installedApps: [],
|
| | | storeApps: []
|
| | | storeApps: [],
|
| | | installFile: {}
|
| | | }
|
| | | },
|
| | | watch: {
|
| | |
| | | this.VideoManageData.init();
|
| | | },
|
| | | methods: {
|
| | | offlineInstall () {
|
| | | this.installDialogVisible = false;
|
| | | this.isInstall = true;
|
| | | //安装
|
| | | installSdk(this.installFile).then(res => {
|
| | | debugger
|
| | | if (res.success) {
|
| | | this.isInstall = false;
|
| | | this.$message({
|
| | | type: 'success',
|
| | | message: '安装成功,将跳转至我的算法中查看'
|
| | | });
|
| | | setTimeout(() => {
|
| | | this.findAllSdk();
|
| | | this.getAllApps();
|
| | | this.activeName = 'myAlgorithm';
|
| | | }, 3000)
|
| | | }
|
| | |
|
| | | }).catch(e => {
|
| | | console.log(e)
|
| | | this.isInstall = false;
|
| | | this.$message({
|
| | | type: 'error',
|
| | | message: e.data
|
| | | });
|
| | | })
|
| | | },
|
| | | downloadApp (app) {
|
| | | app.installLoading = true;
|
| | | let _this = this;
|
| | | installApp(app).then(res => {
|
| | | installApp({ path: app.id }).then(res => {
|
| | | if (res && res.success) {
|
| | | setTimeout(() => {
|
| | | app.installLoading = false;
|
| | |
| | | this.patchFile = { ...file };
|
| | | this.fileAdded = true;
|
| | | const h = this.$createElement;
|
| | | //上传完成获取安装信息
|
| | | let _this = this;
|
| | | getInstallInfo(file).then(res => {
|
| | | _this.installFile = file;
|
| | | if (res.success) {
|
| | | _this.installDialogVisible = true;
|
| | | debugger
|
| | | if (res.data.apps.length > 0) {
|
| | | _this.installAppPackage = {
|
| | | appId: res.data.apps[0].appId,
|
| | | version: res.data.apps[0].version,
|
| | | productName: res.data.productName,
|
| | | installContent: res.data.apps[0].installContent
|
| | | }
|
| | | }
|
| | | if (res.data.sdks.length > 0) {
|
| | | _this.installSdkPackage = {
|
| | | appId: res.data.sdks[0].sdkId,
|
| | | version: res.data.sdks[0].version,
|
| | | productName: res.data.productName,
|
| | | installContent: res.data.sdks[0].installContent
|
| | | }
|
| | | }
|
| | |
|
| | | // this.$confirm('', '算法信息', {
|
| | | // message: `<div class="installInfo">
|
| | | // <div><span>算法名称:</span><span>${file.filename}</span></div>
|
| | | // <div><span>安装版本:</span><span></span></div>
|
| | | // <div><span>更新内容:</span><span></span></div>
|
| | | // <p>确定安装此算法?</p>
|
| | | // </div>`,
|
| | | // confirmButtonText: '安装',
|
| | | // cancelButtonText: '取消',
|
| | | // dangerouslyUseHTMLString: true,
|
| | | // type: ''
|
| | | // }).then(() => {
|
| | | // this.isInstall = true;
|
| | | // //安装
|
| | | // installSdk(file).then(res => {
|
| | | // debugger
|
| | | // if (res.success) {
|
| | | // this.isInstall = false;
|
| | | // //this.$refs['progressBar'].style.width = 100%
|
| | | // //this.installPercentage = 100%
|
| | | // this.$message({
|
| | | // type: 'success',
|
| | | // message: '安装成功,将跳转至我的算法中查看'
|
| | | // });
|
| | | // setTimeout(() => {
|
| | | // this.findAllSdk();
|
| | | // this.activeName = 'myAlgorithm';
|
| | | // }, 3000)
|
| | | // }
|
| | |
|
| | | // }).catch(e => {
|
| | | // console.log(e)
|
| | | // this.isInstall = false;
|
| | | // this.$message({
|
| | | // type: 'error',
|
| | | // message: e.data
|
| | | // });
|
| | | // })
|
| | | // }).catch(() => {
|
| | | // console.log('取消安装');
|
| | |
|
| | | // })
|
| | | }
|
| | | }).catch(e => {
|
| | | this.$message({
|
| | | type: 'error',
|
| | | message: e.data
|
| | | });
|
| | | })
|
| | | // this.$msgbox({
|
| | | // title: '算法信息',
|
| | | // message: h('div', null, [
|
| | |
| | | // });
|
| | | // });
|
| | |
|
| | | this.$confirm('', '算法信息', {
|
| | | message: `<div class="installInfo">
|
| | | <div><span>算法名称:</span><span>${file.filename}</span></div>
|
| | | <div><span>安装版本:</span><span></span></div>
|
| | | <div><span>更新内容:</span><span></span></div>
|
| | | <p>确定安装此算法?</p>
|
| | | </div>`,
|
| | | confirmButtonText: '安装',
|
| | | cancelButtonText: '取消',
|
| | | dangerouslyUseHTMLString: true,
|
| | | type: ''
|
| | | }).then(() => {
|
| | | this.isInstall = true;
|
| | | //安装
|
| | | installSdk(file).then(res => {
|
| | | if (res.success) {
|
| | |
|
| | | this.isInstall = false;
|
| | | //this.$refs['progressBar'].style.width = 100%
|
| | | //this.installPercentage = 100%
|
| | | this.$message({
|
| | | type: 'success',
|
| | | message: '安装成功,将跳转至我的算法中查看'
|
| | | });
|
| | | setTimeout(() => {
|
| | | this.findAllSdk();
|
| | | this.activeName = 'myAlgorithm';
|
| | | }, 3000)
|
| | | }
|
| | | });
|
| | | }).catch(() => {
|
| | | console.log('取消安装')
|
| | | })
|
| | |
|
| | | },
|
| | |
|
| | |
| | | .installInfo {
|
| | | text-indent: 2em;
|
| | | font-size: 14px;
|
| | | color: #777;
|
| | | line-height: 26px;
|
| | | p {
|
| | | text-align: center;
|
| | | color: #666;
|
| | | }
|
| | | }
|
| | | .src-title {
|
| | |
| | | data: query
|
| | | })
|
| | | }
|
| | |
|
| | | //安装算法
|
| | | export const downloadSdk = (query: any) => {
|
| | | return request({
|
| | | url: '/data/api-v/sdk/sdkDownload',
|
| | |
| | | params: query
|
| | | })
|
| | | }
|
| | |
|
| | | //上传完成获取安装信息
|
| | | export const getInstallInfo = (data: any) => {
|
| | | return request({
|
| | | url: '/data/api-v/sdk/showInstallInfo',
|
| | | method: 'post',
|
| | | params: data
|
| | | })
|
| | | }
|
| | | //安装已上传的算法接口
|
| | | export const installSdk = (file: any) => {
|
| | | return request({
|
| | |
| | | <div class="ui-top-title">视频分析集群管理</div> |
| | | </div> |
| | | <el-row> |
| | | <el-col :span="12"> |
| | | <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-item label="虚拟IP" prop="virtualip"> |
| | | <ip-input :ip="ruleForm.virtualip" :on-blur="onIpBlur"></ip-input> |
| | | </el-form-item> --> |
| | | </el-form-item>--> |
| | | <el-form-item style="width:500px"> |
| | | <el-button type="primary" size="small" @click="submitForm('ruleForm')">保存</el-button> |
| | | </el-form-item> |
| | | </el-form> |
| | | </el-tab-pane> |
| | | |
| | | |
| | | <!-- 加入已有集群 --> |
| | | <el-tab-pane label="加入已有集群" name="3" :disabled="isHasColony"> |
| | | <el-tab-pane label="加入已有集群" name="2" :disabled="isHasColony"> |
| | | <el-form label-width="80px" :model="joinForm" :rules="joinRules" ref="joinForm"> |
| | | <el-form-item label="IP地址" style="width:440px"> |
| | | <el-input v-model="joinForm.clusterip" placeholder="请输入集群内任意IP地址" size="small"> |
| | | <el-input |
| | | v-model="joinForm.clusterip" |
| | | placeholder="请输入集群内任意IP地址" |
| | | size="small" |
| | | autocomplete="new-password" |
| | | > |
| | | <el-button |
| | | type="text" |
| | | slot="suffix" |
| | |
| | | placeholder="请输入集群密码" |
| | | show-password |
| | | size="small" |
| | | autocomplete="new-password" |
| | | ></el-input> |
| | | </el-form-item> |
| | | <el-form-item style="width:440px"> |
| | |
| | | |
| | | <!-- <el-form-item label="虚拟IP" prop="virtualip"> |
| | | <ip-input :ip="ruleForm.virtualip" :on-blur="onIpBlur"></ip-input> |
| | | </el-form-item> --> |
| | | </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="14" style="height: 100%;" v-if="members.length !== 0"> |
| | | <el-col :span="10" style="height: 100%;" v-if="members.length !== 0"> |
| | | <serfDiagram |
| | | ref="diagram" |
| | | :members="members" |
| | |
| | | <el-tab-pane label="加入已有集群" name="s-second"> |
| | | <el-form label-width="80px"> |
| | | <el-form-item label="IP地址" style="text-align: left;"> |
| | | <el-input v-model="clusterip2" placeholder="请输入集群内任意IP地址" size="small"> |
| | | <el-input |
| | | v-model="clusterip2" |
| | | placeholder="请输入集群内任意IP地址" |
| | | size="small" |
| | | autocomplete="off" |
| | | > |
| | | <el-button |
| | | type="text" |
| | | slot="suffix" |
| | |
| | | serfDiagram, |
| | | ipInput |
| | | }, |
| | | data() { |
| | | data () { |
| | | const checkPwd = (rule, value, callback) => { |
| | | if (!value) { |
| | | return callback(new Error("密码不能为空")); |
| | |
| | | }, |
| | | watch: {}, |
| | | methods: { |
| | | cleanValue() { |
| | | cleanValue () { |
| | | this.members = []; |
| | | }, |
| | | sHandleClick(tab, event) { |
| | | sHandleClick (tab, event) { |
| | | console.log(tab, event); |
| | | }, |
| | | submitForm(formName) { |
| | | submitForm (formName) { |
| | | this.$refs[formName].validate(valid => { |
| | | if (valid) { |
| | | alert("submit!"); |
| | | //alert("submit!"); |
| | | let json = { |
| | | clusterId: this.clusterid, |
| | | clusterName: this.ruleForm.clustername, |
| | |
| | | } |
| | | }); |
| | | }, |
| | | saveForm(formName) { |
| | | saveForm (formName) { |
| | | debugger |
| | | this.$refs[formName].validate(valid => { |
| | | if (valid) { |
| | |
| | | enable: this.vrIpForm.enable, |
| | | serve_port: this.vrIpForm.serve_port, |
| | | virtual_ip: this.vrIpForm.virtual_ip, |
| | | |
| | | |
| | | }; |
| | | setVrrp(json).then(() => { |
| | | this.getVrrpInfo(); |
| | |
| | | } |
| | | }); |
| | | }, |
| | | join(formName) { |
| | | join (formName) { |
| | | this.$refs[formName].validate(valid => { |
| | | if (valid) { |
| | | if (Object.keys(this.currentCluster).length === 0) { |
| | |
| | | } |
| | | }); |
| | | }, |
| | | async createColony(json) { |
| | | async createColony (json) { |
| | | let res = await createColony(json); |
| | | console.log(res, "创建集群"); |
| | | this.$notify({ |
| | |
| | | type: res.success ? "success" : "error" |
| | | }); |
| | | }, |
| | | async randomPwd() { |
| | | async randomPwd () { |
| | | let res = await randomPwd(); |
| | | if (res && res.success) { |
| | | this.ruleForm.clusterpwd = res.data; |
| | | } |
| | | }, |
| | | async searchColony() { |
| | | async searchColony () { |
| | | this.$refs["joinForm"].validate(valid => { |
| | | if (valid) { |
| | | this.members = []; |
| | | let json = { |
| | | password: this.joinForm.clusterpwd, |
| | | ip: this.joinForm.clusterip |
| | |
| | | } |
| | | }); |
| | | }, |
| | | async search(json) { |
| | | async search (json) { |
| | | let res = await search(json); |
| | | if (res && res.success) { |
| | | console.log(res, "搜索集群"); |
| | |
| | | this.stopSearch(); |
| | | }, 10 * 1000); |
| | | }, |
| | | async getSearchNodes() { |
| | | async getSearchNodes () { |
| | | let res = await getSearchNodes(); |
| | | if (res && res.success) { |
| | | let list = res.data.map(i => { |
| | |
| | | }); |
| | | } |
| | | }, |
| | | setSchedule() { |
| | | setSchedule () { |
| | | this.scheduleId = window.setInterval(() => { |
| | | this.getSearchNodes(); |
| | | }, 1000); |
| | | }, |
| | | async stopSearch() { |
| | | async stopSearch () { |
| | | if (!this.loading) { |
| | | return true; |
| | | } |
| | |
| | | // },2000) |
| | | }) |
| | | }, |
| | | async findCluster() { |
| | | async findCluster () { |
| | | let res = await findCluster(); |
| | | if (res && res.success) { |
| | | if (res.data && res.data.clusterId) { |
| | |
| | | } |
| | | } |
| | | }, |
| | | getVrrpInfo(){ |
| | | getVrrp().then(res=>{ |
| | | if(res.success){ |
| | | getVrrpInfo () { |
| | | getVrrp().then(res => { |
| | | if (res.success) { |
| | | this.vrIpForm.virtual_ip = res.data.virtual_ip; |
| | | this.vrIpForm.enable = res.data.enable; |
| | | } |
| | | }).catch(e=>{ |
| | | }).catch(e => { |
| | | console.log(e) |
| | | }) |
| | | }, |
| | | async updateClusterName() { |
| | | async updateClusterName () { |
| | | let res = await updateClusterName({ |
| | | clusterName: this.mangeForm.colonyName |
| | | }); |
| | |
| | | type: res.success ? "success" : "error" |
| | | }); |
| | | }, |
| | | async joinCluster(json) { |
| | | async joinCluster (json) { |
| | | let res = await joinCluster(json); |
| | | if (res.success) { |
| | | this.members = [] |
| | |
| | | type: res.success ? "success" : "error" |
| | | }); |
| | | }, |
| | | leave() { |
| | | leave () { |
| | | this.$confirm(`确定退出集群吗?`, { |
| | | center: true, |
| | | cancelButtonClass: "comfirm-class-cancle", |
| | |
| | | this.members = []; |
| | | } |
| | | }).catch(() => { }); |
| | | |
| | | |
| | | }, |
| | | joinNode(event, node) { |
| | | joinNode (event, node) { |
| | | debugger |
| | | this.currentCluster.cluster_id = node.cluster_id; |
| | | if (this.activeName === "3") { |
| | | this.manageForm.clustername = node.clusterName; |
| | |
| | | }); |
| | | } |
| | | }, |
| | | generatePassword() { |
| | | generatePassword () { |
| | | var chars = |
| | | "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; |
| | | var uuid = []; |
| | |
| | | |
| | | this.ruleForm.clusterpwd = uuid.join(""); |
| | | }, |
| | | onIpBlur(ip) { |
| | | onIpBlur (ip) { |
| | | this.vrIpForm.virtual_ip = ip; |
| | | } |
| | | }, |
| | | mounted() { |
| | | mounted () { |
| | | this.findCluster(); |
| | | this.getVrrpInfo(); |
| | | }, |
| | | created() { } |
| | | created () { } |
| | | }; |
| | | </script> |
| | | <style lang="scss"> |