You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

240 lines
5.8 KiB

<script setup>
import {computed, ref, watch} from "vue";
import {onBeforeMount, onUnmounted} from "vue";
import {useStore} from "vuex";
import {get_git_ver, get_update_option} from "@/apis/update.js"
const store = useStore()
const props = defineProps({
ip: {
type: String,
default: ''
},
})
onUnmounted(
() => {
// store.state.update_dialog_show = false
store.getters.dialog_change
console.log(store.state.update_dialog_show)
}
)
// 获取git版本
const git_ver = ref([])
const selectedVersion = ref('')
onBeforeMount(() => {
get_git_ver().then(res => {
if (Array.isArray(res)) {
git_ver.value = [...res]
}
console.log(git_ver.value)
}).catch()
})
// 获取升级命令的功能
const updateCmd = ref({setup: [], teardown: [], sql: [], client: []})
onBeforeMount(
() => {
get_update_option().then(res => {
console.log("get_update_option")
if (Array.isArray(res)) {
res.forEach(
(value, index) => {
if (value.process === "setup") {
updateCmd.value.setup.push(value)
}
if (value.process === "teardown") {
updateCmd.value.teardown.push(value)
}
if (value.process === "sql") {
updateCmd.value.sql.push(value)
}
if (value.process === "client") {
updateCmd.value.client.push(value)
}
}
)
console.log(updateCmd.value)
}
}).catch()
}
)
// 提交升级相关逻辑
const updateForm = ref()
// 操作进度相关
const progress = [
{
content: '执行脚本',
checked: true,
done: true,
time: '2018-04-12 20:46',
},
{
content: '对比数据库',
checked: true,
done: false,
time: '2018-04-03 20:46',
},
{
content: '执行升级',
checked: true,
done: false,
time: '2018-04-03 20:46',
},
{
content: '上传客户端',
checked: true,
done: false,
time: '',
},
]
</script>
<template>
<el-dialog v-model="store.state.update_dialog_show" title="更新影院" :modal="true" width="720px">
<div><span class="update">更新单机</span><span class="ip">{{ ip }}</span><span>目标版本</span>
<el-select v-model="selectedVersion">
<el-option v-for="ver in git_ver" :label="ver.short_release" :value="ver.short_release" :key="ver.id"></el-option>
</el-select>
</div>
<el-form :model="updateForm">
<el-form-item>
<el-checkbox-group v-model="updateForm">
<el-divider content-position="left">
<span class="cmd_label">执行脚本</span>
</el-divider>
<el-checkbox v-for="cmd in updateCmd.setup" :label="cmd.desc" :name="cmd.id.toString()"
:checked="cmd.is_checked" :disabled="cmd.is_force"></el-checkbox>
<el-divider content-position="left">
<span class="cmd_label">数据库</span>
</el-divider>
<el-checkbox v-for="cmd in updateCmd.sql" :label="cmd.desc" :name="cmd.id.toString()"
:checked="cmd.is_checked" :disabled="cmd.is_force"></el-checkbox>
<el-divider content-position="left">
<span class="cmd_label">执行升级</span>
</el-divider>
<el-checkbox v-for="cmd in updateCmd.teardown" :label="cmd.desc" :name="cmd.id.toString()"
:checked="cmd.is_checked" :disabled="cmd.is_force"></el-checkbox>
<el-divider content-position="left">
<span class="cmd_label">客户端</span>
</el-divider>
<el-checkbox v-for="cmd in updateCmd.client" :label="cmd.desc" :name="cmd.id.toString()"
:checked="cmd.is_checked" :disabled="cmd.is_force"></el-checkbox>
</el-checkbox-group>
</el-form-item>
</el-form>
<el-button type="primary">更新</el-button>
<div class="processBox">
<!-- <el-divider />-->
<div class="timelineProcessBox">
<el-timeline class="timeline">
<el-timeline-item
class="lineitem"
:class="progress.done ? 'active' : 'inactive'"
v-for="(p, index) in progress"
:key="index"
:timestamp="p.time"
>
<span style="display: flex; flex-direction: column">
<span style="margin: 10px 0; font-size: 16px">
{{ p.content }}
</span>
<span style="color: #8c8c8c; font-size: 14px">
{{ p.checked }}
</span>
</span>
</el-timeline-item>
</el-timeline>
</div>
</div>
</el-dialog>
</template>
<style scoped>
.el-checkbox-group {
text-align: left;
width: 640px;
padding-left: 25px;
}
.el-checkbox {
margin-left: 0;
margin-right: 25px;
width: 180px;
padding-left: 0;
text-align: left;
}
.el-divider--horizontal {
line-height: 1;
}
.update {
padding-left: 0;
}
.ip {
margin-right: 100px;
}
.processBox {
background-color: #fff;
height: 210px;
.title {
font-size: 16px;
font-weight: 600;
padding-left: 32px;
padding-top: 16px;
}
.timelineProcessBox {
.timeline {
display: flex;
width: 95%;
margin: 40px auto;
.lineitem {
transform: translateX(50%);
width: 25%;
}
}
}
}
:deep(.el-timeline-item__tail) {
border-left: none;
border-top: 2px solid #e4e7ed;
width: 100%;
position: absolute;
top: 6px;
}
:deep(.el-timeline-item__wrapper) {
padding-left: 0;
position: absolute;
top: 20px;
transform: translateX(-50%);
text-align: center;
}
:deep(.el-timeline-item__timestamp) {
font-size: 14px;
}
.active {
:deep(.el-timeline-item__node) {
background-color: $login_word;
}
:deep(.el-timeline-item__tail) {
border-color: $login_word;
}
}
</style>