buddhism/pages/future/future.vue

845 lines
22 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="page">
<custom-navbar ref="customNavbar" title="未来规划" />
<tile-grid />
<view class="bg">
<view class="container">
<text class="proName">{{ projectDetails.proName }}</text>
<image
:src="projectDetails.imgUrl"
class="imgUrl"
mode="aspectFill"
></image>
<text class="tip">{{ projectDetails.proName }}效果图</text>
<text class="planTitle">用善意筑就明天的模样</text>
<text class="proProfile">{{ projectDetails.proProfile }}</text>
<text class="introduce">项目介绍</text>
<rich-text
:nodes="formatRichText(projectDetails.proIntroduce)"
class="rich-text-content"
></rich-text>
<view class="donorContainer">
<text>项目筹款情况</text>
<view class="donorData">
<view class="CircleProgress">
<circle-progress
:canvas-size="65"
:progress="getProgressPercentage"
progress-color="#A24242"
strokeWidth="5"
></circle-progress>
</view>
<view class="data-info">
<view class="data-row">
<view class="label">公众筹款目标():</view>
<view class="value">{{ projectDetails.totalAmount }}</view>
</view>
<view class="data-row">
<view class="label">当前筹款金额():</view>
<view class="value">{{ projectDetails.amountSum }}</view>
</view>
<view class="data-row">
<view class="label">当前捐款人次:</view>
<view class="value">{{ projectDetails.donorCount }}</view>
</view>
</view>
</view>
<view class="record" @click="goDonationRecord"
>查看捐款记录
<u-icon name="arrow-right"></u-icon>
</view>
</view>
<view class="new-develop-container">
<text class="section-title">最新进展</text>
<view
v-for="item in winB_List"
:key="item.id"
class="constructionSituation"
>
<view class="project-info" @click="goProjectDetail(item)">
<view class="line-left">
<image :src="buddhaIcon" mode="aspectFill"></image>
<view class="line"></view>
</view>
<view class="info" @click="">
<view class="time">
{{ item.createTime }}
</view>
<text>{{ item.title }}</text>
<rich-text :nodes="item.content"></rich-text>
</view>
<image
v-if="item.coverUrl"
:src="item.coverUrl"
class="content-image"
mode="aspectFill"
></image>
</view>
</view>
<view v-if="winB_NoMore === false" class="more" @click="loadMore"
>查看更多{{ winB_Pagination.remainingItems }}条进展
</view>
<view v-else class="more">到底了</view>
</view>
</view>
</view>
<button v-if="projectDetails.state === '2'" @click="handleDonate">
捐一笔
</button>
<u-popup v-model="show" border-radius="30" height="614rpx" mode="bottom">
<view class="donation">
<view class="title-row">
<view class="title">为寺庙建设捐出</view>
<u-icon class="close-icon" name="close"></u-icon>
</view>
<view class="donation-tip">
<view class="amount">100元</view>
<view class="equivalent">相当于1次健康祈福</view>
</view>
<u-line color="#D8D8D8" />
<view class="select">
<view
v-for="(item, index) in donationList"
:key="index"
:class="{ active: selectedIndex === index }"
class="donation-option"
@click="selectOption(index)"
>
{{ item }}次健康祈福
</view>
</view>
<view class="customMoney">
<input
v-model="customAmount"
class="custom-input"
placeholder="自定义金额"
type="number"
@input="handleCustomInput"
/>
<u-icon
class="reload-icon"
name="reload"
@click="randomAmount"
></u-icon>
<text class="random-text" @click="randomAmount">随缘</text>
</view>
<button class="confirm-btn" @click="toDonation">
确认支付¥{{ payAmount }}
</button>
</view>
</u-popup>
</view>
</template>
<script>
import CommonEnum from "../../enum/common";
import {
getInstitutionalDetail,
getProjectSchedule,
} from "../../api/institutionalStructure/institutionalStructureDetail";
import { createPagination } from "../../composables/winB_Pagination";
import { postInstitutionalStructure } from "../../api/institutionalStructure/institutionalStructure";
export default {
mixins: [
createPagination({
fetchData: getProjectSchedule,
mode: "loadMore",
pageSize: 2,
autoLoad: false, // 设置为 false不自动加载
}),
],
data() {
return {
show: false,
CommonEnum,
buddhaIcon: "https://api.ccttiot.com/image-1756353071821.png",
loading: false,
donationList: [1, 5, 10],
selectedIndex: 0,
customAmount: "",
payAmount: "",
formedId: null, // 添加 formedId 到 data 中
projectDetails: {
// createBy: null,
// createTime: "2025-07-08 17:50:26",
// updateBy: null,
// updateTime: null,
// remark: null,
// scope: null,
// deleted: null,
// areaPermissions: null,
// id: "6",
// templeId: "11",
// proName: "123",
// proProfile: "我们计划在202X-203X年完成这些重要建设邀您共同见证",
// formedYear: null,
// imgUrl: "https://api.ccttiot.com/IMG01-1751968117197.jpg",
// proIntroduce:
// "<p>项目介绍项目介绍项目介绍项目介绍项目介绍项目介</p><p>绍项目介绍项目介绍项目介绍项目介绍项目介绍</p><p>项目介绍项目介绍项目介绍项目介绍项目介绍项目介</p><p>绍项目介绍项目介绍项目</p><p>项目介绍项目介绍项目介绍项目介绍项目介绍项目介</p><p>绍项目介绍项目介绍项目介绍项目介绍项目介绍</p>",
// totalAmount: 10000101.0,
// state: "1",
// createId: null,
// templeName: "少林寺",
// donorCount: 6,
// amountSum: 6666666,
},
winB_List: [
// {
// id: "18",
// templeId: "12",
// title: "施工情况01",
// content: "<p>施工情况02施工情况02...</p>",
// status: "1",
// templeName: "寒山寺",
// createTime: "2025-07-09 13:50:57",
// coverUrl: "https://api.ccttiot.com/IMG01-1751968117197.jpg",
// },
//
// {
// id: "19",
// templeId: "12",
// title: "施工情况01232",
// content:
// "<p>施工情况02施工情况02施工情况02施工情况02施工情况02施工情况02施工情况02施工情况02施工情况02施工情况02施工情况02施工情况02施工情况02施工情况02施工情况02施工情况02施工情况02施工情况02施工情况02施工情况02施工情况02...</p>",
// status: "1",
// templeName: "寒山寺",
// createTime: "2025-07-09 13:50:57",
// coverUrl: "https://api.ccttiot.com/IMG01-1751968117197.jpg",
// },
// {
// id: "19",
// templeId: "12",
// title: "施工情况01232",
// content: "<p>施工情况02施工情况02...</p>",
// status: "1",
// templeName: "寒山寺",
// createTime: "2025-07-09 13:50:57",
// coverUrl: "https://api.ccttiot.com/IMG01-1751968117197.jpg",
// },
],
};
},
onLoad(options) {
if (options) {
console.log("接收到的参数:", options.formedId);
this.formedId = options.formedId;
// 更新参数并首次执行数据加载
this.winB_UpdateParams({ formedId: this.formedId });
}
// 页面加载时获取数据
this.loadPageData();
},
methods: {
// 加载页面数据
async loadPageData() {
try {
const [detailResponse] = await Promise.all([
getInstitutionalDetail(this.formedId),
]);
// 处理机构详情数据
if (detailResponse?.code === 200) {
this.projectDetails = detailResponse.data;
console.log("projectDetails.state:", this.projectDetails.state);
} else {
console.warn("获取机构详情失败:", detailResponse?.message);
uni.showToast({
title: "获取详情失败",
icon: "none",
});
}
} catch (error) {
console.error("获取页面数据失败:", error);
uni.showToast({
title: "数据加载失败",
icon: "none",
});
} finally {
this.loading = false;
}
},
formatRichText(html) {
if (!html) return "";
// 为图片添加最大宽度限制
const formattedHtml = html.replace(
/<img([^>]*)>/gi,
'<img$1 style="max-width: 100%; height: auto; display: block; margin: 10rpx auto;">',
);
return formattedHtml;
},
loadMore() {
this.winB_LoadMore();
},
goDonationRecord() {
// 跳转到捐款记录页面传递建制ID
uni.navigateTo({
url: `/pages/institutionalStructure/donationRecord?formedId=${this.formedId}`,
fail: (err) => {
console.error("跳转失败:", err);
uni.showToast({
title: "页面跳转失败",
icon: "none",
});
},
});
},
goProjectDetail(item) {
uni.navigateTo({
url: `/pages/institutionalStructure/projectDetail?title=${encodeURIComponent(item.title)}&content=${encodeURIComponent(item.content)}&createTime=${encodeURIComponent(item.createTime)}&coverUrl=${encodeURIComponent(item.coverUrl)}`,
});
},
handleDonate() {
console.log("根据state进行弹窗", this.projectDetails.state);
if (this.projectDetails.state === "1") {
uni.showToast({
title: "捐款暂未开始",
icon: "none",
duration: 2000,
});
}
if (this.projectDetails.state !== "1") {
// 执行捐赠逻辑
this.show = true;
}
},
selectOption(index) {
this.selectedIndex = index;
this.payAmount = this.donationList[index] * 100;
this.customAmount = "";
},
handleCustomInput() {
if (this.customAmount) {
this.payAmount = parseInt(this.customAmount);
this.selectedIndex = -1;
} else {
this.payAmount = "";
}
},
randomAmount() {
// 生成随机金额50-1000
const randomAmount = Math.floor(Math.random() * (1000 - 50 + 1)) + 50;
this.customAmount = randomAmount.toString();
this.payAmount = randomAmount;
this.selectedIndex = -1;
},
async toDonation() {
let res = await postInstitutionalStructure({
payAmount: this.payAmount,
formedId: this.formedId,
});
this.openPaymentUrl(res.data.payParams.payUrl);
},
// 封装打开支付链接的方法
openPaymentUrl(payUrl) {
window.location.href = payUrl;
},
},
computed: {
// 计算筹款进度百分比
getProgressPercentage() {
if (
!this.projectDetails.totalAmount ||
this.projectDetails.totalAmount <= 0
) {
return 0;
}
const percentage =
(this.projectDetails.amountSum / this.projectDetails.totalAmount) * 100;
return Math.min(parseFloat(percentage.toFixed(2)), 100); // 保留两位小数且不超过100%
},
},
};
</script>
<style lang="scss" scoped>
.page {
background: linear-gradient(to bottom, #f5f0e7 500rpx, #fff 500rpx);
.bg {
//background: #faf8f3;
background: #fff;
padding: 32rpx 22rpx 162rpx;
.container {
flex-direction: column;
display: flex;
.proName {
width: 100%;
height: 50rpx;
font-weight: 500;
font-size: 36rpx;
color: #522510;
line-height: 50rpx;
text-align: center;
font-style: normal;
text-transform: none;
}
.imgUrl {
margin-top: 22rpx;
width: 708rpx;
height: 370rpx;
}
.tip {
margin-top: 20rpx;
width: 100%;
height: 32rpx;
font-weight: 400;
font-size: 24rpx;
color: #695347;
line-height: 32rpx;
text-align: right;
font-style: normal;
text-transform: none;
}
/* 计划标题样式 */
.planTitle {
margin-top: 12rpx;
padding-left: 30rpx;
width: 100%;
height: 44rpx;
font-family: AlibabaPuHuiTi, AlibabaPuHuiTi;
font-weight: 400;
font-size: 32rpx;
color: #695347;
line-height: 44rpx;
text-align: left;
font-style: normal;
text-transform: none;
}
/* 项目简介样式 */
.proProfile {
margin-top: 16rpx;
padding-left: 30rpx;
width: 100%;
font-family: AlibabaPuHuiTi, AlibabaPuHuiTi;
font-weight: 400;
font-size: 24rpx;
color: #695347;
line-height: 32rpx;
text-align: left;
font-style: normal;
text-transform: none;
}
/* 介绍标题样式 */
.introduce {
margin-top: 38rpx;
margin-bottom: 42rpx;
width: 100%;
height: 54rpx;
font-family: AlibabaPuHuiTi, AlibabaPuHuiTi;
font-weight: 400;
font-size: 40rpx;
color: #695347;
line-height: 54rpx;
text-align: left;
font-style: normal;
text-transform: none;
}
/* 富文本容器样式 */
.rich-text {
width: 100%;
height: 270rpx;
font-family: AlibabaPuHuiTi, AlibabaPuHuiTi;
font-weight: 400;
font-size: 28rpx;
color: #695347;
line-height: 45rpx;
text-align: left;
font-style: normal;
text-transform: none;
}
.donorContainer {
margin-bottom: 34rpx;
padding: 30rpx;
margin-top: 30rpx;
background: #fffbf5;
border-radius: 20rpx 20rpx 20rpx 20rpx;
border: 2rpx solid #c7a26d;
text {
width: 190rpx;
height: 44rpx;
font-family: AlibabaPuHuiTi, AlibabaPuHuiTi;
font-weight: 400;
font-size: 32rpx;
color: #695347;
line-height: 44rpx;
text-align: left;
font-style: normal;
text-transform: none;
}
.donorData {
margin-top: 30rpx;
display: flex;
.CircleProgress {
flex: 1;
}
.data-info {
flex: 3;
.data-row {
display: flex;
justify-content: space-between;
.label {
height: 32rpx;
font-family: AlibabaPuHuiTi, AlibabaPuHuiTi;
font-weight: 400;
font-size: 24rpx;
color: #808080;
line-height: 32rpx;
text-align: left;
font-style: normal;
text-transform: none;
}
.value {
height: 50rpx;
font-family: AlibabaPuHuiTi, AlibabaPuHuiTi;
font-weight: 400;
font-size: 36rpx;
color: #3d3d3d;
line-height: 50rpx;
text-align: right;
font-style: normal;
text-transform: none;
}
}
}
}
u-line-progress {
width: 400rpx !important;
}
.record {
margin-top: 20rpx;
display: flex;
justify-content: center;
height: 32rpx;
font-family: AlibabaPuHuiTi, AlibabaPuHuiTi;
font-weight: 400;
font-size: 24rpx;
color: #522510;
line-height: 32rpx;
text-align: center;
font-style: normal;
text-transform: none;
}
}
.new-develop-container {
background: #fffbf5;
border-radius: 20rpx 20rpx 20rpx 20rpx;
border: 2rpx solid #c7a26d;
padding: 30rpx;
display: flex;
flex-direction: column;
.section-title {
width: 100%;
height: 44rpx;
font-family: AlibabaPuHuiTi, AlibabaPuHuiTi;
font-weight: 400;
font-size: 32rpx;
color: #695347;
line-height: 44rpx;
text-align: left;
font-style: normal;
text-transform: none;
}
.constructionSituation {
.project-info {
display: flex;
.line-left {
margin-right: 16rpx;
image {
width: 18rpx;
height: 19rpx;
}
.line {
margin-left: 8rpx;
width: 0;
height: 100%;
border: 2rpx #d8d8d8 dashed;
}
}
.info {
margin-right: 46rpx;
width: 368rpx;
.time {
width: 100%;
height: 28rpx;
font-family: AlibabaPuHuiTi, AlibabaPuHuiTi;
font-weight: 400;
font-size: 20rpx;
color: #808080;
line-height: 28rpx;
text-align: left;
font-style: normal;
text-transform: none;
}
text {
width: 112rpx;
height: 38rpx;
font-family: AlibabaPuHuiTi, AlibabaPuHuiTi;
font-weight: 400;
font-size: 28rpx;
color: #695347;
line-height: 38rpx;
text-align: left;
font-style: normal;
text-transform: none;
}
rich-text {
width: 368rpx;
display: -webkit-box;
-webkit-line-clamp: 3;
-webkit-box-orient: vertical;
font-family: AlibabaPuHuiTi, AlibabaPuHuiTi;
font-weight: 400;
font-size: 24rpx;
color: #808080;
line-height: 38rpx;
letter-spacing: 2px;
text-align: left;
font-style: normal;
text-transform: none;
max-height: 114rpx; /* 3行 × 1.5行高 */
overflow: hidden;
text-overflow: ellipsis;
}
}
.content-image {
width: 198rpx;
height: 198rpx;
background: #d8d8d8;
border-radius: 8rpx 8rpx 8rpx 8rpx;
}
}
}
.more {
width: 100%;
height: 32rpx;
font-family: AlibabaPuHuiTi, AlibabaPuHuiTi;
font-weight: 400;
font-size: 24rpx;
color: #522510;
line-height: 32rpx;
text-align: center;
font-style: normal;
text-transform: none;
}
}
}
}
}
button {
position: fixed;
left: 51rpx;
bottom: 24rpx;
width: 648rpx;
height: 90rpx;
background: #a24242;
border-radius: 45rpx 45rpx 45rpx 45rpx;
color: #fff;
}
.rich-text-content {
/* 全局限制富文本内容宽度 */
img {
max-width: 100% !important;
height: auto !important;
display: block;
margin: 10rpx auto;
}
/* 其他富文本样式 */
p {
margin-bottom: 20rpx;
line-height: 1.6;
}
}
//捐款
.donation {
background: #ffffff;
padding: 32rpx;
}
.title-row {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 30rpx;
.title {
height: 54rpx;
font-family: AlibabaPuHuiTi, AlibabaPuHuiTi;
font-weight: 400;
font-size: 40rpx;
color: #695347;
line-height: 54rpx;
text-align: left;
font-style: normal;
text-transform: none;
}
.close-icon {
font-size: 36rpx;
color: #999;
}
}
.donation-tip {
display: flex;
align-items: baseline;
margin-bottom: 30rpx;
.amount {
height: 54rpx;
font-family: AlibabaPuHuiTi, AlibabaPuHuiTi;
font-weight: 400;
font-size: 40rpx;
color: #a24242;
line-height: 54rpx;
text-align: left;
font-style: normal;
text-transform: none;
}
.equivalent {
height: 54rpx;
font-family: AlibabaPuHuiTi, AlibabaPuHuiTi;
font-weight: 400;
font-size: 40rpx;
color: #695347;
line-height: 54rpx;
text-align: left;
font-style: normal;
text-transform: none;
}
}
.select {
display: flex;
gap: 20rpx;
margin: 40rpx 0;
.donation-option {
padding: 24rpx;
border: 2rpx solid #eeeeee;
text-align: center;
font-size: 28rpx;
color: #666;
transition: all 0.3s ease;
background: #fff1dd;
border-radius: 6rpx 6rpx 6rpx 6rpx;
&.active {
color: #a24242;
font-weight: bold;
background: #ffcdcd;
border-radius: 6rpx 6rpx 6rpx 6rpx;
border: 1rpx solid #a24242;
}
}
}
.customMoney {
display: flex;
align-items: center;
margin: 40rpx 0;
padding: 20rpx;
background: #f8f8f8;
border-radius: 12rpx;
.custom-input {
flex: 1;
font-size: 28rpx;
color: #333;
background: transparent;
border: none;
outline: none;
&::placeholder {
color: #999;
}
}
.reload-icon {
margin: 0 20rpx;
font-size: 32rpx;
color: #666;
}
.random-text {
font-size: 28rpx;
color: #3d3d3d;
font-weight: 500;
}
}
.confirm-btn {
width: 686rpx;
height: 90rpx;
background: #a24242;
border-radius: 45rpx 45rpx 45rpx 45rpx;
border: none;
color: #ffffff;
font-size: 32rpx;
font-weight: bold;
box-shadow: 0 4rpx 16rpx rgba(255, 68, 68, 0.3);
&:active {
transform: translateY(2rpx);
box-shadow: 0 2rpx 8rpx rgba(255, 68, 68, 0.3);
}
}
</style>