Quellcode durchsuchen

个人分支初始化

学习?学个屁 vor 2 Wochen
Ursprung
Commit
680b535342

+ 44 - 31
src/pages/index/attestation/index.vue

@@ -18,15 +18,15 @@
 		<view class="a-form">
 			<view class="form-item">
 				<view class="">真实姓名</view>
-				<input type="text" placeholder="请输入本人姓名" />
+				<input type="text" v-model="formData.fullName" placeholder="请输入本人姓名" />
 			</view>
 			<view class="form-item">
 				<view class="">身份证号</view>
-				<input type="idcard" placeholder="请输入本人身份证号" />
+				<input type="idcard" v-model="formData.identityCard" placeholder="请输入本人身份证号" />
 			</view>
 			<view class="form-item">
 				<view class="">手机号码</view>
-				<input type="number" placeholder="请输入手机号" />
+				<input type="number" v-model="formData.phone" placeholder="请输入手机号" />
 			</view>
 			<view class="form-tips">老人或无手机号,可填写亲友手机号</view>
 		</view>
@@ -37,36 +37,49 @@
 </template>
 
 <script lang="ts" setup>
-	import { ref } from 'vue';
+	import { ref, onMounted } from 'vue';
+	import { http } from '@/utils/http';
+	import { RouterUtils,TipsUtils } from '@/utils/util';
+	const formData = ref({
+		fullName: '',
+		identityCard: '',
+		phone: ''
+	})
 	const submit = () => {
-		uni.navigateTo({
-			url: '/pages/index/identityCertifying/index'
-		})
-		return
-		uni.checkIsSupportSoterAuthentication({
-			success: (res) => {
-				wx.startFacialRecognitionVerify({
-					name: '',
-					idCardNumber: '',
-					success: (res) => {
-						if (res.errMsg == 'startFacialRecognitionVerify:ok') {
-							console.log(res,'人脸识别结果:success');
-						}
-					},
-					fail: (err) => {
-						console.log(err,'人脸识别结果:fail')
-						uni.showToast({
-							title: '人脸识别失败',
-							icon: 'none',
-							duration: 20000,
-						});
-					}
-				})
-			},
-			fail: (err) => {
-				console.log(err)
-			}
+		http.post('/my/familyMembers/addFamilyMembers',{...formData.value},{loading:true}).then((res)=>{
+			TipsUtils.tips_toast(res.message)
+			formData.value.fullName = ''
+			formData.value.identityCard = ''
+			formData.value.phone = ''
 		})
+		
+		// uni.navigateTo({
+		// 	url: '/pages/index/identityCertifying/index'
+		// })
+		// uni.checkIsSupportSoterAuthentication({
+		// 	success: (res) => {
+		// 		wx.startFacialRecognitionVerify({
+		// 			name: '',
+		// 			idCardNumber: '',
+		// 			success: (res) => {
+		// 				if (res.errMsg == 'startFacialRecognitionVerify:ok') {
+		// 					console.log(res,'人脸识别结果:success');
+		// 				}
+		// 			},
+		// 			fail: (err) => {
+		// 				console.log(err,'人脸识别结果:fail')
+		// 				uni.showToast({
+		// 					title: '人脸识别失败',
+		// 					icon: 'none',
+		// 					duration: 20000,
+		// 				});
+		// 			}
+		// 		})
+		// 	},
+		// 	fail: (err) => {
+		// 		console.log(err)
+		// 	}
+		// })
 	}
 </script>
 

+ 1 - 1
src/pages/index/commentsDetail/index.vue

@@ -36,7 +36,7 @@
 	const check_img = () => {
 		uni.previewImage({
 			urls:imgs.value,
-			current: 'https://img.keaitupian.cn/newupload/08/1629449018344288.jpg'
+			current: ''
 		})
 	}
 </script>

+ 109 - 54
src/pages/index/index.vue

@@ -15,32 +15,40 @@
 			<view class="location-text">富力中心A7</view>
 			<zzx-icon name="right" size="10"></zzx-icon>
 		</view>
-		<view class="content" style="padding-top:180rpx;" @click="gotoPage('/pages/index/search/index')">
+		<view class="content" style="padding-top:180rpx;">
 			<view class="header-search">
 				<zzx-icon name="search" size="16"></zzx-icon>
-				<input type="text" placeholder="搜索俱乐部名称" />
-				<view class="search-btn">
+				<swiper class="i-search-swiper" :vertical="true" :circular="true" :autoplay="true" :interval="5000" :duration="1000" @click="gotoPage('/pages/index/search/index')" @change="transitionChange">
+					<swiper-item  v-for="(item,index) in searchList" :key="item.id">
+						<view class="">{{item.searchContent}}</view>
+					</swiper-item>
+				</swiper>
+				<!-- <input type="text" placeholder="搜索俱乐部名称" /> -->
+				<view class="search-btn" @click="searchInfoBtn">
 					搜索
 				</view>
 			</view>
 		</view>
 		<view class="header-banner">
+			<view style="height: 200rpx;line-height: 200rpx;" v-if="indexLoading">
+				<zs-loading></zs-loading>
+			</view>
 			<swiper class="header-swiper" :autoplay="true" :current="currentIndex" :circular="true"
 				previous-margin="80rpx" next-margin="80rpx" :interval="4000" :duration="500" @change="swierChange">
 				<swiper-item v-for="(item,i) in bannerList" :key="i">
-					<image :src="item.img" class="slide-image" :class="currentIndex === i?'active':''"></image>
+					<image :src="item.imageUrl" class="slide-image" :class="currentIndex === i?'active':''"></image>
 				</swiper-item>
 			</swiper>
 		</view>
 	</view>
 	<view class="content">
-		<view class="announcement" @click="gotoPage('/pages/index/messageNotice/index')">
+		<view class="announcement" @click="gotoPage('/pages/index/messageNotice/index')" v-if="indexMsg.length>0">
 			<image src="/src/static/gg-icon.png" mode="heightFix"></image>
 			<view class="">
 				<swiper class="announcement-swiper" :vertical="true" :circular="true" :autoplay="true" :interval="3000"
 					:duration="1000">
-					<swiper-item v-for="item in 3">
-						<view class="swiper-item textHidden">学校为公益场地,请严格遵守相关规范!</view>
+					<swiper-item v-for="(item,index) in indexMsg" :key="item.id">
+						<view class="swiper-item textHidden">{{item.titile}}</view>
 					</swiper-item>
 				</swiper>
 			</view>
@@ -66,7 +74,8 @@
 				<view class="item-text">赛事</view>
 			</view>
 		</view>
-		<view class="course-card">
+		<zs-loading v-if="indexLoading"></zs-loading>
+		<view class="course-card" v-else>
 			<view class="commonweal" @click="gotoPage('/pages/index/training/index')">
 				<view class="commonweal-title">
 					<view class="title-left">
@@ -76,10 +85,8 @@
 					<zzx-icon name="right" size="14"></zzx-icon>
 				</view>
 				<view class="commonweal-detail">
-					<view class="detail-list" v-for="item in 3">
-						<image
-							src="https://bpic.588ku.com/element_origin_min_pic/23/07/11/d32dabe266d10da8b21bd640a2e9b611.jpg!r650">
-						</image>
+					<view class="detail-list" v-for="item in gyCourseList" :key="item.id">
+						<image :src="item.cover"></image>
 						<view class="detail-text">免费</view>
 					</view>
 				</view>
@@ -93,14 +100,14 @@
 					<zzx-icon name="whiteRight" size="14"></zzx-icon>
 				</view>
 				<view class="audition-detail">
-					<view class="detail-list" v-for="item in 3">
-						<image src="@/static/index_bg.png"></image>
-						<view class="detail-text">¥25</view>
+					<view class="detail-list" v-for="item in stCourseList" :key="item.id">
+						<image :src="item.cover"></image>
+						<view class="detail-text">¥{{item.sellingPrice||'0'}}</view>
 					</view>
 				</view>
 			</view>
 		</view>
-		<view class="hot-instructor">
+		<view class="hot-instructor" v-if="!indexLoading">
 			<view class="i-title">
 				<view class="i-hot">
 					<view class="i-text">
@@ -116,26 +123,25 @@
 			<view class="i-info-card">
 				<view class="i-card-list"
 					:style="{background:index % 2=== 0?'linear-gradient(179deg, #FFD5FB 0%, #FFFFFF 40%)':'linear-gradient( 179deg, #F2FFBE 0%, #FFFFFF 40%)'}"
-					v-for="(item,index) in 6">
+					v-for="(item,index) in instructorList" :key="item.id">
 					<view class="i-info" @click="gotoPage('/pages/index/instructorDetail/index')">
 						<view class="header" :style="{background:index % 2=== 0?'#FFB8F9':'#C8FF0C'}">
-							<image class="head-img" src="https://img.keaitupian.cn/newupload/08/1629449018344288.jpg"
-								mode=""></image>
+							<image class="head-img" :src="item.avatar" mode=""></image>
 							<image class="head-tag" src="/src/static/badge.png" mode=""></image>
 						</view>
 						<view class="i-name-tag">
 							<view class="name-tag">
 								<view class="name">
 									<view class="">
-										<text>张慕斯</text>
+										<text>{{item.name}}</text>
 									</view>
 									<image v-if="index % 2=== 0" src="/src/static/name_bg.png" mode=""></image>
 									<image v-else src="/src/static/name_bg1.png" mode=""></image>
 								</view>
-								<view class="tag">篮球</view>
+								<view class="tag" v-for="(tag,index) in item.list">{{tag}}</view>
 							</view>
-							<view class="ascription">贵州成人篮球俱乐部</view>
-							<view class="sign">教育就是看到美并将其无限放大</view>
+							<view class="ascription">{{item.orgName}}</view>
+							<view class="sign">{{item.teachingPhilosophy}}</view>
 						</view>
 						<view class="type-icon">
 							<image src="/src/static/hot-icon2.png" mode=""></image>
@@ -144,27 +150,24 @@
 					<view class="i-data">
 						<view class="acclaim">
 							<zzx-icon name="acclaim"></zzx-icon>
-							<view style="color: #FFCC00;">好评 99%</view>
+							<view style="color: #FFCC00;">好评 {{item.goodRate}}%</view>
 						</view>
 						<view class="acclaim">
 							<zzx-icon name="order"></zzx-icon>
-							<view style="color: #4DDF96;">订单数 5577</view>
+							<view style="color: #4DDF96;">订单数 {{item.orderCount||'0'}}</view>
 						</view>
 						<view class="acclaim">
 							<zzx-icon name="number"></zzx-icon>
-							<view style="color: #AB7BFF;">授课人数 8659</view>
+							<view style="color: #AB7BFF;">授课人数 {{item.teachingCount}}</view>
 						</view>
 					</view>
-					<view class="i-skill">
-						擅长:体能、篮球、其他运动培训。体能、篮球、其他运
-						动培训。体能、篮球、其他运动培训。
-					</view>
-					<view class="i-course" v-for="item in 2">
+					<view class="i-skill">{{item.excelMsg}}</view>
+					<view class="i-course" v-for="(course,index) in item.courseList" :key="course.id">
 						<view class="course-name">
-							<view class="price">¥296</view>
-							<view class="name textHidden">室内小班篮球培训课时室内小班篮球培训课时</view>
+							<view class="price">¥{{(course.sellingPrice).toFixed(2)||'0.00'}}</view>
+							<view class="name textHidden">{{course.name}}</view>
 						</view>
-						<view class="num">已售9999</view>
+						<view class="num">已售{{item.count||'0'}}</view>
 					</view>
 					<view class="more">更多课程</view>
 				</view>
@@ -179,6 +182,7 @@
 
 <script setup lang="ts">
 	import zzxNavbar from '@/components/zzx-navbar/zzx-navbar.vue';
+	import zsLoading from '@/components/zzx-loading/zzx-loading.vue'
 	import { ref, onMounted, computed } from 'vue'
 	import { onShow, onPageScroll } from '@dcloudio/uni-app';
 	import { RouterUtils, TipsUtils } from '@/utils/util';
@@ -193,11 +197,15 @@
 	const titleBarHeight = ref(0);
 	const navOpacity = ref(0);
 	const backgroundColor = ref('#D2FD73');
+	const instructorList = ref();
 	onShow(() => {
 		get_location()
 	})
 	onMounted(() => {
 		get_navheight()
+		get_indexInfo()
+		get_message()
+		get_searchList()
 	})
 	onPageScroll((e) => {
 		navOpacity.value = Math.min(Math.max(e.scrollTop / navBarHeight.value, 0), 1);
@@ -243,12 +251,14 @@
 		http.get('/user/loginByCode', { data: { code: item }, loading: true }).then(res => {
 			cache.set('TOKEN', res.result.token)
 			cache.set('USER_INFO', res.result)
+			get_indexInfo()
+			get_message()
+			get_searchList()
 			TipsUtils.tips_toast('登录成功')
 		})
 	}
 
 	const get_location = () => {
-		uni.showLoading()
 		uni.authorize({
 			scope: 'scope.userLocation',
 			success() {
@@ -256,35 +266,33 @@
 					type: 'wgs84',
 					success: function (res) {
 						uni.hideLoading()
-						cache.set('LON',res.longitude)
-						cache.set('LAT',res.latitude)
+						cache.set('LON', res.longitude)
+						cache.set('LAT', res.latitude)
 						// console.log('当前位置的经度:' + res.longitude);
 						// console.log('当前位置的纬度:' + res.latitude);
 					},
 					fail: function (err) {
-						uni.hideLoading()
 						if (err.errMsg === 'getFuzzyLocation:fail system permission denied') {
 							TipsUtils.tips_alert('系统定位未开启,请开启定位以便提供更好服务', false)
 						} else if (err.errMsg === 'getFuzzyLocation:fail:ERROR_NOCELL&WIFI_LOCATIONSWITCHOFF' ||
 							err.errMsg === 'getFuzzyLocation:fail system permission denied' ||
-							err.errMsg === 'getFuzzyLocation:fail:system permission denied' || err.errMsg === 'getFuzzyLocation:fail auth deny'){
-								showAuthGuide()
-							}
+							err.errMsg === 'getFuzzyLocation:fail:system permission denied' || err.errMsg === 'getFuzzyLocation:fail auth deny') {
+							showAuthGuide()
+						}
 						console.log(err, '错误信息')
 					}
 				});
 			},
 			fail: (err) => {
-				uni.hideLoading()
 				showAuthGuide()
 			}
 		});
 	}
 
 	// 引导操作
-	const showAuthGuide = async() => {
-		let res:any = await TipsUtils.tips_alert('授权定位以提供更好服务',true)
-		if(res.confirm){
+	const showAuthGuide = async () => {
+		let res : any = await TipsUtils.tips_alert('授权定位以提供更好服务', true)
+		if (res.confirm) {
 			uni.openSetting()
 		}
 	}
@@ -304,14 +312,55 @@
 			}
 		});
 	}
-	
-	// 字典项查询
-	const get_dictItems=(code)=>{
-		http.get('/common/getDictItems',{data:{dictCode:code}}).then(res=>{
-			
+
+	// 首页基础信息
+	const gyCourseList = ref()
+	const stCourseList = ref()
+	const indexLoading=ref(true)
+	const get_indexInfo = () => {
+		http.get('/home/homeInfo').then((res) => {
+			indexLoading.value=false
+			bannerList.value = res.result.bannerList
+			gyCourseList.value = res.result.courseList.filter(item => item.priceType === 0)
+			stCourseList.value = res.result.courseList.filter(item => item.priceType === 1)
+			instructorList.value = res.result.instructorList
+		})
+	}
+
+	// 消息通知
+	const indexMsg = ref([])
+	const get_message = () => {
+		http.get('/home/getMsg').then((res) => {
+			indexMsg.value = res.result
 		})
 	}
 	
+	// 搜索相关
+	const searchList=ref([])
+	const get_searchList=()=>{
+		http.get('/home/getHotSearch').then((res)=>{
+			searchList.value=res.result
+		})
+	}
+	const searchCurrent=ref()
+	const transitionChange=(e)=>{
+		searchCurrent.value=e.detail.current
+	}
+	const searchInfoBtn=()=>{
+		if(searchList.value<1) return TipsUtils.tips_toast('请输入关键词')
+		let keyword=''
+		let venueType=null
+		if(searchList.value.length>1){
+			keyword=searchList.value[searchCurrent.value].searchContent
+			venueType=searchList.value[searchCurrent.value].venueType
+		}else{
+			searchList.value.map((item)=>{
+				keyword=item.searchContent
+				venueType=item.venueType
+			})
+		}
+		gotoPage(`/pages/index/searchPage/index?keyword=${keyword}&venueType=${venueType}`)
+	}
 </script>
 
 <style lang="less" scoped>
@@ -369,7 +418,9 @@
 			padding: 8rpx;
 			border-radius: 40rpx;
 
-			&>input {
+			.i-search-swiper {
+				height: 40rpx;
+				line-height: 40rpx;
 				width: 670rpx;
 				font-weight: bold;
 				font-size: 24rpx;
@@ -491,7 +542,7 @@
 		.commonweal {
 			background: #C8FF0C;
 			border-radius: 32rpx;
-			padding: 30rpx;
+			padding: 20rpx;
 
 			.commonweal-title {
 				display: flex;
@@ -530,6 +581,7 @@
 					}
 
 					.detail-text {
+						text-align: center;
 						margin-top: 16rpx;
 						font-size: 24rpx;
 						color: #222222;
@@ -541,7 +593,7 @@
 		.audition {
 			background: #AB7BFF;
 			border-radius: 32rpx;
-			padding: 30rpx;
+			padding: 20rpx;
 
 			.audition-title {
 				display: flex;
@@ -572,6 +624,7 @@
 					display: flex;
 					flex-direction: column;
 					align-items: center;
+					text-align: center;
 
 					&>image {
 						width: 80rpx;
@@ -580,6 +633,7 @@
 					}
 
 					.detail-text {
+						text-align: center;
 						margin-top: 16rpx;
 						font-size: 24rpx;
 						color: #fff;
@@ -699,7 +753,7 @@
 							width: 134rpx;
 							height: 60rpx;
 							font-weight: 800;
-							font-size: 36rpx;
+							font-size: 28rpx;
 							color: #222222;
 							position: relative;
 
@@ -707,6 +761,7 @@
 								&>text {
 									position: absolute;
 									z-index: 1;
+									top: 10rpx;
 								}
 							}
 

+ 29 - 11
src/pages/index/messageDetail/index.vue

@@ -1,39 +1,57 @@
 <template>
 	<view class="content">
 		<view class="m-message-box">
-			<view class="m-title">爱护公共场所,请勿吸烟乱扔垃圾爱护公共场所,请勿吸烟乱扔</view>
-			<view class="m-publish-time">全龄运动平台 03-14 10:23</view>
+			<view class="m-title">{{messageInfo.titile}}</view>
+			<view class="m-publish-time">{{messageInfo.sender}} {{messageInfo.sendTime}}</view>
 			<view class="m-richtext">
-				富文本内容富文本内容富文本内容富文本内容富文本内容富文本内容富文本内容富文本内容
-				富文本内容富文本内容富文本内容富文本内容富文本内容富文本内容富文本内容富文本内容
-				富文本内容富文本内容富文本内容富文本内容富文本内容富文本内容富文本内容富文本内容
+				<rich-text :nodes="messageInfo.msgContent"></rich-text>
 			</view>
 		</view>
 	</view>
 </template>
 
-<script>
+<script lang="ts" setup>
+	import { ref, onMounted, computed } from 'vue'
+	import { http } from '@/utils/http'
+	import { onLoad } from '@dcloudio/uni-app';
+	const msgId = ref();
+	onLoad((options) => {
+		msgId.value = options.msgId
+	})
+	onMounted(() => {
+		get_magDetail()
+	})
+
+	const messageInfo = ref()
+	const get_magDetail = () => {
+		http.get('/home/getMsgInfo', { data: { id: msgId.value },loading:true }).then(res => {
+			messageInfo.value=res.result
+		})
+	}
 </script>
 
 <style>
-	page{
+	page {
 		background: #fff;
 	}
 </style>
 <style lang="less" scoped>
-	.m-message-box{
+	.m-message-box {
 		margin-top: 20rpx;
-		.m-title{
+
+		.m-title {
 			font-weight: 800;
 			font-size: 32rpx;
 			color: #222222;
 		}
-		.m-publish-time{
+
+		.m-publish-time {
 			margin-top: 20rpx;
 			font-size: 24rpx;
 			color: #AAAAAA;
 		}
-		.m-richtext{
+
+		.m-richtext {
 			margin-top: 20rpx;
 		}
 	}

+ 19 - 6
src/pages/index/messageNotice/index.vue

@@ -1,21 +1,34 @@
 <template>
 	<view class="content">
-		<view class="m-message-card" v-for="item in 3" @click="to_detail">
+		<view class="m-message-card" v-for="item in indexMsg" :key="item.id" @click="to_detail(item)">
 			<view class="m-message">
-				<view class="message textHidden">爱护公共场所,请勿吸烟乱扔垃圾爱护公共场所,请勿吸爱护公共场所,请勿吸</view>
-				<view class="date">全龄运动平台 03-14 10:23</view>
+				<view class="message textHidden">{{item.titile}}</view>
+				<view class="date">{{item.sender}} {{item.sendTime}}</view>
 			</view>
 			<view class="message-img">
-				<image src="https://img.keaitupian.cn/newupload/08/1629449018344288.jpg" mode=""></image>
+				<image :src="item.imgUrl" mode=""></image>
 			</view>
 		</view>
 	</view>
 </template>
 
 <script lang="ts" setup>
-	const to_detail = () => {
+	import { ref, onMounted, computed } from 'vue'
+	import { http } from '@/utils/http'
+	onMounted(()=>{
+		get_message()
+	})
+	const to_detail = (e) => {
 		uni.navigateTo({
-			url: '/pages/index/messageDetail/index'
+			url: `/pages/index/messageDetail/index?msgId=${e.id}`
+		})
+	}
+	
+	// 消息通知
+	const indexMsg = ref([])
+	const get_message = () => {
+		http.get('/home/getMsg',{loading:true}).then((res) => {
+			indexMsg.value = res.result
 		})
 	}
 </script>

+ 113 - 45
src/pages/index/searchPage/components/events.vue

@@ -1,72 +1,140 @@
 <template>
-	<view class="events-card-list">
-		<view class="events-card" v-for="item in 7">
-			<view class="events-img-box">
-				<image class="events-img" src="https://img.keaitupian.cn/newupload/08/1629449018344288.jpg" mode=""></image>
-				<image class="tags-img" src="@/static/events-icon1.png" mode="widthFix"></image>
-				<view class="tags-text">橄榄球</view>
+	<view class="e-card-list" v-for="item in listData" :key="item.id	">
+		<view class="e-events-info">
+			<view class="e-picture">
+				<image class="pic" :src="item.cover" mode=""></image>
+				<view class="e-badge">
+					<image src="/src/static/events-icon1.png" mode="widthFix"></image>
+					<view class="text">
+						<!-- type(0:个人;1:团队;2:个人/团队) -->
+						<text v-if="item.type==0">个人</text>
+						<text v-else-if="item.type==1">团队</text>
+						<text v-else>个人/团队</text>
+					</view>
+				</view>
 			</view>
-			<view class="events-text">
-				<view class="e-name">第一届全龄运动杯橄榄球交流赛</view>
-				<view class="e-time">05.10-05.31</view>
-				<view class="e-price"><text class="mini-text">¥</text>25.9<text class="mini-text">起</text></view>
+			<view class="e-info">
+				<view class="e-title">{{item.name}}</view>
+				<view class="e-address">
+					{{item.placeName}} <text>|</text> {{item.km}}km
+				</view>
+				<view class="e-time">
+					<zzx-icon name="clock" size="12"></zzx-icon>
+					<text>{{DateUtils.formatDateToMMDD(item.startTime)}}-{{DateUtils.formatDateToMMDD(item.endTime)}}</text>
+				</view>
+			</view>
+		</view>
+		<view class="e-price">
+			<view class="price"><text>¥</text>{{item.sellingPrice}}</view>
+			<view class="entry" @click="RouterUtils.to_page('/pages/index/eventsDetail/index')">
+				<image v-if="item.registrationOpen" src="/src/static/events-icon2.png" mode="widthFix"></image>
+				<image v-else src="/src/static/end-entry.png" mode="widthFix"></image>
 			</view>
 		</view>
 	</view>
 </template>
 
-<script>
+<script lang="ts" setup>
+	import { DateUtils } from '@/utils/util'
+	interface Props {
+		listData ?: any;
+	}
+	const props = withDefaults(defineProps<Props>(), {
+		listData: []
+	});
 </script>
 
 <style lang="less" scoped>
-	.events-card-list{
+	.e-card-list {
 		margin-top: 20rpx;
-		display: flex;
-		align-items: center;
-		flex-wrap: wrap;
-		gap: 20rpx;
-		.events-card{
-			background: #FFFFFF;
-			border-radius: 32rpx;
-			padding: 20rpx;
-			width: 300rpx;
-			.events-img-box{
+		padding: 20rpx;
+		background: linear-gradient(179deg, #F2FFBE 0%, #FFFFFF 60%);
+		border-radius: 32rpx;
+
+		.e-events-info {
+			display: flex;
+			align-items: center;
+			gap: 20rpx;
+
+			.e-picture {
 				position: relative;
-				.events-img{
-					width: 296rpx;
-					height: 296rpx;
+
+				.pic {
+					width: 200rpx;
+					height: 200rpx;
 					border-radius: 32rpx;
 				}
-				.tags-img{
-					position: absolute;
-					width: 114rpx;
-					top: 0;
-					left: -18rpx;
-				}
-				.tags-text{
-					font-size: 20rpx;
-					color: #222222;
+
+				.e-badge {
 					position: absolute;
-					left: 10rpx;
-					top:14rpx;
+					top: -4rpx;
+					left: -20rpx;
+
+					&>image {
+						width: 114rpx;
+					}
+
+					.text {
+						position: absolute;
+						top: 14rpx;
+						left: 30rpx;
+						font-size: 20rpx;
+						color: #222222;
+					}
 				}
 			}
-			.events-text{
-				margin-top: 20rpx;
-				.e-name{
+
+			.e-info {
+				.e-title {
 					font-weight: 800;
 					font-size: 32rpx;
 					color: #222222;
 				}
-				.e-time{
+
+				.e-address {
 					margin-top: 12rpx;
 					font-size: 24rpx;
-					color: #AAAAAA;
+					color: #222222;
 				}
-				.e-price{
-					font-weight: 800;
-					font-size: 48rpx;
-					color: #FB5B5B;
+
+				.e-time {
+					margin-top: 16rpx;
+					// width: 132rpx;
+					height: 42rpx;
+					border-radius: 28rpx;
+					background: linear-gradient(90deg, #C8FF0C 0%, #F2FFC7 79%, rgba(255, 255, 255, 0) 100%);
+					display: flex;
+					align-items: center;
+					justify-content: center;
+					gap: 10rpx;
+					font-weight: bold;
+					font-size: 24rpx;
+					color: #222222;
+				}
+			}
+		}
+
+		.e-price {
+			height: 110rpx;
+			display: flex;
+			align-items: center;
+			justify-content: space-between;
+			border-top: 1rpx solid #F0F0F0;
+			margin-top: 24rpx;
+
+			.price {
+				font-weight: 800;
+				font-size: 48rpx;
+				color: #FB5B5B;
+
+				&>text {
+					font-size: 24rpx;
+				}
+			}
+
+			.entry {
+				&>image {
+					width: 156rpx;
 				}
 			}
 		}

+ 21 - 15
src/pages/index/searchPage/components/instructor.vue

@@ -1,7 +1,7 @@
 <template>
 	<view class="instructor-card-list">
 		<view class="i-info-card">
-			<view class="i-card-list" :style="{background:index % 2=== 0?'linear-gradient(179deg, #FFD5FB 0%, #FFFFFF 40%)':'linear-gradient( 179deg, #F2FFBE 0%, #FFFFFF 40%)'}" v-for="(item,index) in 6">
+			<view class="i-card-list" :style="{background:index % 2=== 0?'linear-gradient(179deg, #FFD5FB 0%, #FFFFFF 40%)':'linear-gradient( 179deg, #F2FFBE 0%, #FFFFFF 40%)'}" v-for="(item,index) in listData" :key="index">
 				<view class="i-info">
 					<view class="header" :style="{background:index % 2=== 0?'#FFB8F9':'#C8FF0C'}">
 						<image class="head-img" src="https://img.keaitupian.cn/newupload/08/1629449018344288.jpg"
@@ -12,15 +12,15 @@
 						<view class="name-tag">
 							<view class="name">
 								<view class="">
-									<text>张慕斯</text>
+									<text>{{item.name}}</text>
 								</view>
 								<image v-if="index % 2=== 0" src="/src/static/name_bg.png" mode=""></image>
 								<image v-else src="/src/static/name_bg1.png" mode=""></image>
 							</view>
 							<view class="tag">篮球</view>
 						</view>
-						<view class="ascription">贵州成人篮球俱乐部</view>
-						<view class="sign">教育就是看到美并将其无限放大</view>
+						<view class="ascription">{{item.orgName}}</view>
+						<view class="sign">{{item.teachingPhilosophy}}</view>
 					</view>
 					<view class="type-icon">
 						<image src="/src/static/hot-icon2.png" mode=""></image>
@@ -29,27 +29,26 @@
 				<view class="i-data">
 					<view class="acclaim">
 						<zzx-icon name="acclaim"></zzx-icon>
-						<view style="color: #FFCC00;">好评 99%</view>
+						<view style="color: #FFCC00;">好评 {{item.goodRate}}%</view>
 					</view>
 					<view class="acclaim">
 						<zzx-icon name="order"></zzx-icon>
-						<view style="color: #4DDF96;">订单数 5577</view>
+						<view style="color: #4DDF96;">订单数 {{item.orderCount}}</view>
 					</view>
 					<view class="acclaim">
 						<zzx-icon name="number"></zzx-icon>
-						<view style="color: #AB7BFF;">授课人数 8659</view>
+						<view style="color: #AB7BFF;">授课人数 {{item.classesNumber}}</view>
 					</view>
 				</view>
 				<view class="i-skill">
-					擅长:体能、篮球、其他运动培训。体能、篮球、其他运
-					动培训。体能、篮球、其他运动培训。
+					{{item.excelMsg}}
 				</view>
-				<view class="i-course" v-for="item in 2">
+				<view class="i-course" v-for="course in item.courseList" :key="item.id">
 					<view class="course-name">
-						<view class="price">¥296</view>
-						<view class="name textHidden">室内小班篮球培训课时室内小班篮球培训课时</view>
+						<view class="price">¥{{course.course||'0.00'}}</view>
+						<view class="name textHidden">{{course.name}}</view>
 					</view>
-					<view class="num">已售9999</view>
+					<view class="num">已售{{course.sales}}</view>
 				</view>
 				<view class="more">更多课程</view>
 			</view>
@@ -57,7 +56,13 @@
 	</view>
 </template>
 
-<script>
+<script lang="ts" setup>
+	interface Props {
+		listData ?: any; 
+	}
+	const props = withDefaults(defineProps<Props>(), {
+		listData:[]
+	});
 </script>
 
 <style lang="less" scoped>
@@ -110,7 +115,7 @@
 							width: 134rpx;
 							height: 60rpx;
 							font-weight: 800;
-							font-size: 36rpx;
+							font-size:28rpx;
 							color: #222222;
 							position: relative;
 		
@@ -118,6 +123,7 @@
 								&>text {
 									position: absolute;
 									z-index: 1;
+									top: 10rpx;
 								}
 							}
 		

+ 57 - 30
src/pages/index/searchPage/index.vue

@@ -2,7 +2,7 @@
 	<view class="s-header">
 		<view class="header-search">
 			<zzx-icon name="search" size="16"></zzx-icon>
-			<input type="text" v-model="searchText" placeholder="搜索俱乐部名称" />
+			<input type="text" v-model="keyword" placeholder="搜索俱乐部名称" />
 			<view class="search-btn" @click="to_search">
 				搜索
 			</view>
@@ -17,15 +17,15 @@
 	<view class="content">
 		<view class="select-btn">
 			<view :class="sel_btn===index?'distance':'score'" v-for="(item,index) in selectList" :key="index"
-				@click="select_btn(index)">{{item.text}}</view>
+				@click="select_btn(item,index)">{{item.text}}</view>
 		</view>
-		<view class="s-search-list">
+		<view class="s-search-list"  v-if="!searchLoading">
 			<!-- 场地 -->
 			<view v-if="sel_index==0">
 				<view class="s-venue-card" v-for="(venue,index) in searchList" :key="venue.id">
 					<view class="s-venue-info">
 						<view class="venue-img">
-							<image src="https://img.keaitupian.cn/newupload/08/1629449018344288.jpg" mode=""></image>
+							<image :src="venue.cover" mode=""></image>
 						</view>
 						<view class="venue-info">
 							<view class="name">{{venue.name}}</view>
@@ -39,18 +39,18 @@
 							</view>
 						</view>
 					</view>
-					<view class="s-course-list" v-for="item in 2">
+<!-- 					<view class="s-course-list" v-for="item in 2">
 						<view class="course-name">
 							<view class="price">¥25.6</view>
 							<view class="name">室内小班篮球培训课时</view>
 						</view>
 						<view class="sales">年售1万+</view>
-					</view>
+					</view> -->
 				</view>
 			</view>
 			<!-- 培训 -->
 			<view v-if="sel_index==1">
-				<view class="s-training-card">
+				<view class="s-training-card" v-for="(venue,index) in searchList" :key="venue.id">
 					<view class="training-box">
 						<view class="training-img">
 							<image class="t-img" src="https://img.keaitupian.cn/newupload/08/1629449018344288.jpg" mode="">
@@ -58,16 +58,16 @@
 						</view>
 						<view class="training-info">
 							<view class="training-name">
-								<view class="t-tags">公益课</view>
-								<view class="t-name textHidden">1对1篮球30分钟室内30分钟室内</view>
+								<!-- <view class="t-tags">公益课</view> -->
+								<view class="t-name textHidden">{{venue.name}}</view>
 							</view>
-							<view class="tips">促进青少年长高</view>
+							<!-- <view class="tips">促进青少年长高</view> -->
 							<view class="t-price">
-								<view class="price"><text class="mini-text">¥</text>25.9</view>
-								<view class="price-tips">不支持退款</view>
+								<view class="price"><text class="mini-text">¥</text>{{venue.originalPrice}}</view>
+								<!-- <view class="price-tips">不支持退款</view> -->
 							</view>
-							<view class="sales">已售37 98%好评</view>
-							<view class="address">观山湖区万达广场 | 2.2km</view>
+							<view class="sales">已售{{venue.sales}} {{venue.goodRate||'0'}}%好评</view>
+							<view class="address">{{venue.address}} | {{venue.km}}km</view>
 						</view>
 					</view>
 					<view class="tags-img">
@@ -77,44 +77,63 @@
 			</view>
 			<!-- 赛事 -->
 			<view v-if="sel_index==2">
-				<events />
+				<events :listData="searchList" />
 			</view>
 			<!-- 教练 -->
 			<view v-if="sel_index==3">
-				<instructor />
+				<instructor :listData="searchList" />
 			</view>
 		</view>
+		<zs-loading v-else></zs-loading>
+		<zs-empty v-if="searchList.length<1&&!searchLoading"></zs-empty>
 	</view>
 </template>
 
 <script lang="ts" setup>
 	import { ref, onMounted } from 'vue';
-	import { onLoad } from '@dcloudio/uni-app';
+	import { onLoad,onReachBottom } from '@dcloudio/uni-app';
 	import { http } from '@/utils/http'
 	import { useCacheStore } from '@/stores/cache'
 	import events from './components/events.vue'
 	import instructor from './components/instructor.vue'
+	import zsEmpty from '@/components/zs-empty/index.vue'
+	import zsLoading from '@/components/zzx-loading/zzx-loading.vue'
 	const cache = useCacheStore()
 	const selectList = ref(['距离', '好评'])
 	const sel_index = ref(0);
 	const sel_btn = ref(0);
 	const keyword = ref();
+	const venueType=ref()
 	const searchList=ref();
 	const navbarList = ref([{title: '场地',value: 0,tagsVal:'0-1'},{title: '培训',value: 1,tagsVal:'1-1'},{title: '赛事',value: 2,tagsVal:'2-1'},{title: '教练',value: 3,tagsVal:'3-1'}]);
 	onLoad((options) => {
 		keyword.value = options.keyword
+		venueType.value=options.venueType
 		console.log(options);
 	})
+	onReachBottom(()=>{
+		current.value++
+		get_searchInfo(tagsVal.value||'0-1')
+	})
 	onMounted(() => {
-		get_searchInfo('0-1')
+		if(venueType.value){
+			get_searchInfo(venueType.value)
+		}else{
+			get_searchInfo('0-1')
+		}
 		// get_dictItems()
 		get_dictType(0)
 	})
-	const select_btn = (i) => {
+	const select_btn = (e,i) => {
+		searchLoading.value=true
 		sel_btn.value = i
+		get_searchInfo(e.value)
 	}
 	const select_nav = (e) => {
+		searchLoading.value=true
 		sel_index.value = e.value
+		tagsVal.value=e.tagsVal
+		sel_btn.value=0
 		get_dictType(e.value || 0)
 		get_searchInfo(e.tagsVal)
 	}
@@ -132,16 +151,24 @@
 			selectList.value=arr
 		})
 	}
-
-	const get_searchInfo = (tagsVal) => {
-		http.post('/home/search', { keyword: keyword.value, size: 10, current: 1, venueType:String(tagsVal), longitude: cache.get('LON'), latitude: cache.get('LAT') }, { loading: true }).then((res) => {
-			searchList.value=res.result.records
-			console.log(res);
-		})
+	
+	const tagsVal=ref()
+	const to_search=()=>{
+		searchLoading.value=true
+		get_searchInfo(tagsVal.value||'0-1')
 	}
-
-	const get_searchTab = () => {
-
+	
+	const searchLoading=ref(true)
+	const current=ref(1)
+	const get_searchInfo = (tagsVal=ref()) => {
+		http.post('/home/search', { keyword: keyword.value, size: 10, current:current.value, venueType:String(tagsVal), longitude: cache.get('LON'), latitude: cache.get('LAT') }).then((res) => {
+			searchLoading.value=false
+			if(current.value==1){
+				searchList.value=res.result.records
+			}else{
+				searchList.value=[...searchList.value,...res.result.records]
+			}
+		})
 	}
 </script>
 
@@ -155,10 +182,10 @@
 			align-items: center;
 			gap: 10rpx;
 			background: #F6F6F6;
-			width: 700rpx;
+			width: 680rpx;
 			height: 60rpx;
 			border-radius: 40rpx;
-
+			padding-left: 20rpx;
 			&>input {
 				width: 670rpx;
 				font-weight: bold;

+ 85 - 5
src/pages/index/userList/index.vue

@@ -14,23 +14,75 @@
 				<view class="">邀请好友加入</view>
 			</view>
 		</view>
+		<view class="u-user-list-box">
+			<view class="u-user-list" v-for="(item,index) in userList" :key="index" @click="selectUser(item)">
+				<view class="user-info">
+					<view class="name">{{item.fullName}}</view>
+					<view class="idcard">身份证 {{idCardHide(item.identityCard)}}</view>
+				</view>
+				<view class="">
+					<zzx-icon :name="item.selOut?'selected' : 'unchecked'" size="14"></zzx-icon>
+				</view>
+			</view>
+		</view>
 		<view class="u-select-btn">
-			<button hover-class="hover-btn">确认选择:0人</button>
+			<button hover-class="hover-btn">确认选择:{{selTotal}}人</button>
 		</view>
 	</view>
 </template>
 
 <script lang="ts" setup>
-	import { ref } from 'vue';
-	import { onLoad } from '@dcloudio/uni-app';
-	import { RouterUtils } from '@/utils/util';
+	import { ref, onMounted, computed } from 'vue';
+	import { http } from '@/utils/http';
+	import { useCacheStore } from '@/stores/cache'
+	import { onLoad, onReachBottom } from '@dcloudio/uni-app';
+	import { RouterUtils, idCardHide } from '@/utils/util';
+	const cache = useCacheStore()
+	const select_insurance = ref(false);
+	const userList = ref()
+	const selTotal = ref(0)
+	const pageNo = ref(1)
+	const userinfo = computed(() => {
+		return cache.get('USER_INFO')
+	})
 	onLoad((options) => {
-		if(options.name){
+		if (options.name) {
 			uni.setNavigationBarTitle({
 				title: options.name
 			});
 		}
 	})
+	onReachBottom(() => {
+		pageNo.value++
+		get_userList()
+	})
+	onMounted(() => {
+		get_userList()
+	})
+
+	const get_userList = () => {
+		http.get('/my/familyMembers/findFamilyMembers', { data: { userId: userinfo.value.id, pageNo: pageNo.value, pageSize: 10 }, loading: true }).then((res) => {
+			res.result.records = res.result.records.map((item:any) => ({
+				...item,
+				selOut: false
+			}))
+			if (pageNo.value == 1) {
+				userList.value = res.result.records
+			} else {
+				userList.value = [...userList.value, ...res.result.records]
+			}
+		})
+	}
+
+	const selectUser = (item : any) => {
+		item.selOut = !item.selOut
+		if (item.selOut) {
+			selTotal.value++
+		} else {
+			selTotal.value--
+		}
+	}
+
 	const addUser = () => {
 		RouterUtils.to_page('/pages/index/attestation/index');
 	}
@@ -85,6 +137,34 @@
 		}
 	}
 
+	.u-user-list-box {
+		background: #FFFFFF;
+		border-radius: 16rpx;
+		padding: 20rpx;
+		margin-top: 20rpx;
+
+		.u-user-list {
+			margin-top: 24rpx;
+			display: flex;
+			justify-content: space-between;
+			border-bottom: 1rpx solid #F0F0F0;
+
+			.name {
+				font-weight: bold;
+				font-size: 28rpx;
+				color: #222222;
+				margin-bottom: 20rpx;
+			}
+
+			.idcard {
+				margin-bottom: 24rpx;
+				font-size: 28rpx;
+				color: #222222;
+			}
+		}
+	}
+
+
 	.u-select-btn {
 		position: fixed;
 		bottom: 160rpx;

+ 33 - 6
src/pages/index/writeComments/index.vue

@@ -4,14 +4,14 @@
 			<view class="w-title">观山湖区第十二小学</view>
 			<view class="w-star">
 				<view class="">综合评价</view>
-				<uni-rate :readonly="false" size="16" :value="2" />
-				<view class="star">4.0</view>
+				<uni-rate size="16" :value="formData.score" @change="onRateChange" />
+				<view class="star">{{formData.score}}</view>
 			</view>
 		</view>
 		<view class="w-content-card">
-			<textarea name="" id="" cols="30" rows="10" maxlength="150"></textarea>
+			<textarea v-model="formData.evaluateContent" id="" cols="30" rows="10" maxlength="150"></textarea>
 			<view class="">
-				<sunui-upimg :url="upPicUrl" ref="upload1" title="店铺logo" @upload="handleLoaded1" @change="handleChange1" :number="3"></sunui-upimg>
+				<sunui-upimg :url="upPicUrl" ref="upload1" title="店铺logo" @upload="handleLoaded1" @change="handleChange1"></sunui-upimg>
 			</view>
 		</view>
 		<view class="w-anonymity">
@@ -28,9 +28,36 @@
 </template>
 
 <script lang="ts" setup>
+	import { ref, onMounted, computed } from 'vue'
+	import { RouterUtils, TipsUtils } from '@/utils/util';
+	import { http } from '@/utils/http'
+	const formData=ref({
+		score:0,
+		evaluateContent:'',
+		images:'https://bpic.588ku.com/element_origin_min_pic/23/07/11/d32dabe266d10da8b21bd640a2e9b611.jpg!r650,https://img.keaitupian.cn/newupload/08/1629449018344288.jpg',
+		orgCode:100,
+		deptId:101,
+		siteId:102,
+		userId:1941067719183089666,
+		orderId:103,
+	})
+	const upPicUrl=ref()
+	const onRateChange=(e)=>{
+		formData.value.score=e.value
+	}
+	
+	const handleLoaded1=(e)=>{
+	}
+	const handleChange1=(e)=>{
+	}
 	const publish=()=>{
-		uni.navigateTo({
-			url:'/pages/index/commentsSuccess/index'
+		http.post('/my/evaluate/submitFeedback',formData.value,{loading:true}).then((res)=>{
+			TipsUtils.tips_toast(res.message)
+			formData.value.score=0
+			formData.value.evaluateContent=''
+			uni.navigateTo({
+				url:'/pages/index/commentsSuccess/index'
+			})
 		})
 	}
 </script>

+ 44 - 10
src/pages/mine/feedback/index.vue

@@ -8,14 +8,14 @@
 		<view class="f-issue-card">
 			<view class="f-title">(必填)请选择您在使用过程中遇到的问题</view>
 			<view class="item-issue-box">
-				<view :class="[selectType==index?'sel-item-issue':'item-issue']" v-for="(item,index) in 5"
-					@click="selectItem(index)">投诉吐槽</view>
+				<view :class="[selectType==item.value?'sel-item-issue':'item-issue']" v-for="(item,index) in issueType" :key="item.value"
+					@click="selectItem(item)">{{item.text}}</view>
 			</view>
 		</view>
 		<view class="f-issuedes-card">
 			<view class="f-title">(必填)问题描述</view>
 			<view class="item-issuedes-box">
-				<textarea name="" id="" maxlength="500" cols="30" rows="10"></textarea>
+				<textarea class="f-text-style" id="" maxlength="500" cols="30" rows="10" v-model="formData.feedbackDescribed"></textarea>
 			</view>
 		</view>
 		<view class="f-uploadimg">
@@ -28,20 +28,53 @@
 		<view class="f-tips">
 			咨询问题可联系<text style="color: #222222;">在线客服</text>
 		</view>
-		<view class="submit-btn">
+		<view class="submit-btn" @click="submitFeedback">
 			提交
 		</view>
 	</view>
 </template>
 
 <script lang="ts" setup>
-	import { ref, onMounted } from 'vue'
+	import { ref, onMounted,computed } from 'vue'
+	import { http } from '@/utils/http'
+	import { useCacheStore } from '@/stores/cache'
 	import zzxNavbar from '@/components/zzx-navbar/zzx-navbar.vue';
-	import { RouterUtils } from '@/utils/util';
-	const selectType = ref(0)
-	const selectItem = (i) => {
-		selectType.value = i
-		console.log(selectType.value);
+	import { RouterUtils,TipsUtils } from '@/utils/util';
+	const cache = useCacheStore()
+	const selectType = ref(0);
+	const issueType=ref()
+	const userinfo=computed(()=>{
+		return cache.get('USER_INFO')
+	})
+	const formData=ref({
+		userId:userinfo.value.id,
+		feedbackType:0,
+		feedbackDescribed:'',
+		feedbackImg:'https://bpic.588ku.com/element_origin_min_pic/23/07/11/d32dabe266d10da8b21bd640a2e9b611.jpg!r650,https://img.keaitupian.cn/newupload/08/1629449018344288.jpg,http://gips2.baidu.com/it/u=195724436,3554684702&fm=3028&app=3028&f=JPEG&fmt=auto?w=1280&h=960'
+	})
+
+	onMounted(()=>{
+		get_dictType()
+	})
+	const selectItem = (e) => {
+		selectType.value = e.value
+		formData.value.feedbackType=e.value
+	}
+	
+	// 查询分类
+	const get_dictType = () => {
+		http.get('/common/getDictItems', { data: { dictCode: 'feedback_type' } }).then(res => {
+			issueType.value=res.result.reverse()
+		})
+	}
+	
+	const submitFeedback=()=>{
+		console.log({...formData.value});
+		http.post('/my/feedback/submitFeedback',{...formData.value},{loading:true}).then(res=>{
+			TipsUtils.tips_toast(res.message)
+			formData.value.feedbackDescribed=''
+			formData.value.feedbackImg=''
+		})
 	}
 </script>
 
@@ -115,6 +148,7 @@
 			padding: 20rpx;
 			background: #FFFFFF;
 			border-radius: 16rpx;
+			font-size: 26rpx;
 		}
 	}
 

+ 64 - 30
src/pages/mine/feedbackRecord/index.vue

@@ -1,33 +1,33 @@
 <template>
 	<zzx-navbar :scrollable="false" :back="true" bgColor="linear-gradient( 180deg, #E8FF9B 0%, #F6F6F6 100%)"
 		title="意见反馈"></zzx-navbar>
-		<view style="height:170rpx;"></view>
+	<view style="height:170rpx;"></view>
 	<view class="content">
-		<view class="f-record-card" v-for="item in 6">
+		<view class="f-record-card" v-for="(item,index) in recordList" :key="item.id">
 			<view class="f-user-info">
 				<view class="user-info">
 					<view class="user-header">
 						<image src="https://img.keaitupian.cn/newupload/08/1629449018344288.jpg" mode=""></image>
 					</view>
-					<view class="user-name">张三</view>
+					<view class="user-name">{{item.userName}}</view>
 				</view>
-				<view class="user-time">03-20</view>
+				<view class="user-time">{{item.createTime}}</view>
 			</view>
-			<view class="user-tags">投诉吐槽</view>
+			<view class="user-tags">{{item.feedbackName}}</view>
 			<view class="user-des">
-				詹姆四对孩子很有耐心,也非常照顾小朋友的情绪,值得推荐!
+				{{item.feedbackDescribed}}
 			</view>
 			<view class="user-picture">
-				<scroll-view class="scroll-view_H" scroll-x="true">
-					<view class="scroll-view-item_H" v-for="item in 9">
-						<image src="https://img.keaitupian.cn/newupload/08/1629449018344288.jpg" mode=""></image>
+				<scroll-view class="scroll-view_H" scroll-x="true" @click="_previewImage(item.feedbackImgList)">
+					<view class="scroll-view-item_H" v-for="(img,index) in item.feedbackImgList" :key="index">
+						<image :src="img" mode=""></image>
 					</view>
 				</scroll-view>
 			</view>
-			<view class="f-merchants-reply">
+			<view class="f-merchants-reply" v-if="item.replyContent">
 				<view class="merchants">商家回复</view>
 				<view class="reply">
-					<text :class="[switchOpen?'':'textHidden']">谢评价,我们会越来越好,谢谢您的评价,我,谢我,谢谢您的评价,我们会越来越好</text>
+					<text :class="[switchOpen?'':'textHidden']">{{item.replyContent}}</text>
 					<text class="open-colse" @click="switchOpen=!switchOpen">{{switchOpen?'收起':'展开'}}</text>
 				</view>
 			</view>
@@ -38,42 +38,69 @@
 <script lang="ts" setup>
 	import { ref, onMounted } from 'vue'
 	import zzxNavbar from '@/components/zzx-navbar/zzx-navbar.vue';
-	const switchOpen=ref(true)
+	import { onLoad, onReachBottom } from '@dcloudio/uni-app';
+	import { _previewImage } from '@/utils/util'
+	import { http } from '@/utils/http'
+	const switchOpen = ref(false);
+	const recordList = ref();
+	const pageNo = ref(1)
+	onReachBottom(() => {
+		pageNo.value++
+		get_recordList()
+	})
+	onMounted(() => {
+		get_recordList()
+	})
+	const get_recordList = () => {
+		http.get('/my/feedback/findByPage', { data: { pageNo: pageNo.value, pageSize: 10 }, loading: true }).then((res) => {
+			if (pageNo.value == 1) {
+				recordList.value = res.result.records
+			} else {
+				recordList.value = recordList.value.concat(res.result.records)
+			}
+		})
+	}
 </script>
 
 <style lang="less">
-	.f-record-card{
+	.f-record-card {
 		background: #FFFFFF;
 		border-radius: 32rpx;
 		padding: 20rpx;
 		margin-top: 20rpx;
-		.f-user-info{
+
+		.f-user-info {
 			display: flex;
 			align-items: center;
 			justify-content: space-between;
-			.user-info{
+
+			.user-info {
 				display: flex;
 				align-items: center;
 				gap: 16rpx;
-				.user-header{
-					&>image{
+
+				.user-header {
+					&>image {
 						width: 60rpx;
 						height: 60rpx;
 						border-radius: 50%;
 					}
 				}
-				.user-name{
+
+				.user-name {
 					font-weight: bold;
 					font-size: 24rpx;
 					color: #222222;
 				}
 			}
-			.user-time{
+
+			.user-time {
 				font-size: 24rpx;
 				color: #AAAAAA;
 			}
 		}
-		.user-tags{
+
+		.user-tags {
 			background: #F5F5F5;
 			border-radius: 8rpx;
 			width: 152rpx;
@@ -84,16 +111,19 @@
 			line-height: 48rpx;
 			margin-top: 20rpx;
 		}
-		.user-des{
+
+		.user-des {
 			margin-top: 16rpx;
 			font-size: 28rpx;
 			color: #222222;
 		}
-		.user-picture{
+
+		.user-picture {
 			margin-top: 20rpx;
-			.scroll-view_H{
-				.scroll-view-item_H{
-					&>image{
+
+			.scroll-view_H {
+				.scroll-view-item_H {
+					&>image {
 						width: 160rpx;
 						height: 160rpx;
 						border-radius: 8rpx;
@@ -102,7 +132,8 @@
 				}
 			}
 		}
-		.f-merchants-reply{
+
+		.f-merchants-reply {
 			display: flex;
 			gap: 12rpx;
 			background: #F6F6F6;
@@ -110,20 +141,23 @@
 			padding: 20rpx;
 			margin-top: 20rpx;
 			transition: all .3s;
-			.merchants{
+
+			.merchants {
 				width: 100rpx;
 				height: 40rpx;
 				font-size: 24rpx;
 				color: #AAAAAA;
 			}
-			.reply{
+
+			.reply {
 				width: 520rpx;
 				font-size: 24rpx;
 				color: #222222;
 				display: flex;
-				.open-colse{
+
+				.open-colse {
 					color: #AAAAAA;
-					width:120rpx;
+					width: 120rpx;
 				}
 			}
 		}

+ 24 - 13
src/pages/mine/mineComments/index.vue

@@ -3,10 +3,10 @@
 		title="评价详情"></zzx-navbar>
 	<view style="height:170rpx;"></view>
 	<view class="content">
-		<view class="m-comments-card" v-for="item in 5">
+		<view class="m-comments-card" v-for="item in commentsList" :key="item.id">
 			<view class="m-comments-name">
 				<zzx-icon name="venue-icon4" size="14"></zzx-icon>
-				<view class="name">林旦综合运动馆</view>
+				<view class="name">{{item.departName}}</view>
 				<zzx-icon name="ashRight" size="12"></zzx-icon>
 			</view>
 			<view class="line"></view>
@@ -15,28 +15,28 @@
 					<view class="user-header">
 						<image src="https://img.keaitupian.cn/newupload/08/1629449018344288.jpg" mode=""></image>
 					</view>
-					<view class="user-name">张三</view>
+					<view class="user-name">{{item.username}}</view>
 				</view>
-				<view class="user-time">03-20</view>
+				<view class="user-time">{{item.createTime}}</view>
 			</view>
 			<view class="m-star">
-				<view class="star">4.0</view>
-				<uni-rate :readonly="true" size="16" :value="2" />
+				<view class="star">{{item.score}}</view>
+				<uni-rate :readonly="true" size="16" :value="item.score" />
 			</view>
 			<view class="m-comments">
-				詹姆四对孩子很有耐心,也非常照顾小朋友的情绪,值得推荐!
+				{{item.evaluateContent}}
 			</view>
 			<view class="user-picture">
-				<scroll-view class="scroll-view_H" scroll-x="true">
-					<view class="scroll-view-item_H" v-for="item in 9">
-						<image src="https://img.keaitupian.cn/newupload/08/1629449018344288.jpg" mode=""></image>
+				<scroll-view class="scroll-view_H" scroll-x="true" @click="_previewImage(item.imageList)">
+					<view class="scroll-view-item_H" v-for="(iamge,index) in item.imageList" :key="index">
+						<image :src="iamge" mode=""></image>
 					</view>
 				</scroll-view>
 			</view>
-			<view class="f-merchants-reply">
+			<view class="f-merchants-reply" v-if="item.replyContent">
 				<view class="merchants">商家回复</view>
 				<view class="reply">
-					<text :class="[switchOpen?'':'textHidden']">谢评价,我们会越来越好,谢谢您的评价,我,谢我,谢谢您的评价,我们会越来越好</text>
+					<text :class="[switchOpen?'':'textHidden']">{{item.replyContent}}</text>
 					<text class="open-colse" @click="switchOpen=!switchOpen">{{switchOpen?'收起':'展开'}}</text>
 				</view>
 			</view>
@@ -45,9 +45,20 @@
 </template>
 
 <script lang="ts" setup>
-	import { ref, onMounted } from 'vue'
+	import { ref, onMounted, computed } from 'vue'
+	import { RouterUtils, TipsUtils,_previewImage } from '@/utils/util';
+	import { http } from '@/utils/http'
 	import zzxNavbar from '@/components/zzx-navbar/zzx-navbar.vue';
+	const commentsList=ref()
 	const switchOpen=ref(false)
+	onMounted(()=>{
+		get_findByPage()
+	})
+	const get_findByPage=()=>{
+		http.get('/my/evaluate/findByPage',{data:{pageNo:1,pageSize:10}}).then((res)=>{
+			commentsList.value=res.result.records
+		})
+	}
 </script>
 
 <style lang="less" scoped>

BIN
src/static/end-entry.png


BIN
src/static/search-icon1.png


+ 67 - 30
src/utils/util/index.ts

@@ -1,13 +1,3 @@
-import { http } from '@/utils/http'
-
-/**
- * 数据字典请求
- * 
- */
-export const getDict =(type : string) => {
-	http.get('/common/getDictItems',{data:{dictCode:type}}).then(res=>{
-	})
-}
 
 /**
  * 提示工具类
@@ -104,28 +94,42 @@ export class RouterUtils {
 }
 
 /**
- * 日期时间格式化工具
- * @param date - 日期对象或时间戳
- * @param format - 格式字符串,默认:'YYYY-MM-DD HH:mm:ss'
- * @returns 格式化后的日期字符串
+ * 日期工具类
  */
-export const formatDate = (date : Date | number, format : string = 'YYYY-MM-DD HH:mm:ss') : string => {
-	let d : Date = typeof date === 'number' ? new Date(date) : date;
-
-	const padZero = (num : number) : string => num.toString().padStart(2, '0');
-
-	const replacements : Record<string, string> = {
-		'YYYY': d.getFullYear().toString(),
-		'MM': padZero(d.getMonth() + 1),
-		'DD': padZero(d.getDate()),
-		'HH': padZero(d.getHours()),
-		'mm': padZero(d.getMinutes()),
-		'ss': padZero(d.getSeconds()),
-		'SSS': padZero(d.getMilliseconds()).padStart(3, '0')
+export class DateUtils {
+	/**
+	 * 日期时间格式化工具
+	 * @param date - 日期对象或时间戳
+	 * @param format - 格式字符串,默认:'YYYY-MM-DD HH:mm:ss'
+	 * @returns 格式化后的日期字符串
+	 */
+	static formatDate = (date : Date | number, format : string = 'YYYY-MM-DD HH:mm:ss') : string => {
+		let d : Date = typeof date === 'number' ? new Date(date) : date;
+		const padZero = (num : number) : string => num.toString().padStart(2, '0');
+		const replacements : Record<string, string> = {
+			'YYYY': d.getFullYear().toString(),
+			'MM': padZero(d.getMonth() + 1),
+			'DD': padZero(d.getDate()),
+			'HH': padZero(d.getHours()),
+			'mm': padZero(d.getMinutes()),
+			'ss': padZero(d.getSeconds()),
+			'SSS': padZero(d.getMilliseconds()).padStart(3, '0')
+		};
+		return format.replace(/YYYY|MM|DD|HH|mm|ss|SSS/g, match => replacements[match]);
 	};
 
-	return format.replace(/YYYY|MM|DD|HH|mm|ss|SSS/g, match => replacements[match]);
-};
+	/**
+	 * YYYY-MM-DD HH:mm:ss 转转MM-DD
+	 * @param dateString - 日期字符串
+	 * @returns MM-DD 格式的日期字符串
+	 */
+	static formatDateToMMDD(dateString:any) {
+		const date = new Date(dateString);
+		const month = (date.getMonth() + 1).toString().padStart(2, '0');
+		const day = date.getDate().toString().padStart(2, '0');
+		return `${month}-${day}`;
+	}
+}
 
 /**
  * 生成随机颜色
@@ -133,4 +137,37 @@ export const formatDate = (date : Date | number, format : string = 'YYYY-MM-DD H
  */
 export const randomColor = () : string => {
 	return `#${Math.floor(Math.random() * 0xffffff).toString(16).padStart(6, '0')}`;
-};
+};
+
+/**
+ * 预览图片
+ * @param url - 图片地址
+ */
+export const _previewImage = (url : any) => {
+	uni.previewImage({
+		urls: url,
+		longPressActions: {
+			itemList: ['发送给朋友', '保存图片', '收藏'],
+			success: function (data) {
+				uni.showToast({
+					title: '操作成功',
+					icon: 'none'
+				})
+			},
+			fail: function (err) {
+				console.log(err.errMsg);
+			}
+		}
+	});
+}
+
+/**
+ * 身份证号脱敏
+ * @param card - 身份证号字符串
+ * @returns 脱敏后的身份证号字符串
+ */
+export const idCardHide = (card : any) => {
+	const reg = /^(.{2})(?:\d+)(.{2})$/;
+	const maskedIdCard = card.replace(reg, '$1***********$2');
+	return maskedIdCard;
+}

+ 3 - 2
tsconfig.json

@@ -8,7 +8,8 @@
 	  "@config/*": ["config/*"]
     },
     "lib": ["esnext", "dom"],
-    "types": ["@dcloudio/types"]
+    "types": ["@dcloudio/types"],
+	"moduleResolution":"node"
   },
-  "include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.tsx", "src/**/*.vue"]
+"include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.tsx", "src/**/*.vue"]
 }