ChatRoleForm.vue 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. <template>
  2. <Dialog :title="dialogTitle" v-model="dialogVisible">
  3. <el-form
  4. ref="formRef"
  5. :model="formData"
  6. :rules="formRules"
  7. label-width="100px"
  8. v-loading="formLoading"
  9. >
  10. <el-form-item label="模型编号" prop="modelId">
  11. <el-input v-model="formData.modelId" placeholder="请输入模型编号" />
  12. </el-form-item>
  13. <el-form-item label="角色名称" prop="name">
  14. <el-input v-model="formData.name" placeholder="请输入角色名称" />
  15. </el-form-item>
  16. <el-form-item label="角色头像" prop="avatar">
  17. <el-input v-model="formData.avatar" placeholder="请输入角色头像" />
  18. </el-form-item>
  19. <el-form-item label="角色类别" prop="category">
  20. <el-input v-model="formData.category" placeholder="请输入角色类别" />
  21. </el-form-item>
  22. <el-form-item label="角色排序" prop="sort">
  23. <el-input v-model="formData.sort" placeholder="请输入角色排序" />
  24. </el-form-item>
  25. <el-form-item label="角色描述" prop="description">
  26. <Editor v-model="formData.description" height="150px" />
  27. </el-form-item>
  28. <el-form-item label="角色欢迎语" prop="welcomeMessage">
  29. <el-input v-model="formData.welcomeMessage" placeholder="请输入角色欢迎语" />
  30. </el-form-item>
  31. <el-form-item label="角色上下文" prop="systemMessage">
  32. <el-input v-model="formData.systemMessage" placeholder="请输入角色上下文" />
  33. </el-form-item>
  34. <el-form-item label="是否公开" prop="publicStatus">
  35. <el-radio-group v-model="formData.publicStatus">
  36. <el-radio
  37. v-for="dict in getBoolDictOptions(DICT_TYPE.INFRA_BOOLEAN_STRING)"
  38. :key="dict.value"
  39. :label="dict.value"
  40. >
  41. {{ dict.label }}
  42. </el-radio>
  43. </el-radio-group>
  44. </el-form-item>
  45. <el-form-item label="状态" prop="status">
  46. <el-radio-group v-model="formData.status">
  47. <el-radio
  48. v-for="dict in getIntDictOptions(DICT_TYPE.COMMON_STATUS)"
  49. :key="dict.value"
  50. :label="dict.value"
  51. >
  52. {{ dict.label }}
  53. </el-radio>
  54. </el-radio-group>
  55. </el-form-item>
  56. </el-form>
  57. <template #footer>
  58. <el-button @click="submitForm" type="primary" :disabled="formLoading">确 定</el-button>
  59. <el-button @click="dialogVisible = false">取 消</el-button>
  60. </template>
  61. </Dialog>
  62. </template>
  63. <script setup lang="ts">
  64. import { getIntDictOptions, getBoolDictOptions, DICT_TYPE } from '@/utils/dict'
  65. import { ChatRoleApi, ChatRoleVO } from '@/api/ai/model/chatRole'
  66. /** AI 聊天角色 表单 */
  67. defineOptions({ name: 'ChatRoleForm' })
  68. const { t } = useI18n() // 国际化
  69. const message = useMessage() // 消息弹窗
  70. const dialogVisible = ref(false) // 弹窗的是否展示
  71. const dialogTitle = ref('') // 弹窗的标题
  72. const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
  73. const formType = ref('') // 表单的类型:create - 新增;update - 修改
  74. const formData = ref({
  75. id: undefined,
  76. modelId: undefined,
  77. name: undefined,
  78. avatar: undefined,
  79. category: undefined,
  80. sort: undefined,
  81. description: undefined,
  82. welcomeMessage: undefined,
  83. systemMessage: undefined,
  84. publicStatus: undefined,
  85. status: undefined
  86. })
  87. const formRules = reactive({
  88. name: [{ required: true, message: '角色名称不能为空', trigger: 'blur' }],
  89. avatar: [{ required: true, message: '角色头像不能为空', trigger: 'blur' }],
  90. category: [{ required: true, message: '角色类别不能为空', trigger: 'blur' }],
  91. sort: [{ required: true, message: '角色排序不能为空', trigger: 'blur' }],
  92. description: [{ required: true, message: '角色描述不能为空', trigger: 'blur' }],
  93. welcomeMessage: [{ required: true, message: '角色欢迎语不能为空', trigger: 'blur' }],
  94. systemMessage: [{ required: true, message: '角色上下文不能为空', trigger: 'blur' }],
  95. publicStatus: [{ required: true, message: '是否公开不能为空', trigger: 'blur' }]
  96. })
  97. const formRef = ref() // 表单 Ref
  98. /** 打开弹窗 */
  99. const open = async (type: string, id?: number) => {
  100. dialogVisible.value = true
  101. dialogTitle.value = t('action.' + type)
  102. formType.value = type
  103. resetForm()
  104. // 修改时,设置数据
  105. if (id) {
  106. formLoading.value = true
  107. try {
  108. formData.value = await ChatRoleApi.getChatRole(id)
  109. } finally {
  110. formLoading.value = false
  111. }
  112. }
  113. }
  114. defineExpose({ open }) // 提供 open 方法,用于打开弹窗
  115. /** 提交表单 */
  116. const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
  117. const submitForm = async () => {
  118. // 校验表单
  119. await formRef.value.validate()
  120. // 提交请求
  121. formLoading.value = true
  122. try {
  123. const data = formData.value as unknown as ChatRoleVO
  124. if (formType.value === 'create') {
  125. await ChatRoleApi.createChatRole(data)
  126. message.success(t('common.createSuccess'))
  127. } else {
  128. await ChatRoleApi.updateChatRole(data)
  129. message.success(t('common.updateSuccess'))
  130. }
  131. dialogVisible.value = false
  132. // 发送操作成功的事件
  133. emit('success')
  134. } finally {
  135. formLoading.value = false
  136. }
  137. }
  138. /** 重置表单 */
  139. const resetForm = () => {
  140. formData.value = {
  141. id: undefined,
  142. modelId: undefined,
  143. name: undefined,
  144. avatar: undefined,
  145. category: undefined,
  146. sort: undefined,
  147. description: undefined,
  148. welcomeMessage: undefined,
  149. systemMessage: undefined,
  150. publicStatus: undefined,
  151. status: undefined
  152. }
  153. formRef.value?.resetFields()
  154. }
  155. </script>