editBannerForm.vue 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265
  1. <template>
  2. <a-modal
  3. title="编辑banner"
  4. :width="900"
  5. :visible="visible"
  6. :confirmLoading="confirmLoading"
  7. @ok="handleSubmit"
  8. @cancel="handleCancel"
  9. >
  10. <a-spin :spinning="formLoading">
  11. <a-form :form="form">
  12. <a-form-item
  13. style="display: none;"
  14. >
  15. <a-input v-decorator="['bannerId']" />
  16. </a-form-item>
  17. <a-form-item label="名称" :labelCol="labelCol" :wrapperCol="wrapperCol" has-feedback>
  18. <a-input
  19. placeholder="请输入名称"
  20. v-decorator="['bannerName', {rules: [{required: true, message: '请输入名称!'}]}]"
  21. />
  22. </a-form-item>
  23. <a-form-item label="跳转方式" :labelCol="labelCol" :wrapperCol="wrapperCol" :required="true">
  24. <a-radio-group name="bannerType" v-decorator="['bannerType']" @change="changeType">
  25. <a-radio :value="0">无</a-radio>
  26. <a-radio :value="1">站内文章</a-radio>
  27. <a-radio :value="2">外部链接</a-radio>
  28. </a-radio-group>
  29. </a-form-item>
  30. <a-form-item
  31. :required="true"
  32. v-show="bannerType==1"
  33. label="选择文章"
  34. :labelCol="labelCol"
  35. :wrapperCol="wrapperCol"
  36. has-feedback
  37. >
  38. <a-select
  39. style="width: 100%"
  40. placeholder="请选择文章"
  41. v-decorator="['bannerTypeUrl', {rules: [{validator: checkUrl}]}]"
  42. >
  43. <a-select-option
  44. v-for="(item,index) in actionClassData"
  45. :key="index"
  46. :value="item.articleContentId"
  47. >{{ item.articleContentTitle }}</a-select-option>
  48. </a-select>
  49. </a-form-item>
  50. <a-form-item
  51. :required="true"
  52. v-show="bannerType==2"
  53. label="跳转链接Url"
  54. :labelCol="labelCol"
  55. :wrapperCol="wrapperCol"
  56. has-feedback
  57. >
  58. <a-input
  59. placeholder="请输入跳转链接"
  60. v-decorator="['bannerTypeUrl', {rules: [{validator: checkUrl}]}]"
  61. />
  62. </a-form-item>
  63. <a-form-item
  64. label="图片"
  65. :labelCol="labelCol"
  66. :wrapperCol="wrapperCol"
  67. has-feedback
  68. :required="true"
  69. >
  70. <div>
  71. <upload-component
  72. ref="upLoadRef"
  73. :remarkTxt="remarkTxt"
  74. @uploadSuccess="uploadSuccess"
  75. v-decorator="[
  76. 'bannerImage',
  77. {
  78. trigger: 'change',
  79. rules: [{ validator: checkimageUrl }]
  80. },
  81. ]"
  82. ></upload-component>
  83. </div>
  84. </a-form-item>
  85. <a-form-item
  86. :labelCol="labelCol"
  87. :wrapperCol="wrapperCol"
  88. label="排序"
  89. :hasFeedback="true"
  90. :required="true"
  91. >
  92. <a-input
  93. placeholder="请输入排序号"
  94. v-decorator="['bannerSort', {rules: [{validator: checkSortIndex}]}]"
  95. />
  96. </a-form-item>
  97. <a-form-item label="是否上线" :labelCol="labelCol" :wrapperCol="wrapperCol" :required="true">
  98. <a-radio-group name="bannerIsLine" v-decorator="['bannerIsLine']">
  99. <a-radio :value="1">上线</a-radio>
  100. <a-radio :value="0">下线</a-radio>
  101. </a-radio-group>
  102. </a-form-item>
  103. </a-form>
  104. </a-spin>
  105. </a-modal>
  106. </template>
  107. <script>
  108. import homeApi from '@/api/homeApi'
  109. import uploadComponent from '@/components/upLoad'
  110. import { checkUrl } from '@/utils/util'
  111. export default {
  112. components: { uploadComponent },
  113. data () {
  114. return {
  115. labelCol: {
  116. xs: { span: 24 },
  117. sm: { span: 5 }
  118. },
  119. wrapperCol: {
  120. xs: { span: 24 },
  121. sm: { span: 15 }
  122. },
  123. visible: false,
  124. confirmLoading: false,
  125. actionClassData: [],
  126. formLoading: false,
  127. form: this.$form.createForm(this),
  128. bannerType: 0,
  129. remarkTxt: '请上传1920×712规格图像'
  130. }
  131. },
  132. methods: {
  133. // 初始化方法
  134. edit (record) {
  135. this.visible = true
  136. this.formLoading = true
  137. this.getActionClass()
  138. setTimeout(() => {
  139. if (record.bannerType === 1) {
  140. record.bannerTypeUrl = JSON.parse(record.bannerTypeUrl).articleContentId
  141. }
  142. this.form.setFieldsValue(
  143. {
  144. bannerId: record.bannerId,
  145. bannerName: record.bannerName,
  146. bannerImage: record.bannerImage,
  147. bannerIsLine: record.bannerIsLine,
  148. bannerSort: record.bannerSort,
  149. bannerTypeUrl: record.bannerTypeUrl,
  150. bannerType: record.bannerType
  151. }
  152. )
  153. this.bannerType = record.bannerType
  154. this.$nextTick(() => {
  155. this.$refs.upLoadRef.initData([record.bannerImage])
  156. })
  157. }, 100)
  158. },
  159. /**
  160. * 获取选择器下拉框数据
  161. */
  162. getActionClass () {
  163. homeApi.findArticleAll().then((res) => {
  164. this.formLoading = false
  165. if (res.status === 200) {
  166. this.actionClassData = res.data
  167. } else {
  168. this.$message.error('获取文章列表数据失败')
  169. }
  170. })
  171. },
  172. handleSubmit () {
  173. const { form: { validateFields } } = this
  174. this.confirmLoading = true
  175. validateFields((errors, values) => {
  176. if (!errors) {
  177. values.bannerSort = parseInt(values.bannerSort)
  178. if (!values.bannerTypeUrl) {
  179. values.bannerTypeUrl = ''
  180. }
  181. homeApi.updateBanner(values).then((res) => {
  182. if (res.status === 200) {
  183. this.$message.success('编辑成功')
  184. this.visible = false
  185. this.confirmLoading = false
  186. this.$emit('ok', values)
  187. this.form.resetFields()
  188. } else {
  189. this.$message.error('编辑失败:' + res.message)
  190. }
  191. }).finally((res) => {
  192. this.confirmLoading = false
  193. })
  194. } else {
  195. this.confirmLoading = false
  196. }
  197. })
  198. },
  199. handleCancel () {
  200. this.form.resetFields()
  201. this.visible = false
  202. },
  203. changeType (val) {
  204. this.$nextTick(() => {
  205. this.bannerType = this.form.getFieldValue('bannerType')
  206. this.form.resetFields('bannerTypeUrl')
  207. if (this.bannerType === 2) {
  208. this.form.setFieldsValue({ 'bannerTypeUrl': 'http://' })
  209. } else {
  210. this.form.setFieldsValue({ 'bannerTypeUrl': '' })
  211. }
  212. })
  213. },
  214. uploadSuccess (avg) {
  215. if (avg.fileList[0]) {
  216. this.form.resetFields('bannerImage')
  217. this.form.setFieldsValue({ 'bannerImage': avg.fileList[0].uri })
  218. }
  219. },
  220. checkimageUrl (rule, value, callback) {
  221. if (value && value.length > 0) {
  222. callback()
  223. return
  224. }
  225. var text = '请上传图片'
  226. callback(text)
  227. },
  228. checkUrl (rule, value, callback) {
  229. var text = '请输入跳转链接!'
  230. if (this.bannerType === 1) {
  231. text = '请选择文章!'
  232. if (!value) {
  233. callback(text)
  234. } else {
  235. callback()
  236. }
  237. } else if (this.bannerType === 2) {
  238. if (!value) {
  239. callback(text)
  240. } else if (checkUrl(value)) {
  241. callback()
  242. } else {
  243. text = '请输入正确的url地址'
  244. callback(text)
  245. }
  246. } else {
  247. callback()
  248. }
  249. },
  250. checkSortIndex (rule, value, callback) {
  251. var text = '请输入排序号!'
  252. if (!value) {
  253. callback(text)
  254. } else if (/(^[1-9]\d*$)/.test(value)) {
  255. callback()
  256. } else {
  257. text = '请输入数字'
  258. callback(text)
  259. }
  260. }
  261. }
  262. }
  263. </script>