shoppingCart.vue 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. <template>
  2. <view class="page">
  3. <cu-custom :isBack="true"></cu-custom>
  4. <view class="header" :style="[{top:topHeader + 'px'}]">
  5. <view class="header-title">
  6. <view class="header-title-main">
  7. <view class="margin-bottom-xs">{{title}}</view>
  8. <view class="point"></view>
  9. </view>
  10. </view>
  11. </view>
  12. <scroll-view scroll-y="true"
  13. :style="[{height:'calc(100vh - 64px - '+ topHeader+'px)'}]"
  14. class="scroll-main">
  15. <view class="list">
  16. <view class="cu-card margin-bottom shadow" v-for="(item,index) in list" :key="index">
  17. <view class="cu-item">
  18. <view class="card-header flex justify-between solid-bottom">
  19. <view>{{item.student_name}}</view>
  20. <view>
  21. <text class="cuIcon-delete text-red" @tap="del(item,index)"></text>
  22. </view>
  23. </view>
  24. <view class="card flex">
  25. <view class="card-left">
  26. <img mode="scaleToFill" :src="item.image" alt="" class="card-image">
  27. </view>
  28. <view class="card-right flex-sub margin-left-sm">
  29. <view class="card-title">{{item.class_attend_name}}</view>
  30. <view class="text-price text-student text-xl margin-top-xs">{{item.price}}</view>
  31. <view class="card-item">
  32. <text class="card-label">机构:</text>
  33. <text class="card-text">{{item.agency_name||'-'}}</text>
  34. </view>
  35. <view class="card-item margin-top-xs" v-if="item.cate_type===0">
  36. <text class="card-label">老师:</text>
  37. <text class="card-text">{{item.teacher_name||'-'}}</text>
  38. </view>
  39. <view class="card-item margin-top-xs">
  40. <text class="card-label">总共:</text>
  41. <text class="card-text">{{item.class_total||'-'}}</text>
  42. </view>
  43. <view class="card-item margin-top-xs">
  44. <text class="card-label">时间:</text>
  45. <text class="card-text">{{item.week_limit||'-'}}</text>
  46. </view>
  47. </view>
  48. </view>
  49. <view class="card-footer margin-top-xs" v-if="item.prop">
  50. <view v-for="(tag,index) in item.prop" :key="index" class="cu-tag line-red">{{tag}}</view>
  51. </view>
  52. <view class="card-bottom margin-top-xs">
  53. <button @tap="pay(item)" class="cu-btn round bg-student text-white">立即下单</button>
  54. </view>
  55. </view>
  56. </view>
  57. </view>
  58. </scroll-view>
  59. </view>
  60. </template>
  61. <script>
  62. import { _shopList, _delShop, _createOrder } from '@/api/course'
  63. import { mapGetters } from 'vuex'
  64. import { deepClone } from '@/common/utils'
  65. import socket from '@/common/webSocket'
  66. export default {
  67. data() {
  68. return {
  69. title: '购物车',
  70. topHeader: this.globalCustomBarHeight,
  71. list: []
  72. }
  73. },
  74. computed: {
  75. ...mapGetters([
  76. 'carts', 'phone'
  77. ])
  78. },
  79. onLoad(option) {
  80. this.get_list()
  81. socket.initSocket()
  82. },
  83. methods: {
  84. get_list() {
  85. _shopList().then(res => {
  86. this.list = res.data
  87. const carts = this.list.map(item => Number(item.class_attend_id))
  88. this.$store.dispatch('setCarts', carts)// 刷新购物车
  89. })
  90. },
  91. del(item, index) {
  92. const _self = this
  93. uni.showModal({
  94. title: '提示',
  95. content: '确定要删除?',
  96. cancelText: '取消',
  97. confirmText: '确定',
  98. success: res => {
  99. if (res.confirm) {
  100. _delShop({ shopping_id: item.shopping_id, student_id: item.student_id }).then(res => {
  101. _self.get_list()
  102. })
  103. }
  104. }
  105. })
  106. },
  107. pay(item) {
  108. const order = JSON.stringify([item])
  109. let carts = deepClone(this.carts)
  110. const index = carts.indexOf(Number(item.class_attend_id))
  111. carts = carts.splice(index, 1)
  112. if (!this.phone) {
  113. return this.globalNavigateTo('bindPhone')
  114. }
  115. _createOrder({ result: order }).then(res => {
  116. this.socket.onMessage = message => {
  117. if (typeof message !== 'object') {
  118. return false
  119. }
  120. if (message.push_type !== 'order') {
  121. return false
  122. }
  123. if (message.code === 400) {
  124. uni.showToast({ title: message.msg, icon: 'none', duration: 2000 })
  125. return false
  126. }
  127. this.$store.dispatch('setCarts', carts)
  128. this.globalNavigateTo('order')
  129. }
  130. })
  131. }
  132. }
  133. }
  134. </script>
  135. <style lang="scss" scoped>
  136. @import '~@/common/css/mixin.scss';
  137. .scroll-main{
  138. margin-top:64px;
  139. padding:20rpx;
  140. }
  141. .cu-card{
  142. .cu-item{
  143. margin-top:10rpx;
  144. padding:20rpx;
  145. margin:0;
  146. }
  147. }
  148. .card-header{
  149. padding-bottom:10px;
  150. @include title(10px,18px);
  151. }
  152. .card{
  153. &-title{
  154. font-size:16px;
  155. }
  156. &-image{
  157. width:35vw;
  158. height:35vw;
  159. border-radius:10rpx;
  160. }
  161. &-label{
  162. color:#999;
  163. }
  164. &-text{
  165. color:#333;
  166. }
  167. }
  168. .card-bottom{
  169. text-align:right;
  170. }
  171. </style>