user-pay-form.vue 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. <template>
  2. <div>
  3. <el-alert
  4. title="基础信息设置"
  5. :closable="false"
  6. class="alert"
  7. type="info">
  8. </el-alert>
  9. <userBaseinfo
  10. :form.sync="form"
  11. :isCommon="isCommon"
  12. :isUserType="isUserType"
  13. ref="base"
  14. />
  15. <template v-if="!isCommon">
  16. <el-alert
  17. title="加课信息设置"
  18. :closable="false"
  19. class="alert"
  20. type="info">
  21. </el-alert>
  22. <extraClass
  23. :form="eclass"
  24. ref="eclass"
  25. @create="addExtraClass"
  26. @remove="removeExtraClass"
  27. />
  28. </template>
  29. <template v-if="isUserType">
  30. <el-alert
  31. title="缴费周期设置"
  32. :closable="false"
  33. class="alert"
  34. type="info">
  35. </el-alert>
  36. <template v-if="isCommon">
  37. <el-collapse :value="collapse" @change="collapseChange" >
  38. <el-collapse-item
  39. v-for="(item, index) in cycles"
  40. :key="index"
  41. :name="index"
  42. >
  43. <template slot="title">
  44. <div class="collapse-title">
  45. <span>缴费周期 {{index + 1}}</span>
  46. <i v-if="index !== 0" class="el-icon-circle-close" @click.stop="removeCycle(index)"></i>
  47. </div>
  48. </template>
  49. <paymentCycle
  50. ref="cycles"
  51. :form="item"
  52. />
  53. </el-collapse-item>
  54. </el-collapse>
  55. <el-button
  56. icon="el-icon-circle-plus-outline"
  57. plain
  58. type="info"
  59. size="small"
  60. style="width: 100%;margin: 20px 0;"
  61. @click="addCycle"
  62. >新增缴费周期</el-button>
  63. </template>
  64. <paymentCycle
  65. ref="cycle"
  66. :form.sync="cycle"
  67. v-else
  68. />
  69. </template>
  70. <div slot="footer" class="dialog-footer">
  71. <el-button @click="$listeners.close">取 消</el-button>
  72. <el-button
  73. type="primary"
  74. @click="submit"
  75. >下一步</el-button>
  76. </div>
  77. <el-dialog
  78. :title="nextTitle"
  79. :visible.sync="nextVisible"
  80. width="600px"
  81. append-to-body
  82. >
  83. <classrooms
  84. @close="closeNext"
  85. />
  86. </el-dialog>
  87. </div>
  88. </template>
  89. <script>
  90. import userBaseinfo from './user-baseinfo'
  91. import paymentCycle from './payment-cycle'
  92. import extraClass from './extra-class'
  93. import classrooms from './classrooms'
  94. export default {
  95. props: ['type'],
  96. components: {
  97. userBaseinfo,
  98. paymentCycle,
  99. extraClass,
  100. classrooms,
  101. },
  102. data() {
  103. return {
  104. options: [],
  105. form: {
  106. leixing: '0',
  107. },
  108. cycles: [{}],
  109. cycle: {},
  110. eclass: [{}],
  111. collapse: [],
  112. nextVisible: false,
  113. }
  114. },
  115. computed: {
  116. isCommon() {
  117. console.log(this.form.leixing)
  118. return this.form.leixing === '0'
  119. },
  120. isUserType() {
  121. return this.type === 'user'
  122. },
  123. nextTitle() {
  124. return this.isCommon ? '乐团课程-班级选择' : '临时加课-班级选择'
  125. },
  126. },
  127. watch: {
  128. eclass() {
  129. console.log([...this.eclass])
  130. },
  131. 'form.leixing'() {
  132. this.cycles = [{}]
  133. this.collapse = [0]
  134. this.cycle = {}
  135. },
  136. },
  137. mounted() {
  138. console.log(this.refs)
  139. },
  140. methods: {
  141. addExtraClass() {
  142. this.eclass.push({})
  143. },
  144. removeExtraClass(index) {
  145. this.eclass[index] = null
  146. this.eclass = this.eclass.filter(item => !!item)
  147. },
  148. addCycle() {
  149. this.cycles.push({})
  150. this.collapse.push(this.collapse.length)
  151. },
  152. removeCycle(index) {
  153. this.cycles[index] = null
  154. this.cycles = this.cycles.filter(item => !!item)
  155. this.collapse.pop()
  156. },
  157. collapseChange(val) {
  158. this.collapse = val
  159. },
  160. closeNext() {
  161. this.nextVisible = false
  162. },
  163. getForms() {
  164. const { $refs: refs } = this
  165. return [...refs.cycles, refs.base, refs.eclass, refs.cycle]
  166. .filter(item => !!item)
  167. .map(item => item.$refs.form)
  168. },
  169. async submit() {
  170. const forms = this.getForms()
  171. console.log(forms)
  172. const valided = []
  173. for (const form of forms) {
  174. form.validate(valid => {
  175. if (valid) {
  176. valided.push(form)
  177. }
  178. })
  179. }
  180. if (valided.length === forms.length) {
  181. console.log({...this.form}, this.cycle, this.cycles, this.eclass)
  182. this.nextVisible = true
  183. }
  184. }
  185. },
  186. };
  187. </script>
  188. <style lang="less" scoped>
  189. .dialog-footer{
  190. margin-top: 20px;
  191. display: block;
  192. text-align: right;
  193. }
  194. .alert{
  195. margin-bottom: 10px;
  196. }
  197. .collapse-title{
  198. display: flex;
  199. justify-content: space-between;
  200. align-items: center;
  201. width: 100%;
  202. .el-icon-circle-close{
  203. font-size: 16px;
  204. margin-right: 10px;
  205. }
  206. }
  207. /deep/ .el-collapse-item__wrap{
  208. padding-top: 20px;
  209. }
  210. </style>