123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301 |
- import { Button, Cell, Icon, Image, Popup, showConfirmDialog, Toast } from 'vant'
- import { defineComponent } from 'vue'
- import styles from './index.module.less'
- import request from '@/helpers/request'
- import { setLogin, state } from '@/state'
- import iconStudent from '@common/images/icon_student.png'
- import iconTeacher from '@common/images/icon_teacher.png'
- import iconDiscount from './images/icon_discount.png'
- import iconMemberLogo from './images/member_logo.png'
- // import { orderStatus } from '@/views/order-detail/orderStatus'
- import dayjs from 'dayjs'
- import { memberType } from '@/constant'
- import { moneyFormat } from '@/helpers/utils'
- import OHeader from '@/components/o-header'
- export const getAssetsHomeFile = (fileName: string) => {
- const path = `./images/${fileName}`
- const modules = import.meta.globEager('./images/*')
- return modules[path].default
- }
- export default defineComponent({
- name: 'MemberCenter',
- data() {
- const query = this.$route.query
- return {
- functionList: [] as any,
- selectMember: {} as any,
- users: {} as any
- }
- },
- computed: {
- userInfo() {
- const users: any = this.users
- return {
- username: users?.nickname || '',
- phone: users?.phone || '',
- avatar: users?.avatar,
- id: users?.id,
- isVip: users?.vipMember,
- membershipDays: users?.membershipDays,
- membershipEndTime: users?.membershipEndTime
- }
- }
- },
- async mounted() {
- try {
- const userInfo = await request.get('/api-student/student/member')
- this.users = userInfo.data || {}
- this.functionList = [
- {
- title: '五线谱<br />跟播',
- icon: getAssetsHomeFile(`1.png`)
- },
- {
- title: '演奏指法<br />跟播',
- icon: getAssetsHomeFile(`2.png`)
- },
- {
- title: '原声/伴奏<br />切换',
- icon: getAssetsHomeFile(`3.png`)
- },
- {
- title: '播放速度<br />调整',
- icon: getAssetsHomeFile(`4.png`)
- },
- {
- title: '五线谱选段<br />播放',
- icon: getAssetsHomeFile(`5.png`)
- },
- {
- title: '智能评测',
- icon: getAssetsHomeFile(`6.png`)
- },
- {
- title: '评测报告',
- icon: getAssetsHomeFile(`7.png`)
- },
- {
- title: '评测音视频<br />云储存',
- icon: getAssetsHomeFile(`8.png`)
- }
- ]
- const { data } = await request.post(`/api-student/cityFeeSetting/member`)
- this.selectMember = data
- this.paymentOrderUnpaid()
- } catch {
- //
- }
- //
- },
- methods: {
- // 查询未支付订单
- async paymentOrderUnpaid() {
- try {
- const { data } = await request.get('/api-student/userPaymentOrder/unpaid', {
- requestType: 'form',
- params: {
- paymentType: 'VIP'
- }
- })
- // 判断是否有待支付订单
- if (data.id) {
- showConfirmDialog({
- message: '您有待支付的订单,是否继续支付',
- cancelButtonText: '取消订单',
- confirmButtonText: '继续支付'
- })
- .then(() => {
- const paymentConfig = data.paymentConfig
- this.$router.push({
- path: '/orderDetail',
- query: {
- config: JSON.stringify(paymentConfig.paymentConfig),
- orderNo: paymentConfig.orderNo
- }
- })
- })
- .catch(async () => {
- try {
- await request.post('/api-student/userPaymentOrder/cancelPayment/' + data.orderNo)
- } catch {
- //
- }
- })
- }
- } catch {
- //
- }
- },
- calcSalePrice(item: any) {
- // discount
- if (item.discount === 1) {
- const tempPrice = Number((item.salePrice - item.discountPrice).toFixed(2))
- return tempPrice >= 0 ? tempPrice : 0
- }
- return item.salePrice
- },
- // 购买
- async onSubmit() {
- try {
- const selectMember = this.selectMember
- const params: any = [
- {
- goodsId: selectMember.id,
- goodsNum: 1,
- goodsType: 'VIP',
- paymentCashAmount: selectMember.salePrice, // 现金支付金额
- paymentCouponAmount: 0 // 优惠券金额
- }
- ] // 支付参数
- // 创建订单
- const { data } = await request.post('/api-student/userPaymentOrder/executeOrder', {
- data: {
- orderType: 'VIP',
- paymentCashAmount: this.selectMember.salePrice || 0,
- paymentCouponAmount: 0,
- goodsInfos: params,
- orderName: '团练宝购买',
- orderDesc: '团练宝购买'
- }
- })
- console.log(data)
- this.$router.push({
- path: '/orderDetail',
- query: {
- config: JSON.stringify(data.paymentConfig),
- orderNo: data.orderNo
- }
- })
- } catch (e: any) {
- //
- console.log(e)
- }
- }
- },
- render() {
- return (
- <div class={styles['member-center']}>
- <OHeader background="#ffe5cc" />
- <div class={styles.member_container}>
- <Cell
- class={styles.userMember}
- labelClass={styles.timeRemaining}
- v-slots={{
- icon: () => (
- <div class={styles.userImgSection}>
- <Image
- class={styles.userImg}
- src={this.userInfo.avatar || iconStudent}
- fit="cover"
- />
- </div>
- ),
- title: () => (
- <div class={styles.userInfo}>
- <span class={styles.name}>{this.userInfo.username}</span>
- {!!this.userInfo.isVip && (
- <Image
- class={styles.level}
- src="https://daya.ks3-cn-beijing.ksyun.com/202107/ScSTL1D.png"
- />
- )}
- {this.userInfo.phone && (
- <span class={styles.phone} v-html={`(${this.userInfo.phone})`}></span>
- )}
- </div>
- ),
- label: () => (
- <div class={styles.member_time}>
- {this.userInfo.isVip ? (
- <div>
- 会员权益有效期剩余
- <span class={styles.remaining}>{this.userInfo.membershipDays}</span>天
- </div>
- ) : (
- <div>亲,您还不是会员哟</div>
- )}
- </div>
- )
- }}
- ></Cell>
- </div>
- <div class={styles.memberContainer}>
- <div class={styles.memberItem}>
- <div class={styles.title}>
- 会员<span>VIP</span>
- </div>
- <div class={styles['system-list']}>
- <div class={[styles['system-item'], styles.active]}>
- <p class={[styles.title, 'van-hairline--bottom']}>
- 半年会员
- <span>(6个月)</span>
- </p>
- <div class={styles.priceGroup}>
- <p class={styles.price}>
- <span>¥</span>
- {moneyFormat(this.selectMember.salePrice)}
- </p>
- <del class={styles.originalPrice}>
- ¥{moneyFormat(this.selectMember.originalPrice)}
- </del>
- </div>
- </div>
- </div>
- </div>
- <div class={[styles.intro]}>
- <p>
- 团练宝会员使用包括平台提供教材的所有训练乐谱,并专享“乐器练习云教练”八大核心功能,孩子在家就能轻松完成乐器自主规范练习。
- </p>
- </div>
- <div class={styles.memberItem}>
- <div class={styles.title}>会员功能</div>
- <div class={styles.member_function}>
- {this.functionList.map((item: any) => (
- <div class={styles.function_item}>
- <Icon name={item.icon} size={34} />
- <div class={styles.function_text} v-html={item.title}></div>
- </div>
- ))}
- </div>
- </div>
- </div>
- <div class={styles.btnGroup}>
- <div class={styles.priceSection}>
- 支付金额:
- <div class={styles.price}>
- <span class={styles.priceUnit}>¥</span>
- <span class={styles.priceNum}>
- {moneyFormat(this.calcSalePrice(this.selectMember) || 0)}
- </span>
- </div>
- {this.selectMember?.discount == 1 && (
- <div class={[styles.discountItem, styles.discountBuy]}>
- <img src={iconDiscount} />
- </div>
- )}
- </div>
- <Button
- color="linear-gradient(220deg, #DFA164 0%, #FAC87E 100%)"
- round
- class={styles.btn}
- onClick={this.onSubmit}
- >
- 立即开通
- </Button>
- </div>
- </div>
- )
- }
- })
|