This commit is contained in:
liuyuan
2025-08-25 13:25:26 +08:00
6 changed files with 3176 additions and 1282 deletions

18
.hbuilderx/launch.json Normal file
View File

@@ -0,0 +1,18 @@
{
"version" : "1.0",
"configurations" : [
{
"app-plus" : {
"launchtype" : "local"
},
"default" : {
"launchtype" : "local"
},
"h5" : {
"launchtype" : "local"
},
"provider" : "aliyun",
"type" : "uniCloud"
}
]
}

View File

@@ -2,8 +2,8 @@
"name" : "心灵空间",
"appid" : "__UNI__BBBDFD2",
"description" : "心灵空间",
"versionName" : "1.0.37",
"versionCode" : 1037,
"versionName" : "1.0.40",
"versionCode" : 1040,
"transformPx" : false,
/* 5+App */
"app-plus" : {

View File

@@ -25,7 +25,7 @@
{{childrenData.title}}
</view>
</view>
<view class="list_block" v-if="!statusXLCP" :style="labelsList.length>0&&childrenList.length==0?`marginTop: ${45 + statusBarHeight}px;`:''">
<view class="list_block" v-if="!statusXLCP" :style="labelsList.length>0&&childrenList.length==0?`marginTop: ${42 }px;`:''">
<view class="list_item" v-if="list.length>0" v-for="(item,index) in list" :key="index" @click.stop="goToDetail(item)">
<view class="list_item_image">
<image v-if="item.squareImage" :src="item.squareImage"></image>

File diff suppressed because it is too large Load Diff

View File

@@ -31,12 +31,10 @@
<view class="prof">
<view style="padding: 0 20rpx; position: relative;">
<view :class="`${isHideCourseInfo ? 'hidden2' : ''}`" v-html="parsedContent"></view>
<view v-for="(image, index) in images" :key="index" style=" width: 100%; margin-top: 10rpx;">
<image
style=" width: 100%;"
:src="image" mode="widthFix"
@tap="handleImageClick(image, index)"
/>
<view v-for="(image, index) in images" :key="index"
style=" width: 100%; margin-top: 10rpx;">
<image style=" width: 100%;" :src="image" mode="widthFix"
@tap="handleImageClick(image, index)" />
</view>
<text @click="isHideCourseInfo = !isHideCourseInfo" style="
font-size: 24rpx;
@@ -61,12 +59,14 @@
<view style=" display: flex; align-items: center;">
<view class="line"></view>
<view class="left">
<text style="font-weight: blod" class="catalogue_title">{{ slotProps.data.title }}</text>
<text style="font-weight: blod" class="catalogue_title">{{ slotProps.data.title
}}</text>
</view>
</view>
<view class="not_purchased" v-if="slotProps.data.type != 0&&!showNewPayBtn[slotProps.dataIndex].status">
<view class="spot"></view>
<view class="not_purchased"
v-if="curriculumData.adminControl == 1 && slotProps.data.isBuy != 1">
<!-- <view class="spot"></view>
<view>
<text v-if="userVip==null&&slotProps.data.isBuy!=1">未购买</text>
<view v-if="userVip==null&&slotProps.data.isBuy==1">
@@ -74,32 +74,67 @@
<text v-else>已购买</text>
</view>
<text v-if="userVip!=null">有效期至{{ userVip.endTime }}</text>
</view> -->
</view>
<view class="not_purchased"
v-else-if="curriculumData.adminControl == 1 && slotProps.data.isBuy == 1">
<text v-if="slotProps.data.endTime" style=" width: 280rpx; margin: 0;">课程有效期截止到<br />{{
slotProps.data.endTime ? slotProps.data.endTime.split(' ')[0]
: '' }} </text>
<text v-else>已购买</text>
<!-- <view class="spot"></view>
<view>
<text v-if="userVip==null&&slotProps.data.isBuy!=1">未购买</text>
<view v-if="userVip==null&&slotProps.data.isBuy==1">
<text v-if="slotProps.data.endTime" style=" width: 280rpx; margin: 0;">课程有效期截止到<br/>{{slotProps.data.endTime}} </text>
<text v-else>已购买</text>
</view>
<text v-if="userVip!=null">有效期至{{ userVip.endTime }}</text>
</view> -->
</view>
<view class="not_purchased" v-else-if="slotProps.data.type != 0 && !showNewPayBtn[0].status">
<view class="spot"></view>
<view>
<text v-if="userVip == null && slotProps.data.isBuy != 1">未购买</text>
<view v-if="userVip == null && slotProps.data.isBuy == 1">
<text v-if="slotProps.data.endTime"
style=" width: 280rpx; margin: 0;">课程有效期截止到<br />{{ slotProps.data.endTime ?
slotProps.data.endTime.split(' ')[0]
: '' }} </text>
<text v-else>已购买</text>
</view>
<text v-if="userVip != null">有效期至{{ userVip.endTime ? userVip.endTime.split(' ')[0] : '' }}</text>
</view>
</view>
<view class="right" v-if="curriculumData.adminControl == 1 && slotProps.data.isBuy != 1">
<!-- //是否咨询 -->
<text style="display: inline-block;margin-top: 4px;
text-align: center;
width: 68px;
font-size: 13px;
color: #fff;
border-radius: 5px !important;
line-height: 24px;
height:24px;" class="saveBtn flexbox buyBtn" @click="openKefu(slotProps.data)">购买课程</text>
<view class="right" v-if="slotProps.dataIndex==0">
<text v-if="slotProps.data.type == 0&&userVip==null&&slotProps.data.isBuy!=1" style="color: #fff; font-size: 12px" class="fdButtonBox aui-text-success"
@click="handleClickGetGoodsList(slotProps.data)">领取课程</text>
<text v-else-if="showNewPayBtn[0]&&showNewPayBtn[0].status==true" style=" background: #f42c32; border: 0; padding: 15rpx 30rpx; color: #fff; font-size: 12px" class="fdButtonBox aui-text-success"
@click="goNewPay(slotProps.data)">复读</text>
<u-icon v-else-if="userVip==null&&slotProps.data.type != 0&&slotProps.data.isBuy!=1"
@click="handleClickGetGoodsList(slotProps.data)" class="editIcon" name="shopping-cart-fill"
color="#FF2B57" size="28"></u-icon>
</view>
<view class="right" v-else>
<!-- //是否咨询 -->
<text v-if="slotProps.data.type == 0&&userVip==null&&slotProps.data.isBuy!=1" style="color: #fff; font-size: 12px" class="fdButtonBox aui-text-success"
<text v-if="slotProps.data.type == 0 && userVip == null && slotProps.data.isBuy != 1"
style="color: #fff; font-size: 12px" class="fdButtonBox aui-text-success"
@click="handleClickGetGoodsList(slotProps.data)">领取课程</text>
<text v-else-if="showNewPayBtn[slotProps.dataIndex]&&showNewPayBtn[slotProps.dataIndex].status==true" style=" background: #f42c32; border: 0; padding: 15rpx 30rpx; color: #fff; font-size: 12px" class="fdButtonBox aui-text-success"
@click="goNewPay(slotProps.data)">复读</text>
<text v-else-if="showNewPayBtn[0] && showNewPayBtn[0].status"
style=" background: #f42c32; border: 0; padding: 15rpx 30rpx; color: #fff; font-size: 12px"
class="fdButtonBox aui-text-success" @click="goNewPay(slotProps.data)">复读</text>
<u-icon v-else-if="userVip == null && slotProps.data.type != 0 && slotProps.data.isBuy != 1"
@click="handleClickGetGoodsList(slotProps.data)" class="editIcon" name="shopping-cart-fill"
color="#FF2B57" size="28"></u-icon>
@click="handleClickGetGoodsList(slotProps.data)" class="editIcon"
name="shopping-cart-fill" color="#FF2B57" size="28"></u-icon>
</view>
</view>
</view>
@@ -117,48 +152,70 @@
<view :style="`${slotProps1.row.isAudition == 1 || slotProps1.row.isLearned == 1 || slotProps1.row.isLearned == 0
? 'width:calc(100% - 100rpx);float:left;'
: 'width:100%;'}`">
<text :class="`${slotProps1.row.viewFlg == 1 ? 'aui-text-success' : ''}`">{{ slotProps1.row.title }}</text>
<text :class="`${slotProps1.row.viewFlg == 1 ? 'aui-text-success' : ''}`">{{
slotProps1.row.title }}</text>
</view>
</template>
<template slot="leftSlot" slot-scope="slotProps1">
</template>
<template slot="rightSlot" slot-scope="slotProps1">
<text class="fdButtonBox aui-text-success" style="background: none"
v-if="slotProps.data.isBuy == 0&&slotProps1.row.isAudition == 1&&userVip==null">试听</text>
<template v-if="slotProps.data.isBuy == 1 || userVip!=null">
<uni-tag v-if="slotProps1.row.isLearned == 0" style="position: absolute; right: 10rpx; top: 5rpx;"
:inverted="true" text="未学" size="mini" type="primary" />
<uni-tag v-if="slotProps1.row.isLearned == 1" style="position: absolute; right: 10rpx; top: 5rpx;"
:inverted="true" text="已学" size="mini" type="success" />
<text class="fdButtonBox aui-text-success" style="background: none"
v-if="curriculumData.adminControl == 1&&slotProps.data.isBuy == 0 && slotProps1.row.isAudition == 1">试听</text>
<view v-if="curriculumData.adminControl == 1&&slotProps.data.isBuy == 1&&slotProps1.row.isAudition == 0">
<uni-tag v-if="curriculumData.adminControl == 1&&slotProps.data.isBuy == 1&&slotProps1.row.isAudition == 0&&slotProps1.row.isLearned == 0"
style="position: absolute; right: 10rpx; top: 5rpx;" :inverted="true"
text="未学" size="mini" type="primary" />
<uni-tag v-if="curriculumData.adminControl == 1&&slotProps.data.isBuy == 1&&slotProps1.row.isAudition == 0&&slotProps1.row.isLearned == 1"
style="position: absolute; right: 10rpx; top: 5rpx;" :inverted="true"
text="已学" size="mini" type="success" />
</view>
<view class="shitingTag"
v-if="curriculumData.adminControl == 1&&slotProps.data.isBuy == 0&&slotProps1.row.isAudition == 0"
style="position: absolute; right: 0; top: 0;width:100rpx;overflow: hidden;">
<u-icon style="float: right;" name="lock" color="#7dc1f0 "
size="24"></u-icon>
</view>
<text class="fdButtonBox aui-text-success" style="background: none"
v-if="curriculumData.adminControl == 0 && slotProps.data.isBuy == 0 && slotProps1.row.isAudition == 1 && userVip == null">试听</text>
<template
v-if="curriculumData.adminControl == 0 && slotProps.data.isBuy == 1 || userVip != null">
<uni-tag v-if="slotProps1.row.isLearned == 0"
style="position: absolute; right: 10rpx; top: 5rpx;" :inverted="true"
text="未学" size="mini" type="primary" />
<uni-tag v-if="slotProps1.row.isLearned == 1"
style="position: absolute; right: 10rpx; top: 5rpx;" :inverted="true"
text="已学" size="mini" type="success" />
</template>
<view class="shitingTag" v-if="slotProps.data.type != 0" style="position: absolute; right: 0; top: 0;">
<u-icon
v-if="
slotProps.data.isBuy == 0 &&
<view class="shitingTag"
v-if="curriculumData.adminControl == 0 && slotProps.data.type != 0"
style="position: absolute; right: 0; top: 0;width:100rpx;overflow: hidden;">
<u-icon style="float: right;" v-if="slotProps.data.isBuy == 0 &&
userVip == null &&
slotProps1.row.isAudition == 0
"
name="lock"
color="#7dc1f0 "
size="22"
></u-icon>
" name="lock" color="#7dc1f0 " size="22"></u-icon>
</view>
<view class="shitingTag" v-if="slotProps.data.type == 0" style="position: absolute; right: 0; top: 0;">
<u-icon
v-if="
userVip == null &&
<view class="shitingTag"
v-if="curriculumData.adminControl == 0 && slotProps.data.type == 0"
style="position: absolute; right: 0; top: 0;width:100rpx;overflow: hidden;">
<u-icon style="float: right;" v-if="userVip == null &&
slotProps1.row.isAudition == 0 &&
slotProps.data.isBuy == 0
"
name="lock"
color="#7dc1f0 "
size="24"
></u-icon>
" name="lock" color="#7dc1f0 " size="24"></u-icon>
</view>
</template>
</courseDescription>
</view>
<view class="small_class_teaching_box">
@@ -170,8 +227,8 @@
</view>
<view class="progress_box">
<view class="progress_icon" style="">
<u-line-progress activeColor="#294a97"
height="10" :percentage="slotProps.data.completion"
<u-line-progress activeColor="#294a97" height="10"
:percentage="slotProps.data.completion"
:showText="false"></u-line-progress>
<text style="
font-size: 28rpx;
@@ -186,12 +243,15 @@
</view>
<view class="linkPro" v-if="tjProList.length > 0">
<uni-section style="padding: 0 20rpx;" class="mb-10 graybg" title="相关书籍" type="line"></uni-section>
<uni-section style="padding: 0 20rpx;" class="mb-10 graybg" title="相关书籍"
type="line"></uni-section>
<view class="list supermarketBox">
<scroll-view class="scroll-view_H" scroll-x="true">
<view class="item" v-for="(item, index) in tjProList" :key="index" @click="goToGoodsList(item)">
<view class="item" v-for="(item, index) in tjProList" :key="index"
@click="goToGoodsList(item)">
<view class="imgcontainer" style="position: relative;">
<view v-if="item.isVipPrice==1&&item.vipPrice!=0&&item.vipPrice!=null"
<view
v-if="item.isVipPrice == 1 && item.vipPrice != 0 && item.vipPrice != null"
style="z-index:10;position: absolute;top:0;left:0;text-align: center;font-size: 20rpx;background-color: #f94f04;color: #fff;font-weight: bold;border-radius:4px; line-height: 30rpx; padding:10rpx;box-sizing: border-box;">
VIP优惠</view>
<image :src="item.productImages" mode="aspectFit"></image>
@@ -199,53 +259,35 @@
<view class="name">
{{ item.productName }}
</view>
<text
class="price"
v-if="
item.isVipPrice == 1 &&
<text class="price" v-if="item.isVipPrice == 1 &&
item.vipPrice != 0 &&
item.vipPrice != null
"
>
<text
style="color: #e97512; font-size: 12px; font-weight: bold"
>¥{{ item.vipPrice.toFixed(2) }}</text
>
<text
style="
">
<text style="color: #e97512; font-size: 12px; font-weight: bold">¥{{
item.vipPrice.toFixed(2) }}</text>
<text style="
color: #8a8a8a;
font-size: 10px;
margin-left: 4px;
font-weight: bold;
text-decoration: line-through;
"
>¥{{ Number(item.price) }}</text
>
">¥{{ Number(item.price) }}</text>
</text>
<text
v-else-if="item.activityPrice && item.activityPrice > 0"
class="price"
>
<text
style="color: #e97512; font-size: 12px; font-weight: bold"
>¥{{ item.activityPrice }}</text
>
<text
style="
<text v-else-if="item.activityPrice && item.activityPrice > 0" class="price">
<text style="color: #e97512; font-size: 12px; font-weight: bold">¥{{
item.activityPrice }}</text>
<text style="
color: #8a8a8a;
font-size: 10px;
margin-left: 4px;
font-weight: bold;
text-decoration: line-through;
"
>¥{{ Number(item.price)}}</text
>
">¥{{ Number(item.price) }}</text>
</text>
<text v-else class="price" style="color: #e97512 !important;"
>¥{{ Number(item.price) }}</text
>
<text v-else class="price" style="color: #e97512 !important;">¥{{
Number(item.price) }}</text>
</view>
</scroll-view>
</view>
@@ -256,9 +298,9 @@
</view>
</template>
</common-anchor-link>
<common-select-goods :isFudu="isFudu" ref="commonSelectGoods" :selectGoodsData="selectGoodsData" :goodsList="goodsList"
:buyOptions="buyOptions" :customButtonGroup1="customButtonGroup1" @selectGoods="handleClickSelectGoods"
@onHandleClickBuy="
<common-select-goods :isFudu="isFudu" ref="commonSelectGoods" :selectGoodsData="selectGoodsData"
:goodsList="goodsList" :buyOptions="buyOptions" :customButtonGroup1="customButtonGroup1"
@selectGoods="handleClickSelectGoods" @onHandleClickBuy="
$refs.commonSelectGoods.close();
protocolShow = true;
"></common-select-goods>
@@ -290,6 +332,32 @@
</view>
</view>
</u-popup>
<u-popup :show="kefuShow" mode="center" round="6" @close="kefuShow = false">
<view class="popup_box">
<view class="title">咨询课程</view>
<view class="content">
<view class="center">
<text style="color: #f42c32 ;">此课程仅限为做过心理人格测试,结果显示均为正常的用户开放购买权限。</text>
<br /><text style="color: #838588;font-size: 13px;">点击图片后长按图片保存到手机,或使用微信扫描二维码添加客服企业微信。</text>
<view>
<image @click="previewImage('/static/qiyeWx.jpg')" src="/static/qiyeWx.jpg" mode="widthFix"
style="width: 120px; height: 120px; margin: 40rpx auto 0rpx;"></image>
</view>
</view>
<view class="bottom" style="margin-top: 30px;">
<view class="button_box">
<u-button size="small" text="关闭" @click="kefuShow = false"></u-button>
<!-- <u-button text="同意" color="#7dc1f0" size="small" @click="onHandleClickBuy"></u-button> -->
</view>
</view>
</view>
</view>
</u-popup>
</view>
</template>
@@ -309,6 +377,7 @@
},
data() {
return {
kefuShow: false,
isHideCourseInfo: false,
courseList: [],
showGoBuy: true,
@@ -389,12 +458,14 @@
onHide() {
this.selectGoodsData = {};
this.protocolShow = false;
this.kefuShow = false;
this.handleClickClose();
this.$refs.commonSelectGoods.close();
},
onUnload() {
this.selectGoodsData = {};
this.protocolShow = false;
this.kefuShow = false;
this.$refs.commonSelectGoods.close();
},
computed: {
@@ -402,11 +473,31 @@
},
onShow() {
this.protocolShow = false;
this.kefuShow = false;
this.$nextTick(() => {
this.getCourseDescriptionData();
});
},
methods: {
// 放大图片
previewImage(url) {
console.log(url);
this.showCodeImg = false
uni.previewImage({
urls: [url],
// longPressActions: {
// itemList: ["很抱歉,暂不支持保存图片到本地"],
// success: function (res) {
// // console.log(res,'+++++')
// },
// },
});
},
openKefu(data) {
console.log('data at line 400:', data)
this.kefuShow = true;
},
//删除文本里的图片
removeImagesFromHTML() {
const cleanText = this.curriculumData.content.replace(/<img[^>]*>/g, '');
@@ -479,7 +570,13 @@
} else if (type == 9) {
role = '中西汇通学';
}
this.goBuyTitle = '尊贵的'+role+'VIP您的有效期到'+res.userVip.endTime;
if (res.userVip.endTime) {
var time = res.userVip.endTime ? res.userVip.endTime.split(' ')[0] : ''
} else {
var time = ''
}
this.goBuyTitle = '尊贵的' + role + 'VIP您的有效期到' + time;
this.goBuyType = 1;
} else { //否则没有开通vip
this.goBuyTitle = '';
@@ -682,6 +779,14 @@
},
//课程详情
async gotoDetail(data, index, slotProps) {
console.log(data, '1111111111111')
if (this.curriculumData.adminControl == 1) {
if (data.isAudition == 1 || this.cateList[slotProps.index].isBuy == 1) {
this.goVideo(data);
} else {
this.$commonJS.showToast("请先购买课程");
}
} else
if (this.userVip) {
this.goVideo(data);
} else {
@@ -800,10 +905,12 @@
<style lang="scss" scoped>
@import "@/static/mixin.scss";
.commonPageBox {
height: 100vh;
background: #eff5f8 !important;
}
.searchList {
.item {
font-size: 28rpx;
@@ -999,6 +1106,7 @@
}
}
}
/deep/.scroll-view-item:nth-child(2n-1) {
background-color: transparent !important;
}
@@ -1334,9 +1442,8 @@
/deep/.u-line-progress__background {
background: #fff !important;
}
.course_info_box {
}
.course_info_box {}
.catalogue_title {
background: #294a97;
@@ -1397,9 +1504,7 @@
text-align: center;
}
.shiting_content {
}
.shiting_content {}
}
.chapter_title {
@@ -1517,6 +1622,7 @@
padding-bottom: 10rpx;
color: #333;
}
/deep/ .prof img {
width: 100%;
}
@@ -1524,6 +1630,7 @@
.containerBg {
padding-bottom: 30rpx;
}
.containerBg1 {
padding: 20rpx 0;
background: #fff;
@@ -1569,11 +1676,13 @@
align-items: center;
justify-content: space-between;
}
.describe_block text {
display: block;
font-size: 26rpx;
padding-right: 10rpx;
}
.describe_block button {
display: inline-block;
text-align: center;
@@ -1584,6 +1693,7 @@
line-height: 50rpx;
height: 50rpx;
}
.hidden2 {
line-height: 24px;
max-height: 48px;
@@ -1604,6 +1714,7 @@
box-shadow: 0px 0px 10px 0px #a7bbe4;
}
}
.scroll-view_H {
white-space: nowrap;
padding: 20rpx 10rpx;
@@ -1635,13 +1746,18 @@
}
}
}
/deep/.uni-section-header__decoration {
width: 14px;
height: 34px;
}
/deep/.distraction {
font-size: 32rpx !important;
color: #294a97 !important;
font-weight: bold;
}
</style>
/deep/.wrapper .section .content {
margin-top: 0 !important;
}</style>

View File

@@ -44,7 +44,7 @@
<u-popup key="1" v-if="showCodeImg" :show="showCodeImg" :round="10" @close="closePup">
<view class="box6">
<text style="color: #999; margin-bottom: 20rpx;">点击图片后长按图片保存到手机或使用微信扫描二维码添加客服企业微信</text>
<image src="/static/qiyeWx.jpg" mode="widthFix" style="width: 100px; height: 100px; margin: 0 auto;"></image>
<image @click="previewImage('/static/qiyeWx.jpg')" src="/static/qiyeWx.jpg" mode="widthFix" style="width: 100px; height: 100px; margin: 0 auto;"></image>
</view>
</u-popup>
</view>
@@ -124,6 +124,20 @@ export default {
},
methods: {
...mapMutations(["setUserInfo"]),
// 放大图片
previewImage(url) {
console.log(url);
this.showCodeImg = false
uni.previewImage({
urls: [url],
// longPressActions: {
// itemList: ["很抱歉,暂不支持保存图片到本地"],
// success: function (res) {
// // console.log(res,'+++++')
// },
// },
});
},
closePup(){
this.showCodeImg = false
},