ReplyForm.vue 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. <template>
  2. <div>
  3. <el-form ref="formRef" :model="replyForm" :rules="rules" label-width="80px">
  4. <el-form-item label="消息类型" prop="requestMessageType" v-if="msgType === MsgType.Message">
  5. <el-select v-model="replyForm.requestMessageType" placeholder="请选择">
  6. <template v-for="dict in getDictOptions(DICT_TYPE.MP_MESSAGE_TYPE)" :key="dict.value">
  7. <el-option
  8. v-if="RequestMessageTypes.includes(dict.value)"
  9. :label="dict.label"
  10. :value="dict.value"
  11. />
  12. </template>
  13. </el-select>
  14. </el-form-item>
  15. <el-form-item label="匹配类型" prop="requestMatch" v-if="msgType === MsgType.Keyword">
  16. <el-select v-model="replyForm.requestMatch" placeholder="请选择匹配类型" clearable>
  17. <el-option
  18. v-for="dict in getIntDictOptions(DICT_TYPE.MP_AUTO_REPLY_REQUEST_MATCH)"
  19. :key="dict.value"
  20. :label="dict.label"
  21. :value="dict.value"
  22. />
  23. </el-select>
  24. </el-form-item>
  25. <el-form-item label="关键词" prop="requestKeyword" v-if="msgType === MsgType.Keyword">
  26. <el-input v-model="replyForm.requestKeyword" placeholder="请输入内容" clearable />
  27. </el-form-item>
  28. <el-form-item label="回复消息">
  29. <WxReplySelect v-model="reply" />
  30. </el-form-item>
  31. </el-form>
  32. </div>
  33. </template>
  34. <script setup lang="ts" name="ReplyForm">
  35. import WxReplySelect, { type Reply } from '@/views/mp/components/wx-reply'
  36. import type { FormInstance } from 'element-plus'
  37. import { MsgType } from './types'
  38. import { DICT_TYPE, getDictOptions, getIntDictOptions } from '@/utils/dict'
  39. const props = defineProps<{
  40. modelValue: any
  41. reply: Reply
  42. msgType: MsgType
  43. }>()
  44. const emit = defineEmits<{
  45. (e: 'update:reply', v: Reply)
  46. (e: 'update:modelValue', v: any)
  47. }>()
  48. const reply = computed<Reply>({
  49. get: () => props.reply,
  50. set: (val) => emit('update:reply', val)
  51. })
  52. const replyForm = computed<any>({
  53. get: () => props.modelValue,
  54. set: (val) => emit('update:modelValue', val)
  55. })
  56. const formRef = ref<FormInstance | null>(null) // 表单 ref
  57. const RequestMessageTypes = ['text', 'image', 'voice', 'video', 'shortvideo', 'location', 'link'] // 允许选择的请求消息类型
  58. // 表单校验
  59. const rules = {
  60. requestKeyword: [{ required: true, message: '请求的关键字不能为空', trigger: 'blur' }],
  61. requestMatch: [{ required: true, message: '请求的关键字的匹配不能为空', trigger: 'blur' }]
  62. }
  63. defineExpose({
  64. resetFields: () => formRef.value?.resetFields(),
  65. validate: async () => formRef.value?.validate()
  66. })
  67. </script>
  68. <style scoped></style>