@@ -3,7 +3,7 @@ | |||||
<a class="{{if .PageIsAdminDashboard}}active{{end}} item" href="{{AppSubUrl}}/admin"> | <a class="{{if .PageIsAdminDashboard}}active{{end}} item" href="{{AppSubUrl}}/admin"> | ||||
{{.i18n.Tr "admin.dashboard"}} | {{.i18n.Tr "admin.dashboard"}} | ||||
</a> | </a> | ||||
<a class="item item-first" href="javascript:void;"> | |||||
<a class="item item-first" href="javascript:void(0);"> | |||||
{{.i18n.Tr "admin.user_management"}} | {{.i18n.Tr "admin.user_management"}} | ||||
</a> | </a> | ||||
<a class="{{if .PageIsAdminUsers}}active{{end}} item item-next" href="{{AppSubUrl}}/admin/users"> | <a class="{{if .PageIsAdminUsers}}active{{end}} item item-next" href="{{AppSubUrl}}/admin/users"> | ||||
@@ -27,7 +27,7 @@ | |||||
<a class="{{if .PageIsAdminImages}}active{{end}} item" href="{{AppSubUrl}}/admin/images"> | <a class="{{if .PageIsAdminImages}}active{{end}} item" href="{{AppSubUrl}}/admin/images"> | ||||
{{.i18n.Tr "explore.images"}} | {{.i18n.Tr "explore.images"}} | ||||
</a> | </a> | ||||
<a class="item item-first" href="javascript:void;"> | |||||
<a class="item item-first" href="javascript:void(0);"> | |||||
{{.i18n.Tr "admin.resource_management"}} | {{.i18n.Tr "admin.resource_management"}} | ||||
</a> | </a> | ||||
<a class="{{if .PageIsAdminResourcesQueue}}active{{end}} item item-next" href="{{AppSubUrl}}/admin/resources/queue"> | <a class="{{if .PageIsAdminResourcesQueue}}active{{end}} item item-next" href="{{AppSubUrl}}/admin/resources/queue"> | ||||
@@ -39,7 +39,7 @@ | |||||
<a class="{{if .PageIsAdminResourcesScene}}active{{end}} item item-next" href="{{AppSubUrl}}/admin/resources/scene"> | <a class="{{if .PageIsAdminResourcesScene}}active{{end}} item item-next" href="{{AppSubUrl}}/admin/resources/scene"> | ||||
{{.i18n.Tr "admin.application_scenario"}} | {{.i18n.Tr "admin.application_scenario"}} | ||||
</a> | </a> | ||||
<a class="item item-first" href="javascript:void;"> | |||||
<a class="item item-first" href="javascript:void(0);"> | |||||
{{.i18n.Tr "admin.system_configuration"}} | {{.i18n.Tr "admin.system_configuration"}} | ||||
</a> | </a> | ||||
<a class="{{if .PageIsAdminMonitor}}active{{end}} item item-next" href="{{AppSubUrl}}/admin/monitor"> | <a class="{{if .PageIsAdminMonitor}}active{{end}} item item-next" href="{{AppSubUrl}}/admin/monitor"> | ||||
@@ -0,0 +1,20 @@ | |||||
import service from '../service'; | |||||
// 查看资源池(队列) | |||||
export const getQueueList = (params) => { | |||||
return service({ | |||||
url: '/admin/resources/queue', | |||||
method: 'get', | |||||
params, | |||||
}); | |||||
} | |||||
// 编辑资源池(队列) | |||||
export const setQueueList = (data) => { | |||||
return service({ | |||||
url: '/reward/point/account', | |||||
method: 'get', | |||||
params: {}, | |||||
data, | |||||
}); | |||||
} |
@@ -1,27 +1,10 @@ | |||||
<template> | <template> | ||||
<div class="base-dlg"> | <div class="base-dlg"> | ||||
<el-dialog | |||||
:visible.sync="dialogShow" | |||||
:title="title" | |||||
:width="width" | |||||
:fullscreen="fullscreen" | |||||
:top="top" | |||||
:modal="modal" | |||||
:modal-append-to-body="modalAppendToBody" | |||||
:append-to-body="appendToBody" | |||||
:lock-scroll="lockScroll" | |||||
:custom-class="customClass" | |||||
:close-on-click-modal="closeOnClickModal" | |||||
:close-on-press-escape="closeOnPressEscape" | |||||
:show-close="showClose" | |||||
:center="center" | |||||
:destroy-on-close="destroyOnClose" | |||||
:before-close="beforeClose" | |||||
@open="open" | |||||
@opened="opened" | |||||
@close="close" | |||||
@closed="closed" | |||||
> | |||||
<el-dialog :visible.sync="dialogShow" :title="title" :width="width" :fullscreen="fullscreen" :top="top" | |||||
:modal="modal" :modal-append-to-body="modalAppendToBody" :append-to-body="appendToBody" :lock-scroll="lockScroll" | |||||
:custom-class="customClass" :close-on-click-modal="closeOnClickModal" :close-on-press-escape="closeOnPressEscape" | |||||
:show-close="showClose" :center="center" :destroy-on-close="destroyOnClose" :before-close="beforeClose" | |||||
@open="open" @opened="opened" @close="close" @closed="closed"> | |||||
<template v-slot:title> | <template v-slot:title> | ||||
<slot name="title"></slot> | <slot name="title"></slot> | ||||
</template> | </template> | ||||
@@ -55,7 +38,7 @@ export default { | |||||
center: { type: Boolean, default: false }, | center: { type: Boolean, default: false }, | ||||
destroyOnClose: { type: Boolean, default: false }, | destroyOnClose: { type: Boolean, default: false }, | ||||
}, | }, | ||||
data: function () { | |||||
data() { | |||||
return { | return { | ||||
dialogShow: false, | dialogShow: false, | ||||
}; | }; | ||||
@@ -66,16 +49,16 @@ export default { | |||||
}, | }, | ||||
}, | }, | ||||
methods: { | methods: { | ||||
open: function () { | |||||
open() { | |||||
this.$emit("open"); | this.$emit("open"); | ||||
}, | }, | ||||
opened: function () { | |||||
opened() { | |||||
this.$emit("opened"); | this.$emit("opened"); | ||||
}, | }, | ||||
close: function () { | |||||
close() { | |||||
this.$emit("close"); | this.$emit("close"); | ||||
}, | }, | ||||
closed: function () { | |||||
closed() { | |||||
this.$emit("closed"); | this.$emit("closed"); | ||||
this.$emit("update:visible", false); | this.$emit("update:visible", false); | ||||
}, | }, | ||||
@@ -96,16 +79,19 @@ export default { | |||||
font-weight: 500; | font-weight: 500; | ||||
font-size: 16px; | font-size: 16px; | ||||
color: rgb(16, 16, 16); | color: rgb(16, 16, 16); | ||||
.el-dialog__title { | .el-dialog__title { | ||||
font-weight: 500; | font-weight: 500; | ||||
font-size: 16px; | font-size: 16px; | ||||
color: rgb(16, 16, 16); | color: rgb(16, 16, 16); | ||||
} | } | ||||
.el-dialog__headerbtn { | .el-dialog__headerbtn { | ||||
top: 15px; | top: 15px; | ||||
right: 15px; | right: 15px; | ||||
} | } | ||||
} | } | ||||
/deep/ .el-dialog__body { | /deep/ .el-dialog__body { | ||||
padding: 15px 15px; | padding: 15px 15px; | ||||
} | } | ||||
@@ -9,7 +9,7 @@ | |||||
<span>资源池(队列)名称</span> | <span>资源池(队列)名称</span> | ||||
</div> | </div> | ||||
<div class="content"> | <div class="content"> | ||||
<el-input v-model="point" placeholder=""></el-input> | |||||
<el-input v-model="dataInfo.name" placeholder=""></el-input> | |||||
</div> | </div> | ||||
</div> | </div> | ||||
<div class="form-row"> | <div class="form-row"> | ||||
@@ -17,7 +17,7 @@ | |||||
<span>所属集群</span> | <span>所属集群</span> | ||||
</div> | </div> | ||||
<div class="content"> | <div class="content"> | ||||
<el-select :value="selectValue"></el-select> | |||||
<el-select v-model="dataInfo.cluster"></el-select> | |||||
</div> | </div> | ||||
</div> | </div> | ||||
<div class="form-row"> | <div class="form-row"> | ||||
@@ -25,7 +25,7 @@ | |||||
<span>智算中心</span> | <span>智算中心</span> | ||||
</div> | </div> | ||||
<div class="content"> | <div class="content"> | ||||
<el-select :value="selectValue"></el-select> | |||||
<el-select v-model="dataInfo.computingCenter"></el-select> | |||||
</div> | </div> | ||||
</div> | </div> | ||||
<div class="form-row"> | <div class="form-row"> | ||||
@@ -33,7 +33,7 @@ | |||||
<span>计算资源</span> | <span>计算资源</span> | ||||
</div> | </div> | ||||
<div class="content"> | <div class="content"> | ||||
<el-select :value="selectValue"></el-select> | |||||
<el-select v-model="dataInfo.computingType"></el-select> | |||||
</div> | </div> | ||||
</div> | </div> | ||||
<div class="form-row"> | <div class="form-row"> | ||||
@@ -41,7 +41,7 @@ | |||||
<span>卡类型</span> | <span>卡类型</span> | ||||
</div> | </div> | ||||
<div class="content"> | <div class="content"> | ||||
<el-select :value="selectValue"></el-select> | |||||
<el-select v-model="dataInfo.cardType"></el-select> | |||||
</div> | </div> | ||||
</div> | </div> | ||||
<div class="form-row"> | <div class="form-row"> | ||||
@@ -49,14 +49,14 @@ | |||||
<span>卡数</span> | <span>卡数</span> | ||||
</div> | </div> | ||||
<div class="content"> | <div class="content"> | ||||
<el-input v-model="point" type="number" placeholder=""></el-input> | |||||
<el-input v-model="dataInfo.cardNum" type="number" placeholder=""></el-input> | |||||
</div> | </div> | ||||
</div> | </div> | ||||
<div class="form-row" style="margin-top: 10px"> | <div class="form-row" style="margin-top: 10px"> | ||||
<div class="title"><span>备注</span></div> | <div class="title"><span>备注</span></div> | ||||
<div class="content" style="width: 400px"> | <div class="content" style="width: 400px"> | ||||
<el-input type="textarea" :autosize="{ minRows: 3, maxRows: 4 }" | |||||
:placeholder="true ? '请输入充值操作备注' : '请输入扣减操作备注'" v-model="remark"> | |||||
<el-input type="textarea" :autosize="{ minRows: 3, maxRows: 4 }" :placeholder="'请输入备注'" | |||||
v-model="dataInfo.remark"> | |||||
</el-input> | </el-input> | ||||
</div> | </div> | ||||
</div> | </div> | ||||
@@ -73,8 +73,8 @@ | |||||
</div> | </div> | ||||
</template> | </template> | ||||
<script> | <script> | ||||
import BaseDialog from '~/components/BaseDialog.vue'; | import BaseDialog from '~/components/BaseDialog.vue'; | ||||
import { getQueueList } from '~/apis/modules/resources'; | |||||
export default { | export default { | ||||
name: "QueueDialog", | name: "QueueDialog", | ||||
@@ -87,13 +87,12 @@ export default { | |||||
components: { | components: { | ||||
BaseDialog | BaseDialog | ||||
}, | }, | ||||
data: function () { | |||||
data() { | |||||
return { | return { | ||||
dialogShow: false, | dialogShow: false, | ||||
dataInfo: {}, | |||||
point: '', | |||||
remark: '', | |||||
selectValue: '', | |||||
dataInfo: { | |||||
}, | |||||
}; | }; | ||||
}, | }, | ||||
watch: { | watch: { | ||||
@@ -102,32 +101,49 @@ export default { | |||||
}, | }, | ||||
}, | }, | ||||
methods: { | methods: { | ||||
open: function () { | |||||
resetDataInfo() { | |||||
this.dataInfo = { | |||||
id: '', | |||||
name: '', | |||||
cluster: '', | |||||
computingCenter: '', | |||||
computingType: '', | |||||
cardType: '', | |||||
cardNum: '', | |||||
remark: '', | |||||
} | |||||
}, | |||||
open() { | |||||
this.resetDataInfo(); | |||||
if (this.type === 'add') { | if (this.type === 'add') { | ||||
// | |||||
} else if (this.type === 'edit') { | } else if (this.type === 'edit') { | ||||
this.dataInfo = Object.assign(this.dataInfo, { ...this.data }); | |||||
} | } | ||||
console.log('open', this.type, this.data); | console.log('open', this.type, this.data); | ||||
this.$emit("open"); | this.$emit("open"); | ||||
}, | }, | ||||
opened: function () { | |||||
opened() { | |||||
this.$emit("opened"); | this.$emit("opened"); | ||||
}, | }, | ||||
close: function () { | |||||
close() { | |||||
this.$emit("close"); | this.$emit("close"); | ||||
}, | }, | ||||
closed: function () { | |||||
closed() { | |||||
this.$emit("closed"); | this.$emit("closed"); | ||||
this.$emit("update:visible", false); | this.$emit("update:visible", false); | ||||
}, | }, | ||||
confirm: function () { | |||||
confirm() { | |||||
}, | }, | ||||
cancel: function () { | |||||
cancel() { | |||||
this.dialogShow = false; | |||||
this.$emit("update:visible", false); | |||||
} | } | ||||
}, | }, | ||||
mounted() { | |||||
this.resetDataInfo(); | |||||
}, | |||||
}; | }; | ||||
</script> | </script> | ||||
<style scoped lang="less"> | <style scoped lang="less"> | ||||
@@ -0,0 +1,219 @@ | |||||
<template> | |||||
<div class="base-dlg"> | |||||
<BaseDialog :visible.sync="dialogShow" :width="`750px`" :title="type === 'add' ? `新建算力资源应用场景` : '编辑算力资源应用场景'" | |||||
@open="open" @opened="opened" @close="close" @closed="closed"> | |||||
<div class="dlg-content"> | |||||
<div class="form"> | |||||
<div class="form-row"> | |||||
<div class="title required"> | |||||
<span>应用场景名称</span> | |||||
</div> | |||||
<div class="content"> | |||||
<el-input v-model="dataInfo.name" placeholder=""></el-input> | |||||
</div> | |||||
</div> | |||||
<div class="form-row"> | |||||
<div class="title required"> | |||||
<span>任务类型</span> | |||||
</div> | |||||
<div class="content"> | |||||
<el-select v-model="dataInfo.taskType"> | |||||
<el-option v-for="item in taskTypeList" :key="item.k" :label="item.v" :value="item.k" /> | |||||
</el-select> | |||||
</div> | |||||
</div> | |||||
<div class="form-row"> | |||||
<div class="title required"> | |||||
<span>是否专属</span> | |||||
</div> | |||||
<div class="content"> | |||||
<el-select v-model="dataInfo.isExclusive" @change="changeIsExclusive"> | |||||
<el-option v-for="item in isExclusiveList" :key="item.k" :label="item.v" :value="item.k" /> | |||||
</el-select> | |||||
</div> | |||||
</div> | |||||
<div class="form-row" v-if="dataInfo.isExclusive === '1'"> | |||||
<div class="title required"> | |||||
<span>专属组织</span> | |||||
</div> | |||||
<div class="content"> | |||||
<el-input v-model="dataInfo.exclusiveOrg" placeholder="多个组织名之间用英文分号隔开"></el-input> | |||||
</div> | |||||
</div> | |||||
<div class="form-row"> | |||||
<div class="title required"> | |||||
<span>资源池队列</span> | |||||
</div> | |||||
<div class="content"> | |||||
<el-select v-model="dataInfo.queue" @change="changeQueue"> | |||||
<el-option v-for="item in queueList" :key="item.k" :label="item.v" :value="item.k" /> | |||||
</el-select> | |||||
</div> | |||||
</div> | |||||
<div class="form-row"> | |||||
<div class="title required"> | |||||
<span>资源规格</span> | |||||
</div> | |||||
<div class="content"> | |||||
<el-select v-model="dataInfo.specs" multiple collapse-tags> | |||||
<el-option v-for="item in specsList" :key="item.k" :label="item.v" :value="item.k" /> | |||||
</el-select> | |||||
</div> | |||||
</div> | |||||
<div class="form-row" style="margin-top: 20px"> | |||||
<div class="title"></div> | |||||
<div class="content"> | |||||
<el-button type="primary" class="btn confirm-btn" @click="confirm">确定</el-button> | |||||
<el-button class="btn" @click="cancel">取消</el-button> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</BaseDialog> | |||||
</div> | |||||
</template> | |||||
<script> | |||||
import BaseDialog from '~/components/BaseDialog.vue'; | |||||
import { getQueueList } from '~/apis/modules/resources'; | |||||
export default { | |||||
name: "QueueDialog", | |||||
props: { | |||||
visible: { type: Boolean, default: false }, | |||||
title: { type: String, default: '' }, | |||||
type: { type: String, defalut: 'add' }, | |||||
data: { type: Object, default: () => ({}) }, | |||||
}, | |||||
components: { | |||||
BaseDialog | |||||
}, | |||||
data() { | |||||
return { | |||||
dialogShow: false, | |||||
dataInfo: {}, | |||||
taskTypeList: [{ k: '1', v: '调试任务' }, { k: '2', v: '训练任务' }, { k: '3', v: '评测任务' }, { k: '4', v: '推理任务' }], | |||||
isExclusiveList: [{ k: '', v: '否' }, { k: '1', v: '是' }], | |||||
queueList: [{ k: '1', v: '资源池1' }, { k: '2', v: '资源池2' }], | |||||
specsList: [{ k: '1', v: 'spec1' }, { k: '2', v: 'spec2' }, { k: '3', v: 'spec3' }, { k: '4', v: 'spec4' }, { k: '5', v: 'spec5' }, { k: '6', v: 'spec6' }], | |||||
}; | |||||
}, | |||||
watch: { | |||||
visible: function (val) { | |||||
this.dialogShow = val; | |||||
}, | |||||
}, | |||||
methods: { | |||||
resetDataInfo() { | |||||
this.dataInfo = { | |||||
id: '', | |||||
name: '', | |||||
taskType: '', | |||||
isExclusive: '', | |||||
exclusiveOrg: '', | |||||
queue: '', | |||||
specs: ['2', '3'], | |||||
} | |||||
}, | |||||
changeIsExclusive() { | |||||
this.dataInfo.exclusiveOrg = ''; | |||||
}, | |||||
changeQueue() { | |||||
}, | |||||
open() { | |||||
this.resetDataInfo(); | |||||
if (this.type === 'add') { | |||||
// | |||||
} else if (this.type === 'edit') { | |||||
this.dataInfo = Object.assign(this.dataInfo, { ...this.data }); | |||||
} | |||||
console.log('open', this.type, this.data); | |||||
this.$emit("open"); | |||||
}, | |||||
opened() { | |||||
this.$emit("opened"); | |||||
}, | |||||
close() { | |||||
this.$emit("close"); | |||||
}, | |||||
closed() { | |||||
this.$emit("closed"); | |||||
this.$emit("update:visible", false); | |||||
}, | |||||
confirm() { | |||||
console.log(this.dataInfo); | |||||
}, | |||||
cancel() { | |||||
this.dialogShow = false; | |||||
this.$emit("update:visible", false); | |||||
} | |||||
}, | |||||
mounted() { | |||||
this.resetDataInfo(); | |||||
}, | |||||
}; | |||||
</script> | |||||
<style scoped lang="less"> | |||||
.dlg-content { | |||||
margin: 20px 0 25px 0; | |||||
display: flex; | |||||
justify-content: center; | |||||
.form { | |||||
width: 600px; | |||||
.form-row { | |||||
display: flex; | |||||
min-height: 42px; | |||||
margin-bottom: 4px; | |||||
.title { | |||||
width: 160px; | |||||
display: flex; | |||||
justify-content: flex-end; | |||||
align-items: center; | |||||
margin-right: 20px; | |||||
color: rgb(136, 136, 136); | |||||
font-size: 14px; | |||||
&.required { | |||||
span { | |||||
position: relative; | |||||
} | |||||
span::after { | |||||
position: absolute; | |||||
right: -10px; | |||||
top: -2px; | |||||
vertical-align: top; | |||||
content: '*'; | |||||
color: #db2828; | |||||
} | |||||
} | |||||
} | |||||
.content { | |||||
width: 300px; | |||||
display: flex; | |||||
align-items: center; | |||||
/deep/ .el-select { | |||||
width: 100%; | |||||
} | |||||
} | |||||
} | |||||
} | |||||
.btn { | |||||
color: rgb(2, 0, 4); | |||||
background-color: rgb(194, 199, 204); | |||||
border-color: rgb(194, 199, 204); | |||||
&.confirm-btn { | |||||
color: #fff; | |||||
background-color: rgb(56, 158, 13); | |||||
border-color: rgb(56, 158, 13); | |||||
} | |||||
} | |||||
} | |||||
</style> |
@@ -0,0 +1,213 @@ | |||||
<template> | |||||
<div class="base-dlg"> | |||||
<BaseDialog :visible.sync="dialogShow" :width="`700px`" :title="`新增资源规格和单价信息`" @open="open" @opened="opened" | |||||
@close="close" @closed="closed"> | |||||
<div class="dlg-content"> | |||||
<div class="form"> | |||||
<div class="form-row"> | |||||
<div class="title required"> | |||||
<span>资源池(队列)</span> | |||||
</div> | |||||
<div class="content"> | |||||
<el-select v-model="dataInfo.queue"></el-select> | |||||
</div> | |||||
</div> | |||||
<div class="form-row"> | |||||
<div class="title required"> | |||||
<span>XPU数</span> | |||||
</div> | |||||
<div class="content"> | |||||
<el-input v-model="dataInfo.xpu" type="number" placeholder=""></el-input> | |||||
</div> | |||||
</div> | |||||
<div class="form-row"> | |||||
<div class="title required"> | |||||
<span>CPU数</span> | |||||
</div> | |||||
<div class="content"> | |||||
<el-input v-model="dataInfo.cpu" type="number" placeholder=""></el-input> | |||||
</div> | |||||
</div> | |||||
<div class="form-row"> | |||||
<div class="title required"> | |||||
<span>内存(GB)</span> | |||||
</div> | |||||
<div class="content"> | |||||
<el-input v-model="dataInfo.mem" type="number" placeholder=""></el-input> | |||||
</div> | |||||
</div> | |||||
<div class="form-row"> | |||||
<div class="title required"> | |||||
<span>共享内存(GB)</span> | |||||
</div> | |||||
<div class="content"> | |||||
<el-input v-model="dataInfo.shareMem" type="number" placeholder=""></el-input> | |||||
</div> | |||||
</div> | |||||
<div class="form-row"> | |||||
<div class="title required"> | |||||
<span>单价</span> | |||||
</div> | |||||
<div class="content"> | |||||
<el-input v-model="dataInfo.price" type="number" placeholder=""></el-input> | |||||
</div> | |||||
</div> | |||||
<div class="form-row"> | |||||
<div class="title required"> | |||||
<span>状态</span> | |||||
</div> | |||||
<div class="content"> | |||||
<el-select v-model="dataInfo.status"></el-select> | |||||
</div> | |||||
</div> | |||||
<div class="form-row" style="margin-top: 20px"> | |||||
<div class="title"></div> | |||||
<div class="content"> | |||||
<el-button type="primary" class="btn confirm-btn" @click="confirm">确定</el-button> | |||||
<el-button class="btn" @click="cancel">取消</el-button> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</BaseDialog> | |||||
</div> | |||||
</template> | |||||
<script> | |||||
import BaseDialog from '~/components/BaseDialog.vue'; | |||||
import { getQueueList } from '~/apis/modules/resources'; | |||||
export default { | |||||
name: "QueueDialog", | |||||
props: { | |||||
visible: { type: Boolean, default: false }, | |||||
title: { type: String, default: '' }, | |||||
type: { type: String, defalut: 'add' }, | |||||
data: { type: Object, default: () => ({}) }, | |||||
}, | |||||
components: { | |||||
BaseDialog | |||||
}, | |||||
data() { | |||||
return { | |||||
dialogShow: false, | |||||
dataInfo: { | |||||
}, | |||||
}; | |||||
}, | |||||
watch: { | |||||
visible: function (val) { | |||||
this.dialogShow = val; | |||||
}, | |||||
}, | |||||
methods: { | |||||
resetDataInfo() { | |||||
this.dataInfo = { | |||||
queue: '', | |||||
queueList: [], | |||||
xpu: '', | |||||
cpu: '', | |||||
mem: '', | |||||
shareMem: '', | |||||
price: '', | |||||
status: '', | |||||
statusList: [], | |||||
} | |||||
}, | |||||
open() { | |||||
this.resetDataInfo(); | |||||
if (this.type === 'add') { | |||||
// | |||||
} else if (this.type === 'edit') { | |||||
this.dataInfo = Object.assign(this.dataInfo, { ...this.data }); | |||||
} | |||||
console.log('open', this.type, this.data); | |||||
this.$emit("open"); | |||||
}, | |||||
opened() { | |||||
this.$emit("opened"); | |||||
}, | |||||
close() { | |||||
this.$emit("close"); | |||||
}, | |||||
closed() { | |||||
this.$emit("closed"); | |||||
this.$emit("update:visible", false); | |||||
}, | |||||
confirm() { | |||||
}, | |||||
cancel() { | |||||
this.dialogShow = false; | |||||
this.$emit("update:visible", false); | |||||
} | |||||
}, | |||||
mounted() { | |||||
this.resetDataInfo(); | |||||
}, | |||||
}; | |||||
</script> | |||||
<style scoped lang="less"> | |||||
.dlg-content { | |||||
margin: 20px 0 25px 0; | |||||
display: flex; | |||||
justify-content: center; | |||||
.form { | |||||
width: 600px; | |||||
.form-row { | |||||
display: flex; | |||||
min-height: 42px; | |||||
margin-bottom: 4px; | |||||
.title { | |||||
width: 160px; | |||||
display: flex; | |||||
justify-content: flex-end; | |||||
align-items: center; | |||||
margin-right: 20px; | |||||
color: rgb(136, 136, 136); | |||||
font-size: 14px; | |||||
&.required { | |||||
span { | |||||
position: relative; | |||||
} | |||||
span::after { | |||||
position: absolute; | |||||
right: -10px; | |||||
top: -2px; | |||||
vertical-align: top; | |||||
content: '*'; | |||||
color: #db2828; | |||||
} | |||||
} | |||||
} | |||||
.content { | |||||
width: 300px; | |||||
display: flex; | |||||
align-items: center; | |||||
/deep/ .el-select { | |||||
width: 100%; | |||||
} | |||||
} | |||||
} | |||||
} | |||||
.btn { | |||||
color: rgb(2, 0, 4); | |||||
background-color: rgb(194, 199, 204); | |||||
border-color: rgb(194, 199, 204); | |||||
&.confirm-btn { | |||||
color: #fff; | |||||
background-color: rgb(56, 158, 13); | |||||
border-color: rgb(56, 158, 13); | |||||
} | |||||
} | |||||
} | |||||
</style> |
@@ -3,63 +3,52 @@ | |||||
<div class="title"><span>资源池(队列)</span></div> | <div class="title"><span>资源池(队列)</span></div> | ||||
<div class="tools-bar"> | <div class="tools-bar"> | ||||
<div> | <div> | ||||
<el-select class="select" size="medium" :value="value1"> | |||||
<!-- <el-option v-for="item in sceneList" :key="item.k" :label="item.v" :value="item.k" /> --> | |||||
<el-select class="select" size="medium" v-model="selCluster" @change="selectChange"> | |||||
<el-option v-for="item in clusterList" :key="item.k" :label="item.v" :value="item.k" /> | |||||
</el-select> | </el-select> | ||||
<el-select class="select" size="medium" :value="value1"> | |||||
<!-- <el-option v-for="item in pointActions" :key="item.k" :label="item.v" :value="item.k" /> --> | |||||
<el-select class="select" size="medium" v-model="selComputingCenter" @change="selectChange"> | |||||
<el-option v-for="item in computingCenterList" :key="item.k" :label="item.v" :value="item.k" /> | |||||
</el-select> | |||||
<el-select class="select" size="medium" v-model="selComputingType" @change="selectChange"> | |||||
<el-option v-for="item in computingTypeList" :key="item.k" :label="item.v" :value="item.k" /> | |||||
</el-select> | |||||
<el-select class="select" size="medium" v-model="selCardType" @change="selectChange"> | |||||
<el-option v-for="item in cardTypeList" :key="item.k" :label="item.v" :value="item.k" /> | |||||
</el-select> | </el-select> | ||||
<el-select class="select" size="medium" :value="value1"></el-select> | |||||
<el-select class="select" size="medium" :value="value1"></el-select> | |||||
</div> | </div> | ||||
<div> | <div> | ||||
<el-button size="medium" icon="el-icon-refresh" @click="showDialog('edit', {x: 1, y: 2, z: 3})">同步智算网络</el-button> | |||||
<el-button size="medium" icon="el-icon-refresh" @click="syncComputerNetwork">同步智算网络</el-button> | |||||
<el-button type="primary" icon="el-icon-plus" size="medium" @click="showDialog('add')">新增资源池</el-button> | <el-button type="primary" icon="el-icon-plus" size="medium" @click="showDialog('add')">新增资源池</el-button> | ||||
</div> | </div> | ||||
</div> | </div> | ||||
<div class="table-container"> | <div class="table-container"> | ||||
<div> | <div> | ||||
<el-table border :data="tableData" style="width: 100%" v-loading="loading" stripe> | <el-table border :data="tableData" style="width: 100%" v-loading="loading" stripe> | ||||
<el-table-column prop="index" label="ID" align="center" header-align="center"></el-table-column> | |||||
<el-table-column prop="userName" label="资源池(队列)名称" align="center" header-align="center"> | |||||
<template #default="scope"> | |||||
<a :href="`/${scope.row.userName}`">{{ scope.row.userName }}</a> | |||||
</template> | |||||
</el-table-column> | |||||
<el-table-column prop="date" label="所属集群" align="center" header-align="center"> | |||||
<el-table-column prop="id" label="ID" align="center" header-align="center" width="100"></el-table-column> | |||||
<el-table-column prop="name" label="资源池(队列)名称" align="center" header-align="center"></el-table-column> | |||||
<el-table-column prop="cluster" label="所属集群" align="center" header-align="center"></el-table-column> | |||||
<el-table-column prop="computingCenterId" label="智算中心ID" align="center" header-align="center"> | |||||
</el-table-column> | </el-table-column> | ||||
<el-table-column prop="scene" label="智算中心ID" align="center" header-align="center"> | |||||
</el-table-column> | |||||
<el-table-column prop="pointAction" label="智算中心" align="left" header-align="center"> | |||||
</el-table-column> | |||||
<el-table-column prop="remark" label="计算资源" align="left" header-align="center" min-width="200"> | |||||
<template #default="scope"> | |||||
<span v-html="scope.row.remark"></span> | |||||
<el-table-column prop="computingCenter" label="智算中心" align="center" header-align="center"></el-table-column> | |||||
<el-table-column prop="computingType" label="计算资源" align="center" header-align="center"></el-table-column> | |||||
<el-table-column prop="cardType" label="卡类型" align="center" header-align="center"></el-table-column> | |||||
<el-table-column prop="cardNum" label="卡数 " align="center" header-align="center"> | |||||
<template slot-scope="scope"> | |||||
{{ scope.row.cardNum }} | |||||
</template> | </template> | ||||
</el-table-column> | </el-table-column> | ||||
<el-table-column prop="operator" label="卡类型" align="center" header-align="center"> | |||||
</el-table-column> | |||||
<el-table-column prop="amount" label="卡数 " align="center" header-align="center"> | |||||
<template #default="scope"> | |||||
{{ scope.row.amount }} | |||||
<el-table-column prop="updateTime" label="最后更新时间" align="center" header-align="center"></el-table-column> | |||||
<el-table-column prop="remark" label="备注" align="left" header-align="center"> | |||||
<template slot-scope="scope"> | |||||
{{ scope.row.remark }} | |||||
</template> | </template> | ||||
</el-table-column> | </el-table-column> | ||||
<el-table-column prop="blance" label="最后更新时间" align="center" header-align="center"> | |||||
<template #default="scope"> | |||||
{{ scope.row.blance }} | |||||
<el-table-column label="操作" align="center" header-align="center" width="80"> | |||||
<template slot-scope="scope"> | |||||
<span class="op-btn" @click="showDialog('edit', scope.row)">修改</span> | |||||
</template> | </template> | ||||
</el-table-column> | </el-table-column> | ||||
<el-table-column prop="blance" label="备注" align="center" header-align="center"> | |||||
<template #default="scope"> | |||||
{{ scope.row.blance }} | |||||
</template> | |||||
</el-table-column> | |||||
<el-table-column prop="blance" label="操作" align="center" header-align="center"> | |||||
<template #default="scope"> | |||||
{{ scope.row.blance }} | |||||
</template> | |||||
</el-table-column> | |||||
<template #empty> | |||||
<template slot="empty"> | |||||
<span style="font-size: 12px">{{ | <span style="font-size: 12px">{{ | ||||
loading ? '加载中...' : '暂无数据' | loading ? '加载中...' : '暂无数据' | ||||
}}</span> | }}</span> | ||||
@@ -77,17 +66,27 @@ | |||||
</div> | </div> | ||||
</div> | </div> | ||||
</div> | </div> | ||||
<QueueDialog :visible.sync="queueDialogShow" :type="queueDialogType" :data="queueDialogData" @confirm="queueDialogConfirm"></QueueDialog> | |||||
<QueueDialog :visible.sync="queueDialogShow" :type="queueDialogType" :data="queueDialogData" | |||||
@confirm="queueDialogConfirm"></QueueDialog> | |||||
</div> | </div> | ||||
</template> | </template> | ||||
<script> | <script> | ||||
import QueueDialog from '../components/QueueDialog.vue'; | import QueueDialog from '../components/QueueDialog.vue'; | ||||
import { getQueueList } from '~/apis/modules/resources'; | |||||
export default { | export default { | ||||
data() { | data() { | ||||
return { | return { | ||||
value1: '1', | |||||
searchVal: '', | |||||
selCluster: '', | |||||
clusterList: [{ k: '', v: '全部集群' }, { k: '1', v: '启智集群' }, { k: '2', v: '智算联盟集群' }], | |||||
selComputingCenter: '', | |||||
computingCenterList: [{ k: '', v: '全部智算中心' }, { k: '1', v: '云脑I' }, { k: '2', v: '云脑II' }], | |||||
selComputingType: '', | |||||
computingTypeList: [{ k: '', v: '全部计算资源' }, { k: 'cpu/gpu', v: 'CPU/GPU' }, { k: 'npu', v: 'NPU' }], | |||||
selCardType: '', | |||||
cardTypeList: [{ k: '', v: '全部卡类型' }, { k: 't4', v: 'T4' }, { k: 'a100', v: 'A100' }, { k: 'v100', v: 'V100' }, { k: 'ascend910', v: 'Ascend910' }], | |||||
syncLoading: false, | |||||
loading: false, | loading: false, | ||||
tableData: [], | tableData: [], | ||||
pageInfo: { | pageInfo: { | ||||
@@ -101,34 +100,69 @@ export default { | |||||
queueDialogData: {}, | queueDialogData: {}, | ||||
}; | }; | ||||
}, | }, | ||||
components: { | |||||
QueueDialog | |||||
}, | |||||
components: { QueueDialog }, | |||||
methods: { | methods: { | ||||
getTableData: function () { | |||||
this.tableData = new Array(20).fill(0).map((_, index) => { | |||||
return { | |||||
index: index, | |||||
}; | |||||
}) | |||||
getTableData() { | |||||
const params = { | |||||
cluster: this.selCluster, | |||||
computingCenter: this.selComputingCenter, | |||||
computingType: this.selComputingType, | |||||
cardType: this.selCardType, | |||||
curpage: this.pageInfo.curpage, | |||||
pagesize: this.pageInfo.pageSize, | |||||
}; | |||||
console.log('params', params); | |||||
this.loading = true; | |||||
getQueueList(params).then(res => { | |||||
this.loading = false; | |||||
// const data = res.data. | |||||
const data = new Array(20).fill(0).map((_, index) => { | |||||
return { | |||||
index: index, | |||||
id: `id-${index}-${Math.random().toFixed(2)}`, | |||||
name: `name-${index}-${Math.random().toFixed(2)}`, | |||||
cluster: `cluster-${index}-${Math.random().toFixed(2)}`, | |||||
computingCenterId: `computingCenterId-${index}-${Math.random().toFixed(2)}`, | |||||
computingCenter: `computingCenter-${index}-${Math.random().toFixed(2)}`, | |||||
computingType: `computingType-${index}-${Math.random().toFixed(2)}`, | |||||
cardType: `cardType-${index}-${Math.random().toFixed(2)}`, | |||||
cardNum: `cardNum-${index}-${Math.random().toFixed(2)}`, | |||||
updateTime: `updateTime-${index}-${Math.random().toFixed(2)}`, | |||||
remark: `remark-${index}-${Math.random().toFixed(2)}`, | |||||
}; | |||||
}); | |||||
this.tableData = data; | |||||
this.pageInfo.total = 99; | |||||
}).catch(err => { | |||||
console.log(err); | |||||
this.loading = false; | |||||
}); | |||||
}, | |||||
syncComputerNetwork() { | |||||
// | |||||
}, | |||||
selectChange() { | |||||
this.pageInfo.curpage = 1; | |||||
this.getTableData(); | |||||
}, | }, | ||||
currentChange: function (val) { | |||||
currentChange(val) { | |||||
this.pageInfo.curpage = val; | this.pageInfo.curpage = val; | ||||
// this.getTableData(); | |||||
this.getTableData(); | |||||
}, | }, | ||||
showDialog(type, data) { | showDialog(type, data) { | ||||
this.queueDialogType = type; | this.queueDialogType = type; | ||||
this.queueDialogData = data || {}; | |||||
this.queueDialogData = data ? { ...data } : {}; | |||||
this.queueDialogShow = true; | this.queueDialogShow = true; | ||||
}, | }, | ||||
queueDialogConfirm() { | queueDialogConfirm() { | ||||
this.queueDialogShow = false; | this.queueDialogShow = false; | ||||
this.getTableData(); | |||||
} | } | ||||
}, | }, | ||||
mounted: function () { | |||||
mounted() { | |||||
this.getTableData(); | this.getTableData(); | ||||
}, | }, | ||||
beforeDestroy: function () { | |||||
beforeDestroy() { | |||||
}, | }, | ||||
}; | }; | ||||
</script> | </script> | ||||
@@ -1,21 +1,79 @@ | |||||
<template> | <template> | ||||
<div class="xxx"> | |||||
scene | |||||
<div> | |||||
<div class="title"><span>算力资源应用场景管理</span></div> | |||||
<div class="tools-bar"> | |||||
<div> | |||||
<el-select class="select" size="medium" v-model="selTaskType" @change="selectChange"> | |||||
<el-option v-for="item in taskTypeList" :key="item.k" :label="item.v" :value="item.k" /> | |||||
</el-select> | |||||
<el-select class="select" size="medium" v-model="selIsExclusive" @change="selectChange"> | |||||
<el-option v-for="item in isExclusiveList" :key="item.k" :label="item.v" :value="item.k" /> | |||||
</el-select> | |||||
<el-select class="select" size="medium" v-model="selQueue" @change="selectChange"> | |||||
<el-option v-for="item in queueList" :key="item.k" :label="item.v" :value="item.k" /> | |||||
</el-select> | |||||
</div> | |||||
<div> | |||||
<el-button type="primary" icon="el-icon-plus" size="medium" @click="showDialog('add')">新增应用场景</el-button> | |||||
</div> | |||||
</div> | |||||
<div class="table-container"> | |||||
<div> | |||||
<el-table border :data="tableData" style="width: 100%" v-loading="loading" stripe> | |||||
<el-table-column prop="id" label="ID" align="center" header-align="center" width="100"></el-table-column> | |||||
<el-table-column prop="name" label="应用场景名称" align="center" header-align="center"></el-table-column> | |||||
<el-table-column prop="taskType" label="任务类型" align="center" header-align="center"></el-table-column> | |||||
<el-table-column prop="isExclusive" label="是否专属" align="center" header-align="center"></el-table-column> | |||||
<el-table-column prop="exclusiveOrg" label="专属组织" align="center" header-align="center"></el-table-column> | |||||
<el-table-column prop="queue" label="资源池(队列)" align="center" header-align="center"></el-table-column> | |||||
<el-table-column prop="specs" label="资源规格" align="left" header-align="center"> | |||||
<template slot-scope="scope"> | |||||
{{ scope.row.specs }} | |||||
</template> | |||||
</el-table-column> | |||||
<el-table-column label="操作" align="center" header-align="center" width="100"> | |||||
<template slot-scope="scope"> | |||||
<span class="op-btn" @click="showDialog('edit', scope.row)">修改</span> | |||||
<span class="op-btn" style="color:red" @click="deleteRow(scope.row)">删除</span> | |||||
</template> | |||||
</el-table-column> | |||||
<template slot="empty"> | |||||
<span style="font-size: 12px">{{ | |||||
loading ? '加载中...' : '暂无数据' | |||||
}}</span> | |||||
</template> | |||||
</el-table> | |||||
</div> | |||||
<div class="__r_p_pagination"> | |||||
<div style="margin-top: 2rem"> | |||||
<div class="center"> | |||||
<el-pagination background @current-change="currentChange" :current-page="pageInfo.curpage" | |||||
:page-sizes="pageInfo.pageSizes" :page-size="pageInfo.pageSize" | |||||
layout="total, sizes, prev, pager, next, jumper" :total="pageInfo.total"> | |||||
</el-pagination> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
<SceneDialog :visible.sync="sceneDialogShow" :type="sceneDialogType" :data="sceneDialogData" | |||||
@confirm="sceneDialogConfirm"></SceneDialog> | |||||
</div> | </div> | ||||
</template> | </template> | ||||
<script> | <script> | ||||
import SceneDialog from '../components/SceneDialog.vue'; | |||||
import { getQueueList } from '~/apis/modules/resources'; | |||||
export default { | export default { | ||||
data() { | data() { | ||||
return { | return { | ||||
selTaskType: '', | |||||
taskTypeList: [{ k: '', v: '全部任务类型' }, { k: '1', v: '调试任务' }, { k: '2', v: '训练任务' }, { k: '3', v: '评测任务' }, { k: '4', v: '推理任务' }], | |||||
selIsExclusive: '', | |||||
isExclusiveList: [{ k: '', v: '全部专属和通用' }, { k: '1', v: '专属' }, { k: '2', v: '通用' }], | |||||
selQueue: '', | |||||
queueList: [{ k: '', v: '全部资源池队列' }, { k: '1', v: '资源池1' }, { k: '2', v: '资源池2' }], | |||||
loading: false, | loading: false, | ||||
summaryInfo: { | |||||
available: 0, | |||||
gain: 0, | |||||
used: 0, | |||||
}, | |||||
tabIndex: 0, | |||||
tableData: [], | tableData: [], | ||||
pageInfo: { | pageInfo: { | ||||
curpage: 1, | curpage: 1, | ||||
@@ -23,21 +81,145 @@ export default { | |||||
pageSizes: [10], | pageSizes: [10], | ||||
total: 0, | total: 0, | ||||
}, | }, | ||||
eventSource: null, | |||||
sceneDialogShow: false, | |||||
sceneDialogType: 'add', | |||||
sceneDialogData: {}, | |||||
}; | }; | ||||
}, | }, | ||||
components: {}, | |||||
methods: { | |||||
getTableData: function () { | |||||
components: { SceneDialog }, | |||||
methods: { | |||||
getTableData() { | |||||
const params = { | |||||
taskType: this.selTaskType, | |||||
isExclusive: this.selIsExclusive, | |||||
queue: this.selQueue, | |||||
curpage: this.pageInfo.curpage, | |||||
pagesize: this.pageInfo.pageSize, | |||||
}; | |||||
console.log('params', params); | |||||
this.loading = true; | |||||
getQueueList(params).then(res => { | |||||
this.loading = false; | |||||
// const data = res.data. | |||||
const data = new Array(20).fill(0).map((_, index) => { | |||||
return { | |||||
index: index, | |||||
id: `id-${index}-${Math.random().toFixed(2)}`, | |||||
name: `name-${index}-${Math.random().toFixed(2)}`, | |||||
taskType: `taskType-${index}-${Math.random().toFixed(2)}`, | |||||
isExclusive: `isExclusive-${index}-${Math.random().toFixed(2)}`, | |||||
exclusiveOrg: `exclusiveOrg-${index}-${Math.random().toFixed(2)}`, | |||||
queue: `queue-${index}-${Math.random().toFixed(2)}`, | |||||
specs: `spec-${index}-${Math.random().toFixed(2)}`, | |||||
}; | |||||
}); | |||||
this.tableData = data; | |||||
this.pageInfo.total = 99; | |||||
}).catch(err => { | |||||
console.log(err); | |||||
this.loading = false; | |||||
}); | |||||
}, | |||||
selectChange() { | |||||
this.pageInfo.curpage = 1; | |||||
this.getTableData(); | |||||
}, | |||||
currentChange(val) { | |||||
this.pageInfo.curpage = val; | |||||
this.getTableData(); | |||||
}, | |||||
deleteRow(row) { | |||||
this.$confirm('此操作将永久删除该文件, 是否继续?', '提示', { | |||||
confirmButtonText: '确定', | |||||
cancelButtonText: '取消', | |||||
type: 'warning', | |||||
lockScroll: false, | |||||
}).then(() => { | |||||
this.$message({ | |||||
type: 'success', | |||||
message: '删除成功!' | |||||
}); | |||||
}).catch(() => { | |||||
this.$message({ | |||||
type: 'info', | |||||
message: '已取消删除' | |||||
}); | |||||
}); | |||||
}, | }, | ||||
showDialog(type, data) { | |||||
this.sceneDialogType = type; | |||||
this.sceneDialogData = data ? { ...data } : {}; | |||||
this.sceneDialogShow = true; | |||||
}, | |||||
sceneDialogConfirm() { | |||||
this.sceneDialogShow = false; | |||||
this.getTableData(); | |||||
} | |||||
}, | }, | ||||
mounted: function () { | |||||
mounted() { | |||||
this.getTableData(); | |||||
}, | }, | ||||
beforeDestroy: function () { | |||||
beforeDestroy() { | |||||
}, | }, | ||||
}; | }; | ||||
</script> | </script> | ||||
<style scoped lang="less"> | <style scoped lang="less"> | ||||
.title { | |||||
height: 30px; | |||||
display: flex; | |||||
align-items: center; | |||||
margin-bottom: 5px; | |||||
span { | |||||
font-weight: 700; | |||||
font-size: 16px; | |||||
color: rgb(16, 16, 16); | |||||
} | |||||
} | |||||
.tools-bar { | |||||
display: flex; | |||||
align-items: center; | |||||
justify-content: space-between; | |||||
margin-bottom: 10px; | |||||
.select { | |||||
margin-right: 10px; | |||||
/deep/ .el-input__inner { | |||||
border-radius: 0; | |||||
} | |||||
} | |||||
} | |||||
.table-container { | |||||
margin-bottom: 16px; | |||||
/deep/ .el-table__header { | |||||
th { | |||||
background: rgb(245, 245, 246); | |||||
font-size: 12px; | |||||
color: rgb(36, 36, 36); | |||||
} | |||||
} | |||||
/deep/ .el-table__body { | |||||
td { | |||||
font-size: 12px; | |||||
} | |||||
} | |||||
.op-btn { | |||||
cursor: pointer; | |||||
font-size: 12px; | |||||
color: rgb(25, 103, 252); | |||||
margin: 0 5px; | |||||
} | |||||
} | |||||
.center { | |||||
display: flex; | |||||
justify-content: center; | |||||
} | |||||
</style> | </style> |
@@ -1,21 +1,81 @@ | |||||
<template> | <template> | ||||
<div class="xxx"> | |||||
specification | |||||
<div> | |||||
<div class="title"><span>资源规格单价管理</span></div> | |||||
<div class="tools-bar"> | |||||
<div> | |||||
<el-select class="select" size="medium" v-model="selQueue" @change="selectChange"> | |||||
<el-option v-for="item in queueList" :key="item.k" :label="item.v" :value="item.k" /> | |||||
</el-select> | |||||
<el-select class="select" size="medium" v-model="selStatus" @change="selectChange"> | |||||
<el-option v-for="item in statusList" :key="item.k" :label="item.v" :value="item.k" /> | |||||
</el-select> | |||||
</div> | |||||
<div> | |||||
<!-- syncComputerNetwork --> | |||||
<el-button size="medium" icon="el-icon-refresh" @click="confirmOperate">同步智算网络</el-button> | |||||
<el-button type="primary" icon="el-icon-plus" size="medium" @click="showDialog('add')">新增资源规格</el-button> | |||||
</div> | |||||
</div> | |||||
<div class="table-container"> | |||||
<div> | |||||
<el-table border :data="tableData" style="width: 100%" v-loading="loading" stripe> | |||||
<el-table-column prop="id" label="ID" align="center" header-align="center" width="100"></el-table-column> | |||||
<el-table-column prop="name" label="资源规格" align="left" header-align="center"></el-table-column> | |||||
<el-table-column prop="queue" label="资源池(队列)" align="center" header-align="center"></el-table-column> | |||||
<el-table-column prop="specID" label="智算网络资源规格ID" align="center" header-align="center"></el-table-column> | |||||
<el-table-column prop="cardNum" label="卡数 " align="center" header-align="center"></el-table-column> | |||||
<el-table-column prop="cpu" label="CPU " align="center" header-align="center"></el-table-column> | |||||
<el-table-column prop="mem" label="内存(GB) " align="center" header-align="center"></el-table-column> | |||||
<el-table-column prop="shareMem" label="共享内存(GB)" align="center" header-align="center"></el-table-column> | |||||
<el-table-column prop="updateTime" label="最后更新时间" align="center" header-align="center"></el-table-column> | |||||
<el-table-column prop="price" label="单价(积分/时)" align="center" header-align="center"></el-table-column> | |||||
<el-table-column prop="status" label="状态" align="center" header-align="center"> | |||||
<template slot-scope="scope"> | |||||
{{ scope.row.status }} | |||||
</template> | |||||
</el-table-column> | |||||
<el-table-column label="操作" align="center" header-align="center" width="100"> | |||||
<template slot-scope="scope"> | |||||
<span class="op-btn" @click="showDialog('edit', scope.row)">定价</span> | |||||
<span class="op-btn" @click="showDialog('edit', scope.row)">上架</span> | |||||
</template> | |||||
</el-table-column> | |||||
<template slot="empty"> | |||||
<span style="font-size: 12px">{{ | |||||
loading ? '加载中...' : '暂无数据' | |||||
}}</span> | |||||
</template> | |||||
</el-table> | |||||
</div> | |||||
<div class="__r_p_pagination"> | |||||
<div style="margin-top: 2rem"> | |||||
<div class="center"> | |||||
<el-pagination background @current-change="currentChange" :current-page="pageInfo.curpage" | |||||
:page-sizes="pageInfo.pageSizes" :page-size="pageInfo.pageSize" | |||||
layout="total, sizes, prev, pager, next, jumper" :total="pageInfo.total"> | |||||
</el-pagination> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
<SpecificationDialog :visible.sync="specificationDialogShow" :type="specificationDialogType" | |||||
:data="specificationDialogData" @confirm="specificationDialogConfirm"></SpecificationDialog> | |||||
</div> | </div> | ||||
</template> | </template> | ||||
<script> | <script> | ||||
import SpecificationDialog from '../components/SpecificationDialog.vue'; | |||||
import { getQueueList } from '~/apis/modules/resources'; | |||||
export default { | export default { | ||||
data() { | data() { | ||||
return { | return { | ||||
selQueue: '', | |||||
queueList: [{ k: '', v: '全部资源池' }, { k: '1', v: '资源池1' }, { k: '2', v: '资源池2' }], | |||||
selStatus: '', | |||||
statusList: [{ k: '', v: '全部状态' }, { k: '1', v: '待上架' }, { k: '2', v: '已上架' }, { k: '3', v: '已下架' }], | |||||
syncLoading: false, | |||||
loading: false, | loading: false, | ||||
summaryInfo: { | |||||
available: 0, | |||||
gain: 0, | |||||
used: 0, | |||||
}, | |||||
tabIndex: 0, | |||||
tableData: [], | tableData: [], | ||||
pageInfo: { | pageInfo: { | ||||
curpage: 1, | curpage: 1, | ||||
@@ -23,15 +83,89 @@ export default { | |||||
pageSizes: [10], | pageSizes: [10], | ||||
total: 0, | total: 0, | ||||
}, | }, | ||||
eventSource: null, | |||||
specificationDialogShow: false, | |||||
specificationDialogType: 'add', | |||||
specificationDialogData: {}, | |||||
}; | }; | ||||
}, | }, | ||||
components: {}, | |||||
methods: { | |||||
getTableData: function () { | |||||
components: { SpecificationDialog }, | |||||
methods: { | |||||
getTableData() { | |||||
const params = { | |||||
queue: this.selQueue, | |||||
status: this.selStatus, | |||||
curpage: this.pageInfo.curpage, | |||||
pagesize: this.pageInfo.pageSize, | |||||
}; | |||||
console.log('params', params); | |||||
this.loading = true; | |||||
getQueueList(params).then(res => { | |||||
this.loading = false; | |||||
// const data = res.data. | |||||
const data = new Array(20).fill(0).map((_, index) => { | |||||
return { | |||||
index: index, | |||||
id: `id-${index}-${Math.random().toFixed(2)}`, | |||||
name: `name-${index}-${Math.random().toFixed(2)}`, | |||||
queue: `queue-${index}-${Math.random().toFixed(2)}`, | |||||
specID: `specID-${index}-${Math.random().toFixed(2)}`, | |||||
cardNum: `cardNum-${index}-${Math.random().toFixed(2)}`, | |||||
cpu: `cpu-${index}-${Math.random().toFixed(2)}`, | |||||
mem: `mem-${index}-${Math.random().toFixed(2)}`, | |||||
shareMem: `shareMem-${index}-${Math.random().toFixed(2)}`, | |||||
updateTime: `updateTime-${index}-${Math.random().toFixed(2)}`, | |||||
price: `price-${index}-${Math.random().toFixed(2)}`, | |||||
status: `status-${index}-${Math.random().toFixed(2)}`, | |||||
}; | |||||
}); | |||||
this.tableData = data; | |||||
this.pageInfo.total = 99; | |||||
}).catch(err => { | |||||
console.log(err); | |||||
this.loading = false; | |||||
}); | |||||
}, | |||||
syncComputerNetwork() { | |||||
// | |||||
}, | |||||
selectChange() { | |||||
this.pageInfo.curpage = 1; | |||||
this.getTableData(); | |||||
}, | |||||
currentChange(val) { | |||||
this.pageInfo.curpage = val; | |||||
this.getTableData(); | |||||
}, | }, | ||||
showDialog(type, data) { | |||||
this.specificationDialogType = type; | |||||
this.specificationDialogData = data ? { ...data } : {}; | |||||
this.specificationDialogShow = true; | |||||
}, | |||||
specificationDialogConfirm() { | |||||
this.specificationDialogShow = false; | |||||
this.getTableData(); | |||||
}, | |||||
confirmOperate() { | |||||
this.$confirm('此操作将永久删除该文件, 是否继续?', '提示', { | |||||
confirmButtonText: '确定', | |||||
cancelButtonText: '取消', | |||||
type: 'warning', | |||||
lockScroll: false, | |||||
}).then(() => { | |||||
this.$message({ | |||||
type: 'success', | |||||
message: '删除成功!' | |||||
}); | |||||
}).catch(() => { | |||||
this.$message({ | |||||
type: 'info', | |||||
message: '已取消删除' | |||||
}); | |||||
}); | |||||
} | |||||
}, | }, | ||||
mounted: function () { | mounted: function () { | ||||
this.getTableData(); | |||||
}, | }, | ||||
beforeDestroy: function () { | beforeDestroy: function () { | ||||
}, | }, | ||||
@@ -39,5 +173,61 @@ export default { | |||||
</script> | </script> | ||||
<style scoped lang="less"> | <style scoped lang="less"> | ||||
.title { | |||||
height: 30px; | |||||
display: flex; | |||||
align-items: center; | |||||
margin-bottom: 5px; | |||||
span { | |||||
font-weight: 700; | |||||
font-size: 16px; | |||||
color: rgb(16, 16, 16); | |||||
} | |||||
} | |||||
.tools-bar { | |||||
display: flex; | |||||
align-items: center; | |||||
justify-content: space-between; | |||||
margin-bottom: 10px; | |||||
.select { | |||||
margin-right: 10px; | |||||
/deep/ .el-input__inner { | |||||
border-radius: 0; | |||||
} | |||||
} | |||||
} | |||||
.table-container { | |||||
margin-bottom: 16px; | |||||
/deep/ .el-table__header { | |||||
th { | |||||
background: rgb(245, 245, 246); | |||||
font-size: 12px; | |||||
color: rgb(36, 36, 36); | |||||
} | |||||
} | |||||
/deep/ .el-table__body { | |||||
td { | |||||
font-size: 12px; | |||||
} | |||||
} | |||||
.op-btn { | |||||
cursor: pointer; | |||||
font-size: 12px; | |||||
color: rgb(25, 103, 252); | |||||
margin: 0 5px; | |||||
} | |||||
} | |||||
.center { | |||||
display: flex; | |||||
justify-content: center; | |||||
} | |||||
</style> | </style> |