Create.vue 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. <template>
  2. <a-card :bordered="false">
  3. <div class="card-title">{{ $route.meta.title }}</div>
  4. <a-spin :spinning="isLoading">
  5. <a-form :form="form" @submit="handleSubmit" :labelCol="labelCol" :wrapperCol="wrapperCol">
  6. <a-form-item label="优惠券名称">
  7. <a-input
  8. placeholder="请输入优惠券名称"
  9. v-decorator="['name', { rules: [{ required: true, min: 2, message: '请输入至少2个字符' }] }]"
  10. />
  11. </a-form-item>
  12. <a-form-item label="优惠券类型">
  13. <a-radio-group
  14. v-decorator="['coupon_type', { initialValue: 10, rules: [{ required: true }] }]"
  15. >
  16. <a-radio :value="10">满减券</a-radio>
  17. <a-radio :value="20">折扣券</a-radio>
  18. </a-radio-group>
  19. </a-form-item>
  20. <a-form-item
  21. v-if="form.getFieldValue('coupon_type') == 10"
  22. label="减免金额"
  23. :labelCol="labelCol"
  24. :wrapperCol="wrapperCol"
  25. >
  26. <a-input-number
  27. :min="0.01"
  28. :precision="2"
  29. v-decorator="['reduce_price', { rules: [{ required: true, message: '请输入减免金额' }] }]"
  30. />
  31. <span class="ml-5">元</span>
  32. </a-form-item>
  33. <a-form-item
  34. v-if="form.getFieldValue('coupon_type') == 20"
  35. label="折扣率"
  36. :labelCol="labelCol"
  37. :wrapperCol="wrapperCol"
  38. >
  39. <a-input-number
  40. :min="0"
  41. :max="9.9"
  42. :precision="1"
  43. v-decorator="['discount', { initialValue: 9.9, rules: [{ required: true, message: '请输入折扣率' }] }]"
  44. />
  45. <span class="ml-5">%</span>
  46. <p class="form-item-help">
  47. <small>折扣率范围 0-9.9,8代表打8折,0代表不折扣</small>
  48. </p>
  49. </a-form-item>
  50. <a-form-item label="最低消费金额">
  51. <a-input-number
  52. :min="1"
  53. :precision="2"
  54. v-decorator="['min_price', { rules: [{ required: true, message: '请输入最低消费金额' }] }]"
  55. />
  56. <span class="ml-5">元</span>
  57. </a-form-item>
  58. <a-form-item label="到期类型">
  59. <a-radio-group
  60. v-decorator="['expire_type', { initialValue: 10, rules: [{ required: true }] }]"
  61. >
  62. <a-radio :value="10">领取后生效</a-radio>
  63. <a-radio :value="20">固定时间</a-radio>
  64. </a-radio-group>
  65. <a-form-item v-show="form.getFieldValue('expire_type') == 10" class="expire_type-10">
  66. <InputNumberGroup
  67. addonBefore="有效期"
  68. addonAfter="天"
  69. :inputProps="{ min: 1, precision: 0 }"
  70. v-decorator="['expire_day', { initialValue: 7, rules: [{ required: true, message: '请输入有效期天数' }] }]"
  71. />
  72. </a-form-item>
  73. <a-form-item v-show="form.getFieldValue('expire_type') == 20" class="expire_type-20">
  74. <a-range-picker
  75. format="YYYY-MM-DD"
  76. v-decorator="['betweenTime', { initialValue: defaultDate, rules: [{ required: true, message: '请选择有效期范围' }] }]"
  77. />
  78. </a-form-item>
  79. </a-form-item>
  80. <a-form-item label="券适用范围">
  81. <a-radio-group
  82. v-decorator="['apply_range', { initialValue: ApplyRangeEnum.ALL.value, rules: [{ required: true }] }]"
  83. >
  84. <a-radio
  85. v-for="(item, index) in ApplyRangeEnum.data"
  86. :value="item.value"
  87. :key="index"
  88. >{{ item.name }}</a-radio>
  89. </a-radio-group>
  90. <a-form-item v-if="form.getFieldValue('apply_range') != ApplyRangeEnum.ALL.value">
  91. <SelectGoods
  92. v-decorator="['apply_range_config.goodsIds', { rules: [{ required: true, message: '请选择适用的商品' }] }]"
  93. />
  94. </a-form-item>
  95. </a-form-item>
  96. <a-form-item label="发放总数量">
  97. <a-input-number
  98. :min="-1"
  99. :precision="0"
  100. v-decorator="['total_num', { initialValue: -1, rules: [{ required: true, message: '请输入发放总数量' }] }]"
  101. />
  102. <span class="ml-5">张</span>
  103. <p class="form-item-help">
  104. <small>发放的优惠券总数量,-1为不限制</small>
  105. </p>
  106. </a-form-item>
  107. <a-form-item label="显示状态">
  108. <a-radio-group v-decorator="['status', { initialValue: 1, rules: [{ required: true }] }]">
  109. <a-radio :value="1">显示</a-radio>
  110. <a-radio :value="0">隐藏</a-radio>
  111. </a-radio-group>
  112. <p class="form-item-help">
  113. <small>如果设为隐藏将不会展示在用户端页面</small>
  114. </p>
  115. </a-form-item>
  116. <a-form-item label="优惠券描述">
  117. <a-textarea :autoSize="{ minRows: 4 }" v-decorator="['describe']" />
  118. </a-form-item>
  119. <a-form-item label="排序" extra="数字越小越靠前">
  120. <a-input-number
  121. :min="0"
  122. v-decorator="['sort', { initialValue: 100, rules: [{ required: true, message: '请输入排序值' }] }]"
  123. />
  124. </a-form-item>
  125. <a-form-item class="mt-20" :wrapperCol="{ span: wrapperCol.span, offset: labelCol.span }">
  126. <a-button type="primary" html-type="submit" :loading="isBtnLoading">提交</a-button>
  127. </a-form-item>
  128. </a-form>
  129. </a-spin>
  130. </a-card>
  131. </template>
  132. <script>
  133. import moment from 'moment'
  134. import * as Api from '@/api/market/coupon'
  135. import { InputNumberGroup, SelectGoods } from '@/components'
  136. import { ApplyRangeEnum, CouponTypeEnum, ExpireTypeEnum } from '@/common/enum/coupon'
  137. export default {
  138. components: {
  139. SelectGoods,
  140. InputNumberGroup
  141. },
  142. data () {
  143. return {
  144. // 枚举类
  145. ApplyRangeEnum,
  146. CouponTypeEnum,
  147. ExpireTypeEnum,
  148. // 正在加载
  149. isLoading: false,
  150. isBtnLoading: false,
  151. // 标签布局属性
  152. labelCol: { span: 3 },
  153. // 输入框布局属性
  154. wrapperCol: { span: 10 },
  155. // 当前表单元素
  156. form: this.$form.createForm(this),
  157. // 默认日期范围
  158. defaultDate: [moment(), moment()]
  159. }
  160. },
  161. created () {
  162. this.$nextTick(() => {
  163. this.$forceUpdate()
  164. })
  165. },
  166. methods: {
  167. // 确认按钮
  168. handleSubmit (e) {
  169. e.preventDefault()
  170. // 表单验证
  171. const { form: { validateFields }, onFormSubmit } = this
  172. validateFields((errors, values) => {
  173. !errors && onFormSubmit(values)
  174. })
  175. },
  176. // 提交到后端api
  177. onFormSubmit (values) {
  178. this.isLoading = true
  179. this.isBtnLoading = true
  180. Api.add({ form: values })
  181. .then(result => {
  182. // 显示提示信息
  183. this.$message.success(result.message, 1.5)
  184. // 跳转到列表页
  185. setTimeout(() => this.$router.push('./index'), 1500)
  186. })
  187. .catch(() => this.isBtnLoading = false)
  188. .finally(() => this.isLoading = false)
  189. }
  190. }
  191. }
  192. </script>
  193. <style lang="less" scoped>
  194. .ant-form-item {
  195. .ant-form-item {
  196. margin-bottom: 0;
  197. }
  198. }
  199. /deep/.ant-form-item-control {
  200. padding-left: 10px;
  201. }
  202. </style>