123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966 |
- import {
- computed,
- defineComponent,
- nextTick,
- onMounted,
- reactive,
- shallowRef
- } from 'vue'
- import styles from './index.module.less'
- import ColHeader from '@/components/col-header'
- import { Button, Image, NoticeBar, 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, studyCardType } from '@/constant'
- import dayjs from 'dayjs'
- import { orderStatus } from '../order-detail/orderStatus'
- import TheNoticeBar from '@/components/the-noticeBar'
- import { tradeOrder } from '@/student/trade/tradeOrder'
- 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,
- orderVisiable: false,
- orderDetail: {} as any,
- 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 activitData = reactive({
- activityId: undefined,
- activityStart: '',
- activityEnd: '',
- registrationPrice: 0,
- buyCount: 0, //buyCount 小于1的时候 代表能无限购买
- buyNum: 0,
- vipCardId: 0,
- activityList: [],
- extConfig: {} as Record<string, any>,
- vipType: 'VIP'
- })
- const userInfo = computed(() => {
- const users = baseState.user.data
- return {
- username: users?.username,
- phone: users?.phone,
- avatar: users?.heardUrl,
- id: users?.userId,
- userVip: users?.userVip,
- discountCardFlag: users?.discountCardFlag,
- discountEndTime: users?.discountEndTime,
- discountStartTime: users?.discountStartTime
- }
- })
- // 是否为永久会员
- 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 === 'PERMANENT_SVIP') {
- return 'PERMANENT'
- } else 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 > 30 ? 1 : 0
- })
- /** 切换购买类型 */
- 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
- nextTick(() => {
- document.querySelector('.system-list')?.scroll(0, 0)
- })
- }
- const calcSalePrice = (item: any) => {
- // 有活动 以活动价格为准
- if (item.id === activitData.vipCardId) {
- return activitData.registrationPrice
- }
- // 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 resPadding = await request.post(
- `${state.apiSuffix}/userOrder/getPendingOrder`,
- {
- data: { goodType: state.tabActive }
- }
- )
- console.log(resPadding, 'resPadding')
- if (resPadding?.data?.id) {
- state.orderVisiable = true
- state.orderDetail = resPadding.data || {}
- 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 (state.tabActive === 'SVIP') {
- startTime = dayjs(
- userInfo.value.userVip.svipEndDate || new Date()
- ).toDate()
- } else if (state.tabActive === 'VIP') {
- // 购买Vip时,先有vip的有效时间,如果没有则取SVIP有效时间,都没有默认当前
- startTime = dayjs(
- userInfo.value.userVip.vipEndDate ||
- userInfo.value.userVip.svipEndDate ||
- new Date()
- ).toDate()
- } else if (isPermanent.value) {
- 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 = ''
- const orderData = {
- 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, // 会员剩余天数
- svipEndDays: userInfo.value.userVip?.svipEndDays || 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,
- activityBuyCount: 0, // 活动购买限制次数
- activityList: [], // 活动赠送的东西
- discountCardFlag: userInfo.value.discountCardFlag, // 畅学卡结束时间
- discountEndTime: userInfo.value.discountEndTime, // 畅学卡结束时间
- discountStartTime: userInfo.value.discountStartTime // 畅学卡开始时间
- }
- // 当能购买并且是当前活动商品时候加上 活动信息
- const canBuyNum = activitData.buyCount - activitData.buyNum
- if (member.id === activitData.vipCardId && canBuyNum > 0) {
- orderData.activityBuyCount = canBuyNum
- orderData.activityList = activitData.activityList
- orderStatus.orderObject.activityId = activitData.activityId
- }
- orderStatus.orderObject.orderList = [orderData]
- router.push({
- path: '/orderDetail',
- query: {
- orderType: state.tabActive
- }
- })
- } catch {
- //
- }
- }
- // 取消支付
- const onCancelOrder = async () => {
- try {
- await request.post(`${state.apiSuffix}/userOrder/orderCancel`, {
- data: { orderNo: state.orderDetail.orderNo }
- })
- } catch {
- //
- }
- state.orderVisiable = false
- }
- // 继续支付
- const onContinueOrder = async () => {
- const orderDetail = state.orderDetail || {}
- tradeOrder(orderDetail, () => {
- router.push({
- path: '/orderDetail',
- query: {
- orderType: orderDetail.orderType
- }
- })
- })
- }
- /** 格式化分类信息 */
- 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
- // 学生端 活动 有分享活动的时候 就不支持折扣活动
- if (baseState.platformType === 'STUDENT' && !state.activityId) {
- const activitRes = await request.post(
- `/api-student/memberPriceSettings/getMemberBuyGift`
- )
- if (activitRes.code === 200 && activitRes.data) {
- const {
- activityStart,
- activityEnd,
- registrationPrice,
- buyCount,
- buyNum,
- vipCardId,
- activityRewardList,
- extConfig,
- id
- } = activitRes.data || {}
- // 匹配当前的 会员
- const vipData = list.find(item => {
- return item.id === vipCardId
- })
- // 当匹配上会员 并且没有达到购买限制的时候才有活动
- if (vipData && (buyCount < 1 || buyCount > buyNum)) {
- activitData.activityId = id
- activitData.vipType = vipData.vipType
- activitData.activityStart = activityStart
- activitData.activityEnd = activityEnd
- activitData.registrationPrice = registrationPrice
- activitData.buyCount = buyCount < 1 ? 99999 : buyCount //buyCount 小于1的时候 代表能无限购买
- activitData.buyNum = buyNum
- activitData.vipCardId = vipCardId
- extConfig && (activitData.extConfig = JSON.parse(extConfig))
- activitData.activityList = (activityRewardList || []).map(
- item => {
- const { rewardType, vipCardId, unit } = item.activityReward
- if (rewardType === 'DISCOUNT') {
- return {
- goodType: rewardType,
- goodName: `畅学卡 ${studyCardType[unit]}`,
- goodNum: 1,
- bizContent: vipCardId,
- giftFlag: true,
- vipEndDays: null,
- goodsNum: 1,
- unit
- }
- }
- return {
- goodType: rewardType,
- goodName: `小酷Ai ${rewardType} ${memberType[unit]}`,
- goodNum: 1,
- bizContent: vipCardId,
- giftFlag: true,
- vipEndDays: null,
- goodsNum: 1,
- unit
- }
- }
- )
- }
- }
- }
- 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 () => (
- <div class={styles.memberCenter}>
- <ColHeader
- background={`rgba(255,255,255, ${state.titleOpacity})`}
- color={`rgba(0,0,0, ${state.titleOpacity})`}
- backIconColor="black"
- hideHeader={false}
- border={false}
- v-slots={{
- right: () => (
- <Image
- src={iconShare}
- class={styles.shareBtn}
- onClick={onShare}
- />
- )
- }}
- />
- <div class={styles.memberContainer}>
- <i class={styles.showBrid}></i>
- <div class={styles.userSection}>
- <div
- class={[
- styles.userImgSection,
- state.tabActive === 'VIP' ? styles.userVip : styles.userSVip,
- userMemberStatus.value === 'PERMANENT' ||
- userMemberStatus.value === 'VIP'
- ? styles.isVip
- : ''
- // userMemberStatus.value === 'EXPIREVIP' ? styles.expireVip : ''
- ]}
- >
- <Image
- class={styles.userImg}
- src={userInfo.value.avatar || iconStudent}
- fit="cover"
- />
- <i class={styles.showMemeber}></i>
- </div>
- <div class={styles.userInfo}>
- <div class={styles.userName}>
- <span class={styles.name}>{userInfo.value.username}</span>
- {userInfo.value.phone && (
- <span class={styles.phone}>({userInfo.value.phone})</span>
- )}
- </div>
- <div class={styles.member_time}>
- {userMemberStatus.value === 'PERMANENT' && (
- <>
- 您已是<span>永久SVIP</span>
- </>
- )}
- {userMemberStatus.value === 'VIP' && (
- <>
- {state.tabActive}有效期至{' '}
- <span>
- {state.tabActive === 'VIP'
- ? dayjs(userInfo.value.userVip.vipEndDate).format(
- 'YYYY-MM-DD'
- )
- : dayjs(userInfo.value.userVip.svipEndDate).format(
- 'YYYY-MM-DD'
- )}
- </span>
- </>
- )}
- {userMemberStatus.value === 'EXPIREVIP' && (
- <>
- 您的{state.tabActive}已过期,续费后{state.tabActive}
- 权益可继续使用
- </>
- )}
- {userMemberStatus.value === 'NOT_VIP' && (
- <>您还未开通{state.tabActive}会员哦~</>
- )}
- </div>
- </div>
- </div>
- <div class={styles.memberSection}>
- {memberInfos.value.hasAll ? (
- <>
- <div class={styles.member_tabs}>
- <div
- class={[
- styles.member_tab,
- state.tabActive === 'VIP' ? styles.member_tab_active : ''
- ]}
- onClick={() => onChangeTab('VIP')}
- >
- <div class={[styles.top_tab, styles.top_tab_vip]}>
- <i class={[styles.icon_member]}></i>
- <span class={styles.icon_text}>
- <i class={styles.bottom_line}></i>
- </span>
- </div>
- <div class={styles.vip_member_tip}></div>
- {/* 活动显示 */}
- {!!activitData.vipCardId &&
- activitData.vipType === 'VIP' &&
- activitData.extConfig?.title1 && (
- <div class={styles.activitTip}>
- {activitData.extConfig?.title1}
- </div>
- )}
- </div>
- <div
- class={[
- styles.member_tab,
- state.tabActive === 'SVIP' ? styles.member_tab_active : ''
- ]}
- onClick={() => onChangeTab('SVIP')}
- >
- <div class={[styles.top_tab, styles.top_tab_svip]}>
- <i class={[styles.icon_member]}></i>
- <span class={styles.icon_text}>
- <i class={styles.bottom_line}></i>
- </span>
- </div>
- <div class={styles.svip_member_tip}></div>
- {/* 活动显示 */}
- {!!activitData.vipCardId &&
- activitData.vipType === 'SVIP' &&
- activitData.extConfig?.title1 && (
- <div class={styles.activitTip}>
- {activitData.extConfig?.title1}
- </div>
- )}
- </div>
- </div>
- </>
- ) : memberInfos.value.onlyVip ? (
- <div class={styles.member_tabs}>
- <div
- class={[
- styles.member_tab,
- styles.member_tab_active,
- styles.member_tab_single
- ]}
- >
- <div class={[styles.top_tab, styles.top_tab_vip]}>
- <i class={[styles.icon_member]}></i>
- <span class={styles.icon_text}>
- <i class={styles.bottom_line}></i>
- </span>
- </div>
- <div class={styles.vip_member_tip}></div>
- </div>
- </div>
- ) : memberInfos.value.onlySVip ? (
- // 只有SVIP
- <div class={styles.member_tabs}>
- <div
- class={[
- styles.member_tab,
- styles.member_tab_active,
- styles.member_tab_single
- ]}
- >
- <div class={[styles.top_tab, styles.top_tab_svip]}>
- <i class={[styles.icon_member]}></i>
- <span class={styles.icon_text}>
- <i class={styles.bottom_line}></i>
- </span>
- </div>
- <div class={styles.svip_member_tip}></div>
- </div>
- </div>
- ) : null}
- {/* 选择会员模式 */}
- {(vipList.value.length > 0 || svipList.value.length > 0) && (
- <>
- {/* 判断是否有推荐老师 一个会员都没有配置不显示优惠信息 */}
- {state.discountTeacher.discount == 1 && (
- <div class={styles.memberDiscount}>
- <Image
- src={state.discountTeacher.avatar || iconTeacher}
- class={styles.discountAvatar}
- />
- <TheNoticeBar class={styles.discountName} isAnimation>
- {state.discountTeacher.username}
- 老师的
- <span>专属优惠~</span>
- </TheNoticeBar>
- <Image src={iconGift} class={styles.discountGift} />
- </div>
- )}
- <div class={styles.system_list_section}>
- <div
- class={[
- 'system-list',
- styles['system-list'],
- state.tabActive === 'VIP' ? styles.system_list_vip : '',
- memberInfos.value.memberLength === 2
- ? styles.list_two
- : '',
- memberInfos.value.memberLength === 1
- ? styles.list_one
- : ''
- ]}
- >
- {memberInfos.value.memberLength >= 2 ? (
- <>
- {state.memberShowList.map((member: any) => (
- <div
- key={member.id}
- class={[
- styles['system-item'],
- member.id === state.selectMember.id
- ? styles.active
- : ''
- ]}
- onClick={() => {
- state.selectMember = member
- }}
- >
- {/* 有活动优先展示活动 */}
- {activitData.vipCardId === member.id &&
- activitData.extConfig?.title2 ? (
- <div class={styles.activitTip1}>
- {activitData.extConfig?.title2}
- </div>
- ) : (
- /* 只有永久才会有数量提示 */
- member.period === 'PERPETUAL' && (
- <span class={[styles.iconPermanent]}></span>
- )
- )}
- <p class={styles.s_title}>
- {member.title}
- {/* 优惠标识 */}
- {member.discount === 1 && (
- <span class={styles.discountTag}></span>
- )}
- </p>
- <p class={styles.price}>
- <span>¥</span>
- {moneyFormat(calcSalePrice(member), '0,0[.]00')}
- </p>
- <del
- class={[
- styles.originalPrice,
- calcSalePrice(member) >= member.originalPrice ||
- member.desc
- ? styles.originalPriceHide
- : ''
- ]}
- >
- ¥{moneyFormat(member.originalPrice, '0,0[.]00')}
- </del>
- {member.desc && (
- <p class={styles.extraTip}>{member.desc}</p>
- )}
- </div>
- ))}
- </>
- ) : (
- <>
- {/* 一条数据的样式 */}
- {state.memberShowList.map((member: any) => (
- <div class={[styles['system-item']]}>
- {/* 有活动优先展示活动 */}
- {activitData.vipCardId === member.id &&
- activitData.extConfig?.title2 ? (
- <div class={styles.activitTip1}>
- {activitData.extConfig?.title2}
- </div>
- ) : (
- /* 只有永久才会有数量提示 */
- member.period === 'PERPETUAL' && (
- <span class={[styles.iconPermanent]}></span>
- )
- )}
- {member.discount === 1 && (
- <span class={styles.discountTag}></span>
- )}
- <div class={styles.oneInfo}>
- <div class={styles.priceS}>
- <p class={styles.price}>
- <span>¥</span>
- {moneyFormat(
- calcSalePrice(member),
- '0,0[.]00'
- )}
- </p>
- <p class={styles.s_title}>{member.title}</p>
- </div>
- <div
- class={[
- styles.oneMaxNum,
- styles.oneMaxNumPrice
- ]}
- >
- ¥{member.originalPrice}
- </div>
- </div>
- <span
- class={[
- styles.oneBtn,
- ['EXPIREVIP', 'VIP', 'PERMANENT'].includes(
- userMemberStatus.value
- )
- ? styles.onBtnRenew
- : '',
- userMemberStatus.value === 'PERMANENT'
- ? styles.onBtnDisbled
- : ''
- ]}
- onClick={() => {
- if (userMemberStatus.value === 'PERMANENT')
- return
- onSubmit()
- }}
- ></span>
- <i class={styles.itemBg}></i>
- </div>
- ))}
- </>
- )}
- </div>
- </div>
- </>
- )}
- {/* 是选择会员 会员天数大于0 */}
- {state.tabActive === 'VIP' &&
- userInfo.value.userVip?.vipEndDays > 0 && (
- <div class={styles.discountTips}>
- 购买VIP的会员续费SVIP年度会员,
- <span>原VIP会员天数升级为SVIP</span>
- </div>
- )}
- {/* 活动描述 */}
- {state.selectMember?.id === activitData.vipCardId &&
- activitData.extConfig?.describe && (
- <div class={styles.activitTip2}>
- <div class={styles.activitTipText}>
- {activitData.extConfig?.describe}
- </div>
- </div>
- )}
- <MemberInteres type={state.tabActive} />
- </div>
- </div>
- {(vipList.value.length > 0 || svipList.value.length > 0) && (
- <ColSticky position="bottom">
- <div class={styles.btnGroup}>
- <Button
- block
- color="linear-gradient( 241deg, #FFD984 0%, #FFEAB9 100%)"
- class={[
- styles.btn,
- isPermanent.value ? styles.btnDisabled : ''
- ]}
- onClick={onSubmit}
- >
- {btnSubmitText.value}
- </Button>
- </div>
- </ColSticky>
- )}
- <Popup
- v-model:show={state.shareStatus}
- style={{ background: 'transparent' }}
- >
- <ColShare
- teacherId={userInfo.value.id}
- shareUrl={state.shareUrl}
- shareType="vip"
- shareLength={2}
- >
- <div class={styles.shareVip}>
- {state.shareDiscount === 1 && (
- <div class={styles.tagDiscount}>专属优惠</div>
- )}
- <img class={styles.icon} src={iconMemberLogo} />
- <div class={styles.info}>
- <h4 class="van-multi-ellipsis--l2">小酷Ai会员</h4>
- <p>海量曲谱、智能评测,专为器乐学习者量身打造</p>
- </div>
- </div>
- </ColShare>
- </Popup>
- <Popup
- v-model:show={state.dialogVisiable}
- style={{ background: 'transparent' }}
- closeOnClickOverlay={false}
- >
- <div class={styles.dialogContainer}>
- <div class={styles.dialogTitle}>提示</div>
- <div class={styles.dialogContent}>产品信息已更新,请重新选择</div>
- <div class={styles.dialogBtnGroup}>
- <Button
- round
- type="primary"
- block
- // class={styles.dialogBtn}
- onClick={() => {
- _init()
- state.dialogVisiable = false
- }}
- >
- 重新选择
- </Button>
- </div>
- </div>
- </Popup>
- <Popup
- v-model:show={state.orderVisiable}
- style={{ background: 'transparent' }}
- closeOnClickOverlay={false}
- >
- <div class={styles.dialogContainer}>
- <div class={styles.dialogTitle}>提示</div>
- <div class={styles.dialogContent}>
- 您有待支付的订单,是否继续支付
- </div>
- <div class={[styles.dialogBtnGroup, styles.orderGroup]}>
- <Button round type="default" plain block onClick={onCancelOrder}>
- 取消订单
- </Button>
- <Button
- round
- type="primary"
- block
- class={styles.dialogBtn}
- onClick={onContinueOrder}
- >
- 继续支付
- </Button>
- </div>
- </div>
- </Popup>
- </div>
- )
- }
- })
|