import { computed, defineComponent, onMounted, reactive, shallowRef } from 'vue' import styles from './index.module.less' import ColHeader from '@/components/col-header' import { Button, Image, Popup, Toast } from 'vant' import { state as baseState, setLogin } from '@/state' import iconShare from './new-images/icon-share.png' import { useEventListener } from '@vant/use' import ColShare from '@/components/col-share' import iconMemberLogo from './images/member_logo.png' import iconStudent from '@common/images/icon_student.png' import iconTeacher from '@common/images/icon_teacher.png' import iconGift from './new-images/icon-discount-gift.png' import request from '@/helpers/request' import MemberInteres from './components/member-interes' import ColSticky from '@/components/col-sticky' import { moneyFormat } from '@/helpers/utils' import { useRoute, useRouter } from 'vue-router' import deepClone from '@/helpers/deep-clone' import { memberSimpleType, memberType } from '@/constant' import dayjs from 'dayjs' import { orderStatus } from '../order-detail/orderStatus' export default defineComponent({ name: 'member-center', setup() { const route = useRoute() const router = useRouter() const vipList = shallowRef([] as any) const svipList = shallowRef([] as any) const state = reactive({ activityId: route.query.activityId, recomUserId: route.query.recomUserId, titleOpacity: 0, shareStatus: false, // 分享 dialogVisiable: false, shareUrl: '', shareDiscount: 0, discountTeacher: { avatar: '', discount: 0, username: '' }, // 优惠折扣老师 apiSuffix: baseState.platformType === 'STUDENT' ? '/api-student' : '/api-teacher', tabActive: 'SVIP' as 'SVIP' | 'VIP', // 当前选中 selectMember: {} as any, // 选中的数据 memberShowList: [] // 购买商品信息 }) const userInfo = computed(() => { const users = baseState.user.data return { username: users?.username, phone: users?.phone, avatar: users?.heardUrl, id: users?.userId, userVip: users?.userVip } }) // 是否为永久会员 const isPermanent = computed(() => { return userInfo.value.userVip?.vipType === 'PERMANENT_SVIP' ? true : false }) // 购买按钮文案 const btnSubmitText = computed(() => { if (isPermanent.value) { return '您已是永久SVIP会员' } else if (userMemberStatus.value === 'EXPIREVIP') { return '立即续费' } else if (userMemberStatus.value === 'NOT_VIP') { if (state.selectMember?.id) { // ¥988/永久SVIP 立即开通 return `¥${calcSalePrice(state.selectMember)}/${ memberSimpleType[state.selectMember?.period] }${state.tabActive} 立即开通` } else { return '立即开通' } } return '立即续费' }) /** 当前用户会员状态 动态判断vip svip */ const userMemberStatus = computed(() => { // vip类型 VIP:会员 SVIP:SVIP,PERMANENT_SVIP:永久SVIP,NOT_VIP:不是vip // vip过期类型 VIP:会员 SVIP:SVIP,ALL_VIP:全vip if (state.tabActive === 'SVIP') { if (userInfo.value.userVip?.vipType === 'PERMANENT_SVIP') { return 'PERMANENT' } else if ( userInfo.value.userVip?.vipType === 'SVIP' || userInfo.value.userVip?.svipEndDays > 0 ) { return 'VIP' } else if ( ['SVIP', 'ALL_VIP'].includes(userInfo.value.userVip?.expireVipType) ) { return 'EXPIREVIP' } else if (userInfo.value.userVip?.vipType === 'NOT_VIP') { return 'NOT_VIP' } } else if (state.tabActive === 'VIP') { if ( userInfo.value.userVip?.vipType === 'VIP' || userInfo.value.userVip?.vipEndDays > 0 ) { return 'VIP' } else if ( ['VIP', 'ALL_VIP'].includes(userInfo.value.userVip?.expireVipType) ) { return 'EXPIREVIP' } else if (userInfo.value.userVip?.vipType === 'NOT_VIP') { return 'NOT_VIP' } } return 'NOT_VIP' }) /** 会员信息 */ const memberInfos = computed(() => { return { memberLength: state.memberShowList.length, vipLength: vipList.value.legnth, svipLength: svipList.value.legnth, onlyVip: vipList.value.length > 0 && svipList.value.length <= 0 ? true : false, onlySVip: svipList.value.length > 0 && vipList.value.length <= 0 ? true : false, hasAll: vipList.value.length > 0 && svipList.value.length > 0 ? true : false } }) /** 分享 */ const onShare = async () => { try { const res = await request.post('/api-teacher/open/vipProfit', { data: { userId: userInfo.value.id } }) state.shareUrl = `${location.origin}/teacher#/shareVip?recomUserId=${userInfo.value.id}&userType=${baseState.platformType}` // 判断是否有我分享的编号 if (res.data && res.data.activityId) { state.shareUrl = state.shareUrl + '&activityId=' + res.data.activityId } state.shareStatus = true state.shareDiscount = res.data.discount || 0 return } catch { // } } useEventListener('scroll', () => { const height = window.scrollY || window.pageYOffset || document.documentElement.scrollTop state.titleOpacity = height > 100 ? 1 : height / 100 }) /** 切换购买类型 */ const onChangeTab = (type: 'SVIP' | 'VIP') => { if (type === 'SVIP') { state.memberShowList = deepClone(svipList.value) state.selectMember = state.memberShowList[0] } else if (type === 'VIP') { state.memberShowList = deepClone(vipList.value) state.selectMember = state.memberShowList[0] } state.tabActive = type } const 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 } const onSubmit = async () => { try { // 永久会员 if (isPermanent.value) return const { data } = await request.post( `${state.apiSuffix}/memberPriceSettings/list`, { data: { status: 1 } } ) const result = data.list || [] const selectItem = result.find( (item: any) => item.id === state.selectMember?.id ) // 状态、售价变更时 if ( !selectItem || (selectItem && selectItem.salePrice !== state.selectMember.salePrice) ) { state.dialogVisiable = true return } const member: any = state.selectMember // 判断是否有会员 let startTime = new Date() // vip类型 VIP:会员 SVIP:SVIP,PERMANENT_SVIP:永久SVIP,NOT_VIP:不是vip // vip过期类型 VIP:会员 SVIP:SVIP,ALL_VIP:全vip if (userInfo.value.userVip.vipType === 'SVIP') { startTime = dayjs( userInfo.value.userVip.svipEndDate || new Date() ).toDate() } else if (userInfo.value.userVip.vipType === 'VIP') { startTime = dayjs( userInfo.value.userVip.vipEndDate || new Date() ).toDate() } else if (userInfo.value.userVip.vipType === 'PERMANENT_SVIP') { Toast('您已是永久SVIP会员') return } let endTime = new Date() if (member.period === 'MONTH') { endTime = dayjs(startTime).add(1, 'month').toDate() } else if (member.period === 'QUARTERLY') { endTime = dayjs(startTime).add(3, 'month').toDate() } else if (member.period === 'YEAR_HALF') { endTime = dayjs(startTime).add(6, 'month').toDate() } else if (member.period === 'YEAR') { endTime = dayjs(startTime).add(1, 'year').toDate() } orderStatus.orderObject.orderType = state.tabActive orderStatus.orderObject.orderName = `小酷Ai ${state.tabActive} ${member.title}` orderStatus.orderObject.orderDesc = `小酷Ai ${state.tabActive} ${member.title}` orderStatus.orderObject.actualPrice = calcSalePrice(member) orderStatus.orderObject.recomUserId = state.recomUserId orderStatus.orderObject.activityId = state.activityId orderStatus.orderObject.orderNo = '' orderStatus.orderObject.orderList = [ { orderType: state.tabActive, goodsName: `小酷Ai ${state.tabActive} ${member.title}`, id: member.id, title: member.title, num: 1, // 购买个数 salePrice: member.salePrice, period: member.period, vipEndDays: userInfo.value.userVip?.vipEndDays || 0, // 会员剩余天数 discount: member.discount, // 是否有折扣 discountPrice: member.discountPrice, // 折扣金额 price: calcSalePrice(member), startTime: dayjs(startTime).format('YYYY-MM-DD'), endTime: dayjs(endTime).format('YYYY-MM-DD'), recomUserId: state.recomUserId } ] router.push({ path: '/orderDetail', query: { orderType: state.tabActive } }) } catch { // } } /** 格式化分类信息 */ const formatMemberList = () => { // console.log(vipList.value, svipList.value, 'vipList.value') const onlyVip = vipList.value.length > 0 && svipList.value.length <= 0 ? true : false const onlySVip = svipList.value.length > 0 && vipList.value.length <= 0 ? true : false const hasAll = vipList.value.length > 0 && svipList.value.length > 0 ? true : false if (hasAll) { state.tabActive = 'SVIP' state.memberShowList = deepClone(svipList.value) } else if (onlySVip) { state.tabActive = 'SVIP' state.memberShowList = deepClone(svipList.value) } else if (onlyVip) { state.tabActive = 'VIP' state.memberShowList = deepClone(vipList.value) } if (state.memberShowList.length > 0) { // 判断是否有数据更新了,需要重新为选择的赋值 const item = state.memberShowList.find( (item: any) => item.id === state.selectMember?.id ) if (item) { state.selectMember = item } else { state.selectMember = state.memberShowList[0] } } } const _init = async () => { try { const { data } = await request.post( `${state.apiSuffix}/memberPriceSettings/list`, { data: { activityId: Number(state.activityId), userId: state.recomUserId, status: 1 } } ) const { list, ...more } = data state.discountTeacher = { ...more } const result = list || [] const vipTemp = [] as any const svipTemp = [] as any result.forEach((item: any) => { item.title = memberType[item.period] if (item.vipType === 'VIP' && item.period !== 'DAY') { vipTemp.push(item) } else if (item.vipType === 'SVIP' && item.period !== 'DAY') { svipTemp.push(item) } }) vipList.value = vipTemp ? vipTemp.reverse() : [] svipList.value = svipTemp ? svipTemp.reverse() : [] formatMemberList() } catch { // } } onMounted(async () => { try { const userInfo = await request.get( baseState.platformType === 'TEACHER' ? '/api-teacher/teacher/queryUserInfo' : '/api-student/student/queryUserInfo' ) setLogin(userInfo.data) _init() } catch { // } }) return () => (
{member.title}
{member.discount === 1 && ( )}¥ {moneyFormat(calcSalePrice(member), '0,0[.]00')}
{member.desc}
)}¥ {moneyFormat(calcSalePrice(member), '0,0[.]00')}
{member.title}
海量曲谱、智能评测,专为器乐学习者量身打造