BasicInfo.vue 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  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. interface Form {
  7. vendorCode: string
  8. vendorName: string
  9. modelKind: string[]
  10. isofficial: boolean
  11. status: boolean
  12. sortOrder: number | null
  13. }
  14. // ================== 表单数据初始化 ==================
  15. const form = ref<Form>({
  16. vendorCode: '',
  17. vendorName: '',
  18. modelKind: [],
  19. isofficial: false,
  20. status: true,
  21. sortOrder: null
  22. })
  23. // ================== 模型种类选项 ==================
  24. const modelKindOption = ['大语言模型', '多模态', 'OCR', '视觉', '向量化', '重排序', '语音']
  25. // ================== 表单验证规则 ==================
  26. const rules = {
  27. vendorCode: [
  28. { required: true, message: '请输入服务商编码', trigger: 'blur' },
  29. { pattern: /^[a-z0-9\-_]+$/, message: '只能使用小写字母、数字、下划线或横线', trigger: 'blur' }
  30. ],
  31. vendorName: [
  32. { required: true, message: '请输入服务商名称', trigger: 'blur' }
  33. ],
  34. modelKind: [
  35. { required: true, message: '请选择至少一个模型种类', trigger: 'change' }
  36. ],
  37. sortOrder: [
  38. { required: true, message: '请输入排序值', trigger: 'blur' },
  39. { type: 'number', message: '必须为数字', trigger: 'blur' }
  40. ]
  41. }
  42. // ================== 表单引用 ==================
  43. const formRef = ref()
  44. // ================== 提交方法 ==================
  45. const submitForm = () => {
  46. formRef.value.validate((valid: boolean) => {
  47. if (valid) {
  48. ElMessage.success('验证通过,准备提交')
  49. console.log('提交数据:', form.value)
  50. // 这里可以调用 API 提交数据
  51. } else {
  52. ElMessage.error('请检查表单输入')
  53. return false
  54. }
  55. })
  56. }
  57. // ================== 控制对话框显示 ==================
  58. const dialogVisible = ref(true)
  59. interface ProviderModel {
  60. }
  61. </script>
  62. <template>
  63. <el-form :model="form" label-position="top" label-width="100px" :rules="rules" ref="formRef">
  64. <!-- 服务商编码 -->
  65. <el-row>
  66. <el-col :span="24">
  67. <el-form-item prop="vendorCode" label="服务商编码">
  68. <template #label>
  69. <span class="el-form-item__label">服务商编码</span>
  70. </template>
  71. <el-input v-model="form.vendorCode" placeholder="输入服务商编码,如:openai" />
  72. <div class="input-tips">英文小写,不含特殊字符,作为系统标识</div>
  73. </el-form-item>
  74. </el-col>
  75. </el-row>
  76. <!-- 服务商名称 -->
  77. <el-row :gutter="20">
  78. <el-col :span="24">
  79. <el-form-item prop="vendorName" label="服务商名称">
  80. <template #label>
  81. <span class="el-form-item__label">服务商名称</span>
  82. </template>
  83. <el-input v-model="form.vendorName" placeholder="输入服务商名称,如:OpenAi" />
  84. </el-form-item>
  85. </el-col>
  86. </el-row>
  87. <!-- 模型种类 -->
  88. <el-row :gutter="20">
  89. <el-col :span="24">
  90. <el-form-item prop="modelKind" label="模型种类">
  91. <template #label>
  92. <span class="el-form-item__label">模型种类</span>
  93. </template>
  94. <el-checkbox-group v-model="form.modelKind" style="width: 100%">
  95. <el-checkbox
  96. v-for="option in modelKindOption"
  97. :key="option"
  98. :label="option"
  99. :value="option"
  100. />
  101. </el-checkbox-group>
  102. </el-form-item>
  103. </el-col>
  104. </el-row>
  105. <!-- Logo -->
  106. <el-row :gutter="20">
  107. <el-col :span="24">
  108. <el-form-item label="Logo">
  109. <el-upload
  110. style="width: 100%"
  111. class="upload-demo"
  112. drag
  113. action="https://run.mocky.io/v3/9d059bf9-4660-45f2-925d-ce80ad6c4d15"
  114. multiple
  115. >
  116. <el-icon class="el-icon--upload"><upload-filled /></el-icon>
  117. <div class="el-upload__text">
  118. 点击或拖拽上传Logo
  119. </div>
  120. </el-upload>
  121. </el-form-item>
  122. </el-col>
  123. </el-row>
  124. <!-- 官方认证 -->
  125. <el-row :gutter="20">
  126. <el-col :span="24">
  127. <el-form-item label="官方认证">
  128. <el-switch v-model="form.isofficial" />
  129. <span class="switch-label">{{ form.isofficial ? '是' : '否' }}</span>
  130. </el-form-item>
  131. </el-col>
  132. </el-row>
  133. <!-- 状态 -->
  134. <el-row :gutter="20">
  135. <el-col :span="12">
  136. <el-form-item label="状态">
  137. <el-switch v-model="form.status" />
  138. <span class="switch-label">{{ form.status ? '启用' : '未启用' }}</span>
  139. </el-form-item>
  140. </el-col>
  141. </el-row>
  142. <!-- 排序值 -->
  143. <el-row :gutter="20">
  144. <el-col :span="12">
  145. <el-form-item label="排序值" >
  146. <el-input v-model.number="form.sortOrder" placeholder="0" />
  147. <div class="input-tips">数值越小越靠前</div>
  148. </el-form-item>
  149. </el-col>
  150. </el-row>
  151. </el-form>
  152. </template>
  153. <style scoped lang="scss">
  154. .input-tips{
  155. font-size: 10px;
  156. color: #989a9a;
  157. }
  158. .switch-label {
  159. margin-left: 10px;
  160. font-size: 14px;
  161. color: #666;
  162. line-height: 32px;
  163. }
  164. </style>