Commit 43e277ee authored by 徐一鸣's avatar 徐一鸣

Merge branch 'xym' into dev

parents 05cdb617 6b9cb683
<template>
<div class="deployment_info">
<div class="state_steps">
<p
class="deploy_state icon_and_text"
:class="{
warn: deployState.state === 2,
}"
>
<img :src="getIcon(deployState.state)" />
<span v-text="getText(deployState.state)"></span>
</p>
<ul class="state_list">
<li
v-for="item in data"
:key="item.value"
class="icon_and_text"
:class="{ current: item.value === currentState.value }"
@click="selecState(item)"
>
<img :src="getIcon(item.state)" />
<span v-text="item.name"></span>
</li>
</ul>
</div>
<div class="state_detail">
<p
v-text="currentState.content"
style="text-align: center;margin-top: 20px;"
></p>
</div>
</div>
</template>
<script>
export default {
props: {
data: {
type: Array,
required: true,
},
},
data: () => ({
selectedState: null, // 用户选中的状态
}),
computed: {
deployState() {
let state = {
name: "-",
value: "values",
content: "",
state: 2,
};
let status = this.data;
let statusLength = status.length;
if (statusLength > 0) {
state = status[statusLength - 1];
}
return state;
}, // 正在进行的状态
currentState() {
return this.selectedState || this.deployState;
}, // 需要展示的状态
},
methods: {
getIcon(stateValue = 2) {
const icons = [
require("../assets/imgs/ic_operation.gif"),
require("../assets/imgs/ic_true.png"),
require("../assets/imgs/ic_failed.png"),
];
return icons[stateValue];
},
getText(stateValue = 2) {
const texts = ["部署中", "成功", "失败"];
return texts[stateValue];
},
selecState(state) {
if (this.selectedState && this.selectedState.value === state.value) {
return;
}
console.log(state);
this.selectedState = state;
},
},
mounted() {
// console.log(this.data);
},
};
</script>
<style scoped>
.deployment_info {
display: flex;
justify-content: space-between;
align-items: stretch;
}
.state_steps {
width: 270px;
flex-shrink: 0;
}
.state_steps > .deploy_state {
margin: 10px 20px 20px 0;
padding: 10px;
border-radius: 5px;
overflow: hidden;
background-color: #edf0ff;
font-size: 16px;
line-height: 24px;
color: #264dd9;
text-align: center;
}
.state_steps > .deploy_state.warn {
background-color: #ffebeb;
color: #da4251;
}
.state_steps > .state_list > li {
padding: 15px 20px;
font-size: 14px;
line-height: 22px;
color: #242c43;
cursor: pointer;
}
.state_steps > .state_list > li.current {
border-top-left-radius: 6px;
border-bottom-left-radius: 6px;
background-color: #f8f9fd;
}
.state_detail {
height: 500px;
flex-grow: 1;
border-radius: 7px;
background-color: #f8f9fd;
overflow: hidden;
}
.icon_and_text > * {
display: inline-block;
vertical-align: middle;
}
.icon_and_text > img + span {
margin-left: 12px;
}
</style>
...@@ -5,7 +5,9 @@ ...@@ -5,7 +5,9 @@
<el-breadcrumb-item :to="`/yygl/${$route.params.level}/0`"> <el-breadcrumb-item :to="`/yygl/${$route.params.level}/0`">
我的应用 我的应用
</el-breadcrumb-item> </el-breadcrumb-item>
<el-breadcrumb-item :to="`/yygl/${$route.params.level}/${$route.params.type}`"> <el-breadcrumb-item
:to="`/yygl/${$route.params.level}/${$route.params.type}`"
>
应用仓库 应用仓库
</el-breadcrumb-item> </el-breadcrumb-item>
<el-breadcrumb-item> <el-breadcrumb-item>
...@@ -27,12 +29,16 @@ ...@@ -27,12 +29,16 @@
:rules="image_rules" :rules="image_rules"
> >
<el-form-item label="工作区域:" prop="namespace"> <el-form-item label="工作区域:" prop="namespace">
<el-select v-model="baseInfoForm.namespace" placeholder="请选择工作区域"> <el-select
v-model="baseInfoForm.namespace"
placeholder="请选择工作区域"
>
<el-option <el-option
v-for="item in area_options" v-for="item in area_options"
:key="item.value" :key="item.value"
:label="item.label" :label="item.label"
:value="item.value"> :value="item.value"
>
</el-option> </el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
...@@ -71,22 +77,34 @@ ...@@ -71,22 +77,34 @@
</el-form-item> </el-form-item>
<el-form-item label="镜像版本:" prop="vision"> <el-form-item label="镜像版本:" prop="vision">
<div :class="{'select_box':true,'is_select':app_set.vision==vision}" v-for="vision in vision_arr" :key="vision" @click="app_set.vision=vision">{{vision}}</div> <div
:class="{ select_box: true, is_select: app_set.vision == vision }"
v-for="vision in vision_arr"
:key="vision"
@click="app_set.vision = vision"
>
{{ vision }}
</div>
</el-form-item> </el-form-item>
<el-form-item label="资源限制-内存:" prop="memory" class="limitsd"> <el-form-item label="资源限制-内存:" prop="memory" class="limitsd">
<el-input <el-input
type='number' type="number"
class="limitinput" class="limitinput"
v-model="app_set.memory" v-model="app_set.memory"
placeholder="请输入内存" placeholder="请输入内存"
></el-input> ></el-input>
<el-select v-model="app_set.memory_type" class="timeslect" placeholder="请选择内存"> <el-select
v-model="app_set.memory_type"
class="timeslect"
placeholder="请选择内存"
>
<el-option <el-option
v-for="item in memory_arr" v-for="item in memory_arr"
:key="item.value" :key="item.value"
:label="item.label" :label="item.label"
:value="item.value"> :value="item.value"
>
</el-option> </el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
...@@ -102,13 +120,36 @@ ...@@ -102,13 +120,36 @@
</el-form-item> </el-form-item>
<el-form-item label="是否监控:" prop="watch"> <el-form-item label="是否监控:" prop="watch">
<div class="openbgc" @click="openstart" :style="!app_set.watch?{backgroundImage:'url('+require('@/assets/imgs/btn_off_hov.png')+')'}:{}"></div> <div
class="openbgc"
@click="openstart"
:style="
!app_set.watch
? {
backgroundImage:
'url(' + require('@/assets/imgs/btn_off_hov.png') + ')',
}
: {}
"
></div>
</el-form-item> </el-form-item>
<el-form-item label="储存容量:" prop="save_memory"> <el-form-item label="储存容量:" prop="save_memory">
<div :class="{'select_box':true,'is_select':app_set.save_memory==save}" v-for="save in save_arr" :key="save" @click="app_set.save_memory=save">{{save}}</div> <div
:class="{
select_box: true,
is_select: app_set.save_memory == save,
}"
v-for="save in save_arr"
:key="save"
@click="app_set.save_memory = save"
>
{{ save }}
</div>
</el-form-item> </el-form-item>
</el-form> </el-form>
<div class="senior_box" @click="senior_flag=true" v-if="!senior_flag">高级配置</div> <div class="senior_box" @click="senior_flag = true" v-if="!senior_flag">
高级配置
</div>
<div class="apass_button step_action" v-if="!senior_flag"> <div class="apass_button step_action" v-if="!senior_flag">
<el-button type="primary" plain @click="preStep"> <el-button type="primary" plain @click="preStep">
上一步 上一步
...@@ -117,7 +158,12 @@ ...@@ -117,7 +158,12 @@
下一步 下一步
</el-button> </el-button>
</div> </div>
<p v-if="senior_flag" style="color: #58617a;font-size: 14px;margin-bottom:10px;margin-top:30px;">高级配置:</p> <p
v-if="senior_flag"
style="color: #58617a;font-size: 14px;margin-bottom:10px;margin-top:30px;"
>
高级配置:
</p>
<v-apaas-code v-show="senior_flag" :datas="app_set.code"></v-apaas-code> <v-apaas-code v-show="senior_flag" :datas="app_set.code"></v-apaas-code>
<div class="apass_button step_action" v-if="senior_flag"> <div class="apass_button step_action" v-if="senior_flag">
<el-button type="primary" plain @click="deal_code(0)"> <el-button type="primary" plain @click="deal_code(0)">
...@@ -133,7 +179,10 @@ ...@@ -133,7 +179,10 @@
:step="2" :step="2"
:active-icon="require('@/assets/imgs/progress_ic_bushudata.png')" :active-icon="require('@/assets/imgs/progress_ic_bushudata.png')"
> >
<!-- content --> <deployment-info
:data="stateList"
style="margin-top: 30px;"
></deployment-info>
<div class="apass_button step_action"> <div class="apass_button step_action">
<el-button type="primary"> <el-button type="primary">
前往查看 前往查看
...@@ -161,34 +210,37 @@ import apassDialog from "@/components/apass-dialog"; ...@@ -161,34 +210,37 @@ import apassDialog from "@/components/apass-dialog";
import codes from "@/components/codes"; import codes from "@/components/codes";
var checkNumber = (rule, value, callback) => { var checkNumber = (rule, value, callback) => {
if (!value) { if (!value) {
return callback(new Error('不能为空')); return callback(new Error("不能为空"));
} }
setTimeout(() => { setTimeout(() => {
if (new RegExp("^[1-9][0-9]*$").test(value)) { if (new RegExp("^[1-9][0-9]*$").test(value)) {
callback(); callback();
} else { } else {
callback(new Error('请输入正整数')) callback(new Error("请输入正整数"));
} }
}); });
}; };
var checkName = (rule, value, callback)=>{ var checkName = (rule, value, callback) => {
if (new RegExp("^[a-z]([0-9]||[a-z]||-)*$").test(value)) { if (new RegExp("^[a-z]([0-9]||[a-z]||-)*$").test(value)) {
callback(); callback();
} else { } else {
callback(new Error('小写字母开头,可以由小写字母、数字、- 组成')) callback(new Error("小写字母开头,可以由小写字母、数字、- 组成"));
} }
} };
import deploymentInfo from "@/components/deployment-info";
export default { export default {
components: { components: {
appBuildSteps, appBuildSteps,
appBuildStep, appBuildStep,
apassDialog, apassDialog,
deploymentInfo,
"v-apaas-code": codes, "v-apaas-code": codes,
}, },
data: () => ({ data: () => ({
step: 0, step: 0,
senior_flag:false, senior_flag: false,
begin_code:'', begin_code: "",
dialogInfo: { dialogInfo: {
title: "", title: "",
msg: "", msg: "",
...@@ -198,32 +250,42 @@ export default { ...@@ -198,32 +250,42 @@ export default {
namespace: "", namespace: "",
name: "", name: "",
}, },
app_set:{ app_set: {
title:'', title: "",
vision:'', vision: "",
memory:'', memory: "",
memory_type:1, memory_type: 1,
cpu:'', cpu: "",
watch:0, watch: 0,
save_memory:'', save_memory: "",
code:'' code: "",
}, },
area_options:[ area_options: [
{ {
name:'12312', name: "12312",
value:1 value: 1,
} },
], ],
vision_arr:['1.0.1','10.1.2','2.2.3'], vision_arr: ["1.0.1", "10.1.2", "2.2.3"],
save_arr:['2GI','4GI','8GI','16GI','32GI','64GI','128GI','256GI','512GI'], save_arr: [
memory_arr:[ "2GI",
"4GI",
"8GI",
"16GI",
"32GI",
"64GI",
"128GI",
"256GI",
"512GI",
],
memory_arr: [
{ {
value:1, value: 1,
label:'MI', label: "MI",
}, },
{ {
value:2, value: 2,
label:'GI', label: "GI",
}, },
], ],
image_rules: { image_rules: {
...@@ -232,56 +294,89 @@ export default { ...@@ -232,56 +294,89 @@ export default {
], ],
name: [ name: [
{ required: true, message: "请输入应用部署名称", trigger: "blur" }, { required: true, message: "请输入应用部署名称", trigger: "blur" },
{ validator: checkName, trigger: 'blur' } { validator: checkName, trigger: "blur" },
], ],
}, },
app_set_rules: { app_set_rules: {
title: [ title: [{ required: true, message: "请输入标题", trigger: "blur" }],
{ required: true, message: "请输入标题", trigger: "blur" },
],
memory: [ memory: [
{ required: true, message: "请输入内存", trigger: "blur" }, { required: true, message: "请输入内存", trigger: "blur" },
{ validator: checkNumber, trigger: 'blur' } { validator: checkNumber, trigger: "blur" },
], ],
cpu: [ cpu: [
{ required: true, message: "请输入cpu", trigger: "blur" }, { required: true, message: "请输入cpu", trigger: "blur" },
{ validator: checkNumber, trigger: 'blur' } { validator: checkNumber, trigger: "blur" },
], ],
vision: [{ required: true, message: "请选择版本号", trigger: "change" }], vision: [{ required: true, message: "请选择版本号", trigger: "change" }],
save_memory: [{ required: true, message: "请选择存储容量", trigger: "change" }], save_memory: [
{ required: true, message: "请选择存储容量", trigger: "change" },
],
},
evtUuid: "",
evtSource: null,
listStatus: [],
state: "",
text: "",
url: "",
act: 0,
stateList: [
{
name: "获取部署参数",
value: "values",
content: "获取部署参数",
state: 1,
},
{
name: "拉取部署文件",
value: "pull-chart",
content: "拉取部署文件",
state: 1,
}, },
{
name: "开始部署",
value: "install",
content: "开始部署",
state: 1,
},
{
name: "部署状态",
value: "deploy-status",
content: "部署状态",
state: 2,
},
],
}), }),
methods: { methods: {
get_step_info(){ get_step_info() {
this.$http this.$http
.get(`/apaas/hubApi/market/step/${this.$route.params.app_id}`) .get(`/apaas/hubApi/market/step/${this.$route.params.app_id}`)
.then((response) => { .then((response) => {
console.log(JSON.parse(response.data.data)); console.log(JSON.parse(response.data.data));
}) });
}, },
deal_code(n){ deal_code(n) {
if(n){ if (n) {
this.begin_code = this.app_set.code this.begin_code = this.app_set.code;
}else{ } else {
this.app_set.code = this.begin_code this.app_set.code = this.begin_code;
} }
this.senior_flag = false this.senior_flag = false;
}, },
sub_yy_form(formName){ sub_yy_form(formName) {
this.$refs[formName].validate((valid) => { this.$refs[formName].validate((valid) => {
if (valid) { if (valid) {
this.nextStep() this.nextStep();
} else { } else {
console.log('error submit!!'); console.log("error submit!!");
return false; return false;
} }
}); });
}, },
openstart(){ openstart() {
if(this.app_set.watch){ if (this.app_set.watch) {
this.app_set.watch = 0 this.app_set.watch = 0;
}else{ } else {
this.app_set.watch = 1 this.app_set.watch = 1;
} }
}, },
preStep() { preStep() {
...@@ -290,19 +385,98 @@ export default { ...@@ -290,19 +385,98 @@ export default {
nextStep() { nextStep() {
this.step++; this.step++;
}, },
getStatus() {
let evtUuid = Math.random()
.toString(16)
.substr(3);
let evtSource = new EventSource(
`/apaas/hubApi/event/subscribe/deploy/${evtUuid}`
);
this.evtUuid = evtUuid;
this.evtSource = evtSource;
evtSource.addEventListener("message", function(e) {
if (this.listStatus.map((o) => o.status).indexOf(e.lastEventId) == -1) {
if (this.listStatus.length) {
this.listStatus[this.listStatus.length - 1].success = "success";
}
this.listStatus.push({
status: e.lastEventId,
success: JSON.parse(e.data).state,
data: JSON.parse(e.data).data,
});
this.text = this.listStatus[this.listStatus.length - 1].data;
this.text = "<span class='linenum'></span>" + this.text;
this.text = this.text.replace(
/\n/g,
"\n<span class='linenum'></span>"
);
this.text = this.text.replace(/>==>/g, ">>");
this.act = this.listStatus.length - 1;
} else {
let i = this.listStatus.map((o) => o.status).indexOf(e.lastEventId);
let item = this.listStatus[i].data;
item = item + "\n" + JSON.parse(e.data).data;
this.listStatus[i].data = item;
this.text = this.listStatus[this.listStatus.length - 1].data;
this.text = "<span class='linenum'></span>" + this.text;
this.text = this.text.replace(
/\n/g,
"\n<span class='linenum'></span>"
);
this.text = this.text.replace(/>==>/g, ">>");
this.act = this.listStatus.length - 1;
if (JSON.parse(e.data).state != "notes") {
this.listStatus[i].success = JSON.parse(e.data).state;
}
}
if (JSON.parse(e.data).state == "success") {
this.state = "部署成功!";
this.url = `https://${window.location.host}/apaas/ui/#/pods?namespace=${this.baseInfoForm.namespace}`;
}
for (let i = 0; i < this.listStatus.length; i++) {
switch (this.listStatus[i].status) {
case "values":
this.listStatus[i].statusHan = "获取部署参数";
break;
case "pull-chart":
this.listStatus[i].statusHan = "拉取部署文件";
break;
case "install":
this.listStatus[i].statusHan = "开始部署";
break;
case "deploy-status":
this.listStatus[i].statusHan = "部署状态";
break;
default:
this.listStatus[i].statusHan = "其他";
break;
}
}
});
},
}, },
created() { created() {
this.get_step_info() this.getStatus();
this.get_step_info();
}, },
}; };
</script> </script>
<style scoped> <style scoped>
.openbgc{ .openbgc {
width: 56px; width: 56px;
height: 23px; height: 23px;
background-image: url('~@/assets/imgs/btn_on_hov.png'); background-image: url("~@/assets/imgs/btn_on_hov.png");
background-size:contain; background-size: contain;
cursor: pointer; cursor: pointer;
} }
.deployment-container { .deployment-container {
...@@ -320,7 +494,7 @@ export default { ...@@ -320,7 +494,7 @@ export default {
.step_action .el-button:not(:last-child) { .step_action .el-button:not(:last-child) {
margin-right: 30px; margin-right: 30px;
} }
.select_box{ .select_box {
height: 35px; height: 35px;
width: 80px; width: 80px;
line-height: 35px; line-height: 35px;
...@@ -333,20 +507,20 @@ export default { ...@@ -333,20 +507,20 @@ export default {
margin-right: 10px; margin-right: 10px;
cursor: pointer; cursor: pointer;
} }
.is_select{ .is_select {
background-color: #515fe7; background-color: #515fe7;
color: #f8f9fd; color: #f8f9fd;
} }
.limitsd{ .limitsd {
position: relative; position: relative;
} }
.deployment-container .step_form .el-form-item.limitsd .timeslect{ .deployment-container .step_form .el-form-item.limitsd .timeslect {
position: absolute; position: absolute;
width: 100px; width: 100px;
right: 0; right: 0;
top:0; top: 0;
} }
.senior_box{ .senior_box {
width: 124px; width: 124px;
height: 44px; height: 44px;
background-color: #0f2683; background-color: #0f2683;
...@@ -357,21 +531,21 @@ export default { ...@@ -357,21 +531,21 @@ export default {
text-align: center; text-align: center;
cursor: pointer; cursor: pointer;
} }
</style> </style>
<style> <style>
.deployment-container .step_form .el-form-item .el-input-group__append, .el-input-group__prepend{ .deployment-container .step_form .el-form-item .el-input-group__append,
.el-input-group__prepend {
border-radius: 0 8px 8px 0; border-radius: 0 8px 8px 0;
} }
.limitsd .timeslect .el-input__inner{ .limitsd .timeslect .el-input__inner {
width: 100px; width: 100px;
border-radius: 0 8px 8px 0; border-radius: 0 8px 8px 0;
background-color: rgba(15, 38, 131, 1); background-color: rgba(15, 38, 131, 1);
color: rgba(248, 249, 253, 1); color: rgba(248, 249, 253, 1);
border: 0; border: 0;
} }
.limitsd .limitinput .el-input__inner{ .limitsd .limitinput .el-input__inner {
width: 860px; width: 860px;
} }
.deployment-container .avatar-uploader .el-upload { .deployment-container .avatar-uploader .el-upload {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment