PeriodExchange.vue 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. <template>
  2. <div class="periodExchange">
  3. <m-header v-if="headerStatus" />
  4. <van-cell-group>
  5. <van-cell :center="true">
  6. <template slot="icon">
  7. <img class="logo" v-if="userInfo.avatar" :src="userInfo.avatar" alt="">
  8. <img class="logo" v-else src="@/assets/images/icon_teacher.png" alt="">
  9. </template>
  10. <template slot="title">
  11. <p class="exchangeText">{{ userInfo.realName }}</p>
  12. </template>
  13. <template slot="label">
  14. <p class="info">剩余时长:{{ availableMinutes }}</p>
  15. </template>
  16. </van-cell>
  17. </van-cell-group>
  18. <div class="activeList">
  19. <div class="active" @click="onPayOrder(item)" v-for="(item, index) in dataList" :key="index">
  20. <van-icon name="question-o" @click.stop="onMore(item)" class="icon_question" />
  21. <img :src="item.coverImg" alt="">
  22. </div>
  23. </div>
  24. <!-- <div class="pay_btn" >确认兑换</div> -->
  25. <van-popup v-model="popupShow" closeable position="bottom"
  26. :style="{ minHeight: '30%', maxHeight: '60%' }" >
  27. <div class="popupContent" v-html="popupContent"></div>
  28. </van-popup>
  29. </div>
  30. </template>
  31. <script>
  32. /* eslint-disable */
  33. import MHeader from '@/components/MHeader'
  34. import { browser, calcMinute } from '@/common/common'
  35. import { tenantEntryActivitesList, queryUserInfo, sysTenantAccountGet, createOrder } from '@/api/app'
  36. export default {
  37. name: 'courseApply',
  38. components: { MHeader },
  39. data() {
  40. return {
  41. userInfo: {},
  42. availableMinutes: 0,
  43. headerStatus: true,
  44. result: {}, // 生成订单的数据
  45. dataList: [],
  46. isClick: false,
  47. popupShow: false,
  48. popupContent: null
  49. }
  50. },
  51. mounted() {
  52. let params = this.$route.query
  53. if(params.Authorization) {
  54. localStorage.setItem('Authorization', decodeURI(params.Authorization))
  55. localStorage.setItem('userInfo', decodeURI(params.Authorization))
  56. }
  57. document.title = '课时兑换'
  58. if(browser().android || browser().iPhone) {
  59. this.headerStatus = false
  60. }
  61. this.__init()
  62. },
  63. methods: {
  64. async __init() {
  65. let loadingStatus = true
  66. this.$toast.loading({
  67. duration: 0,
  68. message: '加载中...',
  69. forbidClick: true,
  70. loadingType: 'spinner'
  71. })
  72. await queryUserInfo().then(res => {
  73. let result = res.data
  74. if(result) {
  75. this.userInfo = result
  76. }
  77. })
  78. await sysTenantAccountGet().then(res => {
  79. let result = res.data
  80. if(result.code == 200) {
  81. let tempResult = result.data
  82. if(tempResult) {
  83. this.availableMinutes = calcMinute(tempResult.availableMinutes ? tempResult.availableMinutes : 0)
  84. }
  85. } else {
  86. loadingStatus = false
  87. this.$toast(result.msg)
  88. }
  89. })
  90. await tenantEntryActivitesList().then(res => {
  91. let result = res.data
  92. if(result.code == 200) {
  93. this.dataList = result.data.rows
  94. } else {
  95. loadingStatus = false
  96. this.$toast(result.msg)
  97. }
  98. })
  99. if(loadingStatus) {
  100. this.$toast.clear()
  101. }
  102. },
  103. onPayOrder(item) {
  104. // activitiesId
  105. if(this.isClick) {
  106. return
  107. }
  108. this.$toast.loading({
  109. duration: 0,
  110. message: '加载中...',
  111. forbidClick: true,
  112. loadingType: 'spinner'
  113. })
  114. this.isClick = true
  115. createOrder({ activitiesId: item.id }).then(res => {
  116. let result = res.data
  117. this.$toast.clear()
  118. this.isClick = false
  119. if(result.code == 200) {
  120. this.result = result.data
  121. this.onSubmit()
  122. } else {
  123. this.$toast(result.msg)
  124. }
  125. })
  126. },
  127. onSubmit() {
  128. // submit 提交
  129. let result = this.result
  130. // if(result.type == "YQPAY") {
  131. let f = result.payMap
  132. document.querySelector('#onSubmit').action = f.host
  133. document.querySelector('#apiContent').value = f.apiContent
  134. document.querySelector('#merNo').value = f.merNo
  135. document.querySelector('#notifyUrl').value = f.notifyUrl
  136. document.querySelector('#sign').value = f.sign
  137. document.querySelector('#signType').value = f.signType
  138. document.querySelector('#timestamp').value = f.timestamp
  139. document.querySelector('#version').value = f.version
  140. document.querySelector('#onSubmit').submit()
  141. // } else if(result.type == "UNIONPAY") {
  142. // localStorage.setItem('payInfo', JSON.stringify(result))
  143. // this.$router.push({
  144. // path: '/alipay',
  145. // query: {
  146. // balance: result.totalPrice
  147. // }
  148. // })
  149. // }
  150. },
  151. onMore(item) {
  152. this.popupContent = item.detail
  153. this.popupShow = true
  154. }
  155. }
  156. }
  157. </script>
  158. <style lang='less' scoped>
  159. @import url("../../assets/commonLess/variable.less");
  160. .periodExchange {
  161. min-height: 100vh;
  162. position: relative;
  163. .logo {
  164. width: .5rem;
  165. height: .5rem;
  166. border-radius: 50%;
  167. overflow: hidden;
  168. margin-right: .13rem;
  169. }
  170. /deep/.van-cell {
  171. padding: .26rem .16rem .88rem;
  172. }
  173. .exchangeText {
  174. font-size: .18rem;
  175. color: #1A1A1A;
  176. }
  177. .info {
  178. font-size: .16rem;
  179. color: #808080;
  180. }
  181. }
  182. .activeList {
  183. padding: 0 .16rem;
  184. margin-top: -.6rem;
  185. position: relative;
  186. z-index: 99;
  187. .active {
  188. position: relative;
  189. margin-bottom: .15rem;
  190. line-height: 0;
  191. // box-shadow:0px 0px 16px 0px rgba(155,145,41,0.19);
  192. }
  193. img {
  194. width: 100%;
  195. }
  196. .icon_question {
  197. position: absolute;
  198. bottom: .1rem;
  199. right: .1rem;
  200. color: #fff;
  201. font-size: .18rem;
  202. }
  203. }
  204. .popupContent {
  205. padding: .4rem .16rem .1rem;
  206. }
  207. .pay_btn {
  208. background: #14928A;
  209. line-height: 0.45rem;
  210. color: #fff;
  211. font-size: 0.18rem;
  212. border-radius: 0.5rem;
  213. text-align: center;
  214. position: absolute;
  215. width: 90%;
  216. margin-left: 5%;
  217. bottom: .2rem;
  218. }
  219. </style>