mcwl-pc/app/pages/member-center/index.vue

710 lines
22 KiB
Vue

<script setup>
import { CheckmarkCircleSharp, Close } from '@vicons/ionicons5'
import { NConfigProvider, NMessageProvider } from 'naive-ui'
const message = useMessage()
definePageMeta({
layout: 'header',
})
// 订单
const needPayment = ref([
{
amount: '',
productId: '',
promotionId: '',
type: 'member',
},
])
const userStore = useUserStore()
const userInfo = userStore.userInfo
// 显示支付弹框
// interface Payment {
// isVisible: boolean;
// }
// 是否是会员
const isMember = ref(false)
async function getIsMember() {
try {
const res = await request.get('/member/isMember')
if (res.code === 200) {
isMember.value = res.data
}
}
catch (err) {
console.log(err)
}
}
getIsMember()
// 获取会员等级及权益列表
const MemberBenefitList = ref([])
async function getMemberBenefitList() {
try {
const res = await request.get('/memberBenefit/getMemberBenefitList')
if (res.code === 200) {
MemberBenefitList.value = res.data
}
}
catch (err) {
console.log(err)
}
}
getMemberBenefitList()
// 获取会员等级列表
// interface memberLevel {
// memberName: string;
// unitPrice: number;
// originalPrice: number;
// subscriptionPeriod: number;
// }
const memberLevelList = ref([])
async function getMemberLevelList() {
try {
const res = await request.get('/memberLevel/list')
if (res.code === 200) {
memberLevelList.value = res.data
}
}
catch (err) {
console.log(err)
}
}
getMemberLevelList()
// 显示会员支付的弹框
const isShowPayment = ref(false)
const PaymentRef = ref(null)
function showPayment(info) {
if (info === 1) {
needPayment.value = memberLevelList.value
}
else {
needPayment.value = [info]
}
isShowPayment.value = true
if (PaymentRef.value) {
PaymentRef.value.isVisible = true
}
}
// 关闭开通会员弹框
function closePayment() {
isShowPayment.value = false
if (PaymentRef.value) {
PaymentRef.value.isVisible = false
}
}
// 显示积分的弹框
const isShowIntPayment = ref(false)
const IntPaymentRef = ref(null)
function showIntPayment() {
isShowIntPayment.value = true
if (IntPaymentRef.value) {
IntPaymentRef.value.isVisible = true
}
}
// 关闭充值积分弹框
function closeIntPayment() {
isShowIntPayment.value = false
if (IntPaymentRef.value) {
IntPaymentRef.value.isVisible = false
}
}
// 关闭充值金币弹框
const isShowGoldPayment = ref(false)
const goldPaymentRef = ref(null)
function closeGoldPayment() {
isShowGoldPayment.value = false
if (goldPaymentRef.value) {
goldPaymentRef.value.isVisible = false
}
}
// 支付成功后刷新会员信息
function paymentSuccess() {
// getIsMember();
if (import.meta.client) {
window.location.reload()
}
}
// 跳转到积分详情页
function toIntDetail() {
const baseUrl = window.location.origin
window.open(`${baseUrl}/int-detail`, '_blank', 'noopener,noreferrer')
}
// 订单管理
function toOrderManage() {
const baseUrl = window.location.origin
window.open(`${baseUrl}/order-management`, '_blank', 'noopener,noreferrer')
}
// 跳转到金币详情
function toGoldDetail() {
const baseUrl = window.location.origin
window.open(`${baseUrl}/gold-detail`, '_blank', 'noopener,noreferrer')
}
// 显示充值金币的框
function showGoldPayment() {
isShowGoldPayment.value = true
if (goldPaymentRef.value) {
goldPaymentRef.value.isVisible = true
}
}
// 获取积分和金币余额
const integralGold = ref({})
async function getIntegralGold() {
try {
const res = await request.post('/personalCenter/getPointAndWallet')
if (res.code === 200) {
integralGold.value = res.data
}
}
catch (err) {
console.log(err)
}
}
getIntegralGold()
const isShowActivity = ref(true)
// 关闭活动的图标
function closeActivityIcon() {
isShowActivity.value = false
}
// 活动列表
const activityList = ref([])
const isShowactivityList = ref(false)
async function showActivityList() {
try {
const res = await request.post('/promotion/promotionList', {
pageNum: 1,
pageSize: 50,
})
if (res.code === 200) {
activityList.value = res.rows
isShowactivityList.value = true
}
}
catch (err) {
console.log(err)
}
}
// 参与活动
async function getActivity(item) {
if (item.isJoin === 1)
return
try {
const res = await request.get(`/promotion/joinPromotion?promotionId=${item.id}`)
if (res.code === 200) {
message.success('领取成功')
item.isJoin = 1
}
}
catch (err) {
if (err.code === 601) {
message.warning(err.msg)
}
}
}
</script>
<template>
<div>
<div class="test bg-[#403833] flex justify-center items-center h-90">
<div class="flex gap-6 w-[1145px]">
<!-- 左侧用户信息 -->
<div class="w-60 bg-[#2b2421] rounded-lg p-6 my-3">
<!-- 右上角订阅管理 -->
<div class="text-right">
<button
class="text-[#8b8685] text-sm bg-inherit border-none cursor-pointer"
@click="toOrderManage"
>
订阅管理 >
</button>
</div>
<!-- 用户头像和信息 -->
<div class="flex flex-col items-center mt-2">
<client-only>
<img
:src="userInfo.avatar"
alt="头像"
class="w-20 h-20 rounded-full mb-3"
>
<span class="text-white text-sm mb-2">{{ userInfo.nickName }}</span>
</client-only>
<div class="flex items-center text-[#8b8685] text-xs">
<svg
xmlns="http://www.w3.org/2000/svg"
class="h-4 w-4 mr-1"
viewBox="0 0 20 20"
fill="currentColor"
>
<path
d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z"
/>
</svg>
{{
isMember.result === "1"
? `会员到期时间: ${isMember.endDate}`
: "您还不是魔创未来的会员"
}}
</div>
</div>
<!-- 开通会员按钮 -->
<button
class="w-full bg-[#f2d5bc] text-[#6b4f3f] rounded-full py-2.5 mt-8 font-medium cursor-pointer"
@click="showPayment(1)"
>
{{ isMember.result === "1" ? '立即续费' : '开通会员' }}
</button>
<!-- 兑换会员链接 -->
<div class="text-center mt-3">
<button class="text-[#8b8685] text-sm bg-inherit border-none cursor-pointer">
兑换会员
</button>
</div>
</div>
<!-- 右侧内容 -->
<div class="flex-1 space-y-4">
<!-- 余额信息卡片 -->
<div class="bg-[#2b2421] rounded-lg p-6 mt-3">
<div class="grid grid-cols-3 gap-8">
<!-- 算力余额 -->
<div>
<h3 class="text-[#c3986b] mb-4">
积分余额
</h3>
<div class="flex items-center mb-2">
<span class="text-[#c3986b] mr-2">{{ integralGold.point || 0 }}</span>
<button
class="text-[#c3986b] bg-inherit border-none cursor-pointer"
@click="showIntPayment"
>
充值 >
</button>
</div>
<button
class="text-white bg-inherit border-none cursor-pointer p-0"
@click="toIntDetail"
>
积分明细 >
</button>
</div>
<!-- 生图加速余额 -->
<div>
<h3 class="text-[#c3986b] mb-4">
金币余额
</h3>
<div class="flex items-center mb-2">
<span class="text-[#c3986b] mr-2">{{ integralGold.wallet || 0 }} </span>
<button
class="text-[#c3986b] bg-inherit border-none cursor-pointer"
@click="showGoldPayment"
>
充值 >
</button>
</div>
<button
class="text-white bg-inherit border-none cursor-pointer p-0"
@click="toGoldDetail"
>
金币明细 >
</button>
</div>
<!-- 训练加速余额 -->
<div>
<h3 class="text-[#c3986b] mb-4">
训练加速余额
</h3>
<div class="flex items-center mb-2">
<span class="text-[#c3986b]">0</span>
</div>
</div>
</div>
</div>
<!-- 存储空间卡片 -->
<div class="bg-[#2b2421] rounded-lg p-6">
<div class="flex items-center gap-6 mb-6">
<span class="text-[#c3986b] text-lg">我的存储空间</span>
<button class="text-[#8b8685] bg-inherit border-none cursor-pointer p-0">
管理图库
</button>
<button class="text-[#8b8685] bg-inherit border-none cursor-pointer p-0">
管理训练
</button>
</div>
<!-- 进度条 -->
<div class="relative">
<div class="h-1 bg-[#3a322e] rounded-full">
<div class="absolute right-0 -top-6 text-[#8b8685] text-sm">
0G/3G
</div>
</div>
</div>
<!-- 图例 -->
<div class="flex gap-4 mt-4">
<div class="flex items-center">
<div class="w-2 h-2 bg-blue-500 rounded-full mr-2" />
<span class="text-[#8b8685] text-sm">生图</span>
</div>
<div class="flex items-center">
<div class="w-2 h-2 bg-purple-500 rounded-full mr-2" />
<span class="text-[#8b8685] text-sm">训练</span>
</div>
</div>
</div>
</div>
</div>
</div>
<div
class="bg-gradient-to-b from-[#fdf6e3] to-[#ffffff] w-full flex justify-center py-8"
>
<div class="w-[1145px]">
<div class="grid grid-cols-5 gap-1">
<div
v-for="(item, index) in memberLevelList"
:key="index"
class="h-56 border-2 border-solid border-[#fff] rounded-lg bg-gradient-to-b from-[#f7e8d3] to-[#fef8ef] flex justify-between items-center flex-col p-4 box-border"
>
<div class="text-[#e08909] card-item">
{{ item.memberName }}
</div>
<div class="card-item">
<span class="text-[#814600] text-[20px] mr-2">¥</span>
<span class="text-[#814600] text-[40px] mr-2">{{ item.unitPrice }}</span>
<span class="text-gray-400 text-[20px] line-through">¥{{ item.originalPrice }}</span>
</div>
<div class="card-item text-[#e08909] w-7/10 text-center text-[12px]">
{{ item.subscriptionPeriod }}
</div>
<div class="card-item">
<button
class="bg-gradient-to-r from-[#fbdfa4] to-[#f3c180] text-[#4c3d33] w-40 h-10 rounded-full text-[12px] border-none cursor-pointer"
@click="showPayment(item)"
>
立即开通
</button>
</div>
</div>
</div>
<div class="py-8">
<div class="flex justify-center mb-4">
<div class="text-xl font-bold">
会员权益
</div>
</div>
<!-- <div class="flex items-center">
<div v-for="(item, index) in MemberBenefitList" :key="index" class="w-1/4 w-full">
<div class="flex items-center justify-center">
{{ item.memberLevelName }}
</div>
<div v-for="(item2, index2) in item.memberBenefitList" :key="index2" class="flex w-full">
<div class="h-20 bg-[#f7f0ea] flex justify-center items-center w-full">
{{ item2.benefitName ? item2.benefitName : '无' }}
</div>
</div>
</div>
</div> -->
<div class="text-[#525252]">
<div class="flex gap-2">
<div class="member-item bg-[#f7f0ea]">
会员权益
</div>
<div class="member-item bg-[#f5f5f5]">
用户免费
</div>
<div class="member-item bg-[#fdf6ea]">
基础版VIP
</div>
<div class="member-item bg-[#fce6bf]">
专业版VIP
</div>
</div>
<div class="flex gap-2">
<div class="member-item bg-[#fff]">
算力
</div>
<div class="member-item bg-[#fff]">
每天300点
</div>
<div class="member-item bg-[#fff]">
每月15000点
</div>
<div class="member-item bg-[#fff]member-item">
每月35000点
</div>
</div>
<div class="flex gap-2">
<div class="member-item bg-[#fafafa]">
云端存储空间
</div>
<div class="member-item bg-[#fafafa]">
3GB
</div>
<div class="member-item bg-[#fdf6ea]">
20GB
</div>
<div class="member-item bg-[#fce6bf]">
50GB
</div>
</div>
<div class="flex gap-2">
<div class="member-item bg-[#fff]">
生图加速特权
</div>
<div class="member-item bg-[#fff]member-item">
<n-icon size="20" color="#ed7470">
<Close />
</n-icon>
</div>
<div class="member-item bg-[#fff]">
每月800次
</div>
<div class="member-item bg-[#fff]">
每月5000次
</div>
</div>
<div class="flex gap-2">
<div class="member-item bg-[#fafafa]">
会员专属模型
</div>
<div class="member-item bg-[#fafafa]">
<n-icon size="20" color="#ed7470">
<Close />
</n-icon>
</div>
<div class="member-item bg-[#fdf6ea]">
<n-icon size="20" color="#58c08f">
<CheckmarkCircleSharp />
</n-icon>
</div>
<div class="member-item bg-[#fce6bf]">
<n-icon size="20" color="#58c08f">
<CheckmarkCircleSharp />
</n-icon>
</div>
</div>
<div class="flex gap-2">
<div class="member-item bg-[#fff]">
生图高级功能
</div>
<div class="member-item bg-[#fff]">
<n-icon size="20" color="#ed7470">
<Close />
</n-icon>
</div>
<div class="member-item bg-[#fff]">
<n-icon size="20" color="#58c08f">
<CheckmarkCircleSharp />
</n-icon>
</div>
<div class="member-item bg-[#fff]">
<n-icon size="20" color="#58c08f">
<CheckmarkCircleSharp />
</n-icon>
</div>
</div>
<div class="flex gap-2">
<div class="member-item bg-[#fafafa]">
训练XL模型
</div>
<div class="member-item bg-[#fafafa]">
<n-icon size="20" color="#ed7470">
<Close />
</n-icon>
</div>
<div class="member-item bg-[#fdf6ea]">
<n-icon size="20" color="#ed7470">
<Close />
</n-icon>
</div>
<div class="member-item bg-[#fce6bf]">
<n-icon size="20" color="#58c08f">
<CheckmarkCircleSharp />
</n-icon>
</div>
</div>
<div class="flex gap-2">
<div class="member-item bg-[#fff]">
图片去水印下载
</div>
<div class="member-item bg-[#fff]">
<n-icon size="20" color="#ed7470">
<Close />
</n-icon>
</div>
<div class="member-item bg-[#fff]">
<n-icon size="20" color="#58c08f">
<CheckmarkCircleSharp />
</n-icon>
</div>
<div class="member-item bg-[#fff]">
<n-icon size="20" color="#58c08f">
<CheckmarkCircleSharp />
</n-icon>
</div>
</div>
<div class="flex gap-2">
<div class="member-item bg-[#fafafa]">
多任务并行生图
</div>
<div class="member-item bg-[#fafafa]">
<n-icon size="20" color="#58c08f">
<CheckmarkCircleSharp />
</n-icon>
</div>
<div class="member-item bg-[#fdf6ea]">
2个
</div>
<div class="member-item bg-[#fce6bf]">
3个
</div>
</div>
</div>
</div>
<div class="text-[#999] text-[12px]">
<div class="mt-1">
会员每月算力和加速特权按月下发, 有效期31天,
到期重置。会员模型下载次数上限为每月200次
</div>
<div class="mt-1">
发票或团队/企业定制需求, 请点击立即咨询联系我们, 企业合作需求也可直接联系xxxx
</div>
<div class="mt-1">
更多问题可见帮助中心
</div>
</div>
</div>
</div>
<NConfigProvider>
<NMessageProvider>
<Payment
v-if="isShowPayment"
ref="PaymentRef"
:info="needPayment"
:is-member="isMember"
@close-payment="closePayment"
/>
<IntPayment
v-if="isShowIntPayment"
ref="IntPaymentRef"
:is-member="isMember"
@payment-success="paymentSuccess"
@close-payment="closeIntPayment"
/>
<GoldPayment
v-if="isShowGoldPayment"
ref="goldPaymentRef"
:is-member="isMember"
@payment-success="paymentSuccess"
@close-payment="closeGoldPayment"
/>
</NMessageProvider>
</NConfigProvider>
<div v-if="isShowActivity" class="activity-box">
<div class="absolute -top-6 -right-0 cursor-pointer">
<n-icon size="20" color="#bbb" @click="closeActivityIcon">
<Close />
</n-icon>
</div>
<img
class="cursor-pointer"
src="@/assets/img/activityIcon.png"
alt=""
@click="showActivityList"
>
</div>
<n-modal v-model:show="isShowactivityList" transform-origin="center">
<n-card
style="width: 350px; background: #e65e40"
:bordered="false"
size="huge"
:content-style="{ padding: 0 }"
role="dialog"
aria-modal="true"
>
<div class="p-4 rounded-lg">
<div class="flex justify-end mb-4">
<n-icon
class="cursor-pointer"
size="20"
color="#bbb"
@click="isShowactivityList = false"
>
<Close />
</n-icon>
</div>
<div class="flex flex-col gap-3">
<div
v-for="(item, index) in activityList"
:key="index"
class="px-2 py-4 bg-white h-20 w-full flex rounded-lg"
>
<div class="w-[70%] flex flex-col justify-around">
<div>{{ item.activityName }}</div>
<div class="text-xs text-gray-500">
有效期: {{ item.startTime }}
</div>
<div class="text-xs text-gray-500">
失效期: {{ item.endTime }}
</div>
</div>
<div class="w-[30%] flex items-center justify-center">
<div
class="w-14 h-6 flex items-center justify-center cursor-pointer text-white text-xs bg-[#e9613f] rounded-full"
:style="{ backgroundColor: item.isJoin === 0 ? '#e9613f' : '#ccc' }"
@click="getActivity(item)"
>
{{ item.isJoin === 0 ? '领取' : '已领取' }}
</div>
</div>
</div>
</div>
</div>
</n-card>
</n-modal>
</div>
</template>
<style scoped>
/* .n-card__content{
padding:20px !important
} */
.activity-box {
position: fixed;
bottom: 20px;
right: 20px;
justify-content: space-around;
}
.card-item {
@apply flex items-center justify-center h-1/4;
}
.member-item {
@apply w-1/4 h-12 flex justify-center items-center;
}
</style>