<template>
|
<div class="list-wrap">
|
<a-typography-title class="block-title" :heading="6">
|
{{ $t('cardList.tab.title.content') }}
|
</a-typography-title>
|
<a-button class='add-button' type="primary" @click="addCard">添加</a-button>
|
|
<a-row class="list-row" :gutter="24">
|
<a-col
|
:xs="12"
|
:sm="12"
|
:md="12"
|
:lg="6"
|
:xl="6"
|
:xxl="6"
|
class="list-col"
|
>
|
<div class="card-wrap empty-wrap">
|
<a-card :bordered="false" hoverable >
|
<a-result :status="null" title="Xinference模型是个很厉害的模型">
|
<template #icon>
|
<icon-plus style="font-size: 20px" />
|
</template>
|
</a-result>
|
</a-card>
|
</div>
|
</a-col>
|
<a-col
|
v-for="item in renderData"
|
:key="item.id"
|
class="list-col"
|
:xs="12"
|
:sm="12"
|
:md="12"
|
:lg="6"
|
:xl="6"
|
:xxl="6"
|
>
|
<CardWrap
|
:loading="loading"
|
:title="item.title"
|
:description="item.description"
|
:default-value="item.enable"
|
:action-type="item.actionType"
|
:icon="item.icon"
|
:open-txt="$t('cardList.content.inspection')"
|
:close-txt="$t('cardList.content.delete')"
|
:show-tag="false"
|
>
|
<a-descriptions
|
style="margin-top: 16px"
|
:data="item.data"
|
layout="inline-horizontal"
|
:column="2"
|
/>
|
<template #skeleton>
|
<a-skeleton :animation="true">
|
<a-skeleton-line
|
:widths="['50%', '50%', '100%', '40%']"
|
:rows="4"
|
/>
|
<a-skeleton-line :widths="['40%']" :rows="1" />
|
</a-skeleton>
|
</template>
|
</CardWrap>
|
</a-col>
|
</a-row>
|
|
<a-modal v-model:visible="visible" @Ok="handleOk" @cancel="handleCancel">
|
<template #title> 添加LLM </template>
|
<a-form
|
ref="formRef"
|
:size="form.size"
|
:model="form"
|
auto-label-width
|
@submit="handleSubmit"
|
>
|
<a-form-item
|
field="type"
|
label="模型类型"
|
:rules="[{ required: true, message: '不能为空' }]"
|
:validate-trigger="['change', 'input']"
|
>
|
<a-select
|
v-model="form.type"
|
placeholder="请选择模型类型"
|
allow-clear
|
>
|
<a-option>chartGpt 4</a-option>
|
<a-option>chartGpt o</a-option>
|
<a-option>LLM</a-option>
|
</a-select>
|
</a-form-item>
|
|
<a-form-item
|
field="UID"
|
label="模型UID"
|
:rules="[
|
{ required: true, message: '不能为空' },
|
{ minLength: 1, message: '至少一个字符' },
|
]"
|
:validate-trigger="['change', 'input']"
|
>
|
<a-input v-model="form.UID" placeholder="请输入模型UID" />
|
</a-form-item>
|
|
<a-form-item
|
field="Url"
|
label="基础Url"
|
:rules="[
|
{ required: true, message: '不能为空' },
|
{ minLength: 1, message: '至少一个字符' },
|
]"
|
:validate-trigger="['change', 'input']"
|
>
|
<a-input v-model="form.Url" placeholder="请输入基础Url" />
|
</a-form-item>
|
|
<a-form-item
|
field="vision"
|
label="是否支持 vision"
|
:validate-trigger="['change', 'input']"
|
>
|
<a-switch v-model="form.vision" />
|
</a-form-item>
|
</a-form>
|
</a-modal>
|
</div>
|
</template>
|
|
<script lang="ts" setup>
|
import { nextTick, reactive, ref } from 'vue';
|
import { queryInspectionList, ServiceRecord } from '@/api/list';
|
import useRequest from '@/hooks/request';
|
import CardWrap from './card-wrap.vue';
|
|
const defaultValue: ServiceRecord[] = new Array(3).fill({});
|
const { loading, response: renderData } = useRequest<ServiceRecord[]>(
|
queryInspectionList,
|
defaultValue
|
);
|
const visible = ref(false);
|
const addCard = () => {
|
visible.value = true;
|
};
|
|
const formRef = ref(null);
|
const form = reactive({
|
size: 'medium',
|
type: '',
|
UID: '',
|
Url: '',
|
vision: false,
|
});
|
const handleOk = () => {
|
formRef.value.validate().then((res) => {
|
if (res) {
|
return;
|
}
|
renderData.value = renderData.value.concat({
|
id: renderData.value.length + 1,
|
title: form.type,
|
description: form.Url,
|
icon: 'icon-setting',
|
actionType: 'inspection',
|
enable: true,
|
data: [
|
{
|
label: '待质检数',
|
value: '120',
|
},
|
{
|
label: '积压时长',
|
value: '60s',
|
},
|
{
|
label: '待抽检数',
|
value: '0',
|
},
|
],
|
});
|
visible.value = false;
|
});
|
nextTick(() => {
|
visible.value = true;
|
});
|
return false;
|
};
|
const handleCancel = () => {
|
formRef.value.resetFields();
|
visible.value = false;
|
};
|
</script>
|
|
<style scoped lang="less">
|
.card-wrap {
|
height: 100%;
|
transition: all 0.3s;
|
border: 1px solid var(--color-neutral-3);
|
&:hover {
|
transform: translateY(-4px);
|
}
|
:deep(.arco-card-meta-description) {
|
color: rgb(var(--gray-6));
|
.arco-descriptions-item-label-inline {
|
font-weight: normal;
|
font-size: 12px;
|
color: rgb(var(--gray-6));
|
}
|
.arco-descriptions-item-value-inline {
|
color: rgb(var(--gray-8));
|
}
|
}
|
}
|
.empty-wrap {
|
height: 200px;
|
border-radius: 4px;
|
:deep(.arco-card) {
|
height: 100%;
|
display: flex;
|
align-items: center;
|
justify-content: center;
|
border-radius: 4px;
|
.arco-result-title {
|
color: rgb(var(--gray-6));
|
}
|
}
|
}
|
|
.list-wrap{
|
position: relative;
|
|
::v-deep .block-title{
|
height: 36px;
|
lin-height: 36px;
|
}
|
|
.add-button{
|
position: absolute;
|
right: 20px;
|
top: 0;
|
}
|
}
|
</style>
|