addBannerForm.vue 7.0 KB

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