liujiaxin 1 week ago
parent
commit
9d3f6a5094
4 changed files with 456 additions and 51 deletions
  1. 16 7
      pages.json
  2. 43 9
      pages_course/living.vue
  3. 26 35
      pages_shopping/live/complaint.vue
  4. 371 0
      pages_shopping/live/complaintList.vue

+ 16 - 7
pages.json

@@ -572,7 +572,7 @@
 							"titleNView": false
 						}
 					}
-				},{
+				}, {
 					"path": "shareLive",
 					"style": {
 						"navigationBarTitleText": "分享直播间",
@@ -813,10 +813,10 @@
 					"style": {
 						"navigationStyle": "custom",
 						"enablePullDownRefresh": false
-						
+
 					}
 
-				},{
+				}, {
 					"path": "live/complaint",
 					"style": {
 						"navigationBarTitleText": "我的反馈",
@@ -826,7 +826,16 @@
 						}
 					}
 				},
-
+				{
+					"path": "live/complaintList",
+					"style": {
+						"navigationBarTitleText": "反馈与投诉",
+						"navigationBarTextStyle": "black",
+						"app-plus": {
+							"bounce": "none"
+						}
+					}
+				},
 				{
 					"path": "live/goods",
 					"style": {
@@ -834,7 +843,7 @@
 						"enablePullDownRefresh": false
 					}
 
-				},{
+				}, {
 					"path": "live/integral",
 					"style": {
 						"navigationBarTitleText": "芳华币",
@@ -888,7 +897,7 @@
 						"enablePullDownRefresh": false
 					}
 
-				},{
+				}, {
 					"path": "live/storeOrderDelivery",
 					"style": {
 						"navigationBarTitleText": "物流信息",
@@ -906,7 +915,7 @@
 						"navigationBarTextStyle": "black"
 					}
 				},
-				
+
 				{
 					"path": "live/storeOrderRefundSubmit",
 					"style": {

+ 43 - 9
pages_course/living.vue

@@ -24,14 +24,14 @@
 								<text class="text-white text-xs">{{ getNicknameInitial(item.nickName) }}</text>
 							</view>
 						</view>
-						<view class="sum">{{ liveUserTotal || 0 }}</view>
+						<view class="sum">{{formattedWatchCount || 0 }}</view>
 					</view>
 				</view>
 
-				<!-- <view class="complaint-box" @click="navgetTo('/pages_shopping/live/complaint')">
-					<image class="image w32 h32 mr10"  src="/static/images/complaint.png" mode="widthFix" />
+				<view class="complaint-box" @click="navgetTo('/pages_shopping/live/complaintList?userId='+userData.userId)">
+					<image class="image w32 h32 mr10" src="/static/images/complaint.png" mode="widthFix" />
 					<view class="fs26">投诉</view>
-				</view> -->
+				</view>
 
 				<!-- 右边的side -->
 				<view class="side-group" :class="{ 
@@ -55,7 +55,7 @@
 
 					<view class="side-item" @click="onLike">
 						<LikeButton :initialCount="100" :heartsPerClick="5" @like="onLike" />
-						<view style="font-size: 30rpx;">{{ (liveViewData && liveViewData.like) || 0 }}</view>
+						<view style="font-size: 30rpx;">{{ formattedLikeCount || 0 }}</view>
 					</view>
 					<view class="side-item">
 						<button open-type="share" class="button button-reset">
@@ -870,6 +870,14 @@
 			};
 		},
 		computed: {
+			// 观看人数
+			formattedWatchCount() {
+				return this.formatNumber(this.liveUserTotal || 0);
+			},
+			//点赞人数
+			formattedLikeCount() {
+				return this.formatNumber(this.liveViewData.like || 0);
+			},
 			filteredViewers() {
 				const safeLiveViewers = Array.isArray(this.liveViewersData) ? this.liveViewersData : [];
 				// 截取前3项
@@ -913,6 +921,9 @@
 			//  清除所有定时器(使用增强清理)
 			// this.clearAllTimersEnhanced();
 			// this.stopHeartBeat();
+			if (this.trafficTimer) {
+				clearInterval(this.trafficTimer);
+			}
 
 			// 页面隐藏时清理部分数据,减少内存占用
 			if (this.talklist && this.talklist.length > 20) {
@@ -1000,7 +1011,30 @@
 			}
 		},
 		methods: {
-
+			formatNumber(num) {
+				if (typeof num !== 'number') {
+					num = Number(num) || 0;
+				}
+				if (num < 10000) {
+					return num.toString();
+				}
+				// 处理万以上的数字
+				const wan = num / 10000;
+				if (wan < 10) {
+					// 1万-10万之间,保留2位小数
+					const rounded = Math.round(wan * 100) / 100;
+					return rounded.toFixed(2).replace(/\.?0+$/, '') + 'w';
+				} else if (wan < 10000) {
+					// 10万-1亿之间,保留1位小数
+					const rounded = Math.round(wan * 10) / 10;
+					return rounded.toFixed(1).replace(/\.0$/, '') + 'w';
+				} else {
+					// 1亿以上,转换为亿单位
+					const yi = wan / 10000;
+					const rounded = Math.round(yi * 100) / 100;
+					return rounded.toFixed(2).replace(/\.?0+$/, '') + '亿';
+				}
+			},
 			// 重置所有状态
 			resetAllStates() {
 				this.liveUserCalled = false;
@@ -2198,7 +2232,7 @@
 			},
 			// 录播时间点
 			onVideoMetaLoaded(e) {
-				console.log("录播时间点",e)
+				console.log("录播时间点", e)
 				this.videoProgressKey = `videoProgress_${this.liveId}`;
 				this.setVideoProgress();
 			},
@@ -3025,7 +3059,7 @@
 
 			//直播间点赞、关注、在线人数数据
 			getliveViewData() {
-				if ( !this.liveId) return;
+				if (!this.liveId) return;
 				getLiveViewData(this.liveId).then((res) => {
 					if (res.code == 200) {
 						// 强制响应式更新,确保数据实时显示
@@ -3050,7 +3084,7 @@
 				this.getliveViewData();
 				this.liveViewDataTimer = setInterval(() => {
 					// 安全校验:确保liveItem和liveId存在(避免无效请求)
-					if ( this.liveId) {
+					if (this.liveId) {
 						this.getliveViewData();
 					}
 				}, 20000);

+ 26 - 35
pages_shopping/live/complaint.vue

@@ -49,7 +49,8 @@
 
 <script>
 	import { mapGetters } from 'vuex';
-	import{ getTypeTree, complaintRecord,loginByMp } from "@/api/course.js"
+	// complaintRecord
+	import{ getTypeTree,loginByMp } from "@/api/course.js"
 	export default {
 		data() {
 			return {
@@ -59,8 +60,8 @@
 				list: [],
 				feedbackItems: [],
 				userId: '',
-				courseId: '',
-				videoId: '',
+				// courseId: '',
+				// videoId: '',
 				formdata: {
 					complaintContent: ""
 				},
@@ -77,7 +78,7 @@
 				isLastChild: 0,
 				isLogin: false,
 				fileList1: [],
-				projectCode:'',
+				// projectCode:'',
 				code:''
 			};
 		},
@@ -98,33 +99,33 @@
 		},
 		onLoad(option) {
 			this.userId = option.userId || ''
-			this.courseId = option.courseId || ''
-			this.videoId = option.videoId || ''
-			this.projectCode = option.projectCode || ''
+			// this.courseId = option.courseId || ''
+			// this.videoId = option.videoId || ''
+			// this.projectCode = option.projectCode || ''
 			uni.$on('usercode',(data)=>{
 				if(data) {
 					this.code=data.code
 					this.goLogin(data)
 				}
 			})
-			this.utils.getDomain({projectCode:this.projectCode}).then(res=>{
-				if(res.code == 200) {
-					uni.setStorageSync('addressUrl',res.addressUrl)
-					this.utils.isLoginCourseAuto().then(
-						res => {
-							if(res){
-								this.isLogin = true
-								this.getMenuButton()
-								this.getList()
-							} else{
-								this.isLogin = false
-								this.goLogin()
-							}
-						},
-						rej => {}
-					);
-				}
-			})
+			// this.utils.getDomain({projectCode:this.projectCode}).then(res=>{
+			// 	if(res.code == 200) {
+			// 		uni.setStorageSync('addressUrl',res.addressUrl)
+			// 		this.utils.isLoginCourseAuto().then(
+			// 			res => {
+			// 				if(res){
+			// 					this.isLogin = true
+			// 					this.getMenuButton()
+			// 					this.getList()
+			// 				} else{
+			// 					this.isLogin = false
+			// 					this.goLogin()
+			// 				}
+			// 			},
+			// 			rej => {}
+			// 		);
+			// 	}
+			// })
 		},
 		onUnload() {
 			uni.$off('usercode')
@@ -238,15 +239,6 @@
 				});
 				this.$refs.uForm.validate().then(res => {
 					if (res) {
-						const param = {
-							userId: this.userId,
-							complaintTypeId: this.templateId,
-							complaintContent: this.formdata.complaintContent,
-							courseId: this.courseId,
-							videoId: this.videoId,
-							complaintUrl: images.toString()
-						}
-						complaintRecord(param).then(res=>{
 							uni.showModal({
 								title: '',
 								content: '我们已收到您的反馈,谢谢',
@@ -259,7 +251,6 @@
 									}
 								}
 							});
-						})
 					}
 				})
 			},

+ 371 - 0
pages_shopping/live/complaintList.vue

@@ -0,0 +1,371 @@
+<template>
+	<view>
+		<view class="title">请选择投诉原因</view>
+		<view class="list">
+			<view class="item">
+				<view>{{item}}</view>
+				<image class="w30 h30" src="/static/images/arrow_gray.png"></image>
+			</view>
+			
+		</view>
+	</view>
+</template>
+
+<script>
+	import { mapGetters } from 'vuex';
+	// complaintRecord
+	import{ getTypeTree,loginByMp } from "@/api/course.js"
+	export default {
+		data() {
+			return {
+				statusBarHeight: uni.getSystemInfoSync().statusBarHeight,
+				menuButtonH: 45,
+				pageIndex: 0,
+				list: [],
+				feedbackItems: [],
+				userId: '',
+				// courseId: '',
+				// videoId: '',
+				formdata: {
+					complaintContent: ""
+				},
+				rules: {
+					complaintContent:[{
+						required: true,
+						message: '投诉反馈内容不能为空',
+						trigger: ["change", "blur"]
+					}]
+				},
+				text: '',
+				templateId: 0,
+				user: {},
+				isLastChild: 0,
+				isLogin: false,
+				fileList1: [],
+				// projectCode:'',
+				code:''
+			};
+		},
+		computed: {
+			...mapGetters(['coureLogin']),
+		},
+		watch: {
+		    coureLogin: {
+		      immediate: true,          // 页面一进入就检查一次
+		      handler(val) {
+		        if (val == 2) {
+					console.log("AppToken失效,请重新登录")
+					this.isLogin = false
+					this.goLogin()
+		        }
+		      }
+		    }
+		},
+		onLoad(option) {
+			this.userId = option.userId || ''
+			// this.courseId = option.courseId || ''
+			// this.videoId = option.videoId || ''
+			// this.projectCode = option.projectCode || ''
+			uni.$on('usercode',(data)=>{
+				if(data) {
+					this.code=data.code
+					this.goLogin(data)
+				}
+			})
+			// this.utils.getDomain({projectCode:this.projectCode}).then(res=>{
+			// 	if(res.code == 200) {
+			// 		uni.setStorageSync('addressUrl',res.addressUrl)
+			// 		this.utils.isLoginCourseAuto().then(
+			// 			res => {
+			// 				if(res){
+			// 					this.isLogin = true
+			// 					this.getMenuButton()
+			// 					this.getList()
+			// 				} else{
+			// 					this.isLogin = false
+			// 					this.goLogin()
+			// 				}
+			// 			},
+			// 			rej => {}
+			// 		);
+			// 	}
+			// })
+		},
+		onUnload() {
+			uni.$off('usercode')
+		},
+		methods: {
+			getMenuButton(){
+				const menuButtonInfo = uni.getMenuButtonBoundingClientRect()
+				this.menuButtonH = menuButtonInfo.height
+			},
+			goBack() {
+				// 返回上一层逻辑
+				if (this.pageIndex == 0) {
+					uni.navigateBack();
+				} else {
+					this.pageIndex--;
+					this.formdata = {
+						complaintContent: ""
+					}
+					if (this.isLastChild == 1) {
+						this.isLastChild = 0
+					} else {
+						if (this.pageIndex == 0) {
+							this.feedbackItems = this.list
+							this.templateId = 0
+						} else {
+							const list = this.findGrandparentOrAllData(this.list, this.templateId)
+							this.feedbackItems = list.childrenType
+							this.templateId = list.complaintTypeId
+						}
+					}
+				
+				}
+			},
+			findGrandparentOrAllData(data, targetId) {
+				// 递归函数,用于查找目标节点的父级节点
+				function findParent(node, targetId) {
+					if (!node || !node.childrenType) return null;
+			
+					for (let child of node.childrenType) {
+						if (child.complaintTypeId === targetId) {
+							return node; // 找到目标节点的父级节点
+						}
+			
+						const result = findParent(child, targetId); // 递归查找子节点
+						if (result) return result;
+					}
+			
+					return null;
+				}
+			
+				// 遍历顶层节点,查找目标节点的父级和祖父级节点
+				for (let root of data) {
+					if (root.complaintTypeId === targetId) {
+						return data; // 如果目标节点是顶层节点,返回所有数据
+					}
+			
+					const parent = findParent(root, targetId); // 查找目标节点的父级节点
+					if (parent) {
+						const grandparent = findParent(root, parent.complaintTypeId); // 查找父级节点的父级节点
+						return grandparent || data; // 如果找到祖父节点返回祖父节点,否则返回所有数据
+					}
+				}
+			
+				return data; // 如果没有找到目标节点,返回所有数据
+			},
+			handleClick(item,index) {
+				if (this.isLastChild == 1) return
+				if (this.pageIndex >= 0) {
+					this.pageIndex++
+					let children = this.feedbackItems[index].childrenType || [];
+					this.templateId = this.feedbackItems[index].complaintTypeId
+					this.formdata = {
+						complaintContent: ""
+					}
+					this.text = this.feedbackItems[index].complaintTypeName
+					if (children.length > 0) {
+						this.isLastChild = 0
+						this.feedbackItems = children
+						this.templateId = this.feedbackItems[0].complaintTypeId
+					} else {
+						this.isLastChild = 1
+						this.formdata = {
+							complaintContent: ""
+						}
+						setTimeout(() => {
+							this.$refs.uForm.setRules(this.rules)
+						}, 200)
+					}
+				}
+			},
+			getList(){
+				getTypeTree().then(res=>{
+					if(res.code == 200) {
+						this.list = res.data
+						this.pageIndex = 0
+						this.feedbackItems = this.list
+					}
+				})
+			},
+			submit() {
+				if(this.fileList1.some(item=>item.status == 'uploading')) {
+					uni.showToast({
+						title: '等待图片上传中',
+						icon: 'none'
+					})
+					return
+				}
+				var images=[];
+				this.fileList1.forEach(function(element) {
+					images.push(element.url)
+				});
+				this.$refs.uForm.validate().then(res => {
+					if (res) {
+							uni.showModal({
+								title: '',
+								content: '我们已收到您的反馈,谢谢',
+								showCancel: false,
+								success: function (res) {
+									if (res.confirm) {
+										uni.navigateBack()
+									} else if (res.cancel) {
+										uni.navigateBack()
+									}
+								}
+							});
+					}
+				})
+			},
+			deletePic(event) {
+				this[`fileList${event.name}`].splice(event.index, 1)
+			},
+			async afterRead(event) {
+				// 当设置 multiple 为 true 时, file 为数组格式,否则为对象格式
+				let lists = [].concat(event.file)
+				let fileListLen = this[`fileList${event.name}`].length
+				lists.map((item) => {
+					this[`fileList${event.name}`].push({
+						...item,
+						status: 'uploading',
+						message: '上传中'
+					})
+				})
+				for (let i = 0; i < lists.length; i++) {
+					const result = await this.uploadFilePromise(lists[i].url)
+					let item = this[`fileList${event.name}`][fileListLen]
+					this[`fileList${event.name}`].splice(fileListLen, 1, Object.assign(item, {
+						status: 'success',
+						message: '',
+						url: result
+					}))
+					fileListLen++
+				}
+			},
+			uploadFilePromise(url) {
+				const projectCode = uni.getStorageSync('projectCode')
+				return new Promise((resolve, reject) => {
+					let a = uni.uploadFile({
+						url: uni.getStorageSync('addressUrl_'+projectCode)+ '/app/common/uploadOSS', // 仅为示例,非真实的接口地址
+						filePath: url,
+						name: 'file',
+						success: (res) => {
+							setTimeout(() => {
+								console.log(JSON.parse(res.data).url)
+								resolve(JSON.parse(res.data).url)
+							}, 1000)
+						}
+					});
+				})
+			},
+			goLogin(data) {
+				if(!this.projectCode){
+					uni.showToast({
+						title: '链接有误',
+						icon: 'none'
+					});
+					return
+				} 
+				this.loginFsUserWx(data)
+				return
+				this.utils.getProvider().then(provider=>{
+					console.log('当前的环境商',provider)
+					if (!provider) {
+					  reject()
+					}
+					uni.login({
+						provider: provider,
+						success: async loginRes => {
+							console.log(loginRes)
+							uni.getUserInfo({
+							   provider: provider,
+							   success: (infoRes)=> {
+								    uni.showToast({
+										title: '处理中...',
+										icon: 'loading'
+								    });
+									loginByMp({code: loginRes.code,encryptedData:infoRes.encryptedData,iv:infoRes.iv,appId:getApp().globalData.appId}).then(res=>{
+										 uni.hideLoading();
+										 if (res.code == 200) {
+											 this.$store.commit('setCoureLogin', 1);
+											uni.setStorageSync(this.utils.TOKEN_KEYAuto, res.token);
+											uni.setStorageSync('auto_userInfo', JSON.stringify(res.user));
+											this.userId = res.user.userId || ''
+											this.isLogin = true
+											this.getMenuButton()
+											this.getList()
+										 } else {
+											uni.showToast({
+												title: res.msg,
+												icon: 'none'
+											});
+										 }
+									 }).catch(err=>{
+										uni.hideLoading();
+										uni.showToast({
+											icon:'none',
+											title: "登录失败,请重新登录",
+										});
+									});
+							   }
+							});
+						}
+					})
+				}).catch(err => {})
+			},
+			// H5授权绑定关系
+			async loginFsUserWx(data){
+				if(data){
+					let token = uni.getStorageSync('TOKEN_WEXIN');
+					let user = uni.getStorageSync('userInfo')
+					
+					uni.setStorageSync(this.utils.TOKEN_KEYAuto, token);
+					uni.setStorageSync('auto_userInfo', JSON.stringify(user));
+					this.userId = user.userId || ''
+					this.isLogin = true
+					this.getMenuButton()
+					this.getList()
+				}else{
+					uni.setStorageSync('H5course',{
+						companyId: this.urlOption.companyId,
+						companyUserId:this.urlOption.companyUserId,
+						type: 1, //1自动,其他手动
+					})
+					uni.showLoading({ title: '加载中' });
+										
+					try {
+					  await this.utils.getDomain({ projectCode: this.projectCode}); // code 换成你的业务标识
+					  await this.utils.getConfigKey();
+					  uni.navigateTo({
+					  	url:'/pages_course/webview?H5course='+uni.getStorageSync('H5course')
+					  })
+					} catch (err) {
+					  console.error('初始化失败', err);
+					  uni.showToast({ title: '请求失败', icon: 'none' });
+					} finally {
+					  uni.hideLoading();
+					}
+				}
+			}
+		}
+	};
+</script>
+
+<style scoped lang="scss">
+
+
+	.title {
+text-align: center;
+font-size: 40rpx;
+font-weight: 500;
+	}
+	.list{
+		padding: 24rpx;
+		.item{
+			display: flex;
+			justify-content: space-between;
+			align-items: center;
+		}
+	}
+</style>