buy-member.vue 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272
  1. <template>
  2. <div class="member-center">
  3. <!-- 头部 -->
  4. <MemberHeader />
  5. <!-- /头部 -->
  6. <div class="content buy-member">
  7. <div class="tit">
  8. <div class="tit-bg"></div>
  9. <div class="text">
  10. {{$t('memberCenter.currentGrowthValue')}}:
  11. <span class="number">{{memberInfo.growth}}</span>
  12. </div>
  13. <div class="tit-bg tit-r"></div>
  14. <!-- 会员等级 -->
  15. </div>
  16. <!-- 会员等级 -->
  17. <div class="item-box">
  18. <div class="item" v-for="(item,index) in userLevels" :key="index">
  19. <div class="bg">
  20. <img :src="item.img" alt />
  21. </div>
  22. <div class="text-box">
  23. <div class="level">{{item.levelName}}</div>
  24. <!-- 期数类型 1:日 2:周 3:月 4:季 5:年 -->
  25. <div class="time">{{$t('memberCenter.shoppingMall')}}:{{item.term}} {{['',$t('dayRi'),$t('week'),$t('month'),$t('season'),$t('year')][item.termType]}}</div>
  26. <div class="price">
  27. <span class="big">{{item.needAmount}}</span>
  28. </div>
  29. <div class="btn-box">
  30. <div class="limit">{{$t('memberCenter.memberGrowthValue')}} ≥ {{item.needGrowth}} {{$t('memberCenter.availablePurchase')}}</div>
  31. <div
  32. class="btn"
  33. :class="(memberInfo.growth < item.needGrowth) ? 'default' : ''"
  34. @click="buyNow(item,index)"
  35. >{{$t('buyNow')}}</div>
  36. </div>
  37. </div>
  38. </div>
  39. </div>
  40. <!-- /会员等级 -->
  41. </div>
  42. <!-- 支付弹窗 -->
  43. <div class="popup-mask" v-if="isShowPop"></div>
  44. <div class="popup-box" v-if="isPayPop">
  45. <div class="tit">
  46. <div class="text">{{$t('memberCenter.purchaseMembership')}}</div>
  47. <div class="close" @click="closePop"></div>
  48. </div>
  49. <div class="con">
  50. <div class="pay-number">
  51. <div class="text">{{$t('memberCenter.openingTips1')}}</div>
  52. <div class="number">{{userLevels[curIndex].levelName}}</div>
  53. <div class="text">{{$t('memberCenter.openingTips2')}}</div>
  54. <div class="number">{{userLevels[curIndex].needAmount}}</div>
  55. <div class="text">{{$t('memberCenter.yuan')}}</div>
  56. </div>
  57. <div class="pay-way">
  58. <div class="item" @click="choosePayWay(PayTypeConstant.ALIPAY)">
  59. <img src="~/assets/images/payment-aliPay.png" alt />
  60. <span class="payment-text">{{$t('payment.aliPay')}}</span>
  61. </div>
  62. <div v-if="payHtml" v-rich="payHtml"></div>
  63. <div class="item" @click="choosePayWay(PayTypeConstant.WECHATPAY_SWEEP_CODE)">
  64. <img src="~/assets/images/payment-wechatPay.png" alt />
  65. <span class="payment-text">{{$t('payment.wechatPay')}}</span>
  66. </div>
  67. <div class="item" @click="choosePayWay(PayTypeConstant.BALANCEPAY)">
  68. <img class="item-balance-img" src="~/assets/images/balancePay.png" alt>
  69. <span class="item-balance-span">
  70. {{$t("payment.balancePay")}}
  71. </span>
  72. </div>
  73. </div>
  74. </div>
  75. </div>
  76. <!-- /支付弹窗 -->
  77. <!-- 微信支付弹窗 -->
  78. <div class="popup-box" v-if="isWxPop">
  79. <div class="tit">
  80. <div class="text">{{$t('memberCenter.weChatPayment')}}</div>
  81. <div class="close" @click="closePop"></div>
  82. </div>
  83. <div class="con">
  84. <div class="weixin-pay-code">
  85. <div class="text">{{$t('memberCenter.weChatSweepPayment')}}</div>
  86. <div class="qrcode">
  87. <canvas id="wxPayQrCode"></canvas>
  88. </div>
  89. <div class="btn-box">
  90. <a href="javascript:void(0)" class="btn" @click="paySuccess">{{$t('memberCenter.completedPayment')}}</a>
  91. <a href="javascript:void(0)" class="btn gray" @click="closePop">{{$t('memberCenter.cancel')}}</a>
  92. </div>
  93. </div>
  94. </div>
  95. </div>
  96. <!-- /微信支付弹窗 -->
  97. </div>
  98. </template>
  99. <script src='~/assets/js/load-transition'></script>
  100. <script>
  101. import MemberHeader from '~/components/member-header'
  102. import { PayType } from '~/plugins/constant'
  103. import QRCode from 'qrcode'
  104. export default {
  105. layout: 'home',
  106. components: {
  107. MemberHeader
  108. },
  109. data () {
  110. return {
  111. memberInfo: {}, //会员等级信息
  112. userLevels: [], //付费会员等级列表
  113. isShowPop: false, //是否显示弹窗
  114. isPayPop: false, //是否显示支付方式弹窗
  115. isWxPop: false, //是否微信支付弹窗
  116. payType: null, //支付类型
  117. PayTypeConstant: PayType, //支付类型常量
  118. curIndex: 0, //当前套餐
  119. memberLevelId: null, //当前会员等级id
  120. payHtml: '', //支付宝支付页面
  121. currentBalance: 0 //余额
  122. }
  123. },
  124. mounted () {
  125. // 设置网页标题
  126. document.title = this.$i18n.t('memberCenter.purchaseMembership')
  127. //获取会员等级信息
  128. this.$axios.get('/p/score/scoreLevel/page?levelType=' + 0).then(({ data }) => {
  129. this.memberInfo = data
  130. })
  131. //获取付费会员等级列表
  132. this.$axios.get('/p/score/scoreLevel/page?levelType=' + 1).then(({ data }) => {
  133. this.userLevels = data.userLevels
  134. })
  135. this.getBalanceInfo()
  136. },
  137. methods: {
  138. //立即购买
  139. buyNow (item, index) {
  140. if (this.memberInfo.growth >= item.needGrowth) {
  141. this.isShowPop = true
  142. this.isPayPop = true
  143. this.curIndex = index
  144. this.memberLevelId = item.id
  145. }
  146. },
  147. // 请求余额数据
  148. getBalanceInfo() {
  149. this.$axios.get('/p/userBalance/getBalanceInfo').then(({ data }) => {
  150. this.currentBalance = data
  151. })
  152. },
  153. //选择支付方式
  154. choosePayWay (type) {
  155. if (type == PayType.ALIPAY) {
  156. // 支付宝部分
  157. this.$axios.post('/p/level/payLevel', {
  158. id: this.memberLevelId,
  159. payType: type,
  160. returnUrl: window.location.origin + '/member-center/member-center'
  161. }).then(({ data }) => {
  162. this.payHtml = data
  163. this.$nextTick(() => {
  164. document.forms[0].submit()
  165. })
  166. })
  167. } else if (type == PayType.WECHATPAY_SWEEP_CODE) {
  168. // 微信部分
  169. this.$axios.post('/p/level/payLevel', {
  170. id: this.memberLevelId,
  171. payType: type,
  172. }).then(({ data }) => {
  173. this.isWxPop = true
  174. this.isPayPop = false
  175. this.$nextTick(function () {
  176. QRCode.toCanvas(document.getElementById('wxPayQrCode'), data, { version: 6, errorCorrectionLevel: 'L' })
  177. })
  178. })
  179. } else if (type === PayType.BALANCEPAY) {
  180. // 余额部分
  181. const that = this
  182. let total = this.userLevels[this.curIndex].needAmount
  183. if (total > parseFloat(this.currentBalance)) {
  184. this.$message({
  185. message: this.$t("myBalance.balanceInsufficient") + this.currentBalance,
  186. type: 'warning',
  187. duration: 3000
  188. })
  189. return
  190. }
  191. this.closePop()
  192. this.$confirm(this.$t("myBalance.payTips"), this.$t("tips"),{
  193. distinguishCancelAndClose: true,
  194. confirmButtonText: this.$t("determine"),
  195. cancelButtonText: this.$t("cancel")
  196. }).then(() => {
  197. this.$axios.post('/p/level/payLevel', {
  198. id: this.memberLevelId,
  199. payType: type,
  200. }).then(({ data }) => {
  201. if (data.type == 1) {
  202. this.$message({
  203. message: this.$t('payment.paymentSuccessful'),
  204. type: 'success',
  205. duration: 1000,
  206. onClose() {
  207. that.$router.push({ path: '/member-center/member-center' })
  208. }
  209. })
  210. } else {
  211. this.$message({
  212. message: res.message,
  213. type: 'error',
  214. duration: 1000
  215. })
  216. }
  217. })
  218. }).catch(action => {})
  219. }
  220. },
  221. //关闭弹窗
  222. closePop () {
  223. this.isShowPop = false
  224. this.isPayPop = false
  225. this.isWxPop = false
  226. },
  227. // 点击完成支付
  228. paySuccess () {
  229. this.$axios.get('/p/level/isPay', {
  230. }).then(({ data }) => {
  231. console.log(data)
  232. if(data === 1) {
  233. this.$message({
  234. message: this.$i18n.t('memberCenter.purchaseSuccess'),
  235. type: 'success',
  236. duration: 1500
  237. })
  238. }else {
  239. this.$message({
  240. message: this.$i18n.t('memberCenter.purchaseFailure'),
  241. type: 'error',
  242. duration: 1500
  243. })
  244. }
  245. })
  246. this.isShowPop = false
  247. this.isPayPop = false
  248. this.isWxPop = false
  249. this.$router.push({
  250. path: '/member-center/member-center'
  251. })
  252. }
  253. }
  254. }
  255. </script>
  256. <style scoped>
  257. @import '~/assets/css/member-center.css';
  258. @import '~/assets/css/buy-member.css';
  259. @import '~/assets/css/payment.css';
  260. </style>