Эх сурвалжийг харах

修改: 1.研究报告图片不可点击;2.如果跳转动态详情时不带标题,则后面补充;3.课程详情课程日期显示;4.课程列表按钮显示修改

littleblue55 2 долоо хоног өмнө
parent
commit
2fd39857c4

+ 12 - 4
pages/dynamic/dynamicDetail/dynamicDetail.vue

@@ -40,6 +40,12 @@
 		getDynamicDetail(id).then(res => {
 		getDynamicDetail(id).then(res => {
 			if (res?.data) {
 			if (res?.data) {
 				announcement.value = res.data
 				announcement.value = res.data
+				if(!currentTitle.value){
+					currentTitle.value = res.data.title;
+					uni.setNavigationBarTitle({
+						title: title
+					});
+				}
 			}
 			}
 		})
 		})
 	}
 	}
@@ -48,10 +54,12 @@
 			id, title
 			id, title
 		} = option
 		} = option
 		currentId.value = id
 		currentId.value = id
-		currentTitle.value = title
-		uni.setNavigationBarTitle({
-			title: title
-		});
+		if(title){
+			currentTitle.value = title
+			uni.setNavigationBarTitle({
+				title: title
+			});
+		}
 		init(id)
 		init(id)
 	})
 	})
 	
 	

+ 27 - 66
pages/goOnEdu/course/courseDetail/courseDetail.vue

@@ -24,7 +24,7 @@
 					<view class="text-title">课程概述</view>
 					<view class="text-title">课程概述</view>
 					<view class="text-content">{{courseDetail.summary}}</view>
 					<view class="text-content">{{courseDetail.summary}}</view>
 					<view class="text-title">课程时间</view>
 					<view class="text-title">课程时间</view>
-					<view class="text-content">{{courseDetail.courseDate}}</view>
+					<view class="text-content">{{courseDetail.courseDate ? getDateWeek(courseDetail.courseDate) : ''}}</view>
 					<view class="text-title">培训地点</view>
 					<view class="text-title">培训地点</view>
 					<view class="text-content">{{courseDetail.loc}}</view>
 					<view class="text-content">{{courseDetail.loc}}</view>
 					<view class="text-tip" v-if="!isMember">个人会员或单位会员免费,点击现在入会></view>
 					<view class="text-tip" v-if="!isMember">个人会员或单位会员免费,点击现在入会></view>
@@ -144,7 +144,7 @@
 			if (res?.data) {
 			if (res?.data) {
 				courseDetail.value = res.data;
 				courseDetail.value = res.data;
 				showBuy.value = showBuyAction()
 				showBuy.value = showBuyAction()
-				if(courseDetail.value.loc === '微信视频号' && new Date(formatDateS(courseDetail.value.courseDate)) < new Date()){
+				if(courseDetail.value.regType === '1' && new Date(formatDateS(courseDetail.value.courseDate)) < new Date()){
 					// console.log(123456)
 					// console.log(123456)
 					getVideo()
 					getVideo()
 				}
 				}
@@ -168,11 +168,6 @@
 		// console.log("购买该课程", courseDetail.value.id)
 		// console.log("购买该课程", courseDetail.value.id)
 	}
 	}
 
 
-	// 定义 Canvas 画布尺寸(按 5:4 比例)
-	const canvasWidth = ref(750); // 推荐 2倍图尺寸
-	const canvasHeight = ref(600);
-	const shareImageUrl = ref(''); // 存储处理后的图片路径
-
 	// 获取图片信息
 	// 获取图片信息
 	const getImageInfo = (imgUrl) => {
 	const getImageInfo = (imgUrl) => {
 		return new Promise((resolve) => {
 		return new Promise((resolve) => {
@@ -184,63 +179,6 @@
 		});
 		});
 	};
 	};
 
 
-	// 动态裁剪并填充背景
-	const processShareImage = async (imgUrl) => {
-		try {
-			const imageInfo = await getImageInfo(imgUrl);
-			if (!imageInfo) return imgUrl;
-
-			const ctx = uni.createCanvasContext('shareCanvas', this);
-			const targetRatio = 5 / 4;
-			const originalRatio = imageInfo.width / imageInfo.height;
-
-			// 1. 绘制背景填充
-			ctx.setFillStyle('#FFFFFF'); // 自定义背景色
-			ctx.fillRect(0, 0, canvasWidth.value, canvasHeight.value);
-
-			// 2. 计算绘制区域
-			if (originalRatio < targetRatio) {
-				// 比例不足时:居中缩放 + 左右填充
-				const scale = canvasHeight.value / imageInfo.height;
-				const drawWidth = imageInfo.width * scale;
-				ctx.drawImage(
-					imageInfo.path,
-					(canvasWidth.value - drawWidth) / 2, // 水平居中
-					0,
-					drawWidth,
-					canvasHeight.value
-				);
-			} else {
-				// 比例足够时:裁剪中间区域
-				const cropWidth = imageInfo.height * targetRatio;
-				ctx.drawImage(
-					imageInfo.path,
-					(imageInfo.width - cropWidth) / 2, // 水平居中裁剪
-					0,
-					cropWidth,
-					imageInfo.height,
-					0,
-					0,
-					canvasWidth.value,
-					canvasHeight.value
-				);
-			}
-
-			// 3. 导出临时图片
-			ctx.draw(false, () => {
-				setTimeout(async () => { // 解决 Canvas 渲染延迟
-					const res = await uni.canvasToTempFilePath({
-						canvasId: 'shareCanvas',
-						fileType: 'jpg',
-						quality: 0.9
-					});
-					shareImageUrl.value = res.tempFilePath;
-				}, 300);
-			});
-		} catch (err) {
-			return imgUrl; // 降级处理
-		}
-	};
 
 
 	function toSend() {
 	function toSend() {
 		sendComment({
 		sendComment({
@@ -339,6 +277,29 @@
 	function formatDateS(dateStr) {
 	function formatDateS(dateStr) {
 		return dateStr.replace(" ", "T");
 		return dateStr.replace(" ", "T");
 	}
 	}
+	
+	// 日期格式:xxxx年xx月xx日(星期x)
+	function getDateWeek(dateStr) {
+		console.log(dateStr,"dateStr")
+		// 将日期字符串转换为 Date 对象
+		  const date = new Date(dateStr.replace(/-/g, '/'));
+		  // 检查日期是否有效
+		  if (isNaN(date.getTime())) {
+		    return dateStr; // 如果无效,返回原字符串
+		  }
+		  // 获取年月日
+		  const year = date.getFullYear();
+		  const month = String(date.getMonth() + 1).padStart(2, '0');
+		  const day = String(date.getDate()).padStart(2, '0');
+		  // 获取星期几
+		  const weekdays = ['日', '一', '二', '三', '四', '五', '六'];
+		  const weekday = weekdays[date.getDay()];
+		  // 获取时分
+		  const hours = String(date.getHours()).padStart(2, '0');
+		  const minutes = String(date.getMinutes()).padStart(2, '0');
+		  // 组合成新格式
+		  return `${year}-${month}-${day}(星期${weekday}) ${hours}:${minutes}`;
+	}
 
 
 	function formatTime(timeString) {
 	function formatTime(timeString) {
 		const commentDate = new Date(formatDateS(timeString));
 		const commentDate = new Date(formatDateS(timeString));
@@ -367,7 +328,7 @@
 	});
 	});
 
 
 	onShareAppMessage(async (res) => {
 	onShareAppMessage(async (res) => {
-		const processedImage = await processShareImage(courseDetail.value.cover);
+		const processedImage = courseDetail.value.cover;
 		// console.log(processedImage)
 		// console.log(processedImage)
 		return {
 		return {
 			title: courseName.value,
 			title: courseName.value,
@@ -447,7 +408,7 @@
 	}
 	}
 	
 	
 	const videoShow = computed(()=>{
 	const videoShow = computed(()=>{
-		return courseDetail.value?.loc==='微信视频号' && !feedShow.value
+		return (courseDetail.value?.regType ==='1') && !feedShow.value
 	})
 	})
 </script>
 </script>
 <style lang="scss">
 <style lang="scss">

+ 213 - 69
pages/goOnEdu/course/courseHome/courseHome.vue

@@ -20,26 +20,82 @@
 					<view class="course-item-content">
 					<view class="course-item-content">
 						<view class="course-title">
 						<view class="course-title">
 							<text>{{ course.courseName }}</text>
 							<text>{{ course.courseName }}</text>
-							<image style="width: 25rpx;height: 25rpx;padding-left: 20rpx;"
+							<!-- 1.隐藏收藏功能 -->
+							<!-- <image style="width: 25rpx;height: 25rpx;padding-left: 20rpx;"
 								:src="course.hasFavi ? `${FILE_URL}/edu-icon/favi-icon.png` : `${FILE_URL}/edu-icon/no-favi-icon.png`"
 								:src="course.hasFavi ? `${FILE_URL}/edu-icon/favi-icon.png` : `${FILE_URL}/edu-icon/no-favi-icon.png`"
 								@click.stop="collectCourse(course.id, index, course.hasFavi)">
 								@click.stop="collectCourse(course.id, index, course.hasFavi)">
-							</image>
+							</image> -->
 						</view>
 						</view>
 						<view class="course-type">{{ course.courseType }}</view>
 						<view class="course-type">{{ course.courseType }}</view>
 						<view class="course-teacher">
 						<view class="course-teacher">
 							<u-icon name="account" size="28"></u-icon>
 							<u-icon name="account" size="28"></u-icon>
-							{{ course.name }}
+							{{ course.lecturer }}
 						</view>
 						</view>
 						<view class="course-date">
 						<view class="course-date">
 							<u-icon name="clock" size="28"></u-icon>
 							<u-icon name="clock" size="28"></u-icon>
 							{{ getDateWeek(course.courseDate) }}
 							{{ getDateWeek(course.courseDate) }}
 						</view>
 						</view>
-						<view class="course-price"
+						<!-- <view class="course-price"
 							v-if=" (course.viewMode === '3') || (isMember && course.viewMode==='2')">
 							v-if=" (course.viewMode === '3') || (isMember && course.viewMode==='2')">
 							¥{{ isMember ? course.priceMember : course.price }}元
 							¥{{ isMember ? course.priceMember : course.price }}元
 						</view>
 						</view>
-						<view v-else style="height: 30rpx;width: 100%;"></view>
-						<button :class="['button', getButtonClass(course)]">{{ getButtonText(course) }}</button>
+						<view v-else style="height: 30rpx;width: 100%;"></view> -->
+						<!-- 如果没结束 -->
+						<view class="func" v-if="course.status !== '2' && course.status !== '3'">
+							<!-- 如果是免费,直接显示免费 -->
+							<view v-if="course.viewMode==='1'" class="func-box" style="justify-content: flex-end;">
+								<view class="button free">免费</view>
+							</view>
+							<view v-else-if="course.viewMode==='2' && isMember" class="func-box">
+								<view class="price">¥{{ course.price }}元</view>
+								<view class="button member-free">会员免费</view>
+							</view>
+							<view v-else-if="course.viewMode==='2' && !isMember" class="func-box">
+								<view style="flex: 0 0 auto;display: flex;align-items: center;">
+									<view class="member-free">
+										会员免费
+									</view>
+									<view class="not-member-price">
+										非会员:¥{{course.price}}元
+									</view>
+								</view>
+								<view :class="['button', course.hasBuy ? 'free' : 'buy']">
+									{{course.hasBuy ? '已购买' : '立即购买'}}
+								</view>
+							</view>
+							<view v-else-if="course.viewMode==='3' && course.price===course.priceMember"
+								class="func-box">
+								<view class="price">¥{{ course.price }}元</view>
+								<view :class="['button', course.hasBuy ? 'free' : 'buy']">
+									{{course.hasBuy ? '已购买' : '立即购买'}}
+								</view>
+							</view>
+							<view v-else-if="course.viewMode==='3' && course.price!==course.priceMember"
+								class="func-box">
+								<view style="flex: 0 0 auto;display: flex;align-items: center;">
+									<view class="member-free">
+										{{`会员:${course.priceMember}元`}}
+									</view>
+									<view class="not-member-price">
+										非会员:¥{{course.price}}元
+									</view>
+								</view>
+								<view :class="['button', course.hasBuy ? 'free' : 'buy']">
+									{{course.hasBuy ? '已购买' : '立即购买'}}
+								</view>
+							</view>
+						</view>
+						<!-- <button :class="['button', getButtonClass(course)]">{{ getButtonText(course) }}</button> -->
+						<!-- 如果课程结束了 -->
+						<view class="func" v-else>
+							<!-- regType: 0 线下 ;1 线上 -->
+							<view v-if="course.regType==='0'" class="func-box" style="justify-content: flex-end;">
+								<view class="button-long over" @click="toPage(course)">已结束,点击查看活动</view>
+							</view>
+							<view v-if="course.regType==='1'" class="func-box" style="justify-content: flex-end;">
+								<view class="button-long over" @click="toAct(course.actId)">已结束,点击查看回放</view>
+							</view>
+						</view>
 					</view>
 					</view>
 				</view>
 				</view>
 				<u-line />
 				<u-line />
@@ -99,7 +155,7 @@
 	const loadText = {
 	const loadText = {
 		loadmore: '点击或上拉加载更多',
 		loadmore: '点击或上拉加载更多',
 		loading: '努力加载中',
 		loading: '努力加载中',
-		nomore: '实在没有了'
+		nomore: '已加载全部数据'
 	}
 	}
 	// 展示的课程
 	// 展示的课程
 	const filterCourses = ref([]);
 	const filterCourses = ref([]);
@@ -116,11 +172,14 @@
 		viewMode: "免费" // 新增字段,标识课程的付费类型
 		viewMode: "免费" // 新增字段,标识课程的付费类型
 	}, ]);
 	}, ]);
 
 
-	// 按钮的文字
+	// 列表样式-按钮的文字
 	function getButtonText(course) {
 	function getButtonText(course) {
-		const currentDate = new Date();
-		const classDate = new Date(course.courseDate);
+		console.log(course)
+		// const currentDate = new Date();
+		// const classDate = new Date(formatDateS(course.courseDate));
+		// if(currentDate > classDate) {
 
 
+		// }
 		if (course.viewMode === '1') {
 		if (course.viewMode === '1') {
 			return "免费";
 			return "免费";
 		}
 		}
@@ -128,7 +187,8 @@
 			if (isMember.value) return "会员免费";
 			if (isMember.value) return "会员免费";
 			if (!course.hasBuy && !isMember.value) return "会员免费";
 			if (!course.hasBuy && !isMember.value) return "会员免费";
 			if (course.hasBuy) {
 			if (course.hasBuy) {
-				return currentDate < classDate ? "点击查看" : "点击查看回放";
+				// return currentDate < classDate ? "点击查看" : "点击查看回放";
+				return "点击查看";
 			}
 			}
 		}
 		}
 
 
@@ -140,8 +200,7 @@
 		return "error"; // 默认返回
 		return "error"; // 默认返回
 	}
 	}
 
 
-
-	// 按钮的样式
+	// 列表样式-按钮的样式
 	function getButtonClass(course) {
 	function getButtonClass(course) {
 		if (courseMember[course.viewMode] === '免费') return 'free';
 		if (courseMember[course.viewMode] === '免费') return 'free';
 		if (courseMember[course.viewMode] === '会员免费') {
 		if (courseMember[course.viewMode] === '会员免费') {
@@ -155,17 +214,30 @@
 		return 'error';
 		return 'error';
 	}
 	}
 
 
+	function formatDateS(dateStr) {
+		return dateStr.replace(" ", "T");
+	}
 
 
 	// 日期格式:xxxx年xx月xx日(星期x)
 	// 日期格式:xxxx年xx月xx日(星期x)
-	function getDateWeek(val) {
-		const date = new Date(val);
-		const daysOfWeek = ['日', '一', '二', '三', '四', '五', '六'];
-		const year = date.getFullYear();
-		const month = date.getMonth() + 1; // 注意:月份从0开始
-		const day = date.getDate();
-		const dayOfWeek = daysOfWeek[date.getUTCDay()];
-		// const result = `${year}年${month}月${day}日(星期${dayOfWeek})`
-		return `${year}年${month}月${day}日(星期${dayOfWeek})`
+	function getDateWeek(dateStr) {
+		// 将日期字符串转换为 Date 对象
+		  const date = new Date(dateStr.replace(/-/g, '/'));
+		  // 检查日期是否有效
+		  if (isNaN(date.getTime())) {
+		    return dateStr; // 如果无效,返回原字符串
+		  }
+		  // 获取年月日
+		  const year = date.getFullYear();
+		  const month = String(date.getMonth() + 1).padStart(2, '0');
+		  const day = String(date.getDate()).padStart(2, '0');
+		  // 获取星期几
+		  const weekdays = ['日', '一', '二', '三', '四', '五', '六'];
+		  const weekday = weekdays[date.getDay()];
+		  // 获取时分
+		  const hours = String(date.getHours()).padStart(2, '0');
+		  const minutes = String(date.getMinutes()).padStart(2, '0');
+		  // 组合成新格式
+		  return `${year}-${month}-${day}(星期${weekday}) ${hours}:${minutes}`;
 	}
 	}
 
 
 	// 切换搜索框下面的tab
 	// 切换搜索框下面的tab
@@ -176,13 +248,13 @@
 		pageNumber.value = 1
 		pageNumber.value = 1
 		search(searchForm.value.keyword)
 		search(searchForm.value.keyword)
 	}
 	}
-
+	// 搜索
 	function toSearch(e) {
 	function toSearch(e) {
 		// 搜索时pageNumber为1
 		// 搜索时pageNumber为1
 		pageNumber.value = 1
 		pageNumber.value = 1
 		search(e)
 		search(e)
 	}
 	}
-	// 搜索
+	// 获取列表数据
 	function search(e) {
 	function search(e) {
 		// 如果是全部,则不传courseType这个值
 		// 如果是全部,则不传courseType这个值
 		searchForm.value = {
 		searchForm.value = {
@@ -226,7 +298,7 @@
 			courses.value[index].hasFavi = courses.value[index].hasFavi
 			courses.value[index].hasFavi = courses.value[index].hasFavi
 		}
 		}
 	}
 	}
-	// 初始化
+	// 初始化:获取分类数据和列表数据
 	async function init() {
 	async function init() {
 		const res = await loadCourseCate()
 		const res = await loadCourseCate()
 		if (res?.data) {
 		if (res?.data) {
@@ -238,19 +310,27 @@
 			search("");
 			search("");
 		}
 		}
 	}
 	}
-
+	// 跳转到课程详情页
 	function toPage(course) {
 	function toPage(course) {
 		uni.navigateTo({
 		uni.navigateTo({
 			url: `/pages/goOnEdu/course/courseDetail/courseDetail?id=${course.id}&title=${course.courseName}`
 			url: `/pages/goOnEdu/course/courseDetail/courseDetail?id=${course.id}&title=${course.courseName}`
 		});
 		});
 	}
 	}
-
+	// 加载更多
 	function loadmore() {
 	function loadmore() {
 		if (courses.value.length === total.value) {
 		if (courses.value.length === total.value) {
 			return;
 			return;
 		}
 		}
 		search(searchForm.value.keyword);
 		search(searchForm.value.keyword);
 	}
 	}
+	
+	function toAct(actId){
+		// console.log(actId);
+		uni.navigateTo({
+			url: `/pages/dynamic/dynamicDetail/dynamicDetail?id=${actId}`
+		})
+	}
+
 	onMounted(() => {
 	onMounted(() => {
 		isMember.value = authStore.userInfo.isMember === 1 ? true : false
 		isMember.value = authStore.userInfo.isMember === 1 ? true : false
 		init();
 		init();
@@ -319,53 +399,117 @@
 				letter-spacing: 2rpx;
 				letter-spacing: 2rpx;
 			}
 			}
 
 
+			.func {
+				display: flex;
+				justify-content: space-between;
+				align-items: flex-end;
+				font-size: $uni-font-size-2;
+				font-weight: bold;
+				margin-top: 10rpx;
+				view {
+					margin-bottom: 0rpx;
+				}
+				.func-box {
+					display: flex;
+					justify-content: space-between;
+					width: 100%;
+					align-items: center;
+				}
+
+				.button {
+					text-align: center;
+					width: 130rpx;
+				}
+				.button-long {
+					text-align: center;
+					width: 270rpx;
+				}
+
+				.price {
+					color: $uni-color-error;
+					font-size: $uni-title-font-size-2;
+				}
+
+				.not-member-price {
+					font-size: $uni-font-size-3;
+					color: $uni-text-color-grey;
+					text-align: end;
+				}
+
+				.buy {
+					padding: 6rpx 25rpx;
+					background-color: $uni-color-error;
+					border-radius: $uni-card-border-radius;
+					color: $uni-text-color-inverse;
+				}
+
+				.free {
+					padding: 6rpx 25rpx;
+					background-color: $uni-color-primary;
+					border-radius: $uni-card-border-radius;
+					color: $uni-text-color-inverse;
+				}
+				.over{
+					padding: 6rpx 25rpx;
+					border-radius: $uni-card-border-radius;
+					color: $uni-text-color-inverse;
+					background-color: #8f9092;
+				}
+
+				.member-free {
+					padding: 10rpx 20rpx;
+					@include backgroundImg('http://www.gzrea.org.cn:8543/icon/wxmp/bg-label.png');
+					color: $uni-text-color;
+				}
+			}
+
 			.button::after {
 			.button::after {
 				content: none;
 				content: none;
 				/* 移除内容 */
 				/* 移除内容 */
 			}
 			}
 
 
-			.button {
-				position: absolute;
-				right: 0;
-				bottom: 0;
-				min-width: 80px;
-				padding: 0 40rpx;
-				white-space: nowrap;
-				height: 45rpx;
-				line-height: 45rpx;
-				font-size: 22rpx;
-				/* padding: 0; */
-				border-radius: 50rpx;
-				color: white;
-				border: none;
-			}
-
-			.free {
-				background-color: #006af4;
-			}
-
-			.purchase {
-				background-color: #fe0000;
-			}
-
-			.member-free {
-				background-color: transparent;
-				background-image: url('http://www.gzrea.org.cn:8543/icon/wxmp/bg-label.png');
-				background-size: cover;
-				background-repeat: no-repeat;
-				color: #000;
-				height: initial;
-				padding: 6rpx 0 3rpx;
-				border-radius: 0;
-			}
-
-			.replay {
-				background-color: #006af4;
-			}
-
-			.purchased {
-				background-color: #006af4;
-			}
+			// .button {
+			// 	position: absolute;
+			// 	right: 0;
+			// 	bottom: 0;
+			// 	min-width: 80px;
+			// 	padding: 0 40rpx;
+			// 	white-space: nowrap;
+			// 	height: 45rpx;
+			// 	line-height: 45rpx;
+			// 	font-size: 22rpx;
+			// 	/* padding: 0; */
+			// 	border-radius: 50rpx;
+			// 	color: white;
+			// 	border: none;
+			// }
+
+			// .free {
+			// 	background-color: #006af4;
+			// }
+
+			// .purchase {
+			// 	background-color: #fe0000;
+			// }
+
+			// .member-free {
+			// 	background-color: transparent;
+			// 	background-image: url('http://www.gzrea.org.cn:8543/icon/wxmp/bg-label.png');
+			// 	background-size: cover;
+			// 	background-repeat: no-repeat;
+			// 	color: #000;
+			// 	height: initial;
+			// 	padding: 6rpx 0 3rpx;
+			// 	border-radius: 0;
+			// }
+
+			// .replay {
+			// 	background-color: #006af4;
+			// }
+
+			// .purchased {
+			// 	background-color: #006af4;
+			// }
 		}
 		}
 	}
 	}
 </style>
 </style>

+ 1 - 1
pages/reportDetail/reportDetail.vue

@@ -271,7 +271,7 @@
 					const size = res.data.imgData.size
 					const size = res.data.imgData.size
 					for (let i = 1; i <= size; i++) {
 					for (let i = 1; i <= size; i++) {
 						let image = `${path}/${i}.${type}`
 						let image = `${path}/${i}.${type}`
-						report.value.content = report.value.content + `<img src='${image}'></img>`
+						report.value.content = report.value.content + `<img style='-webkit-touch-callout: none; -webkit-user-select: none; user-select: none; pointer-events: none;' src='${image}'></img>`
 					}
 					}
 				} else {
 				} else {
 					report.value.content = ''
 					report.value.content = ''