瀏覽代碼

模型供应商 弹窗修改

zhaoen 5 月之前
父節點
當前提交
a442ae755d

+ 6 - 4
src/views/enterpriseModelConfig/components/AddModelDialog.vue

@@ -1,4 +1,5 @@
 <template>
+
   <el-dialog
       v-model="dialogVisible"
       :title="isEdit ? '编辑模型配置' : '新增模型配置'"
@@ -6,6 +7,7 @@
       :close-on-click-modal="false"
       :destroy-on-close="true"
   >
+
     <!-- 步骤导航 -->
     <div class="step-header">
       <div
@@ -23,7 +25,6 @@
     <el-form
         ref="formRef"
         :model="form"
-        :rules="rules"
         label-width="120px"
         style="margin-top: 20px"
     >
@@ -263,9 +264,9 @@ const onModelSelected = () => {
 }
 
 const nextStep = async () => {
-  const currentRules = getRulesForCurrentStep()
-  const isValid = await formRef.value.validate(currentRules)
-  if (!isValid) return
+  // const currentRules = getRulesForCurrentStep()
+  // const isValid = await formRef.value.validate(currentRules)
+  // if (!isValid) return
 
   currentStep.value++
   stepsCompleted.value[currentStep.value - 1] = true
@@ -337,6 +338,7 @@ const getRulesForCurrentStep = () => {
 }
 
 defineExpose({ open })
+
 </script>
 
 <style scoped>

+ 22 - 40
src/views/enterpriseModelConfig/index.vue

@@ -16,7 +16,6 @@
 
     <!-- 筛选器 -->
     <el-row :gutter="10" style="margin-bottom: 5px">
-      <!-- 搜索区域 -->
       <el-col :span="16">
         <el-form inline :model="queryParams" label-width="100px">
           <el-form-item label="模型名称">
@@ -39,14 +38,14 @@
           <el-form-item label="创建人">
             <el-input v-model="queryParams.creator" placeholder="请输入创建人" style="width: 120px" />
           </el-form-item>
-
         </el-form>
       </el-col>
     </el-row>
+
+    <!-- 操作按钮 -->
     <el-row :gutter="10" style="margin-bottom: 20px; display: flex; align-items: center; justify-content: space-between;">
       <el-form style="width: 100%;margin-left:10px">
         <div style="display: flex; justify-content: space-between; align-items: center;">
-          <!-- 左侧搜索项 -->
           <div style="flex: 1; display: flex; align-items: center;">
             <el-form-item style="margin-bottom: 0;">
               <div class="button-group">
@@ -54,10 +53,7 @@
                 <el-button>导出</el-button>
               </div>
             </el-form-item>
-
           </div>
-
-          <!-- 右侧按钮组 -->
           <div style="text-align: right; flex-shrink: 0;">
             <el-form-item style="margin-bottom: 0;">
               <el-button type="primary" @click="handleQuery">搜索</el-button>
@@ -67,6 +63,7 @@
         </div>
       </el-form>
     </el-row>
+
     <!-- 环境筛选 -->
     <el-row :gutter="20" style="margin-bottom: 20px">
       <el-col :span="8" style="margin-left: 20px">
@@ -99,33 +96,9 @@
       </el-table-column>
     </el-table>
 
-    <!-- 批量操作 -->
-    <el-row :gutter="20" style="margin-top: 15px; margin-bottom: 10px">
-      <el-col :span="4" style="margin-left: 20px">
-        <el-button v-if="selectedRows.length > 0" @click="batchEnable">
-          批量启用({{ selectedRows.length }}项)
-        </el-button>
-        <el-button v-if="selectedRows.length > 0" @click="batchDisable">
-          批量禁用({{ selectedRows.length }}项)
-        </el-button>
-        <el-button v-if="selectedRows.length > 0" type="danger" @click="batchDelete">
-          批量删除({{ selectedRows.length }}项)
-        </el-button>
-      </el-col>
-      <el-col :span="4" :offset="16">
-        <el-pagination
-            @size-change="handleSizeChange"
-            @current-change="handleCurrentChange"
-            :current-page="queryParams.pageNum"
-            :page-sizes="[10, 20, 50, 100]"
-            :page-size="queryParams.pageSize"
-            layout="total, sizes, prev, pager, next, jumper"
-            :total="total"
-        />
-      </el-col>
-    </el-row>
 
-    <!-- 新增/编辑弹窗 -->
+
+    <!-- 弹窗组件 -->
     <AddModelDialog ref="addModelDialog" @success="getList" />
   </div>
 </template>
@@ -133,6 +106,7 @@
 <script setup>
 import { ref, onMounted } from 'vue'
 import { Warning } from '@element-plus/icons-vue'
+import AddModelDialog from './components/AddModelDialog.vue'
 
 // 查询参数
 const queryParams = ref({
@@ -147,17 +121,16 @@ const queryParams = ref({
 
 // 选中行
 const selectedRows = ref([])
-const addModelDialog = ref()
 
 // 表格数据
 const models = ref([])
 const total = ref(0)
 
+// 弹窗引用
+const addModelDialog = ref()
+
 // 获取列表数据
 const getList = async () => {
-  // const res = await listModelVendor(queryParams.value)
-  // const list = res.data.list || []
-
   // 模拟数据
   const list = [
     {
@@ -169,7 +142,15 @@ const getList = async () => {
       createdAt: '2024-03-20',
       status: 1
     },
-    // ...其他数据
+    {
+      modelName: 'OCR识别',
+      modelType: 'OCR',
+      modelVersion: 'v1.0',
+      env: 'TEST',
+      creator: 'user1',
+      createdAt: '2024-04-10',
+      status: 0
+    }
   ]
 
   models.value = list
@@ -207,15 +188,16 @@ const handleCurrentChange = (val) => {
   getList()
 }
 
-// 操作方法
-const handleAdd = () => {
+// 新增/编辑弹窗操作
+const openAddDialog = () => {
   addModelDialog.value.open()
 }
 
 const handleEdit = (row) => {
-  addModelDialog.value.open(row) // 传入编辑数据
+  addModelDialog.value.open(row)
 }
 
+// 查看、详情、删除等操作
 const handleView = (row) => {
   console.log('查看:', row)
 }

+ 15 - 58
src/views/modleServiceProvide/components/AdditionInfo.vue

@@ -1,20 +1,10 @@
 <template>
-  <el-form
-      :model="form"
-      label-position="top"
-      label-width="120px"
-      :rules="rules"
-      ref="formRef"
-  >
-
+  <el-form :model="form" label-position="top" label-width="120px" :rules="rules" ref="formRef">
     <!-- 联系方式 -->
     <el-row :gutter="20">
       <el-col :span="24">
-        <el-form-item prop="contact" label="联系方式">
-          <template #label>
-            <span class="el-form-item__label">联系方式</span>
-          </template>
-          <el-input v-model="form.contact" placeholder="请输入联系方式,如邮箱或电话" />
+        <el-form-item prop="contactInfo" label="联系方式">
+          <el-input v-model="form.contactInfo" placeholder="请输入联系方式,如邮箱或电话" />
         </el-form-item>
       </el-col>
     </el-row>
@@ -23,9 +13,6 @@
     <el-row :gutter="20">
       <el-col :span="24">
         <el-form-item prop="website" label="官网">
-          <template #label>
-            <span class="el-form-item__label">官网</span>
-          </template>
           <el-input v-model="form.website" placeholder="请输入官网地址,如:https://openai.com" />
         </el-form-item>
       </el-col>
@@ -35,9 +22,6 @@
     <el-row :gutter="20">
       <el-col :span="24">
         <el-form-item prop="apiDocUrl" label="API文档地址">
-          <template #label>
-            <span class="el-form-item__label">API文档地址</span>
-          </template>
           <el-input v-model="form.apiDocUrl" placeholder="请输入API文档地址" />
         </el-form-item>
       </el-col>
@@ -47,9 +31,6 @@
     <el-row :gutter="20">
       <el-col :span="24">
         <el-form-item prop="pricingUrl" label="定价页面地址">
-          <template #label>
-            <span class="el-form-item__label">定价页面地址</span>
-          </template>
           <el-input v-model="form.pricingUrl" placeholder="请输入定价页面URL" />
         </el-form-item>
       </el-col>
@@ -68,49 +49,24 @@
         </el-form-item>
       </el-col>
     </el-row>
-
-    <!--&lt;!&ndash; 备注 &ndash;&gt;-->
-    <!--<el-row :gutter="20">-->
-    <!--  <el-col :span="24">-->
-    <!--    <el-form-item label="备注" prop="remark">-->
-    <!--      <el-input-->
-    <!--          v-model="form.remark"-->
-    <!--          type="textarea"-->
-    <!--          :rows="4"-->
-    <!--          placeholder="请输入备注信息"-->
-    <!--      />-->
-    <!--    </el-form-item>-->
-    <!--  </el-col>-->
-    <!--</el-row>-->
-
   </el-form>
 </template>
 
 <script setup lang="ts">
-import { ref } from 'vue'
-import { ElMessage } from 'element-plus'
-
+import { computed } from 'vue'
 
-const props = defineProps<{
-    modelValue: {
-        contactInfo: string
-        website: string
-        apiDocUrl: string
-        pricingUrl: string
-        description: string
-    };
-}>();
+// ================== 表单数据定义 ==================
+const model = defineModel()
 
-const emit = defineEmits(['update:modelValue']);
-
-const model = computed({
-    get: () => props.modelValue,
-    set: (value) => emit('update:modelValue', value)
-});
+// 响应式表单代理
+const form = computed({
+  get: () => model.value,
+  set: (value) => (model.value = value)
+})
 
 // ================== 表单验证规则 ==================
 const rules = {
-  contact: [
+  contactInfo: [
     { required: true, message: '请输入联系方式,如邮箱或电话', trigger: 'blur' }
   ],
   website: [
@@ -124,10 +80,11 @@ const rules = {
   pricingUrl: [
     { required: true, message: '请输入定价页面地址', trigger: 'blur' },
     { type: 'url', message: '请输入合法的网址', trigger: 'blur' }
+  ],
+  description: [
+    { required: false, message: '请输入服务商描述', trigger: 'blur' }
   ]
 }
-
-
 </script>
 
 <style scoped lang="scss">

+ 49 - 139
src/views/modleServiceProvide/components/ApiInfo.vue

@@ -1,69 +1,11 @@
-
-<script setup lang="ts">
-import { ref } from 'vue'
-import { ElMessage } from 'element-plus'
-const dialogVisible = ref(true)
-// ================== 表单数据类型定义 ==================
-const props = defineProps<{
-    modelValue: {
-        defaultUrl: string
-        extraConfig: string
-    };
-}>();
-
-const emit = defineEmits(['update:modelValue']);
-
-const model = computed({
-    get: () => props.modelValue,
-    set: (value) => emit('update:modelValue', value)
-});
-
-
-
-
-// ================== 表单验证规则 ==================
-const rules = {
-    defaultUrl: [
-        { required: true, message: '请输入默认 API 地址', trigger: 'blur' },
-        { type: 'url', message: '请输入合法的 URL 地址', trigger: 'blur' }
-    ],
-    authType: [
-        { required: true, message: '请选择认证方式', trigger: 'change' }
-    ],
-    requestHeaderKey: [
-        { required: true, message: '请输入请求头 Key', trigger: 'blur' }
-    ],
-    requestHeaderValuePrefix: [
-        { required: true, message: '请输入请求头 Value 前缀', trigger: 'blur' }
-    ],
-    retryCount: [
-        { required: true, message: '请输入重试次数', trigger: 'blur' },
-        { type: 'number', min: 0, max: 10, message: '重试次数应在 0~10 之间', trigger: 'blur' }
-    ]
-}
-
-
-
-</script>
-
 <template>
-  <el-form
-      :model="model"
-      label-position="top"
-      label-width="120px"
-      :rules="rules"
-      ref="formRef"
-  >
-
-    <!-- 默认 API 地址 -->
+  <el-form :model="form" label-position="top" label-width="120px" :rules="rules" ref="formRef">
+    <!-- 默认API地址 -->
     <el-row :gutter="20">
       <el-col :span="24">
         <el-form-item prop="defaultUrl" label="默认API地址">
-          <template #label>
-            <span class="el-form-item__label">默认API地址</span>
-          </template>
           <el-input
-              v-model="model.defaultUrl"
+              v-model="form.defaultUrl"
               placeholder="请输入默认API地址,如:https://api.openai.com/v1"
           />
           <div class="input-tips">用于连接服务器的API基础地址</div>
@@ -71,86 +13,12 @@ const rules = {
       </el-col>
     </el-row>
 
-    <!--&lt;!&ndash; 认证方式 &ndash;&gt;-->
-    <!--<el-row :gutter="20">-->
-    <!--  <el-col :span="24">-->
-    <!--    <el-form-item prop="authType" label="认证方式">-->
-    <!--      <template #label>-->
-    <!--        <span class="el-form-item__label">认证方式</span>-->
-    <!--      </template>-->
-    <!--      <el-select v-model="form.authType" placeholder="请选择认证方式" style="width: 100%">-->
-    <!--        <el-option-->
-    <!--            v-for="item in authTypeOption"-->
-    <!--            :key="item.value"-->
-    <!--            :label="item.label"-->
-    <!--            :value="item.value"-->
-    <!--        />-->
-    <!--      </el-select>-->
-    <!--    </el-form-item>-->
-    <!--  </el-col>-->
-    <!--</el-row>-->
-
-    <!--&lt;!&ndash; 请求头Key &ndash;&gt;-->
-    <!--<el-row :gutter="20">-->
-    <!--  <el-col :span="24">-->
-    <!--    <el-form-item prop="requestHeaderKey" label="请求头Key">-->
-    <!--      <template #label>-->
-    <!--        <span class="el-form-item__label">请求头Key</span>-->
-    <!--      </template>-->
-    <!--      <el-input v-model="form.requestHeaderKey" placeholder="请输入请求头Key,如:Authorization,X-API" />-->
-    <!--      <div class="input-tips">例如:Authorization, X-API 等</div>-->
-    <!--    </el-form-item>-->
-    <!--  </el-col>-->
-    <!--</el-row>-->
-
-    <!--&lt;!&ndash; 请求头Value前缀 &ndash;&gt;-->
-    <!--<el-row :gutter="20">-->
-    <!--  <el-col :span="24">-->
-    <!--    <el-form-item prop="requestHeaderValuePrefix" label="请求头Value前缀">-->
-    <!--      <template #label>-->
-    <!--        <span class="el-form-item__label">请求头Value前缀</span>-->
-    <!--      </template>-->
-    <!--      <el-input v-model="form.requestHeaderValuePrefix" placeholder="请输入请求头Value前缀,如:Bearer,basic" />-->
-    <!--      <div class="input-tips">例如:Bearer, basic 等与API key拼接</div>-->
-    <!--    </el-form-item>-->
-    <!--  </el-col>-->
-    <!--</el-row>-->
-
-    <!--&lt;!&ndash; 请求超时时间 &ndash;&gt;-->
-    <!--<el-row :gutter="20">-->
-    <!--  <el-col :span="24">-->
-    <!--    <el-form-item label="请求超时时间(毫秒)" prop="requestTimeout">-->
-    <!--      <el-input-->
-    <!--          v-model.number="form.requestTimeout"-->
-    <!--          placeholder="请输入请求超时时间(秒)"-->
-    <!--          style="width: 100%"-->
-    <!--      />-->
-    <!--    </el-form-item>-->
-    <!--  </el-col>-->
-    <!--</el-row>-->
-
-    <!--&lt;!&ndash; 重试次数 &ndash;&gt;-->
-    <!--<el-row :gutter="20">-->
-    <!--  <el-col :span="24">-->
-    <!--    <el-form-item label="重试次数" prop="retryCount">-->
-    <!--      <template #label>-->
-    <!--        <span class="el-form-item__label">重试次数</span>-->
-    <!--      </template>-->
-    <!--      <el-input-->
-    <!--          v-model.number="form.retryCount"-->
-    <!--          placeholder="请输入重试次数"-->
-    <!--          style="width: 100%"-->
-    <!--      />-->
-    <!--    </el-form-item>-->
-    <!--  </el-col>-->
-    <!--</el-row>-->
-
     <!-- 拓展配置 -->
     <el-row :gutter="20">
       <el-col :span="24">
-        <el-form-item label="拓展配置" prop="extraConfig">
+        <el-form-item prop="extraConfig" label="拓展配置">
           <el-input
-              v-model="model.extraConfig"
+              v-model="form.extraConfig"
               type="textarea"
               :rows="4"
               placeholder="请输入拓展配置,例如:{ timeout: 5000, proxy: 'xxx' }"
@@ -158,12 +26,54 @@ const rules = {
         </el-form-item>
       </el-col>
     </el-row>
+  </el-form>
+</template>
 
+<script setup lang="ts">
+import { computed } from 'vue'
 
+// ================== 表单数据定义 ==================
+const model = defineModel()
 
-  </el-form>
-</template>
+// 响应式表单代理,便于访问和修改
+const form = computed({
+  get: () => model.value,
+  set: (value) => (model.value = value)
+})
+
+// ================== 表单验证规则 ==================
+const rules = {
+  defaultUrl: [
+    { required: true, message: '请输入默认 API 地址', trigger: 'blur' },
+    { type: 'url', message: '请输入合法的 URL 地址', trigger: 'blur' }
+  ],
+  extraConfig: [
+    {
+      validator: (_rule: any, value: string, callback: (error?: Error) => void) => {
+        if (value && !isValidJSON(value)) {
+          callback(new Error('拓展配置必须是合法的 JSON 字符串'))
+        } else {
+          callback()
+        }
+      },
+      trigger: 'blur'
+    }
+  ]
+}
+
+// ================== JSON 校验工具函数 ==================
+function isValidJSON(str: string): boolean {
+  try {
+    JSON.parse(str)
+    return true
+  } catch {
+    return false
+  }
+}
 
+// ================== 表单引用(可用于后续提交或验证) ==================
+const formRef = ref()
+</script>
 
 <style scoped lang="scss">
 .input-tips {

+ 86 - 110
src/views/modleServiceProvide/components/BasicInfo.vue

@@ -1,76 +1,10 @@
-<script setup lang="ts">
-import { ref } from 'vue'
-import { UploadFilled } from '@element-plus/icons-vue'
-import { ElMessage } from 'element-plus'
-
-// ================== 表单数据类型定义 ==================
-
-const props = defineProps<{
-    modelValue: {
-        vendorCode: string
-        vendorName: string
-        modelKind: string[]
-        logoUrl: string;
-        logoFile: File | null;
-        isofficial: boolean
-        status: boolean
-        sortOrder: number | null
-    };
-}>();
-
-const emit = defineEmits(['update:modelValue']);
-
-const model = computed({
-    get: () => props.modelValue,
-    set: (value) => emit('update:modelValue', value)
-});
-
-const fileList = ref<any[]>([]);
-// 文件变更时更新 logoFile
-const handleLogoChange = (file: any) => {
-    model.value.logoFile = file.raw; // 获取原始 File 对象
-};
-
-// 超出文件数量限制提示
-const handleExceed = () => {
-    alert('最多只能上传一个文件');
-};
-
-// ================== 模型种类选项 ==================
-const modelKindOption = ['大语言模型', '多模态', 'OCR', '视觉', '向量化', '重排序', '语音']
-
-// ================== 表单验证规则 ==================
-const rules = {
-  vendorCode: [
-    { required: true, message: '请输入服务商编码', trigger: 'blur' },
-    { pattern: /^[a-z0-9\-_]+$/, message: '只能使用小写字母、数字、下划线或横线', trigger: 'blur' }
-  ],
-  vendorName: [
-    { required: true, message: '请输入服务商名称', trigger: 'blur' }
-  ],
-  modelKind: [
-    { required: true, message: '请选择至少一个模型种类', trigger: 'change' }
-  ],
-  sortOrder: [
-    { required: true, message: '请输入排序值', trigger: 'blur' },
-    { type: 'number', message: '必须为数字', trigger: 'blur' }
-  ]
-}
-
-// ================== 表单引用 ==================
-const formRef = ref()
-</script>
-
 <template>
-  <el-form :model="model" label-position="top" label-width="100px" :rules="rules" ref="formRef">
+  <el-form :model="form" label-position="top" label-width="100px" :rules="rules" ref="formRef">
     <!-- 服务商编码 -->
     <el-row>
       <el-col :span="24">
         <el-form-item prop="vendorCode" label="服务商编码">
-          <template #label>
-            <span class="el-form-item__label">服务商编码</span>
-          </template>
-          <el-input v-model="model.vendorCode" placeholder="输入服务商编码,如:openai" />
+          <el-input v-model="form.vendorCode" placeholder="输入服务商编码,如:openai" />
           <div class="input-tips">英文小写,不含特殊字符,作为系统标识</div>
         </el-form-item>
       </el-col>
@@ -80,10 +14,7 @@ const formRef = ref()
     <el-row :gutter="20">
       <el-col :span="24">
         <el-form-item prop="vendorName" label="服务商名称">
-          <template #label>
-            <span class="el-form-item__label">服务商名称</span>
-          </template>
-          <el-input v-model="model.vendorName" placeholder="输入服务商名称,如:OpenAi" />
+          <el-input v-model="form.vendorName" placeholder="输入服务商名称,如:OpenAi" />
         </el-form-item>
       </el-col>
     </el-row>
@@ -92,51 +23,44 @@ const formRef = ref()
     <el-row :gutter="20">
       <el-col :span="24">
         <el-form-item prop="modelKind" label="模型种类">
-          <template #label>
-            <span class="el-form-item__label">模型种类</span>
-          </template>
-          <el-checkbox-group v-model="model.modelKind" style="width: 100%">
+          <el-checkbox-group v-model="form.modelKind" style="width: 100%">
             <el-checkbox
                 v-for="option in modelKindOption"
                 :key="option"
                 :label="option"
-                :value="option"
             />
           </el-checkbox-group>
         </el-form-item>
       </el-col>
     </el-row>
 
-      <!-- Logo -->
-      <el-row :gutter="20">
-          <el-col :span="24">
-              <el-form-item label="Logo">
-                  <el-upload
-                          style="width: 100%"
-                          class="upload-demo"
-                          drag
-                          action="#"
-                          :auto-upload="false"
-                          :on-change="handleLogoChange"
-                          :file-list="fileList"
-                          :limit="1"
-                          :on-exceed="handleExceed"
-                  >
-                      <el-icon class="el-icon--upload"><upload-filled /></el-icon>
-                      <div class="el-upload__text">
-                          点击或拖拽上传Logo
-                      </div>
-                  </el-upload>
-              </el-form-item>
-          </el-col>
-      </el-row>
+    <!-- Logo -->
+    <el-row :gutter="20">
+      <el-col :span="36">
+        <el-form-item label="Logo">
+          <el-upload
+              class="upload-demo"
+              drag
+              action="#"
+              :auto-upload="false"
+              :file-list="fileList"
+              :limit="1"
+              :on-change="handleLogoChange"
+              :on-exceed="handleExceed"
+          >
+            <el-icon><upload-filled /></el-icon>
+            <div class="el-upload__text">点击或拖拽上传Logo</div>
+          </el-upload>
+        </el-form-item>
+      </el-col>
+    </el-row>
 
     <!-- 官方认证 -->
     <el-row :gutter="20">
       <el-col :span="24">
         <el-form-item label="官方认证">
-          <el-switch v-model="model.isofficial" />
-          <span class="switch-label">{{ model.isofficial ? '是' : '否' }}</span>
+          <el-switch v-model="form.isofficial" />
+          <span class="switch-label">{{ form.isofficial ? '是' : '否' }}</span>
         </el-form-item>
       </el-col>
     </el-row>
@@ -145,8 +69,8 @@ const formRef = ref()
     <el-row :gutter="20">
       <el-col :span="12">
         <el-form-item label="状态">
-          <el-switch v-model="model.status" />
-          <span class="switch-label">{{ model.status ? '启用' : '未启用' }}</span>
+          <el-switch v-model="form.status" />
+          <span class="switch-label">{{ form.status ? '启用' : '未启用' }}</span>
         </el-form-item>
       </el-col>
     </el-row>
@@ -154,22 +78,69 @@ const formRef = ref()
     <!-- 排序值 -->
     <el-row :gutter="20">
       <el-col :span="12">
-        <el-form-item label="排序值" >
-          <el-input v-model.number="model.sortOrder" placeholder="0" />
+        <el-form-item label="排序值" prop="sortOrder">
+          <el-input v-model.number="form.sortOrder" placeholder="0" />
           <div class="input-tips">数值越小越靠前</div>
         </el-form-item>
       </el-col>
     </el-row>
-
-
   </el-form>
 </template>
 
+<script setup lang="ts">
+import { ref, computed } from 'vue'
+import { UploadFilled } from '@element-plus/icons-vue'
+import { ElMessage } from 'element-plus'
+
+// ================== 表单数据定义 ==================
+const model = defineModel()
+const form = computed({
+  get: () => model.value,
+  set: (value) => (model.value = value)
+})
+
+// ================== 表单字段 ==================
+const modelKindOption = ['LLM', 'MULTMIMDAL', 'OCR', 'VISION', 'VECTOR', 'RERANK', 'SPEECH', 'OTHER']
+
+// ================== 上传逻辑 ==================
+const fileList = ref<any[]>([])
+
+const handleLogoChange = (file: any) => {
+  form.value.logoFile = file.raw
+  form.value.logoUrl = URL.createObjectURL(file.raw)
+}
+
+const handleExceed = () => {
+  ElMessage.warning('最多只能上传一个文件')
+}
+
+// ================== 表单验证规则 ==================
+const rules = {
+  vendorCode: [
+    { required: true, message: '请输入服务商编码', trigger: 'blur' },
+    { pattern: /^[a-z0-9\-_]+$/, message: '只能使用小写字母、数字、下划线或横线', trigger: 'blur' }
+  ],
+  vendorName: [
+    { required: true, message: '请输入服务商名称', trigger: 'blur' }
+  ],
+  modelKind: [
+    { required: true, message: '请选择至少一个模型种类', trigger: 'change' }
+  ],
+  sortOrder: [
+    { required: true, message: '请输入排序值', trigger: 'blur' },
+    { type: 'number', message: '必须为数字', trigger: 'blur' }
+  ]
+}
+
+// ================== 表单引用 ==================
+const formRef = ref()
+</script>
+
 <style scoped lang="scss">
-.input-tips{
+.input-tips {
   font-size: 10px;
   color: #989a9a;
-
+  margin-top: 4px;
 }
 .switch-label {
   margin-left: 10px;
@@ -177,4 +148,9 @@ const formRef = ref()
   color: #666;
   line-height: 32px;
 }
+.upload-demo {
+  :deep(.el-upload) {
+    width: 100%;
+  }
+}
 </style>

+ 5 - 4
src/views/modleServiceProvide/index.vue

@@ -49,6 +49,7 @@
     <el-row :gutter="20">
       <el-col :span="2">
         <el-button type="primary" @click="dialogVisible = true">+新增服务商</el-button>
+
         <el-dialog v-model="dialogVisible" title="新增服务商" width="40%">
 
           <el-form>
@@ -143,10 +144,10 @@
         <el-table-column label="创建时间" prop="createTime" width="240" />
         <el-table-column label="操作" width="240">
           <template #default="slot">
-            <!-- 查看 -->
+            <!-- 查看 传入id进入详情页面 -->
             <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>
 
             <!-- 启用/禁用图标 -->
@@ -349,7 +350,7 @@ const formData = ref({
     info1: {
         vendorCode: '',
         vendorName: '',
-        modelKind: '',
+        modelKind: [],
         logoUrl: '',
         logoFile: null, // 用于保存上传的文件对象
         isOfficial: false,
@@ -426,7 +427,7 @@ const submitForm = () => {
         submitData.append('logo', data.info1.logoFile);
     }
 
-   const res =  listModelVendor(submitData);
+   const res =  addModelVendor(submitData);
 
     // 发送请求
     // axios.post('/api/model/vendor/save', submitData, {