addForum.vue 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. <template>
  2. <a-card :bordered="false">
  3. <a-alert
  4. class="mb-3"
  5. message="欢迎来到论坛 — 衷心感谢你参与讨论!
  6. 标题是否清晰明了地描述了主题?看
  7. 起来有意思么?
  8. 谁会感兴趣?
  9. 它为什么重要?
  10. 你期望从社区中获得什么样的回应?
  11. 选择常用的词句以便别人能找到你的主题。若想要给主题和类似主题分组,选择一个分类。"
  12. type="warning"
  13. />
  14. <a-form ref="formRef" :model="formData" :rules="formRules" layout="vertical">
  15. <a-row :gutter="16">
  16. <a-col :span="12">
  17. <a-form-item label="标题:" name="postTitle">
  18. <a-input v-model:value="formData.postTitle" placeholder="请输入标题" allow-clear />
  19. </a-form-item>
  20. </a-col>
  21. <a-col :span="12">
  22. <a-form-item label="分类:" name="typeId">
  23. <a-select
  24. v-model:value="formData.typeId"
  25. show-search
  26. placeholder="请选择分类"
  27. style="width: 200px"
  28. :options="typeOptions"
  29. :filter-option="filterOption"
  30. ></a-select>
  31. </a-form-item>
  32. </a-col>
  33. <a-col :span="12">
  34. <a-form-item label="指向:" name="appointUserArr">
  35. <a-select
  36. v-model:value="formData.appointUserArr"
  37. mode="multiple"
  38. show-search
  39. placeholder="请选择"
  40. style="width: 200px"
  41. :options="usertypeOptions"
  42. :filter-option="filterOption"
  43. ></a-select>
  44. </a-form-item>
  45. </a-col>
  46. <a-col :span="24">
  47. <a-form-item label="内容:" name="postContent">
  48. <xn-editor v-model="formData.postContent" placeholder="请输入内容" :height="400"></xn-editor>
  49. </a-form-item>
  50. </a-col>
  51. </a-row>
  52. </a-form>
  53. <div>
  54. <!-- <a-button style="margin-right: 8px" @click="onClose">关闭</a-button> -->
  55. <a-button type="primary" :loading="submitLoading" @click="onSubmit">保存</a-button>
  56. </div>
  57. </a-card>
  58. </template>
  59. <script setup name="addForum">
  60. import { required } from '@/utils/formRules'
  61. import SnowflakeId from 'snowflake-id'
  62. import tool from '@/utils/tool'
  63. import forumApi from '@/api/forum/forumApi'
  64. import XnEditor from '@/components/Editor/index.vue'
  65. import Bowser from 'bowser'
  66. import { useRoute, useRouter } from 'vue-router'
  67. const route = useRoute()
  68. const router = useRouter()
  69. const { proxy } = getCurrentInstance()
  70. const userInfo = tool.data.get('USER_INFO')
  71. const typeOptions = ref([])
  72. // 默认是关闭状态
  73. const emit = defineEmits({ successful: null })
  74. const formRef = ref()
  75. const treeData = ref([])
  76. // 表单数据,也就是默认给一些数据
  77. const formData = ref({})
  78. // 默认展开的节点(顶级)
  79. const defaultExpandedKeys = ref([0])
  80. const submitLoading = ref(false)
  81. // 模块ID
  82. const moduleId = ref('')
  83. const usertypeOptions = ref([])
  84. const filterOption = (input, option) => {
  85. return option.value.toLowerCase().indexOf(input.toLowerCase()) >= 0
  86. }
  87. // 打开抽屉
  88. const onOpen = () => {
  89. forumApi.forumTypeList().then((data) => {
  90. typeOptions.value = data.map((r) => {
  91. return {
  92. label: r.typeName,
  93. value: r.typeId,
  94. ...r
  95. }
  96. })
  97. })
  98. forumApi.allUserList().then((data) => {
  99. usertypeOptions.value = data.map((r) => {
  100. return {
  101. label: r.name,
  102. value: r.id,
  103. ...r
  104. }
  105. })
  106. })
  107. if (route.query.postType == 1) {
  108. getBower()
  109. }
  110. if (route.query.postType == 2) {
  111. errorCorrection()
  112. }
  113. }
  114. setTimeout(() => {
  115. onOpen()
  116. }, 0)
  117. // 关闭抽屉
  118. const onClose = () => {
  119. formRef.value.resetFields()
  120. }
  121. // 默认要校验的
  122. const formRules = {
  123. postTitle: [required('请输入标题')],
  124. typeId: [required('请选择分类')],
  125. postContent: [required('请输入内容')]
  126. }
  127. // 验证并提交数据
  128. const onSubmit = () => {
  129. formRef.value
  130. .validate()
  131. .then(() => {
  132. submitLoading.value = true
  133. if (formData.value.appointUserArr && formData.value.appointUserArr.length > 1) {
  134. formData.value.appointUser = formData.value.appointUserArr.join(',')
  135. }
  136. let params = formData.value
  137. if (route.query.postType == 1) {
  138. params = {
  139. ...formData.value,
  140. ...browserObj.value,
  141. postType:route.query.postType
  142. }
  143. }
  144. if (route.query.postType == 2) {
  145. params = {
  146. ...formData.value,
  147. ...errorVal.value,
  148. postType:route.query.postType
  149. }
  150. }
  151. forumApi.submitForm(params).then(() => {
  152. onClose()
  153. emit('successful')
  154. })
  155. })
  156. .finally(() => {
  157. submitLoading.value = false
  158. })
  159. }
  160. //获取操作系统/浏览器等信息
  161. const browserObj = ref({})
  162. function getBower() {
  163. const browser = Bowser.getParser(window.navigator.userAgent)
  164. let obj = browser.parsedResult
  165. browserObj.value = {
  166. forumSupportEnvParam: {
  167. browserType: obj.browser.name,
  168. browserVersion: obj.browser.version,
  169. osType: obj.os.name,
  170. osVersion: obj.os.version,
  171. deviceType: 0
  172. }
  173. }
  174. }
  175. //纠错
  176. const errorVal = ref({})
  177. function errorCorrection() {
  178. errorVal.value = {
  179. contentCorrectionParam: {
  180. resourceType: route.query.type,
  181. resourceId: route.query.id
  182. }
  183. }
  184. }
  185. </script>