ArticleForm.vue 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. <template>
  2. <el-dialog :title="formData.id ? '编辑' : '创建'" :visible.sync="dialogVisible" width="1000px"
  3. custom-class="ele-dialog-form" :lock-scroll="false" @closed="handleClosed">
  4. <el-form :model="formData" ref="formRef" :rules="rules" label-width="100px">
  5. <el-row :gutter="15">
  6. <el-col :sm="12">
  7. <el-form-item label="类型:" prop="type" v-if="!this.defaultType">
  8. <el-select v-model="formData.type" placeholder="请选择类型" class="ele-fluid">
  9. <el-option v-for="item in typeArr" :key="item.id" :label="item.name" :value="item.id" />
  10. </el-select>
  11. </el-form-item>
  12. <el-form-item label="标题:" prop="title">
  13. <el-input v-model="formData.title" placeholder="请输入标题" clearable />
  14. </el-form-item>
  15. <el-form-item label="作者:" prop="author" v-if="!isSmartReply">
  16. <el-input v-model="formData.author" placeholder="请输入作者" clearable />
  17. </el-form-item>
  18. <el-form-item label="状态:" prop="status">
  19. <el-radio-group v-model="formData.status">
  20. <el-radio :label="1">发布</el-radio>
  21. <el-radio :label="2">不发布</el-radio>
  22. </el-radio-group>
  23. </el-form-item>
  24. <el-form-item label="排序:" prop="sort">
  25. <el-input v-model="formData.sort" placeholder="请输入排序号" clearable />
  26. </el-form-item>
  27. </el-col>
  28. <el-col :sm="12">
  29. <el-form-item label="内容:" prop="content">
  30. <tinymce-editor v-model="formData.content" :init="editorConfig" />
  31. </el-form-item>
  32. </el-col>
  33. </el-row>
  34. </el-form>
  35. <div slot="footer">
  36. <el-button @click="closeDialog">取消</el-button>
  37. <el-button type="primary" @click="save">保存</el-button>
  38. </div>
  39. </el-dialog>
  40. </template>
  41. <script>
  42. import TinymceEditor from '@/components/TinymceEditor'
  43. export default {
  44. name: 'ArticleForm',
  45. components: { TinymceEditor },
  46. props: {
  47. defaultType: { type: [Number, String, Array], default: null },
  48. visible: { type: Boolean, default: false },
  49. defaultData: { type: Object, default: () => ({ status: 1, type: 1 }) },
  50. },
  51. data() {
  52. return {
  53. formData: Object.assign({}, this.defaultData),
  54. typeArr: [
  55. { id: 1, name: '文章资讯' },
  56. { id: 2, name: '注册协议' },
  57. { id: 3, name: '隐私政策' },
  58. { id: 4, name: 'VIP购买协议' },
  59. { id: 9, name: '智能问答' },
  60. ],
  61. }
  62. },
  63. computed: {
  64. // 弹窗显示状态(处理prop的双向绑定)
  65. dialogVisible: {
  66. get() {
  67. return this.visible;
  68. },
  69. set(val) {
  70. this.$emit('update:visible', val);
  71. }
  72. },
  73. // 判断是否为智能问答类型
  74. isSmartReply() {
  75. // 处理 defaultType 可能是 Number、String 或 Array 的情况
  76. let currentType = this.defaultType || this.formData.type;
  77. if (Array.isArray(this.defaultType)) {
  78. // 如果是数组,使用第一个元素判断
  79. currentType = this.defaultType.length > 0 ? this.defaultType[0] : this.formData.type;
  80. }
  81. const b = currentType == 9;
  82. console.log('isSmartReply', b, this.defaultType)
  83. return b;
  84. },
  85. // 动态验证规则
  86. rules() {
  87. const baseRules = {
  88. title: [{ required: true, message: '请输入标题', trigger: 'blur' }],
  89. type: [{ required: true, message: '请选择类型', trigger: 'blur' }],
  90. content: [{ required: true, message: '内容不能为空', trigger: 'blur' }],
  91. };
  92. // 智能问答不需要验证作者
  93. if (!this.isSmartReply) {
  94. baseRules.author = [{ required: true, message: '请输入作者', trigger: 'blur' }];
  95. }
  96. return baseRules;
  97. },
  98. editorConfig() {
  99. return {
  100. menubar: false,
  101. skin_url: '/tinymce/skins/ui/oxide',
  102. content_css: '/tinymce/skins/content/default/content.css',
  103. height: 400,
  104. }
  105. },
  106. },
  107. watch: {
  108. defaultData(val) {
  109. this.formData = Object.assign({}, val)
  110. },
  111. },
  112. methods: {
  113. closeDialog() {
  114. this.$emit('update:visible', false);
  115. },
  116. handleClosed() {
  117. // 对话框关闭后重置表单
  118. this.resetForm();
  119. },
  120. resetForm() {
  121. if (this.$refs.formRef) {
  122. this.$refs.formRef.resetFields();
  123. }
  124. this.formData = Object.assign({}, this.defaultData);
  125. },
  126. save() {
  127. this.$refs.formRef.validate(valid => {
  128. if (!valid) return
  129. // 处理 defaultType 可能是 Number、String 或 Array 的情况
  130. let typeValue = this.formData.type;
  131. if (this.defaultType) {
  132. if (Array.isArray(this.defaultType)) {
  133. // 如果是数组,使用第一个元素
  134. typeValue = this.defaultType.length > 0 ? Number(this.defaultType[0]) : this.formData.type;
  135. } else {
  136. typeValue = this.defaultType;
  137. }
  138. }
  139. const loading = this.$loading({ lock: true })
  140. this.$http.post('/article/edit', { ... this.formData, type: typeValue })
  141. .then(res => {
  142. loading.close()
  143. if (res.data.code === 0) {
  144. this.$message.success(res.data.msg)
  145. this.$emit('success')
  146. this.closeDialog()
  147. } else {
  148. this.$message.error(res.data.msg)
  149. }
  150. })
  151. .catch(e => {
  152. loading.close()
  153. this.$message.error(e.message)
  154. })
  155. })
  156. },
  157. },
  158. }
  159. </script>
  160. <style scoped>
  161. .ele-dialog-form>>>.tox-tinymce {
  162. width: 100%;
  163. }
  164. </style>