Files
taimed/pages/vip/index.vue
2025-06-20 17:40:41 +08:00

1048 lines
25 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">
<z-nav-bar title="VIP办理" bgColor="#5188e5" fontColor="#fff"></z-nav-bar>
<scroll-view scroll-x="true">
<view class="vip_block">
<view class="vip_item" v-for="(item, index) in list" :key="index"
:class="{'active':activeIndex==index, 'active_null': !item.canUpgrade}" @click="activeItem(item,index)">
<text class="item_title">{{item.title}}</text>
<text class="item_fee" :class="item.canUpgrade&&item.upgradeFee>0?'item_line_container':''"><span>{{item.fee}}</span></text>
<text class="item_count" :class="item.canUpgrade&&item.upgradeFee>0?'item_line':''">{{item.count}}</text>
<view v-if="item.canUpgrade&&item.upgradeFee>0">
<text class="item_upgradeFee">升级价<span>{{item.upgradeFee}}</span></text>
</view>
<text class="item_content" v-if="item.canUpgrade&&item.upgradeCount>0">增加{{item.upgradeCount}}次问答</text>
<text class="item_content" v-else>{{item.content}}</text>
</view>
</view>
</scroll-view>
<view class="vip_rule">
<text class="rule_title">说明</text>
<text class="rule_con">1.普通用户仅有三次免费机会仅限制使用全科医生提问</text>
<text class="rule_con">2.VIP用户按月度或季度办理成功后拥有相应VIP提问次数不限制使用专科或全科医生</text>
<text class="rule_con">3.VIP用户升级按月度或季度办理成功后如有效期内次数用尽还想在有效期内增加使用次数可进行同类型VIP升级操作(仅一次)补相应差价即可获得增加次数有效期时间以第一次办理的时间为准</text>
</view>
<view class="order_box">
<view class="title">价格明细</view>
<view class="order_block">
<view class="order_item" v-for="(v, i) in priceBreakdownList">
<view class="top">
<view class="left">
<image v-if="v.imgUrl" class="pay_item_img_icon" :src="v.imgUrl" mode="aspectFil"></image>
<template v-if="v.type == 2">
{{ v.text }}
<text class="quanbu">(全部积分{{ user.jf }})</text>
</template>
<template v-else-if="v.type == 3">
<text style="color: #fe6035">{{ v.text }}</text>
</template>
<text v-else>{{ v.text }}</text>
</view>
<view class="right">
<template v-if="v.type == 2">
<text style="color: #fe6035"> -{{ jfNumberShow }}</text>
</template>
<template v-else-if="v.type == 3">
<text style="color: #fe6035">{{ data.upgradeFee }}</text>
</template>
<template v-else>
<text :class="data.upgradeFee>0?'fee_line':''">{{ data.fee }}</text>
</template>
</view>
</view>
<view class="bottom jf_box" v-if="v.type == 2">
<view class="jf_box">
<text>可用积分({{ jfNumberMax }})</text>
<view class="jf_input">
<u--input type="number" @input="handleChangejf" @clear="jfNumber = 0" :max="jfNumberMax"
v-model="jfNumber" placeholder="请输入积分" border="surround" clearable></u--input>
</view>
</view>
</view>
</view>
</view>
</view>
<view class="pay_box">
<view class="title">支付方式</view>
<view class="pay_block">
<view class="pay_item" v-for="(v, i) in payList">
<view :class="isDefaultCurrency && i != 2 ? 'bgGrey top' : 'top'">
<view class="left">
<image class="pay_item_img" :src="v.imgUrl" mode="aspectFil" :style="v.style">
</image>
<template v-if="v.type == 4">
<text> {{ v.text }}</text>
<text style="color: #5188e5; font-weight: 600; margin-left: 10rpx">
(余额{{ user && user.peanutCoin ? user.peanutCoin : 0 }})</text>
</template>
<text v-else> {{ v.text }}</text>
</view>
<template v-if="isDefaultCurrency">
<radio :value="v.value" color="#5188e5" v-if="$platform != 'ios'&&i == 2||$platform == 'ios'&&i == 0"
:checked="selectPayIndex == i ? true : false" @click="radioChange(i)" size="8" />
</template>
<template v-else>
<radio :value="v.value" color="#5188e5" :checked="selectPayIndex == i ? true : false"
@click="radioChange(i)" size="8" />
</template>
</view>
</view>
</view>
<template v-if="selectPayIndex == 2 || $platform == 'ios'">
<view class="goods_detail_list_title">
<view class="linlanzhifu">
<view class="linlanzhifu">
<u-icon name="error-circle" color="#5188e5" size="16"
style="display: inline-block; margin-right: 10rpx"></u-icon>
确保您的天医币足够支付
</view>
<text class="fdButtonBox" @click="
onPageJump('/pages/wallet/recharge?source=order')">立即充值</text>
</view>
<view class="other_info" style="margin-top: 12rpx">
<view class="explain" style="margin-bottom: 10rpx"> 说明 </view>
<view class="explain"> 1. 1天医币 = 1元人民币 </view>
<view class="explain">
2.若有疑问或意见请致电客服
<span><u @click="checkPermision">022-24142321</u></span>
</view>
<view class="explain">
3.非中国大陆用户可以信用卡支付简单快捷推荐使用
支付时使用的信用卡需要带有Visa或MasterCard的标识请向邮箱
<text @click="fnCopy('publisher@tmrjournals.com', '邮箱')" class="aui-text-success"
style="text-decoration: underline; color: #5188e5">
publisher@tmrjournals.com
</text>
点击复制发送支付请求内容需包含拟购买的课程名称支付金额APP注册姓名及手机号码或者加一路健康客服微信
<text class="aui-text-success" @click="fnCopy('yilujiankangkefu', '微信名')"
style="text-decoration: underline; color: #5188e5">
yilujiankangkefu </text>点击复制联系我们我们将在24小时内向您的邮箱或者微信发送支付链接根据提示即可完成信用卡支付无需兑换外币
</view>
</view>
</view>
</template>
</view>
<view class="goods_nav_box">
<common-goods-nav :customButton="customButton" @submit="goBuyJie">
<!-- leftSlot -->
<template slot="leftSlot" slot-scope="slotProps">
<view class="price_box order_bottom_box">
<text class="price">合计
<text class="total" v-if="actualPayment==0">{{jfNumber}}积分</text>
<text class="total" v-else>
<span style=" color: red;">{{actualPayment}}</span>
<text style="margin: 0 4rpx" v-if="actualPayment > 0 && jfNumber > 0"> + </text>
<text v-if="jfNumber > 0">{{ jfNumber }} 积分</text>
</text>
</text>
</view>
</template>
</common-goods-nav>
<view class="agree_wo">
<radio-group class="agree">
<view v-for="(item, index) in argee" :key="index">
<radio class="agreeRadio" :value="item.id" :checked="item.id == radioValue" color="#5188e5"
@click="radioCheck(index)"></radio>
</view>
</radio-group>
<view>* 我已阅读并同意<span class="highlight" @click="showXieyi">会员服务协议</span></view>
</view>
</view>
<!-- 会员协议 -->
<u-popup :show="xieyiShow" :round="10" @close="xieyiShow = false">
<view class="tanchu">
<view class="dp_title">{{ xieyi.title }}</view>
<view style="max-height: 1000rpx; overflow-y: scroll">
<view v-html="xieyi.content"></view>
</view>
</view>
</u-popup>
</view>
</template>
<script>
import $http from "@/config/requestConfig.js";
import { mapState } from "vuex";
import debounce from "@/common/debounce.js";
import {
setPay,
setPayAssign,
setWXPay
} from "@/config/utils";
const { platform } = uni.getSystemInfoSync();
export default {
watch: {
isDefaultCurrency: {
immediate: true,
handler(newRoute) {
if (this.isDefaultCurrency) {
if (platform == "ios") {
this.selectPayIndex = 0;
} else {
this.selectPayIndex = 0;
}
} else {
if (platform == "ios") {
this.selectPayIndex = 0;
} else {
this.selectPayIndex = 0;
}
}
this.payType = this.payList[this.selectPayIndex].type;
if (this.actualPayment == 0) {
var that = this;
this.payList.forEach((e, i) => {
if (e.type == 4) {
that.selectPayIndex = i;
that.payType = 4;
}
});
this.$forceUpdate();
}
this.$forceUpdate();
},
},
},
data() {
return {
list: [],
activeIndex: 0,
payType: null,
paylist: [{
title: "支付宝",
id: 2,
imgUrl: require("@/static/icon/pay_1.png"),
},
{
title: "微信",
id: 1,
imgUrl: require("@/static/icon/pay_2.png"),
},
],
priceBreakdownList: [
{
type: 1,
text: '商品价格',
}
],
isDefaultCurrency: false,
jfNumber: 0,
jfNumberShow: "",
jfNumberMax: 0,
user: {},
data: {}, //选中的每一个商品
actualPayment: 0, //合计价格
payType: 1,
selectPayIndex: 1,
argee: [{value: false, id: "1"}], // 同意权限
radioValue: "",
xieyi: {
title: "",
content: "",
},
xieyiShow: false,
customButton: [{
width: "300rpx",
text: "立即支付",
backgroundColor: "#5188e5",
color: "#fff",
}, ],
flag: null, //普通购买/升级
buyStatus: false, //重复下单
}
},
onLoad(e) {
this.flag = e.flag;
this.getData();
if (platform == "ios") {
this.payList = [
{
text: "天医币",
imgUrl: require("@/static/icon/pay_3.png"),
type: 4,
value: "2",
},
];
this.selectPayIndex = 0;
this.payType = 4;
} else {
this.payList = [
{
text: "支付宝",
imgUrl: require("@/static/icon/pay_1.png"),
type: 2,
value: "0",
},
{
text: "微信",
imgUrl: require("@/static/icon/pay_2.png"),
type: 1,
value: "1",
},
{
text: "天医币",
imgUrl: require("@/static/icon/pay_3.png"),
type: 4,
value: "2",
},
];
this.selectPayIndex = 1;
this.payType = 1;
}
},
onShow() {
},
computed: {
...mapState(["userInfo"]),
},
methods: {
//获取数据
getData() {
uni.showLoading({
title: '加载中'
})
this.$http.request({
url: 'taihumed/aiBuyConfig/getAiBuyConfigList',
method: "POST",
data: {},
header: {
"Content-Type": "application/json",
},
})
.then(res=> {
uni.hideLoading();
if (res.list&&res.list.length>0) {
this.list = res.list;
//赋值能够买的index
if(this.flag==1){
this.activeIndex = res.list.findIndex(item => item.canUpgrade === true);
//价格明细
this.priceBreakdownList.push({
type: 3,
text: 'VIP升级价格',
})
}
this.data = this.list[this.activeIndex];
this.getUserInfo();
}
});
},
//选择
activeItem(data, index){
if(!data.canUpgrade){
return
}
this.data = data;
this.activeIndex = index;
this.getTotalPrice(this.user);
},
//获取用户详情
getUserInfo() {
if (this.userInfo.id != undefined) {
this.$http.post("book/user/info/" + this.userInfo.id).then(async(res) => {
this.user = res.user;
this.getTotalPrice(res.user);
if(res.user.jf>0){
this.priceBreakdownList.push({
type: 2,
imgUrl: require("@/static/icon/jifen.png"),
text: '积分',
})
}
});
}
},
//积分输入
handleChangejf(val) {
var value = String(val);
let fee = 0;
if(this.flag==1){
fee = this.data.upgradeFee;
}else{
fee = this.data.fee;
}
this.$nextTick(() => {
//1. 只允许数字字符,并去掉小数点后的部分
value = value.replace(/[^0-9.]/g, ""); // 删除非数字和小数点字符
//2. 如果有小数点,只保留小数点前的部分
if (value.indexOf(".") !== -1) {
value = value.split(".")[0]; // 截取小数点前的部分
}
//如果输入为0强制设置为0并显示为 "0"
if (val == 0) {
this.jfNumber = 0;
this.jfNumberShow = "0";
} else {
//3. 强制转换为正整数
let numericValue = parseInt(value, 10); // 使用parseInt转换为整数
if (numericValue < 0 || isNaN(numericValue)) {
numericValue = 0;
}
//4. 确保最大值限制
if (numericValue >= this.jfNumberMax) {
numericValue = this.jfNumberMax;
}
//更新最终的数字值和显示
this.jfNumber = Math.max(0, numericValue); //强制为正整数
this.jfNumberShow = this.jfNumber.toString(); //显示整数
}
//计算实际支付金额
this.actualPayment = fee - this.jfNumber;
//如果实际支付金额为0设置支付方式为默认货币
if (this.actualPayment == 0) {
this.isDefaultCurrency = true;
var that = this;
this.payList.forEach((e, i) => {
if (e.type == 4) {
that.selectPayIndex = i;
that.payType = 4;
}
});
this.$forceUpdate();
} else {
this.isDefaultCurrency = false;
}
this.$forceUpdate();
});
},
//获取总金额
getTotalPrice(userInfo) {
let fee = 0;
if(this.flag==1){
fee = this.data.upgradeFee;
}else{
fee = this.data.fee;
}
if (userInfo.jf >= fee) {
this.jfNumber = fee;
this.jfNumberMax = fee;
} else {
this.jfNumber = userInfo.jf;
this.jfNumberMax = userInfo.jf;
}
if (this.jfNumber == 0 || this.jfNumber == null) {
this.jfNumberShow = "0.00";
this.actualPayment = fee;
} else {
this.jfNumberShow = this.jfNumber;
this.actualPayment = fee - this.jfNumber;
}
if (this.actualPayment == 0) {
this.isDefaultCurrency = true;
this.payList.forEach((e, i) => {
if (e.type == 4) {
this.selectPayIndex = i;
this.payType = 4;
}
});
this.$forceUpdate();
} else {
this.isDefaultCurrency = false;
}
this.$forceUpdate();
},
//支付
async goBuyJie(){
if(this.radioValue!='1'){
uni.showToast({
title: "请勾选 已阅读会员服务协议",
icon: "none",
});
return false;
}
if(this.buyStatus){
uni.showToast({
title: "请勿重复下单",
icon: "none",
});
return false;
}
//下单状态
this.buyStatus = true;
let that = this;
let orderType = '';
let districtMoney = 0;
if(this.flag==0){
orderType = 'aiVip';
}else if(this.flag==1){
orderType = 'upgradeAiVip';
}
//VIP升级的价格逻辑
if(that.data.upgradeFee&&that.data.upgradeFee>0){
districtMoney = Number(that.data.fee)-Number(that.data.upgradeFee);
}
debounce(async () => {
let data = {
orderType: orderType, //aiVip-购买upgradeAiVip-升级
paymentMethod: that.payType,
orderMoney: that.data.fee,
realMoney: that.actualPayment,
districtMoney: districtMoney,
aiBuyConfigId: that.data.id,
jfDeduction: that.jfNumber,
remark: that.data.title + '-' + that.data.content,
come: '4',
appName: 'thyy'
}
await $http.request({
url: 'taihumed/aiVip/placeAiVipOrder',
method: "POST",
data,
header: {
"Content-Type": "application/json",
},
})
.then(async (res) => {
if (res.code == 0) {
uni.hideLoading();
if (res.orderSn == null) {
uni.showToast({
title: "失败,请重新下单",
icon: "none"
});
that.buyStatus = false;
} else {
if (that.payType == 2) {
//常规支付
uni.showToast({
title: "正在支付",
icon: "loading",
});
await setPay({
typePay: "alipay",
subject: "order",
totalAmount: res.money,
type: 2,
relevanceoid: res.orderSn,
customerId: that.userInfo.id,
},
(res) => {
uni.showLoading({
title: "加载中",
});
console.log(res, "支付支付");
if (res.success) {
uni.showToast({
title: "支付成功",
});
setTimeout(() => {
that.buyStatus = false;
uni.switchTab({
url: '/pages/my/index'
})
}, 1000);
} else {
setTimeout(() => {
that.buyStatus = false;
console.log("延迟调用 失败提示");
uni.showToast({
title: "支付失败"
});
}, 0);
}
}
);
} else if (that.payType == 1) {
//微信支付
let data1 = {
orderSn: res.orderSn,
buyOrderId: null,
totalAmount: res.money,
};
setWXPay(data1, (res) => {
if (res.success) {
uni.showToast({
title: "支付成功",
});
setTimeout(() => {
that.buyStatus = false;
uni.switchTab({
url: '/pages/my/index'
})
}, 1000);
} else {
if (res.data.errMsg.indexOf("User canceled") != -1) {
uni.showToast({
title: "用户取消支付",
icon: "none"
});
} else {
uni.showToast({
title: "支付失败",
icon: "none"
});
}
that.buyStatus = false;
}
});
} else if (that.payType == 4) {
//天医币支付
console.log(res, "天医币支付成功");
uni.showToast({
title: "购买成功",
icon: "success",
});
setTimeout(() => {
that.buyStatus = false;
uni.switchTab({
url: '/pages/my/index'
})
}, 1000);
}
}
}
})
.catch(()=>{
uni.hideLoading();
that.buyStatus = false;
});
}, 1000);
},
//支付方式切换
radioChange(index) {
this.selectPayIndex = index;
this.payType = this.payList[this.selectPayIndex].type;
this.$forceUpdate();
},
//复制
fnCopy(value, title) {
this.$commonJS.handleMakingPhoneCalls(value, title);
},
onPageJump(url) {
uni.navigateTo({
url: url,
});
},
//勾选会员协议
radioCheck(index) {
this.argee.forEach((item) => {
item.isCheck = false;
});
if (this.radioValue == this.argee[index].id) {
this.radioValue = null;
} else {
this.radioValue = this.argee[index].id;
}
},
//会员协议
async showXieyi() {
var data = await this.$commonJS.getAgreement(115);
if (data.content) {
data.content = data.content.replace(
/<h5>/g,
'<view style="font-weight: bold;font-size: 32rpx;margin-top: 20rpx;margin-bottom: 20rpx;">'
);
data.content = data.content.replace(/<\/h5>/g, "</view>");
}
this.xieyi = data;
this.xieyiShow = true;
},
},
}
</script>
<style lang="scss" scoped>
@import '@/static/mixin.scss';
.content{
background-color: #eff5f8;
height: 100%;
overflow: auto;
}
.vip_block{
padding: 30rpx 30rpx 10rpx;
display: inline-flex;
align-items: center;
white-space: nowrap;
.vip_item{
width: 205rpx;
height: 270rpx;
box-sizing: border-box;
border-radius: 10rpx;
position: relative;
margin-right: 20rpx;
background: #fff;
box-shadow: 0px 1px 5px 0px #a7bbe4;
flex-shrink: 0;
text{
display: block;
text-align: center;
}
.item_title{
font-size: 32rpx;
font-weight: bold;
padding-top: 25rpx;
}
.item_fee{
padding-top: 20rpx;
font-size: 30rpx;
color: #ec701f;
line-height: 50rpx;
span{
font-size: 40rpx;
padding-left: 4rpx;
font-weight: bold;
}
}
.item_count{
font-size: 26rpx;
line-height: 34rpx;
color: #999;
padding-top: 10rpx;
}
.item_content{
position: absolute;
bottom: 0;
left: 0;
width: 100%;
background: #fff9eb;
height: 50rpx;
line-height: 50rpx;
font-size: 24rpx;
color: #bbac84;
border-radius: 0 0 10rpx 10rpx;
}
.item_upgradeFee{
font-size: 26rpx;
line-height: 40rpx;
color: #ec701f;
span{
font-size: 36rpx;
font-weight: bold;
}
}
.item_line{
text-decoration: line-through;
color: #bcbcbc;
padding-top: 0;
}
.item_line_container{
padding-top: 5rpx;
color: #bcbcbc;
}
.item_line_container::after{
content: "";
position: absolute;
left: 50%;
top: 300rpx;
width: 90rpx;
height: 1rpx;
background: #bcbcbc; /* 删除线颜色 */
transform: translateY(-198rpx);
margin-left: -45rpx;
}
}
.vip_item:last-child{
margin-right: 0;
}
.active{
border: 3rpx solid #ec701f;
background: rgba(255, 118, 31, 0.1);
.item_content{
background: rgba(255, 118, 31, 0.8);
color: #fff;
}
}
.active_null{
border: 3rpx solid #bcbcbc;
background: rgba(188, 188, 188, 0.1);
.item_title,.item_fee{
color: #bcbcbc;
}
.item_content{
background: rgba(188, 188, 188, 0.8);
color: #999;
}
}
}
.fee_line{
text-decoration: line-through;
}
.vip_rule{
margin: 30rpx;
border-radius: 10rpx;
padding: 30rpx;
background: #fff;
box-sizing: border-box;
.rule_title{
font-size: 34rpx;
font-weight: bold;
line-height: 40rpx;
display: block;
padding-bottom: 30rpx;
}
.rule_con{
display: block;
font-size: 28rpx;
line-height: 50rpx;
}
}
.order_box{
margin: 30rpx;
border-radius: 10rpx;
padding: 30rpx;
background: #fff;
box-sizing: border-box;
font-size: 28rpx;
.title{
font-size: 34rpx;
font-weight: bold;
line-height: 40rpx;
display: block;
padding-bottom: 30rpx;
}
.order_item{
padding: 20rpx 0;
border-bottom: 1px solid #eeecec;
.top{
display: flex;
align-items: center;
justify-content: space-between;
.left{
display: flex;
align-items: center;
.pay_item_img_icon{
width: 40rpx;
height: 40rpx;
margin-right: 8rpx;
}
.quanbu{
color: #999;
font-size: 28rpx;
padding-left: 10rpx;
}
}
.right{
color: red;
}
}
.bottom {
background-color: #f5f5f5;
border-radius: 10rpx;
margin-top: 20rpx;
.jf_box {
width: 100%;
display: flex;
align-items: center;
padding: 15rpx;
box-sizing: border-box;
justify-content: space-between;
text{
color: $themeColor;
}
}
.jf_input {
width: calc(100% - 400rpx) !important;
input{
height: 50rpx;
border: 1rpx solid #efe4e4;
border-radius: 10rpx;
font-size: 28rpx;
padding: 10rpx 0;
}
}
}
}
}
.order_block .order_item:last-child{
border-bottom: none;
}
.pay_box{
margin: 30rpx 30rpx 200rpx;
border-radius: 10rpx;
padding: 30rpx;
background: #fff;
box-sizing: border-box;
font-size: 28rpx;
.title{
font-size: 34rpx;
font-weight: bold;
line-height: 40rpx;
display: block;
padding-bottom: 30rpx;
}
.pay_item{
padding: 20rpx 0;
border-bottom: 1px solid #eeecec;
.top{
width: 100%;
display: flex;
align-items: center;
justify-content: space-between;
.left{
line-height: 50rpx;
font-weight: 500;
color: #242323;
display: flex;
align-items: center;
.pay_item_img {
width: 45rpx;
height: 45rpx;
float: left;
margin-right: 20rpx;
}
.pay_item_img_icon{
width: 40rpx;
height: 40rpx;
float: left;
margin-right: 8rpx;
}
}
}
}
}
.pay_block .pay_item:last-child{
border-bottom: none;
}
.goods_detail_list_title {
padding: 30rpx;
color: #7dc1f0;
background: rgba(125, 193, 240, 0.1);
.linlanzhifu {
color: $themeColor;
display: flex;
align-items: center;
justify-content: space-between;
}
.other_info {
font-size: 28rpx;
color: #5a5a5a;
}
.left {
display: flex;
align-items: center;
}
.right {
font-size: 24rpx;
font-weight: 500 !important;
color: #999;
font-family: none;
}
}
.fdButtonBox {
border: 1rpx solid $themeColor;
background-color: $themeColor;
color: #fff;
padding: 10rpx 15rpx;
font-size: 24rpx;
line-height: 30rpx;
border-radius: 10rpx;
box-sizing: border-box;
}
/deep/.goods_nav_box {
background-color: #fff;
.left {
margin-top: -10rpx;
width: calc(100% - 220rpx);
line-height: 70rpx;
.price {
.total {
font-size: 30rpx;
color: red;
}
}
}
.right .button{
margin-left: 0;
}
}
.explain {
word-wrap: break-word;
word-break: normal;
word-break: break-all;
}
.order_bottom_box {
width: 100%;
text-align: right;
padding-right: 30rpx;
font-size: 30rpx;
}
.agree_wo {
display: flex;
align-items: center;
justify-content: flex-end;
color: #aaa;
line-height: 30rpx;
font-size: 28rpx;
padding: 10rpx 10rpx 20rpx 0;
}
.agreeRadio {
zoom: 0.6;
}
.agree {
width: auto !important;
}
.highlight {
color: $themeColor;
}
.tanchu {
padding: 40rpx 30rpx 40rpx 30rpx;
position: relative;
.dp_title {
font-size: 32rpx;
margin-bottom: 50rpx;
color: #555;
text-align: center;
font-weight: bold;
}
}
</style>