houzhongjian
2024-08-08 820397e43a0b64d35c6d31d2a55475061438593b
提交 | 用户 | 时间
820397 1 <template>
H 2   <Dialog :title="dialogTitle" v-model="dialogVisible">
3     <el-form
4       ref="formRef"
5       :model="formData"
6       :rules="formRules"
7       label-width="120px"
8       v-loading="formLoading"
9     >
10       <el-form-item label="所属平台" prop="platform">
11         <el-select v-model="formData.platform" placeholder="请输入平台" clearable>
12           <el-option
13             v-for="dict in getStrDictOptions(DICT_TYPE.AI_PLATFORM)"
14             :key="dict.value"
15             :label="dict.label"
16             :value="dict.value"
17           />
18         </el-select>
19       </el-form-item>
20       <el-form-item label="API 秘钥" prop="keyId">
21         <el-select v-model="formData.keyId" placeholder="请选择 API 秘钥" clearable>
22           <el-option
23             v-for="apiKey in apiKeyList"
24             :key="apiKey.id"
25             :label="apiKey.name"
26             :value="apiKey.id"
27           />
28         </el-select>
29       </el-form-item>
30       <el-form-item label="模型名字" prop="name">
31         <el-input v-model="formData.name" placeholder="请输入模型名字" />
32       </el-form-item>
33       <el-form-item label="模型标识" prop="model">
34         <el-input v-model="formData.model" placeholder="请输入模型标识" />
35       </el-form-item>
36       <el-form-item label="模型排序" prop="sort">
37         <el-input-number v-model="formData.sort" placeholder="请输入模型排序" class="!w-1/1" />
38       </el-form-item>
39       <el-form-item label="开启状态" prop="status">
40         <el-radio-group v-model="formData.status">
41           <el-radio
42             v-for="dict in getIntDictOptions(DICT_TYPE.COMMON_STATUS)"
43             :key="dict.value"
44             :label="dict.value"
45           >
46             {{ dict.label }}
47           </el-radio>
48         </el-radio-group>
49       </el-form-item>
50       <el-form-item label="温度参数" prop="temperature">
51         <el-input-number
52           v-model="formData.temperature"
53           placeholder="请输入温度参数"
54           :min="0"
55           :max="2"
56           :precision="2"
57         />
58       </el-form-item>
59       <el-form-item label="回复数 Token 数" prop="maxTokens">
60         <el-input-number
61           v-model="formData.maxTokens"
62           placeholder="请输入回复数 Token 数"
63           :min="0"
64           :max="4096"
65         />
66       </el-form-item>
67       <el-form-item label="上下文数量" prop="maxContexts">
68         <el-input-number
69           v-model="formData.maxContexts"
70           placeholder="请输入上下文数量"
71           :min="0"
72           :max="20"
73         />
74       </el-form-item>
75     </el-form>
76     <template #footer>
77       <el-button @click="submitForm" type="primary" :disabled="formLoading">确 定</el-button>
78       <el-button @click="dialogVisible = false">取 消</el-button>
79     </template>
80   </Dialog>
81 </template>
82 <script setup lang="ts">
83 import { ChatModelApi, ChatModelVO } from '@/api/ai/model/chatModel'
84 import { ApiKeyApi, ApiKeyVO } from '@/api/ai/model/apiKey'
85 import { CommonStatusEnum } from '@/utils/constants'
86 import { DICT_TYPE, getIntDictOptions, getStrDictOptions } from '@/utils/dict'
87
88 /** API 聊天模型 表单 */
89 defineOptions({ name: 'ChatModelForm' })
90
91 const { t } = useI18n() // 国际化
92 const message = useMessage() // 消息弹窗
93
94 const dialogVisible = ref(false) // 弹窗的是否展示
95 const dialogTitle = ref('') // 弹窗的标题
96 const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
97 const formType = ref('') // 表单的类型:create - 新增;update - 修改
98 const formData = ref({
99   id: undefined,
100   keyId: undefined,
101   name: undefined,
102   model: undefined,
103   platform: undefined,
104   sort: undefined,
105   status: CommonStatusEnum.ENABLE,
106   temperature: undefined,
107   maxTokens: undefined,
108   maxContexts: undefined
109 })
110 const formRules = reactive({
111   keyId: [{ required: true, message: 'API 秘钥不能为空', trigger: 'blur' }],
112   name: [{ required: true, message: '模型名字不能为空', trigger: 'blur' }],
113   model: [{ required: true, message: '模型标识不能为空', trigger: 'blur' }],
114   platform: [{ required: true, message: '所属平台不能为空', trigger: 'blur' }],
115   sort: [{ required: true, message: '排序不能为空', trigger: 'blur' }],
116   status: [{ required: true, message: '状态不能为空', trigger: 'blur' }]
117 })
118 const formRef = ref() // 表单 Ref
119 const apiKeyList = ref([] as ApiKeyVO[]) // API 密钥列表
120
121 /** 打开弹窗 */
122 const open = async (type: string, id?: number) => {
123   dialogVisible.value = true
124   dialogTitle.value = t('action.' + type)
125   formType.value = type
126   resetForm()
127   // 修改时,设置数据
128   if (id) {
129     formLoading.value = true
130     try {
131       formData.value = await ChatModelApi.getChatModel(id)
132     } finally {
133       formLoading.value = false
134     }
135   }
136   // 获得下拉数据
137   apiKeyList.value = await ApiKeyApi.getApiKeySimpleList(CommonStatusEnum.ENABLE)
138 }
139 defineExpose({ open }) // 提供 open 方法,用于打开弹窗
140
141 /** 提交表单 */
142 const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
143 const submitForm = async () => {
144   // 校验表单
145   await formRef.value.validate()
146   // 提交请求
147   formLoading.value = true
148   try {
149     const data = formData.value as unknown as ChatModelVO
150     if (formType.value === 'create') {
151       await ChatModelApi.createChatModel(data)
152       message.success(t('common.createSuccess'))
153     } else {
154       await ChatModelApi.updateChatModel(data)
155       message.success(t('common.updateSuccess'))
156     }
157     dialogVisible.value = false
158     // 发送操作成功的事件
159     emit('success')
160   } finally {
161     formLoading.value = false
162   }
163 }
164
165 /** 重置表单 */
166 const resetForm = () => {
167   formData.value = {
168     id: undefined,
169     keyId: undefined,
170     name: undefined,
171     model: undefined,
172     platform: undefined,
173     sort: undefined,
174     status: CommonStatusEnum.ENABLE,
175     temperature: undefined,
176     maxTokens: undefined,
177     maxContexts: undefined
178   }
179   formRef.value?.resetFields()
180 }
181 </script>