index.tsx 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300
  1. import { Button, Cell, Icon, Image, showConfirmDialog } from 'vant';
  2. import { defineComponent } from 'vue';
  3. import styles from './index.module.less';
  4. import request from '@/helpers/request';
  5. import iconStudent from '@common/images/icon-student.png';
  6. // import iconMemberLogo from './images/member_logo.png';
  7. import iconGift from '../student-register/images/icon-gift.png';
  8. import { moneyFormat } from '@/helpers/utils';
  9. import OHeader from '@/components/m-header';
  10. import member1 from './images/member-1.png';
  11. import member2 from './images/member-2.png';
  12. import ODialog from '@/components/m-dialog';
  13. import { useEventListener, useWindowScroll } from '@vueuse/core';
  14. export default defineComponent({
  15. name: 'MemberCenter',
  16. data() {
  17. return {
  18. functionList: [] as any,
  19. selectMember: {} as any,
  20. users: {} as any,
  21. memberStatus: false,
  22. background: 'transparent',
  23. color: '#fff'
  24. };
  25. },
  26. computed: {
  27. userInfo() {
  28. const users: any = this.users;
  29. return {
  30. username: users?.nickname || '',
  31. phone: users?.phone || '',
  32. avatar: users?.avatar,
  33. id: users?.id,
  34. isVip: users?.vipMember,
  35. membershipGiftDays: users?.membershipGiftDays,
  36. membershipDays: users?.membershipDays,
  37. membershipEndTime: users?.membershipEndTime
  38. };
  39. }
  40. },
  41. async mounted() {
  42. useEventListener(document, 'scroll', () => {
  43. const { y } = useWindowScroll();
  44. if (y.value > 52) {
  45. this.background = '#fff';
  46. this.color = '#323333';
  47. } else {
  48. this.background = 'transparent';
  49. this.color = '#fff';
  50. }
  51. });
  52. try {
  53. const userInfo = await request.get('/edu-app/student/member');
  54. this.users = userInfo.data || {};
  55. const { data } = await request.post(`/edu-app/cityFeeSetting/member`);
  56. this.selectMember = data;
  57. this.paymentOrderUnpaid();
  58. } catch {
  59. //
  60. }
  61. //
  62. },
  63. methods: {
  64. // 查询未支付订单
  65. async paymentOrderUnpaid() {
  66. try {
  67. const { data } = await request.get('/edu-app/userPaymentOrder/unpaid', {
  68. requestType: 'form',
  69. params: {
  70. paymentType: 'VIP'
  71. }
  72. });
  73. // 判断是否有待支付订单
  74. if (data.id) {
  75. showConfirmDialog({
  76. message: '您有待支付的订单,是否继续支付',
  77. cancelButtonText: '取消订单',
  78. confirmButtonText: '继续支付'
  79. })
  80. .then(() => {
  81. const paymentConfig = data.paymentConfig;
  82. this.$router.push({
  83. path: '/order-detail',
  84. query: {
  85. config: JSON.stringify(paymentConfig.paymentConfig),
  86. orderNo: paymentConfig.orderNo
  87. }
  88. });
  89. })
  90. .catch(async () => {
  91. try {
  92. await request.post(
  93. '/edu-app/userPaymentOrder/cancelPayment/' + data.orderNo
  94. );
  95. } catch {
  96. //
  97. }
  98. });
  99. }
  100. } catch {
  101. //
  102. }
  103. },
  104. calcSalePrice(item: any) {
  105. // discount
  106. if (item.discount === 1) {
  107. const tempPrice = Number(
  108. (item.salePrice - item.discountPrice).toFixed(2)
  109. );
  110. return tempPrice >= 0 ? tempPrice : 0;
  111. }
  112. return item.salePrice;
  113. },
  114. // 购买
  115. async onSubmit() {
  116. try {
  117. const selectMember = this.selectMember;
  118. const params: any = [
  119. {
  120. goodsId: selectMember.id,
  121. goodsNum: 1,
  122. goodsType: 'VIP',
  123. paymentCashAmount: selectMember.salePrice, // 现金支付金额
  124. paymentCouponAmount: 0 // 优惠券金额
  125. }
  126. ]; // 支付参数
  127. // 创建订单
  128. const { data } = await request.post(
  129. '/edu-app/userPaymentOrder/executeOrder',
  130. {
  131. data: {
  132. orderType: 'VIP',
  133. paymentCashAmount: this.selectMember.salePrice || 0,
  134. paymentCouponAmount: 0,
  135. goodsInfos: params,
  136. orderName: '数字化器乐学练工具',
  137. orderDesc: '数字化器乐学练工具'
  138. }
  139. }
  140. );
  141. const res = await request.get(
  142. '/edu-app/userPaymentOrder/detail/' + data.orderNo
  143. );
  144. if (res.data.status !== 'WAIT_PAY' && res.data.status !== 'PAYING') {
  145. this.$router.push({
  146. path: '/payment-result',
  147. query: {
  148. orderNo: data.orderNo
  149. }
  150. });
  151. } else {
  152. this.$router.push({
  153. path: '/order-detail',
  154. query: {
  155. config: JSON.stringify(data.paymentConfig),
  156. orderNo: data.orderNo
  157. }
  158. });
  159. }
  160. } catch (e: any) {
  161. //
  162. console.log(e);
  163. }
  164. }
  165. },
  166. render() {
  167. return (
  168. <div class={styles['member-center']}>
  169. <OHeader
  170. background={this.background}
  171. color={this.color}
  172. border={false}
  173. />
  174. <div class={styles.member_container}>
  175. <Cell
  176. class={[styles.userMember]}
  177. labelClass={styles.timeRemaining}
  178. center
  179. v-slots={{
  180. icon: () => (
  181. <div class={styles.userImgSection}>
  182. <Image
  183. class={styles.userImg}
  184. src={this.userInfo.avatar || iconStudent}
  185. fit="cover"
  186. />
  187. </div>
  188. ),
  189. title: () => (
  190. <div class={styles.userInfo}>
  191. <span class={styles.name}>{this.userInfo.username}</span>
  192. {!!this.userInfo.isVip && (
  193. <Image
  194. class={styles.level}
  195. src="https://daya.ks3-cn-beijing.ksyun.com/202107/ScSTL1D.png"
  196. />
  197. )}
  198. {this.userInfo.phone && (
  199. <span
  200. class={styles.phone}
  201. v-html={`(${this.userInfo.phone})`}></span>
  202. )}
  203. </div>
  204. ),
  205. label: () => (
  206. <div class={styles.member_time}>
  207. <>
  208. {this.userInfo.isVip ? (
  209. <div>
  210. 使用有效期剩余
  211. <span class={styles.remaining}>
  212. {this.userInfo.membershipGiftDays}
  213. </span>
  214. </div>
  215. ) : (
  216. <div>您还未开通器乐学练工具哟</div>
  217. )}
  218. </>
  219. </div>
  220. )
  221. }}></Cell>
  222. </div>
  223. <div class={[styles.memberContainer]}>
  224. <div
  225. class={[
  226. styles.memberItem,
  227. this.selectMember.membershipGiftDays > 0 ? styles.memberGift : ''
  228. ]}>
  229. <p class={[styles.title]}>
  230. <strong>数字化</strong>器乐学练工具
  231. <span>12个月</span>
  232. </p>
  233. <div class={styles.priceGroup}>
  234. <p class={styles.price}>
  235. <span>¥</span>
  236. {moneyFormat(this.selectMember.salePrice)}
  237. </p>
  238. <del class={styles.originalPrice}>
  239. ¥{moneyFormat(this.selectMember.originalPrice)}
  240. </del>
  241. </div>
  242. {this.selectMember.membershipGiftDays > 0 && (
  243. <Cell border={false} class={styles.giftCell}>
  244. {{
  245. title: () => (
  246. <div class={styles.gift}>
  247. <img src={iconGift} class={styles.iconGift} />
  248. 现在购买赠送{' '}
  249. <span>{this.selectMember.membershipGiftDays || 0}</span>
  250. 天有效期
  251. </div>
  252. )
  253. }}
  254. </Cell>
  255. )}
  256. </div>
  257. <div class={styles.memberImgs}>
  258. <img src={member1} />
  259. <img src={member2} />
  260. </div>
  261. </div>
  262. <div class={styles.btnGroup}>
  263. <div class={styles.priceSection}>
  264. 工具领取:
  265. <div class={styles.price}>
  266. <span class={styles.priceUnit}>¥</span>
  267. <span class={styles.priceNum}>
  268. {moneyFormat(this.calcSalePrice(this.selectMember) || 0)}
  269. </span>
  270. </div>
  271. </div>
  272. {this.userInfo.id ? (
  273. <Button round class={styles.btn} onClick={this.onSubmit}>
  274. 立即领取
  275. </Button>
  276. ) : (
  277. ''
  278. )}
  279. </div>
  280. <ODialog
  281. v-model:show={this.memberStatus}
  282. title="待激活团练宝"
  283. message="为让团员有效使用乐团学习工具,首次加入乐团且购买团练宝的团员,团练宝的生效时间为乐团首次训练之日,具体训练时间可查看课表。"
  284. messageAlign="left"
  285. dialogMarginTop="env(safe-area-inset-top)"
  286. confirmButtonText="我知道了"
  287. />
  288. </div>
  289. );
  290. }
  291. });