BasicInfo.vue 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. <script setup lang="ts">
  2. import { ref } from 'vue'
  3. import { UploadFilled } from '@element-plus/icons-vue'
  4. import { ElMessage } from 'element-plus'
  5. // ================== 表单数据类型定义 ==================
  6. const props = defineProps<{
  7. modelValue: {
  8. vendorCode: string
  9. vendorName: string
  10. modelKind: string[]
  11. logoUrl: string;
  12. logoFile: File | null;
  13. isofficial: boolean
  14. status: boolean
  15. sortOrder: number | null
  16. };
  17. }>();
  18. const emit = defineEmits(['update:modelValue']);
  19. const model = computed({
  20. get: () => props.modelValue,
  21. set: (value) => emit('update:modelValue', value)
  22. });
  23. const fileList = ref<any[]>([]);
  24. // 文件变更时更新 logoFile
  25. const handleLogoChange = (file: any) => {
  26. model.value.logoFile = file.raw; // 获取原始 File 对象
  27. };
  28. // 超出文件数量限制提示
  29. const handleExceed = () => {
  30. alert('最多只能上传一个文件');
  31. };
  32. // ================== 模型种类选项 ==================
  33. const modelKindOption = ['大语言模型', '多模态', 'OCR', '视觉', '向量化', '重排序', '语音']
  34. // ================== 表单验证规则 ==================
  35. const rules = {
  36. vendorCode: [
  37. { required: true, message: '请输入服务商编码', trigger: 'blur' },
  38. { pattern: /^[a-z0-9\-_]+$/, message: '只能使用小写字母、数字、下划线或横线', trigger: 'blur' }
  39. ],
  40. vendorName: [
  41. { required: true, message: '请输入服务商名称', trigger: 'blur' }
  42. ],
  43. modelKind: [
  44. { required: true, message: '请选择至少一个模型种类', trigger: 'change' }
  45. ],
  46. sortOrder: [
  47. { required: true, message: '请输入排序值', trigger: 'blur' },
  48. { type: 'number', message: '必须为数字', trigger: 'blur' }
  49. ]
  50. }
  51. // ================== 表单引用 ==================
  52. const formRef = ref()
  53. </script>
  54. <template>
  55. <el-form :model="model" label-position="top" label-width="100px" :rules="rules" ref="formRef">
  56. <!-- 服务商编码 -->
  57. <el-row>
  58. <el-col :span="24">
  59. <el-form-item prop="vendorCode" label="服务商编码">
  60. <template #label>
  61. <span class="el-form-item__label">服务商编码</span>
  62. </template>
  63. <el-input v-model="model.vendorCode" placeholder="输入服务商编码,如:openai" />
  64. <div class="input-tips">英文小写,不含特殊字符,作为系统标识</div>
  65. </el-form-item>
  66. </el-col>
  67. </el-row>
  68. <!-- 服务商名称 -->
  69. <el-row :gutter="20">
  70. <el-col :span="24">
  71. <el-form-item prop="vendorName" label="服务商名称">
  72. <template #label>
  73. <span class="el-form-item__label">服务商名称</span>
  74. </template>
  75. <el-input v-model="model.vendorName" placeholder="输入服务商名称,如:OpenAi" />
  76. </el-form-item>
  77. </el-col>
  78. </el-row>
  79. <!-- 模型种类 -->
  80. <el-row :gutter="20">
  81. <el-col :span="24">
  82. <el-form-item prop="modelKind" label="模型种类">
  83. <template #label>
  84. <span class="el-form-item__label">模型种类</span>
  85. </template>
  86. <el-checkbox-group v-model="model.modelKind" style="width: 100%">
  87. <el-checkbox
  88. v-for="option in modelKindOption"
  89. :key="option"
  90. :label="option"
  91. :value="option"
  92. />
  93. </el-checkbox-group>
  94. </el-form-item>
  95. </el-col>
  96. </el-row>
  97. <!-- Logo -->
  98. <el-row :gutter="20">
  99. <el-col :span="24">
  100. <el-form-item label="Logo">
  101. <el-upload
  102. style="width: 100%"
  103. class="upload-demo"
  104. drag
  105. action="#"
  106. :auto-upload="false"
  107. :on-change="handleLogoChange"
  108. :file-list="fileList"
  109. :limit="1"
  110. :on-exceed="handleExceed"
  111. >
  112. <el-icon class="el-icon--upload"><upload-filled /></el-icon>
  113. <div class="el-upload__text">
  114. 点击或拖拽上传Logo
  115. </div>
  116. </el-upload>
  117. </el-form-item>
  118. </el-col>
  119. </el-row>
  120. <!-- 官方认证 -->
  121. <el-row :gutter="20">
  122. <el-col :span="24">
  123. <el-form-item label="官方认证">
  124. <el-switch v-model="model.isofficial" />
  125. <span class="switch-label">{{ model.isofficial ? '是' : '否' }}</span>
  126. </el-form-item>
  127. </el-col>
  128. </el-row>
  129. <!-- 状态 -->
  130. <el-row :gutter="20">
  131. <el-col :span="12">
  132. <el-form-item label="状态">
  133. <el-switch v-model="model.status" />
  134. <span class="switch-label">{{ model.status ? '启用' : '未启用' }}</span>
  135. </el-form-item>
  136. </el-col>
  137. </el-row>
  138. <!-- 排序值 -->
  139. <el-row :gutter="20">
  140. <el-col :span="12">
  141. <el-form-item label="排序值" >
  142. <el-input v-model.number="model.sortOrder" placeholder="0" />
  143. <div class="input-tips">数值越小越靠前</div>
  144. </el-form-item>
  145. </el-col>
  146. </el-row>
  147. </el-form>
  148. </template>
  149. <style scoped lang="scss">
  150. .input-tips{
  151. font-size: 10px;
  152. color: #989a9a;
  153. }
  154. .switch-label {
  155. margin-left: 10px;
  156. font-size: 14px;
  157. color: #666;
  158. line-height: 32px;
  159. }
  160. </style>