HaniBlindBox/honey_box/pages/user/vip.vue
zpc 2550f6d4c2 refactor: 统一权益系统命名 VIP -> Equity
后端更改:
- 重命名数据库表: vip_levels -> equity_levels, vip_level_rewards -> equity_level_rewards, user_vip_rewards -> user_equity_rewards
- 重命名实体类: VipLevel -> EquityLevel, VipLevelReward -> EquityLevelReward, UserVipReward -> UserEquityReward
- 重命名 DTO: VipInfoResponse -> EquityInfoResponse, VipUserInfoDto -> EquityUserInfoDto, VipLevelDto -> EquityLevelDto
- 重命名服务: VipService -> EquityService, IVipService -> IEquityService
- 更新 API 端点: /vip_list -> /equity_list
- 移动命名空间: Models/Vip -> Models/Equity
- 删除重复的 VipController (与 QyLevelController 功能重复)
- 删除未使用的 equity_levels 和 equity_level_prizes 旧表实体

前端更改:
- 更新 API 调用: getVipList -> getEquityList
- 更新 vip.vue 页面使用新的 API 函数

保持兼容:
- JSON 响应字段名保持不变 (vip, last_vip, jin_du 等)
- 用户表 vip 字段保持不变
2026-02-05 18:21:07 +08:00

392 lines
7.3 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<view class="content">
<uni-nav-bar left-icon="left" title="会员中心" color="#fff" backgroundColor="transparent" :fixed="true"
:statusBar="true" :border="false" @clickLeft="$c.back"></uni-nav-bar>
<view class="head justify-center align-end">
<view class="user-card br20 relative">
<view class="">
<view class="">LV.{{ userinfo.vip }}</view>
<view class="">当前权益{{ userinfo.notice || '(无)' }}</view>
<view class="mt30">
<cmd-progress stroke-shape="round" style="height: 100%;background: rgba(255,255,255,0.45);border-radius: 30rpx;" :percent="userinfo.jin_du || 0" :show-info="false"
stroke-color="#FFFFFF"
:strokxxeWidth="5"></cmd-progress>
</view>
<view class="">还需消费{{ userinfo.upgrade_money }}可升级至V{{ userinfo.last_vip }}</view>
</view>
<view class="flex">
<image class="img100" :src="$img1('my/zuan1.png')"></image>
<text>{{userinfo.vip}}</text>
</view>
</view>
</view>
<view class="quanyi relative">
<view class="list-title ziti">
<text>会员权益</text>
</view>
<view class="">
<view class="coupon_item" v-for="(item, index) in config" :key="index">
<view class="icon common_bg" :style="{
'background-image': `url(${$img1('my/zuan.png')})`
}">{{item.title}}</view>
<view class="coupon_r">
<view class="title">{{ item.title }}</view>
<view class="rule">获得条件累计消费{{ item.condition }}</view>
<view class="desc">权益说明{{ item.notice || '(无)' }}</view>
</view>
</view>
</view>
</view>
</view>
</template>
<script>
import { getEquityList } from '@/common/server/user.js';
export default {
data() {
return {
z_imgPath: this.$z_img2 + 'mine/vip/',
statusBarHeight: uni.getSystemInfoSync().statusBarHeight,
userinfo: {},
config: {},
show: 0,
type: ''
}
},
onLoad(e) {
this.getData()
},
methods: {
async getData() {
// 模拟接口
const res = await getEquityList();
if (res.status == 1) {
this.userinfo = res.data.userinfo
this.config = res.data.data
}
},
back() {
uni.navigateBack()
}
}
}
</script>
<style lang="scss">
.footer {
width: 702rpx;
height: 88rpx;
background: #ff5029;
border-radius: 44rpx;
display: flex;
align-items: center;
justify-content: center;
color: #ffffff;
font-size: 32rpx;
position: fixed;
bottom: 57rpx;
left: 0;
right: 0;
margin: auto;
}
.wenben>view:nth-of-type(1) {
font-size: 32rpx;
margin-bottom: 10rpx;
}
.wenben {
font-size: 24rpx;
color: #999999;
padding: 30rpx;
box-sizing: border-box;
}
.coupon_head {
width: 372rpx;
height: 71rpx;
margin: 70rpx auto 0;
display: block;
}
.header_user>view:nth-of-type(2)>view:nth-of-type(2) {
font-size: 24rpx;
margin-left: 20rpx;
}
.header_user>view:nth-of-type(2)>view:nth-of-type(1) {
margin-left: 20rpx;
font-size: 36rpx;
text-shadow: 0px 0px 10px rgba(255, 150, 254, 0.7);
}
.header_user {
display: flex;
align-items: center;
margin-left: 37rpx;
margin-bottom: 80rpx;
}
.xietiao {
width: 714rpx;
height: 274rpx;
display: flex;
justify-content: space-between;
align-items: center;
color: #ffffff;
margin: 0 auto;
position: relative;
.vip-icon {
position: absolute;
right: 30rpx;
top: -10rpx;
width: 216rpx;
height: 200rpx;
}
.header_bot {
text-align: center;
margin-right: 100rpx;
margin-bottom: -80rpx;
font-size: 32rpx;
font-family: zihun147hao-xingyuanhei;
font-weight: 400;
color: #ffffff;
}
}
.jifen {
position: absolute;
bottom: 66rpx;
left: 51rpx;
font-size: 24rpx;
color: #fff;
// opacity: 0.6;
}
.xian {
position: absolute;
bottom: 112rpx;
left: 51rpx;
width: 600rpx;
height: 1px;
background: linear-gradient(94deg, #ffffff, #ffffff, #ffffff);
opacity: 0.2;
border-radius: 1rpx;
}
.jp_headimg>image {
width: 72rpx;
height: 72rpx;
border-radius: 50%;
margin-right: 20rpx;
}
.content {
width: 100vw;
min-height: 100vh;
box-sizing: border-box;
color: #fff;
padding-bottom: 40rpx;
.head {
width: 686rpx;
height: 372rpx;
background: #121317;
border-radius: 34rpx;
margin: 0 auto;
}
.user-card {
width: 622rpx;
height: 330rpx;
margin: 0 auto;
box-sizing: border-box;
padding: 30rpx 50rpx 0;
position: relative;
background: linear-gradient(138deg, #fe622b 7%, #ffa246 100%);
>view:nth-child(1){
>view:nth-child(1){
font-size: 68rpx;
color: #F4C783;
font-weight: bold;
}
>view:nth-child(2){
font-weight: 400;
font-size: 20rpx;
color: #FFFFFF;
}
>view:nth-child(3){
width: 294rpx;
height: 14rpx;
}
>view:nth-child(4){
font-weight: 400;
font-size: 20rpx;
color: #FFFFFF;
}
}
>view:nth-child(2){
width: 216rpx;
height: 216rpx;
position: absolute;
top: -14rpx;
right: 34rpx;
>text{
width: 120rpx;
height: 74rpx;
font-weight: 700;
font-size: 68rpx;
color: #FFFFFF;
position: absolute;
text-align: center;
line-height: 74rpx;
right: 30rpx;
bottom: 60rpx;
}
}
.user-info {
display: flex;
align-items: center;
.avatar {
width: 98rpx;
height: 98rpx;
background: #9d9d9d;
border: 1px solid #cccccc;
border-radius: 50%;
overflow: hidden;
image {
width: 100%;
height: 100%;
}
}
.name {
width: 250rpx;
margin-left: 20rpx;
font-size: 32rpx;
font-family: Source Han Sans CN;
font-weight: 400;
color: #ffffff;
}
}
.cur-desc {
margin-top: 20rpx;
font-size: 28rpx;
font-family: Source Han Sans CN;
font-weight: 400;
color: #ffffff;
text {
color: #08F6BB;
}
}
.need-lv {
margin-top: 30rpx;
font-size: 26rpx;
font-family: Source Han Sans CN;
font-weight: 400;
color: #ffffff;
text {
color: #08F6BB;
}
}
.lv {
position: absolute;
right: 20rpx;
top: 20rpx;
text-align: center;
font-size: 32rpx;
font-family: YouSheBiaoTiHei;
font-weight: 400;
color: #ffffff;
>image {
width: 174rpx;
height: 174rpx;
}
}
}
.quanyi{
width: 750rpx;
margin: -100rpx auto 0;
z-index: 20;
background: url($imgurl+'my/vipBg.png') no-repeat 0 0 / 100% 1192rpx;
}
.list-title {
margin-top: 20rpx;
padding-left: 30rpx;
padding-top: 100rpx;
text {
font-size: 40rpx;
font-weight: 400;
color: #FFFFFF;
}
}
.coupon_item {
position: relative;
padding: 24rpx 20rpx;
box-sizing: border-box;
margin: 20rpx auto 0;
width: 680rpx;
display: flex;
align-items: center;
.icon {
width: 108rpx;
height: 94rpx;
}
.coupon_r {
position: relative;
padding-left: 60rpx;
&::before {
content: '';
display: block;
position: absolute;
left: 20rpx;
top: 50%;
transform: translateY(-50%);
width: 1px;
height: 86rpx;
background: #666;
}
.title {
font-weight: 700;
font-size: 40rpx;
color: #FFFFFF;
}
.rule,
.desc {
margin-top: 10rpx;
font-size: 24rpx;
font-family: Source Han Sans CN;
font-weight: 400;
color: #dddddd;
}
}
}
}
</style>