|
|
@@ -6,23 +6,23 @@
|
|
|
<el-row :gutter="20">
|
|
|
<el-col :span="4" style="margin-left: 20px">
|
|
|
<el-form-item label="服务商名称">
|
|
|
- <el-input v-model="input" style="width: 240px" placeholder="请输入服务商名称" />
|
|
|
+ <el-input v-model="input" style="width: 240px" placeholder="请输入服务商名称" />
|
|
|
</el-form-item>
|
|
|
|
|
|
</el-col>
|
|
|
<el-col :span="5">
|
|
|
<el-form-item label="服务商编码">
|
|
|
- <el-input v-model="input" style="width: 240px" placeholder="请输入服务商编码" />
|
|
|
+ <el-input v-model="input" style="width: 240px" placeholder="请输入服务商编码" />
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
<el-col :span="4">
|
|
|
<el-form-item label="服务商种类">
|
|
|
- <el-select v-model="modelType" placeholder="全部">
|
|
|
+ <el-select v-model="modelKind" placeholder="全部">
|
|
|
<el-option
|
|
|
- v-for="item in modelTypeOption"
|
|
|
- :value="item"
|
|
|
- :label="item"
|
|
|
- :key="item"
|
|
|
+ v-for="item in modelKindOption"
|
|
|
+ :value="item"
|
|
|
+ :label="item"
|
|
|
+ :key="item"
|
|
|
/>
|
|
|
</el-select>
|
|
|
</el-form-item>
|
|
|
@@ -31,10 +31,10 @@
|
|
|
<el-form-item label="状态">
|
|
|
<el-select v-model="modelState" placeholder="全部">
|
|
|
<el-option
|
|
|
- v-for="item in modelStateOption"
|
|
|
- :label="item"
|
|
|
- :value="item"
|
|
|
- :key="item"
|
|
|
+ v-for="item in modelStateOption"
|
|
|
+ :label="item"
|
|
|
+ :value="item"
|
|
|
+ :key="item"
|
|
|
/>
|
|
|
</el-select>
|
|
|
</el-form-item>
|
|
|
@@ -51,33 +51,33 @@
|
|
|
<el-button type="primary" @click="dialogVisible = true">+新增服务商</el-button>
|
|
|
<el-dialog v-model="dialogVisible" title="新增服务商" width="40%">
|
|
|
|
|
|
- <el-form>
|
|
|
- <!-- Tab 栏 -->
|
|
|
- <el-tabs tab-position="top" v-model="activeTab" type="card">
|
|
|
- <el-tab-pane label="基本信息" name="info1">
|
|
|
- <BasicInfo v-model="formData.info1" />
|
|
|
- </el-tab-pane>
|
|
|
- <el-tab-pane label="API配置" name="info2">
|
|
|
- <ApiInfo v-model="formData.info2" />
|
|
|
- </el-tab-pane>
|
|
|
- <el-tab-pane label="附加信息" name="info3">
|
|
|
- <AdditionInfo v-model="formData.info3" />
|
|
|
- </el-tab-pane>
|
|
|
- </el-tabs>
|
|
|
- <!-- 提交按钮 -->
|
|
|
- <div style="display: flex; justify-content: flex-end;">
|
|
|
- <el-form-item>
|
|
|
- <el-button @click="dialogVisible = false">取消</el-button>
|
|
|
- <el-button type="primary" @click="submitForm">提交</el-button>
|
|
|
- </el-form-item>
|
|
|
- </div>
|
|
|
- </el-form>
|
|
|
+ <el-form>
|
|
|
+ <!-- Tab 栏 -->
|
|
|
+ <el-tabs tab-position="top" v-model="activeTab" type="card">
|
|
|
+ <el-tab-pane label="基本信息" name="info1">
|
|
|
+ <BasicInfo v-model="formData.info1" />
|
|
|
+ </el-tab-pane>
|
|
|
+ <el-tab-pane label="API配置" name="info2">
|
|
|
+ <ApiInfo v-model="formData.info2" />
|
|
|
+ </el-tab-pane>
|
|
|
+ <el-tab-pane label="附加信息" name="info3">
|
|
|
+ <AdditionInfo v-model="formData.info3" />
|
|
|
+ </el-tab-pane>
|
|
|
+ </el-tabs>
|
|
|
+ <!-- 提交按钮 -->
|
|
|
+ <div style="display: flex; justify-content: flex-end;">
|
|
|
+ <el-form-item>
|
|
|
+ <el-button @click="dialogVisible = false">取消</el-button>
|
|
|
+ <el-button type="primary" @click="submitForm">提交</el-button>
|
|
|
+ </el-form-item>
|
|
|
+ </div>
|
|
|
+ </el-form>
|
|
|
|
|
|
</el-dialog>
|
|
|
</el-col>
|
|
|
- <el-col :span="1.5">
|
|
|
- <el-button><el-icon><Upload /></el-icon>批量导入</el-button>
|
|
|
- </el-col>
|
|
|
+ <el-col :span="1.5">
|
|
|
+ <el-button><el-icon><Upload /></el-icon>批量导入</el-button>
|
|
|
+ </el-col>
|
|
|
<el-col :span="1">
|
|
|
<el-button><el-icon><Download /></el-icon>导出</el-button>
|
|
|
</el-col>
|
|
|
@@ -88,80 +88,80 @@
|
|
|
<!--</div>-->
|
|
|
<div class="table">
|
|
|
|
|
|
- <el-table :data="models" @selection-change="handleSelectionChange">
|
|
|
- <el-table-column type="selection" />
|
|
|
- <el-table-column label="Logo">
|
|
|
- <template #default="slot">
|
|
|
- <el-avatar :src="slot.row.logo" size="small" v-if="slot.row.logo" />
|
|
|
- <span v-else>无</span>
|
|
|
- </template>
|
|
|
- </el-table-column>
|
|
|
- <el-table-column label="服务商编码" prop="providerCode" width="120" />
|
|
|
- <el-table-column label="服务商名称" prop="providerName" width="120" />
|
|
|
- <el-table-column label="模型种类" prop="modelType" width="420" />
|
|
|
- <el-table-column label="官方认证" width="120">
|
|
|
- <template #default="slot">
|
|
|
- <el-icon size="15" color="#45D1A6" name="success" v-if="slot.row.officialCertified">
|
|
|
- <component is="Check" />
|
|
|
- </el-icon>
|
|
|
- <el-icon size="15" color="#FF4C4E" name="danger" v-else>
|
|
|
- <component is="Close" />
|
|
|
- </el-icon>
|
|
|
- </template>
|
|
|
- </el-table-column>
|
|
|
- <el-table-column label="API接入" width="120">
|
|
|
- <template #default="slot">
|
|
|
- <el-icon size="15" color="#45D1A6" v-if="slot.row.apiAccess">
|
|
|
- <component is="Check" />
|
|
|
- </el-icon>
|
|
|
- <el-icon size="15" color="#FF4C4E" name="danger" v-else>
|
|
|
- <component is="Close" />
|
|
|
- </el-icon>
|
|
|
- </template>
|
|
|
- </el-table-column>
|
|
|
- <el-table-column label="状态" width="120">
|
|
|
- <template #default="slot">
|
|
|
- <el-tag
|
|
|
- :type="
|
|
|
+ <el-table :data="models" @selection-change="handleSelectionChange">
|
|
|
+ <el-table-column type="selection" />
|
|
|
+ <el-table-column label="logoUrl">
|
|
|
+ <template #default="slot">
|
|
|
+ <el-avatar :src="slot.row.logoUrl" size="small" v-if="slot.row.logoUrl" />
|
|
|
+ <span v-else>无</span>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="服务商编码" prop="vendorCode" width="120" />
|
|
|
+ <el-table-column label="服务商名称" prop="vendorName" width="120" />
|
|
|
+ <el-table-column label="模型种类" prop="modelKind" width="420" />
|
|
|
+ <el-table-column label="官方认证" width="120">
|
|
|
+ <template #default="slot">
|
|
|
+ <el-icon size="15" color="#45D1A6" name="success" v-if="slot.row.isofficial">
|
|
|
+ <component is="Check" />
|
|
|
+ </el-icon>
|
|
|
+ <el-icon size="15" color="#FF4C4E" name="danger" v-else>
|
|
|
+ <component is="Close" />
|
|
|
+ </el-icon>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <!--<el-table-column label="API接入" width="120">-->
|
|
|
+ <!-- <template #default="slot">-->
|
|
|
+ <!-- <el-icon size="15" color="#45D1A6" v-if="slot.row.apiAccess">-->
|
|
|
+ <!-- <component is="Check" />-->
|
|
|
+ <!-- </el-icon>-->
|
|
|
+ <!-- <el-icon size="15" color="#FF4C4E" name="danger" v-else>-->
|
|
|
+ <!-- <component is="Close" />-->
|
|
|
+ <!-- </el-icon>-->
|
|
|
+ <!-- </template>-->
|
|
|
+ <!--</el-table-column>-->
|
|
|
+ <el-table-column label="状态" width="120">
|
|
|
+ <template #default="slot">
|
|
|
+ <el-tag
|
|
|
+ :type="
|
|
|
slot.row.status === 'active'
|
|
|
? 'success'
|
|
|
: slot.row.status === 'configuring'
|
|
|
? 'primary'
|
|
|
: 'warning'
|
|
|
"
|
|
|
- >
|
|
|
- {{
|
|
|
- slot.row.status === 'active'
|
|
|
- ? '启用'
|
|
|
- : slot.row.status === 'configuring'
|
|
|
- ? '配置中'
|
|
|
- : '待配置'
|
|
|
- }}
|
|
|
- </el-tag>
|
|
|
- </template>
|
|
|
- </el-table-column>
|
|
|
- <el-table-column label="创建时间" prop="createTime" width="240" />
|
|
|
- <el-table-column label="操作" width="240">
|
|
|
- <template #default="slot">
|
|
|
- <!-- 查看 -->
|
|
|
- <el-icon size="15" color="#15A9FF" style="margin-right: 10px;"><View /></el-icon>
|
|
|
-
|
|
|
- <!-- 编辑 -->
|
|
|
- <el-icon size="15" color="#15A9FF" style="margin-right: 10px;"><Edit /></el-icon>
|
|
|
-
|
|
|
- <!-- 启用/禁用图标 -->
|
|
|
- <el-icon size="15" style="margin-right: 10px;" :color="slot.row.status === 'active' ? '#13ce66' : '#ff4949'">
|
|
|
- <SwitchButton />
|
|
|
- </el-icon>
|
|
|
-
|
|
|
- <!-- 列表 -->
|
|
|
- <el-icon size="15" color="#15A9FF" style="margin-right: 10px;"><More /></el-icon>
|
|
|
-
|
|
|
-
|
|
|
- </template>
|
|
|
- </el-table-column>
|
|
|
-
|
|
|
- </el-table>
|
|
|
+ >
|
|
|
+ {{
|
|
|
+ slot.row.status === 'active'
|
|
|
+ ? '启用'
|
|
|
+ : slot.row.status === 'configuring'
|
|
|
+ ? '配置中'
|
|
|
+ : '待配置'
|
|
|
+ }}
|
|
|
+ </el-tag>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="创建时间" prop="createTime" width="240" />
|
|
|
+ <el-table-column label="操作" width="240">
|
|
|
+ <template #default="slot">
|
|
|
+ <!-- 查看 -->
|
|
|
+ <el-icon size="15" color="#15A9FF" style="margin-right: 10px;"><View /></el-icon>
|
|
|
+
|
|
|
+ <!-- 编辑 -->
|
|
|
+ <el-icon size="15" color="#15A9FF" style="margin-right: 10px;"><Edit /></el-icon>
|
|
|
+
|
|
|
+ <!-- 启用/禁用图标 -->
|
|
|
+ <el-icon size="15" style="margin-right: 10px;" :color="slot.row.status === 'active' ? '#13ce66' : '#ff4949'">
|
|
|
+ <SwitchButton />
|
|
|
+ </el-icon>
|
|
|
+
|
|
|
+ <!-- 列表 -->
|
|
|
+ <el-icon size="15" color="#15A9FF" style="margin-right: 10px;"><More /></el-icon>
|
|
|
+
|
|
|
+
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+
|
|
|
+ </el-table>
|
|
|
<div class="batch-actions">
|
|
|
<span>已选择 {{ selectedIds.length }} 项</span>
|
|
|
<el-button type="primary" size="small" :disabled="selected.length === 0" @click="batchEnable">批量启用</el-button>
|
|
|
@@ -194,11 +194,13 @@ import BasicInfo from "@/views/modleServiceProvide/components/BasicInfo.vue";
|
|
|
import ApiInfo from "@/views/modleServiceProvide/components/ApiInfo.vue";
|
|
|
import AdditionInfo from "@/views/modleServiceProvide/components/AdditionInfo.vue";
|
|
|
import components from "../../../vite/plugins/components";
|
|
|
+import listModelVendor from "@/api/modleServiceProvide/index"
|
|
|
+import type { ModelVendorQuery, ModelVendorDto } from '../../api/modleServiceProvide/type' // 根据实际类型调整
|
|
|
|
|
|
|
|
|
const serviceOption = ref(["OpenAI"])
|
|
|
const modelNameOption = ref(["服务商1","服务商2"])
|
|
|
-const modelTypeOption = ref(["大语言模型","多模态","OCR","视觉","向量化","重排序","语音"])
|
|
|
+const modelKindOption = ref(["大语言模型","多模态","OCR","视觉","向量化","重排序","语音"])
|
|
|
const modelStateOption = ref(["全部","开启","关闭"])
|
|
|
// const models = ref([])
|
|
|
const total = ref(50) // 总条目数
|
|
|
@@ -206,18 +208,18 @@ const currentPage = ref(1) // 当前页码
|
|
|
const pageSize = ref(10) // 每页显示条目个数
|
|
|
const selected = ref<number[]>([]) // 存储选中的行ID
|
|
|
const modelName = ref(null)
|
|
|
-const modelType = ref(null)
|
|
|
+const modelKind = ref(null)
|
|
|
const activeTab = 'info1'
|
|
|
const service = ref(null)
|
|
|
const modelState = ref(null)
|
|
|
// 定义表格数据的类型
|
|
|
interface ProviderModel {
|
|
|
id: number
|
|
|
- logo?: string
|
|
|
- providerCode: string
|
|
|
- providerName: string
|
|
|
- modelType: string
|
|
|
- officialCertified: boolean
|
|
|
+ logoUrl?: string
|
|
|
+ vendorCode: string
|
|
|
+ vendorName: string
|
|
|
+ modelKind: string
|
|
|
+ isofficial: boolean
|
|
|
apiAccess: boolean
|
|
|
status: 'active' | 'configuring' | 'pending' // 状态枚举
|
|
|
createTime: string
|
|
|
@@ -227,33 +229,33 @@ interface ProviderModel {
|
|
|
const models = ref<ProviderModel[]>([
|
|
|
{
|
|
|
id: 1,
|
|
|
- logo: 'https://via.placeholder.com/40',
|
|
|
- providerCode: 'PROV001',
|
|
|
- providerName: '阿里云',
|
|
|
- modelType: '大语言模型',
|
|
|
- officialCertified: true,
|
|
|
+ logoUrl: 'https://via.placeholder.com/40',
|
|
|
+ vendorCode: 'PROV001',
|
|
|
+ vendorName: '阿里云',
|
|
|
+ modelKind: '大语言模型',
|
|
|
+ isofficial: true,
|
|
|
apiAccess: true,
|
|
|
status: 'active',
|
|
|
createTime: '2025-01-01 10:30',
|
|
|
},
|
|
|
{
|
|
|
id: 2,
|
|
|
- logo: 'https://via.placeholder.com/40',
|
|
|
- providerCode: 'PROV002',
|
|
|
- providerName: '腾讯云',
|
|
|
- modelType: '图像识别',
|
|
|
- officialCertified: false,
|
|
|
+ logoUrl: 'https://via.placeholder.com/40',
|
|
|
+ vendorCode: 'PROV002',
|
|
|
+ vendorName: '腾讯云',
|
|
|
+ modelKind: '图像识别',
|
|
|
+ isofficial: false,
|
|
|
apiAccess: true,
|
|
|
status: 'configuring',
|
|
|
createTime: '2025-02-15 10:30',
|
|
|
},
|
|
|
{
|
|
|
id: 3,
|
|
|
- logo: 'https://via.placeholder.com/40',
|
|
|
- providerCode: 'PROV003',
|
|
|
- providerName: '百度云',
|
|
|
- modelType: '语音识别',
|
|
|
- officialCertified: false,
|
|
|
+ logoUrl: 'https://via.placeholder.com/40',
|
|
|
+ vendorCode: 'PROV003',
|
|
|
+ vendorName: '百度云',
|
|
|
+ modelKind: '语音识别',
|
|
|
+ isofficial: false,
|
|
|
apiAccess: false,
|
|
|
status: 'pending',
|
|
|
createTime: '2025-03-10 10:30',
|
|
|
@@ -290,61 +292,62 @@ const dialogVisible = ref(false)
|
|
|
const formRef = ref<FormInstance>()
|
|
|
|
|
|
interface Info1 {
|
|
|
- name: string
|
|
|
- desc: string
|
|
|
+ name: string
|
|
|
+ desc: string
|
|
|
}
|
|
|
|
|
|
interface Info2 {
|
|
|
- phone: string
|
|
|
- email: string
|
|
|
+ phone: string
|
|
|
+ email: string
|
|
|
}
|
|
|
const formData = ref({
|
|
|
- info1: { name: '', desc: '' },
|
|
|
- info2: { phone: '', email: '' },
|
|
|
- info3: { address: '', remark: '' }
|
|
|
+ info1: { name: '', desc: '' },
|
|
|
+ info2: { phone: '', email: '' },
|
|
|
+ info3: { address: '', remark: '' }
|
|
|
})
|
|
|
interface Info3 {
|
|
|
- address: string
|
|
|
- remark: string
|
|
|
+ address: string
|
|
|
+ remark: string
|
|
|
}
|
|
|
|
|
|
interface formData {
|
|
|
- info1: Info1
|
|
|
- info2: Info2
|
|
|
- info3: Info3
|
|
|
+ info1: Info1
|
|
|
+ info2: Info2
|
|
|
+ info3: Info3
|
|
|
}
|
|
|
|
|
|
const form = ref({
|
|
|
- providerName: '',
|
|
|
- providerCode: '',
|
|
|
- modelType: '',
|
|
|
- logo: '',
|
|
|
- officialCertified: false,
|
|
|
+ vendorName: '',
|
|
|
+ vendorCode: '',
|
|
|
+ modelKind: '',
|
|
|
+ logoUrl: '',
|
|
|
+ isofficial: false,
|
|
|
apiAccess: false,
|
|
|
status: 'active'
|
|
|
})
|
|
|
|
|
|
+//表单规则
|
|
|
const rules = {
|
|
|
- providerName: [
|
|
|
+ vendorName: [
|
|
|
{ required: true, message: '服务商名称不能为空', trigger: 'blur' }
|
|
|
],
|
|
|
- providerCode: [
|
|
|
+ vendorCode: [
|
|
|
{ required: true, message: '服务商编码不能为空', trigger: 'blur' }
|
|
|
],
|
|
|
- modelType: [
|
|
|
+ modelKind: [
|
|
|
{ required: true, message: '请选择模型种类', trigger: 'change' }
|
|
|
]
|
|
|
}
|
|
|
|
|
|
-// const modelTypeOption = ref(['大语言模型', '图像识别', '语音识别'])
|
|
|
+// const modelKindOption = ref(['大语言模型', '图像识别', '语音识别'])
|
|
|
|
|
|
-// Logo 上传成功回调
|
|
|
-const handleLogoSuccess = (response, file) => {
|
|
|
- form.value.logo = URL.createObjectURL(file.raw)
|
|
|
+// logoUrl 上传成功回调
|
|
|
+const handlelogoUrlSuccess = (response, file) => {
|
|
|
+ form.value.logoUrl = URL.createObjectURL(file.raw)
|
|
|
}
|
|
|
|
|
|
-// Logo 上传前校验
|
|
|
-const beforeLogoUpload = (file) => {
|
|
|
+// logoUrl 上传前校验
|
|
|
+const beforelogoUrlUpload = (file) => {
|
|
|
const isValid = ['image/jpeg', 'image/png'].includes(file.type)
|
|
|
if (!isValid) {
|
|
|
alert('只能上传 JPG/PNG 文件')
|
|
|
@@ -369,11 +372,11 @@ const submitForm = () => {
|
|
|
// 关闭弹窗并重置表单
|
|
|
dialogVisible.value = false
|
|
|
form.value = {
|
|
|
- providerName: '',
|
|
|
- providerCode: '',
|
|
|
- modelType: '',
|
|
|
- logo: '',
|
|
|
- officialCertified: false,
|
|
|
+ vendorName: '',
|
|
|
+ vendorCode: '',
|
|
|
+ modelKind: '',
|
|
|
+ logoUrl: '',
|
|
|
+ isofficial: false,
|
|
|
apiAccess: false,
|
|
|
status: 'active'
|
|
|
}
|