Browse Source

基础业务接口

学习?学个屁 2 days ago
parent
commit
4e632be521

+ 3 - 2
src/components/sunui-upimg/sunui-upimg.vue

@@ -10,7 +10,7 @@
 				</view>
 			</block>
 			<view v-show="upload_len < upload_count" hover-class="sunui-uploader-hover" class="sunui-uploader-inputbox" @click="chooseImage" :style="upload_img_wh">
-				<view><text class="iconfont icon-mn_shangchuantupian" style="color: #666;"></text></view>
+				<view><text class="iconfont icon-mn_shangchuantupian" style="color: #b9b9b9;"></text></view>	
 			</view>
 		</view>
 	</view>
@@ -277,7 +277,8 @@ const upload = function(options) {
 	position: relative;
 	margin-bottom: 16rpx;
 	box-sizing: border-box;
-	background-color: #ededed;
+	background-color: #FFFFFF;
+	border-radius: 32rpx;
 	display: flex;
 	flex-wrap: wrap;
 	align-items: center;

+ 3 - 1
src/pages.json

@@ -5,7 +5,9 @@
 			"style": {
 				"navigationBarBackgroundColor": "#FFF",
 				"navigationBarTitleText": "首页",
-				"navigationStyle": "custom"
+				"navigationStyle": "custom",
+				"enablePullDownRefresh": true,
+				"backgroundTextStyle": "dark"
 			}
 		}, {
 			"path": "pages/index/venue/index",

+ 36 - 2
src/pages/index/attestation/index.vue

@@ -6,11 +6,17 @@
 			<view class="text">用于身份实名核验,反洗钱,资料将严格保密</view>
 		</view>
 		<view class="a-idcard-box">
-			<view class="front bg-image">
+			<view class="front" v-if="frontImg!=''"  @click="chooseImage(1)">
+				<image :src="frontImg" mode=""></image>
+			</view>
+			<view class="front bg-image" @click="chooseImage(1)" v-else>
 				<zzx-icon name="upload" size="30"></zzx-icon>
 				<view class="">上传人像面</view>
 			</view>
-			<view class="flip-side bg-image">
+			<view class="flip-side" v-if="flipSideImg!=''" @click="chooseImage(2)">
+				<image :src="flipSideImg" mode=""></image>
+			</view>
+			<view class="flip-side bg-image" v-else  @click="chooseImage(2)">
 				<zzx-icon name="upload" size="30"></zzx-icon>
 				<view class="">上传国徽面</view>
 			</view>
@@ -45,6 +51,24 @@
 		identityCard: '',
 		phone: ''
 	})
+	
+	const frontImg = ref('')
+	const flipSideImg=ref('')
+	const chooseImage = (e) => {
+		uni.chooseImage({
+			count: 1,
+			sizeType: ['original', 'compressed'],
+			sourceType: ['album', 'camera'],
+			success: function (res) {
+				if(e==1){
+					frontImg.value=res.tempFilePaths;
+				}else{
+					flipSideImg.value=res.tempFilePaths;
+				}
+			}
+		});
+	}
+	
 	const submit = () => {
 		http.post('/my/familyMembers/addFamilyMembers',{...formData.value},{loading:true}).then((res)=>{
 			TipsUtils.tips_toast(res.message)
@@ -119,6 +143,11 @@
 				align-items: center;
 				justify-content: center;
 				flex-direction: column;
+				&>image{
+					width: 100%;
+					height: 100%;
+					border-radius: 16rpx;
+				}
 			}
 			.flip-side{
 				width: 332rpx;
@@ -129,6 +158,11 @@
 				align-items: center;
 				justify-content: center;
 				flex-direction: column;
+				&>image{
+					width: 100%;
+					height: 100%;
+					border-radius: 16rpx;
+				}
 			}
 		}
 

+ 20 - 8
src/pages/index/courseDetail/index.vue

@@ -30,7 +30,7 @@
 		<view class="c-detail-info">
 			<view class="c-time">课时:{{courseDetailInfo.startTime}}-{{courseDetailInfo.endTime}}</view>
 			<view class="c-address">
-				<view class="">上课地点:{{courseDetailInfo.address}} | {{courseDetailInfo.km}}</view>
+				<view class="">上课地点:{{courseDetailInfo.address}} | {{courseDetailInfo.km}} km</view>
 				<zzx-icon name="ashRight" size="10"></zzx-icon>
 			</view>
 			<view class="c-instructor">
@@ -128,16 +128,25 @@
 			<view class="">分享</view>
 		</view>
 		<view class="c-buy-btn">
-			<view class="buy">
-				<view class="buy-text">直接购买</view>
+			<view class="buy" v-if="type==3">
+				<view class="buy-text">抢购</view>
 				<view class="buy-price">
-					<text>¥25.9</text>
+					<text>¥{{courseDetailInfo.sellingPrice}}</text>
 					<text>省10</text>
 				</view>
 			</view>
-			<view class="gratis" @click="toOrderPage">
-				免费试听
-			</view>
+			<block v-else>
+				<view class="buy">
+					<view class="buy-text">直接购买</view>
+					<view class="buy-price">
+						<text>¥{{courseDetailInfo.sellingPrice}}</text>
+						<text>省10</text>
+					</view>
+				</view>
+				<view class="gratis" @click="toOrderPage">
+					免费试听
+				</view>
+			</block>
 		</view>
 	</view>
 </template>
@@ -157,8 +166,11 @@
 	const selectList = ref(['详情', '须知', '课表', '评价']);
 	const instance = getCurrentInstance();
 	const cache = useCacheStore()
+	const type=ref()
 	onLoad((option) => {
+		console.log(option);
 		courseId.value = option.id
+		type.value=option.type
 	})
 	onMounted(() => {
 		get_navheight()
@@ -243,7 +255,7 @@
 	}
 
 	const toOrderPage = () => {
-		RouterUtils.to_page('/pages/index/submitOrder/index')
+		RouterUtils.to_page(`/pages/index/gymPay/index?courseId=${courseId.value}&type=${type.value}`)
 	}
 
 	const courseId = ref()

+ 1 - 1
src/pages/index/detail/components/course.vue

@@ -57,7 +57,7 @@
 	
 	const toCourseDetail=(e)=>{
 		uni.navigateTo({
-			url:`/pages/index/courseDetail/index?id=${e.id}`
+			url:`/pages/index/courseDetail/index?id=${e.id}&type=1`
 		})
 	}
 </script>

+ 1 - 1
src/pages/index/gymDetail/components/popup.vue

@@ -56,7 +56,7 @@
 			<view class="footer-submit">
 				<view class="f-price">
 					<view class="">总价</view>
-					<view class="">¥{{priceTotal}}</view>
+					<view class="">¥{{priceTotal.toFixed(2)}}</view>
 				</view>
 				<view class="f-btn" @click="submit_order">
 					<button>提交订单</button>

+ 5 - 6
src/pages/index/gymDetail/index.vue

@@ -120,8 +120,7 @@
 								<view class="">¥{{item.sellingPrice}}</view>
 								<view class="">¥{{item.originalPrice}}</view>
 							</view>
-							<view class="price-btn" @click="RouterUtils.to_page('/pages/index/gymPay/index?type=1')">抢购
-							</view>
+							<view class="price-btn" @click="RouterUtils.to_page(`/pages/index/gymPay/index?type=1&courseId=${item.id}`)">抢购</view>
 						</view>
 					</view>
 					<view class="card-tips">
@@ -172,7 +171,7 @@
 							<view class="sale">
 								已售{{item.sales}} {{item.goodRate}}%好评
 							</view>
-							<view class="price-btn" @click="RouterUtils.to_page('/pages/index/courseDetail/index?type=2')">免费试听
+							<view class="price-btn" @click="RouterUtils.to_page(`/pages/index/courseDetail/index?id=${item.id}&type=2`)">免费试听
 							</view>
 						</view>
 					</view>
@@ -183,13 +182,13 @@
 			<view class="more">查看更多</view>
 		</view>
 		<view class="instructor-card" id="schedule">
-			<view class="card-title">
-				<view class="">教练(9)</view>
+			<view class="card-title"  @click="RouterUtils.to_page('/pages/index/allInstructor/index')">
+				<view class="">教练({{detailInfo.instructorVOList.length}})</view>
 				<zzx-icon name="right" size="12"></zzx-icon>
 			</view>
 			<scroll-view class="header-swiper content" scroll-x="true" :show-scrollbar="false">
 				<view class="swiper-box">
-					<view class="swiper-inner" v-for="item in detailInfo.instructorVOList" :key="item.id">
+					<view class="swiper-inner" v-for="item in detailInfo.instructorVOList" :key="item.id" @click="RouterUtils.to_page(`/pages/index/instructorDetail/index?id=${item.id}`)">
 						<view class="header-img">
 							<image :src="item.avatar" mode=""></image>
 							<image src="/src/static/badge.png" mode=""></image>

+ 151 - 53
src/pages/index/gymPay/index.vue

@@ -1,17 +1,17 @@
 <template>
+	<!-- 不同类型进入的type(1:学校课程;2:体育馆课程;3:教练课程) -->
 	<view class="content">
 		<view class="g-orderinfo-card">
 			<view class="g-shoping-info">
-				<image class="shoping-img" src="https://img.shetu66.com/2023/06/13/1686646672844195.jpg" mode="">
-				</image>
+				<image class="shoping-img" :src="previewCourseInfo.cover" mode=""></image>
 				<view class="shoping-info">
-					<view class="name">一对一篮球30分钟室内精品课程,一对一篮球30分</view>
+					<view class="name">{{previewCourseInfo.name}}</view>
 					<view class="price-info">
-						<view class="price"><text class="mini-text">¥</text>25.9</view>
+						<view class="price"><text class="mini-text">¥</text>{{previewCourseInfo.sellingPrice}}</view>
 						<view class="price-stepper">
-							<view class="minus">-</view>
-							<input type="number" />
-							<view class="add">+</view>
+							<view class="minus" @click="minusNum">-</view>
+							<input v-model="countTotal" disabled type="number" />
+							<view class="add" @click="addNum">+</view>
 						</view>
 					</view>
 				</view>
@@ -19,17 +19,20 @@
 			<view class="g-shoping-total">
 				<view class="total-price">
 					<view class="">商品总价(共1件)</view>
-					<view class="">¥25.9</view>
+					<view class="">¥{{previewCourseInfo.sellingPrice}}</view>
 				</view>
 				<view class="total-price">
-					<view class="">团购优惠</view>
-					<view class="">-¥25.90</view>
+					<view class="">
+						<text v-if="loadType==1||loadType==2">试听优惠</text>
+						<text v-if="loadType==3">团购优惠</text>
+					</view>
+					<view class="">-¥{{previewCourseInfo.discountPrice}}</view>
 				</view>
 			</view>
-			<view class="subtotal">小计 ¥125</view>
+			<view class="subtotal">小计 ¥{{previewCourseInfo.subtotal}}</view>
 		</view>
 		<!-- 无固定场进入 -->
-		<view class="g-buy-tips" v-if="loadType==1">
+		<view class="g-buy-tips" v-if="loadType==4">
 			<view class="tips-title">购买须知</view>
 			<view class="tips-info-card">
 				<view class="title">有效期</view>
@@ -46,7 +49,8 @@
 			</view>
 		</view>
 		<!-- 课程进入 -->
-		<view class="g-insurance-card" v-if="loadType==2">
+		 <!-- v-if="loadType==1||loadType==3" -->
+		<view class="g-insurance-card">
 			<view class="g-insurance-info">
 				<view class="insurance-type">
 					<view class="type-name">
@@ -68,6 +72,7 @@
 				<view class="price">¥6</view>
 			</view>
 		</view>
+		  <!-- v-if="loadType==1||loadType==3" -->
 		<view class="g-userinfo-card">
 			<view class="r-user">
 				<view class="user-title">用户信息</view>
@@ -75,27 +80,29 @@
 					<zzx-icon name="wechat" size="16"></zzx-icon>
 					<view style="margin-bottom: 8rpx;">邀请微信好友</view>
 					<zzx-icon name="ashRight" size="12"></zzx-icon>
+					<button class="g-share-btn" open-type="share"></button>
 				</view>
 			</view>
-			<view class="user-tags">张三</view>
-			<view class="r-user-list" v-for="item in 2">
-				<view class="minus-user">-</view>
+			<!-- <view class="user-tags">张三</view> -->
+			<view class="r-user-list" v-for="item in userData" :key="item.id">
+				<view class="minus-user" @click="deleteUser(item)">-</view>
 				<view class="r-list">
-					<view class="name">张三</view>
-					<view class="id-num">身份证 51**************10</view>
+					<view class="name">{{item.fullName}}</view>
+					<view class="id-num">身份证 {{idCardHide(item.identityCard)}}</view>
 				</view>
 			</view>
-			<view class="g-adduser-btn">
+			<view class="g-adduser-btn" @click="toUserList">
 				<view class="add-icon">+</view>
 				<view class="add-text">添加用户</view>
 			</view>
 		</view>
+		  <!-- v-if="loadType==1" -->
 		<view class="g-usetips-card">
 			<view class="use-title">使用须知</view>
 			<view class="use-text">
-				<view class="item-text">1.购买后,需按照课表按时上课;</view>
-				<view class="item-text">2.如有特殊情况,需上传相关证明;</view>
-				<view class="item-text">3.由于特殊情况耽误了课程,后续会发布补课表,集中补课</view>
+				<view class="item-text">
+					<rich-text :nodes="previewCourseInfo.reminder"></rich-text>
+				</view>
 			</view>
 			<view class="use-tips-more" @click="RouterUtils.to_page('/pages/index/useNotice/index')">
 				<view class="more-text">查看更多</view>
@@ -106,12 +113,12 @@
 		<view class="footer footer-box">
 			<view class="footer-price">
 				<view class="total-price">合计:</view>
-				<view class="price"><text class="mini-text">¥</text>50.59</view>
-				<view class="discount">优惠¥22.59</view>
+				<view class="price"><text class="mini-text">¥</text>{{previewCourseInfo.totalPrice}}</view>
+				<view class="discount">优惠¥{{previewCourseInfo.totalDiscount}}</view>
 			</view>
 			<view class="footer-btn" @click="to_pay">
 				<button>
-					<view class="btn-price">¥57.8</view>
+					<view class="btn-price">¥{{previewCourseInfo.totalPrice}}</view>
 					<view class="btn-price">立即支付</view>
 				</button>
 			</view>
@@ -120,19 +127,83 @@
 </template>
 
 <script lang="ts" setup>
-	import { ref } from 'vue';
+	import { ref, onMounted,computed } from 'vue';
 	import { onLoad, onPageScroll } from '@dcloudio/uni-app';
-	import { RouterUtils } from '@/utils/util';
+	import { RouterUtils, TipsUtils,idCardHide } from '@/utils/util';
+	import { http } from '@/utils/http'
 	const select_insurance = ref(false);
-	const loadType=ref(1)
-	onLoad((options)=>{
-		loadType.value=options.type
-		
+	const loadType = ref(1)
+	onLoad((options) => {
+		console.log(options);
+		loadType.value = options.type
+		courseId.value = options.courseId
+	})
+	onMounted(() => {
+		get_previewOrderCourse()
+		get_userData()
 	})
 	
-	const to_pay=()=>{
+	
+	const to_pay = () => {
 		uni.navigateTo({
-			url:'/pages/index/cancelOrder/index'
+			url: '/pages/index/toBeUsed/index'
+		})
+	}
+	
+	const toUserList = () => {
+		RouterUtils.to_page('/pages/index/userList/index')
+	}
+	
+	const userData=ref()
+	const get_userData=()=>{
+		uni.$on('userData',function(data){
+			userData.value=data
+		})
+	}
+	
+	const deleteUser=async(e)=>{
+		let res = await TipsUtils.tips_alert('确定删除该用户吗?',true)
+		if(res.confirm){
+			userData.value=userData.value.filter(user=>user.id!==e.id)
+		}
+	}
+
+	const courseId = ref()
+	const previewCourseInfo = ref()
+	const get_previewOrderCourse = () => {
+		http.get('/order/previewOrderCourse', { data: { courseId: courseId.value }, loading: true }).then((res) => {
+			previewCourseInfo.value = res.result
+		})
+	}
+
+	const countTotal = ref(1)
+	const minusNum = () => {
+		if (countTotal.value > 1) {
+			countTotal.value--
+		}
+	}
+	
+	// const subtotal=computed(()=>{
+	// 	return (previewCourseInfo.value.subtotal*countTotal.value).toFixed(2)-previewCourseInfo.value.
+	// })
+
+	const addNum = () => {
+		get_checkCourseLimitNum(countTotal.value + 1)
+	}
+	
+	const get_checkCourseLimitNum = (targetNum) => {
+		http.get('/order/checkCourseLimitNum', {
+			data: {
+				courseId: courseId.value,
+				limitNum: targetNum
+			},
+			loading: true
+		}).then((res) => {
+			if (res.result === true) {
+				countTotal.value = targetNum
+			} else {
+				TipsUtils.tips_toast('超出可购数量')
+			}
 		})
 	}
 </script>
@@ -193,6 +264,7 @@
 							width: 80rpx;
 							font-size: 28rpx;
 							color: #222222;
+							text-align: center;
 						}
 
 						.add {
@@ -340,29 +412,40 @@
 		}
 	}
 
-	.g-userinfo-card{
+	.g-userinfo-card {
 		margin-top: 20rpx;
 		padding: 20rpx;
 		background: #FFFFFF;
 		border-radius: 32rpx;
+
 		.r-user {
 			display: flex;
 			align-items: center;
 			justify-content: space-between;
+
 			.user-title {
 				font-weight: bold;
 				font-size: 28rpx;
 				color: #222222;
 			}
-			.invite{
+
+			.invite {
 				display: flex;
 				align-items: center;
 				gap: 8rpx;
 				font-size: 24rpx;
 				color: #AAAAAA;
+				position: relative;
+				.g-share-btn{
+					position: absolute;
+					width: 200rpx;
+					height: 60rpx;
+					opacity: 0;
+				}
 			}
 		}
-		.user-tags{
+
+		.user-tags {
 			margin-top: 20rpx;
 			width: 112rpx;
 			height: 40rpx;
@@ -376,85 +459,99 @@
 			font-size: 28rpx;
 			color: #222222;
 		}
-		.r-user-list{
+
+		.r-user-list {
 			margin-top: 20rpx;
 			display: flex;
 			align-items: center;
 			gap: 20rpx;
 			border-top: 1rpx solid #F0F0F0;
 			height: 140rpx;
-			.minus-user{
+
+			.minus-user {
 				width: 30rpx;
 				height: 30rpx;
 				border-radius: 50%;
 				background: #FB5B5B;
 				text-align: center;
-				line-height:20rpx;
+				line-height: 20rpx;
 				font-weight: 600;
 				color: #fff;
 				font-size: 40rpx;
 			}
-			.r-list{
-				.name{
+
+			.r-list {
+				.name {
 					font-weight: bold;
 					font-size: 28rpx;
 					color: #222222;
 				}
-				.id-num{
+
+				.id-num {
 					font-size: 28rpx;
 					color: #222222;
 				}
 			}
 		}
-		.g-adduser-btn{
+
+		.g-adduser-btn {
 			display: flex;
 			height: 88rpx;
 			align-items: center;
 			justify-content: center;
 			gap: 20rpx;
 			border-top: 1rpx solid #F0F0F0;
-			.add-icon{
+
+			.add-icon {
 				width: 30rpx;
 				height: 30rpx;
 				border-radius: 50%;
 				background: #FDD143;
-				font-size:30rpx;
+				font-size: 30rpx;
 				font-weight: 600;
 				color: #fff;
 				text-align: center;
 				line-height: 20rpx;
 			}
-			.add-text{
+
+			.add-text {
 				font-size: 28rpx;
 				color: #FDD143;
 			}
 		}
 	}
-	.g-usetips-card{
+
+	.g-usetips-card {
 		margin-top: 20rpx;
 		padding: 20rpx;
 		background: #FFFFFF;
 		border-radius: 32rpx;
-		.use-title{
+
+		.use-title {
 			font-weight: bold;
 			font-size: 28rpx;
 			color: #222222;
 		}
-		.use-text{
+
+		.use-text {
 			font-size: 24rpx;
 			color: #222222;
-			.item-text{
+
+			.item-text {
 				margin-top: 20rpx;
 			}
 		}
-		.use-tips-more{
+
+		.use-tips-more {
 			margin-top: 20rpx;
-			.more-text{
+
+			.more-text {
 				text-align: center;
 				font-size: 24rpx;
 				color: #CCCCCC;
 			}
-			.use-line{
+
+			.use-line {
 				margin: auto;
 				margin-top: 10rpx;
 				width: 38rpx;
@@ -464,6 +561,7 @@
 			}
 		}
 	}
+
 	.footer {
 		left: 0;
 

+ 60 - 39
src/pages/index/index.vue

@@ -1,9 +1,9 @@
 <template>
 	<view class="nav-title"
 		:style="{height:navBarHeight+'px',opacity: navOpacity,transition: 'opacity 0.3s ease-in-out',background: backgroundColor }">
-		<view class="back-icon" :style="{paddingTop:statusBarHeight+'px'}">
+		<view class="back-icon" :style="{paddingTop:statusBarHeight+'px'}" @click="openSellocation">
 			<zzx-icon name="location" size="13"></zzx-icon>
-			<view class="location-text">富力中心A7</view>
+			<view class="location-text textHidden">{{addressName}}</view>
 			<zzx-icon name="right" size="10"></zzx-icon>
 		</view>
 	</view>
@@ -12,14 +12,15 @@
 		<view class="back-icon" :style="{paddingTop:(statusBarHeight+10)+'px'}" v-if="navOpacity==0"
 			@click="openSellocation">
 			<zzx-icon name="location" size="13"></zzx-icon>
-			<view class="location-text">富力中心A7</view>
+			<view class="location-text textHidden">{{addressName}}</view>
 			<zzx-icon name="right" size="10"></zzx-icon>
 		</view>
 		<view class="content" style="padding-top:180rpx;">
 			<view class="header-search">
-				<zzx-icon name="search" size="16"></zzx-icon>
-				<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">
+				<zzx-icon name="search" size="18"></zzx-icon>
+				<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>
@@ -76,7 +77,7 @@
 		</view>
 		<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" @click="gotoPage(`/pages/index/training/index?priceType=1`)">
 				<view class="commonweal-title">
 					<view class="title-left">
 						<image src="/src/static/gy-icon.png" mode=""></image>
@@ -91,7 +92,7 @@
 					</view>
 				</view>
 			</view>
-			<view class="audition" @click="gotoPage('/pages/index/training/index')">
+			<view class="audition" @click="gotoPage(`/pages/index/training/index?priceType=0`)">
 				<view class="audition-title">
 					<view class="title-left">
 						<image src="/src/static/st-icon.png" mode=""></image>
@@ -169,7 +170,8 @@
 						</view>
 						<view class="num">已售{{item.count||'0'}}</view>
 					</view>
-					<view class="more">更多课程</view>
+					<view class="more" @click="gotoPage(`/pages/index/instructorDetail/index?id=${item.id}`)">更多课程
+					</view>
 				</view>
 			</view>
 		</view>
@@ -184,7 +186,7 @@
 	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 { onShow,onLoad, onPageScroll, onPullDownRefresh } from '@dcloudio/uni-app';
 	import { RouterUtils, TipsUtils } from '@/utils/util';
 	import { http } from '@/utils/http'
 	import { useCacheStore } from '@/stores/cache'
@@ -198,9 +200,14 @@
 	const navOpacity = ref(0);
 	const backgroundColor = ref('#D2FD73');
 	const instructorList = ref();
-	onShow(() => {
+	onLoad(() => {
 		get_location()
 	})
+	onPullDownRefresh(() => {
+		get_indexInfo()
+		get_message()
+		get_searchList()
+	})
 	onMounted(() => {
 		get_navheight()
 		get_indexInfo()
@@ -254,22 +261,27 @@
 			get_indexInfo()
 			get_message()
 			get_searchList()
+			get_userinfo()
 			TipsUtils.tips_toast('登录成功')
 		})
 	}
 
+	const get_userinfo = () => {
+		http.get('/user/getUserInfo', { loading: true }).then(res => {
+			cache.set('USER_INFO', res.result)
+		})
+	}
+
 	const get_location = () => {
 		uni.authorize({
 			scope: 'scope.userLocation',
 			success() {
 				uni.getLocation({
-					type: 'wgs84',
+					type: 'gcj02',
 					success: function (res) {
 						uni.hideLoading()
 						cache.set('LON', res.longitude)
 						cache.set('LAT', res.latitude)
-						// console.log('当前位置的经度:' + res.longitude);
-						// console.log('当前位置的纬度:' + res.latitude);
 					},
 					fail: function (err) {
 						if (err.errMsg === 'getFuzzyLocation:fail system permission denied') {
@@ -298,13 +310,13 @@
 	}
 
 	// 手动选择
+	const addressName = ref('选择定位')
 	const openSellocation = () => {
 		uni.chooseLocation({
 			success: function (res) {
-				console.log('位置名称:' + res.name);
-				console.log('详细地址:' + res.address);
-				console.log('纬度:' + res.latitude);
-				console.log('经度:' + res.longitude);
+				addressName.value = res.name
+				cache.set('LON', res.longitude)
+				cache.set('LAT', res.latitude)
 			},
 			fail(res) {
 				console.log(res);
@@ -316,14 +328,15 @@
 	// 首页基础信息
 	const gyCourseList = ref()
 	const stCourseList = ref()
-	const indexLoading=ref(true)
+	const indexLoading = ref(true)
 	const get_indexInfo = () => {
 		http.get('/home/homeInfo').then((res) => {
-			indexLoading.value=false
+			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
+			uni.stopPullDownRefresh()
 		})
 	}
 
@@ -334,29 +347,29 @@
 			indexMsg.value = res.result
 		})
 	}
-	
+
 	// 搜索相关
-	const searchList=ref([])
-	const get_searchList=()=>{
-		http.get('/home/getHotSearch').then((res)=>{
-			searchList.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 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
+	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}`)
@@ -384,6 +397,10 @@
 			font-weight: 800;
 			font-size: 28rpx;
 			color: #222222;
+
+			.location-text {
+				max-width: 460rpx;
+			}
 		}
 	}
 
@@ -406,6 +423,10 @@
 			font-weight: 800;
 			font-size: 28rpx;
 			color: #222222;
+
+			.location-text {
+				max-width: 460rpx;
+			}
 		}
 
 		.header-search {

+ 3 - 4
src/pages/index/instructorDetail/index.vue

@@ -1,9 +1,7 @@
 <template>
 	<zzx-navbar :scrollable="true" :back="true" title="详情"></zzx-navbar>
 	<view class="detail-header">
-		<image class="header-bg"
-			src="https://ts1.tc.mm.bing.net/th/id/R-C.a8553f142638e741396e386b43c2bca7?rik=dzSGk6XRsxAAsQ&riu=http%3a%2f%2fseopic.699pic.com%2fphoto%2f50062%2f5890.jpg_wh1200.jpg&ehk=BgxiqxvzoNQd0pZHWV4VPOMbYgqM76WDMt8RDzCjoYY%3d&risl=&pid=ImgRaw&r=0"
-			mode="widthFix"></image>
+		<image class="header-bg" :src="detailObj.backgroundImg" mode="widthFix"></image>
 		<view class="back-icon" :style="{paddingTop:(statusBarHeight+10)+'px'}" @click="RouterUtils.back()">
 			<zzx-icon name="back"></zzx-icon>
 		</view>
@@ -71,11 +69,12 @@
 						<view class="sale-data">已售{{item.saleNum}} {{item.goodRate}}%好评</view>
 						<view class="course-num">
 							<view class="number">{{item.coursesNum}}课时 {{item.startTime}}-{{item.endTime}}</view>
-							<view class="i-btn">抢购</view>
+							<view class="i-btn" @click="RouterUtils.to_page(`/pages/index/courseDetail/index?id=${item.id}&type=3`)">抢购</view>
 						</view>
 						<view style="height: 24rpx;"></view>
 					</view>
 				</view>
+				<view class="not-data" v-if="detailObj.courseInfoVOList.length<1">暂无课程数据</view>
 			</view>
 		</view>
 		<view class="appraise-card">

+ 2 - 2
src/pages/index/search/index.vue

@@ -1,7 +1,7 @@
 <template>
 	<view class="content">
 		<view class="header-search">
-			<zzx-icon name="search" size="16"></zzx-icon>
+			<zzx-icon name="search" size="18"></zzx-icon>
 			<input type="text" v-model="searchText" placeholder="搜索俱乐部名称" />
 			<view class="search-btn" @click="to_search">
 				搜索
@@ -45,7 +45,6 @@
 		if (historyList.value.length > 20) {
 			historyList.value.pop(); // 移除最后一条
 		}
-		//保存到缓存
 		cache.set('SEARCH_INFO', historyList.value);
 		RouterUtils.to_page(`/pages/index/searchPage/index?keyword=${keyword}`)
 		searchText.value = '';
@@ -80,6 +79,7 @@
 			width: 670rpx;
 			font-weight: bold;
 			font-size: 24rpx;
+			margin-bottom: 8rpx;
 		}
 
 		.search-btn {

+ 16 - 2
src/pages/index/submitOrder/index.vue

@@ -75,7 +75,7 @@
 				<view class="add-text">添加用户</view>
 			</view>
 		</view>
-		<view class="submit-btn">免费 立即预约</view>
+		<view class="submit-btn" @click="submitBooking">免费 立即预约</view>
 	</view>
 	<uni-calendar ref="calendar" :insert="false" :date="selectInsurance" @confirm="confirm" />
 </template>
@@ -112,6 +112,8 @@
 	}
 	const check_item=(e,i)=>{
 		check_index.value=i
+		rulesId.value=e.id
+		
 	}
 	
 	// 预览时间选项
@@ -129,10 +131,11 @@
 	const get_previewOrderPlaceSchool=(startTime)=>{
 		http.get('/order/previewOrderPlaceSchool',{data:{placeId:placeId.value,startTime:startTime},loading:true}).then((res)=>{
 			timeList.value=res.result
+			rulesId.value=res.result.timeSlot[0].id
 		})
 	}
 	
-	const userData=ref()
+	const userData=ref([])
 	const get_userData=()=>{
 		uni.$on('userData',function(data){
 			userData.value=data
@@ -145,6 +148,17 @@
 			userData.value=userData.value.filter(user=>user.id!==e.id)
 		}
 	}
+	
+	const rulesId=ref()
+	const submitBooking=()=>{
+		if(!rulesId.value) return TipsUtils.tips_toast('请选择时段')
+		if(userData.value.length<1) return TipsUtils.tips_toast('请添加用户')
+		let userIds=userData.value.map(item=>item.id).join(',')
+		rulesId.value=rulesId.value.toString()
+		http.get('/order/createOrderPlaceSchool',{data:{rulesId:rulesId.value,userIds:userIds},loading:true}).then((res)=>{
+			RouterUtils.to_page('/pages/index/toBeUsed/index')
+		})
+	}
 </script>
 
 <style lang="less" scoped>

+ 42 - 2
src/pages/index/toBeUsed/index.vue

@@ -158,9 +158,18 @@
 			</view>
 		</view>
 		<view class="t-use-card">
-			<view class="use-tips">
+			<view class="use-tips t-contract-list">
 				<view class="title">电子合同</view>
-				<view class="text">该电子合同具有法律效力</view>
+				<view class="text contract-list">
+					<view class="item-no-sign">
+						<view class="sign-title">未签署:</view>
+						<view class="sign-name">张三</view>
+					</view>
+					<view class="item-sign">
+						<view class="sign-title">已签署:</view>
+						<view class="sign-name">李四</view>
+					</view>
+				</view>
 			</view>
 			<view class="check-all">
 				<text>查看详情</text>
@@ -709,6 +718,37 @@
 				color: #AAAAAA;
 			}
 		}
+		.t-contract-list{
+			.contract-list{
+				.item-no-sign{
+					display: flex;
+					align-items: center;
+					gap: 20rpx;
+					.sign-title{}
+					.sign-name{
+						padding: 4rpx 10rpx 4rpx 10rpx;
+						border-radius: 8rpx;
+						background: #F6F6F6;
+						font-size: 24rpx;
+						color: #AAAAAA;
+					}
+				}
+				.item-sign{
+					display: flex;
+					align-items: center;
+					gap: 20rpx;
+					margin-top: 20rpx;
+					.sign-title{}
+					.sign-name{
+						padding: 4rpx 10rpx 4rpx 10rpx;
+						border-radius: 8rpx;
+						background: #FDD143;
+						font-size: 24rpx;
+						color:#222222;
+					}
+				}
+			}
+		}
 
 		.check-all {
 			display: flex;

+ 19 - 5
src/pages/index/training/index.vue

@@ -12,13 +12,13 @@
 				@click="select_btn(item,index)">{{item.text}}</view>
 		</view>
 		<block v-if="courseList.length>1">
-			<view class="t-card-list" v-for="item in courseList" :key="item.id">
+			<view class="t-card-list" v-for="item in courseList" :key="item.id" @click="RouterUtils.to_page(`/pages/index/courseDetail/index?id=${item.id}`)">
 				<view class="t-courseImg">
 					<image :src="item.cover" mode=""></image>
 				</view>
 				<view class="t-course">
 					<view class="c-title textHidden">{{item.name}}</view>
-					<view class="c-address">{{item.address}} | {{item.km.toFixed(2)}}km</view>
+					<view class="c-address" v-if="item.km">{{item.address}} | {{item.km.toFixed(2)}}km</view>
 					<view class="c-price">¥25.9
 						<text v-if="item.priceType==0"
 							style="font-size: 22rpx;color: #AAAAAA;text-decoration: line-through;">¥23.2</text>
@@ -44,6 +44,7 @@
 	import { onLoad, onReachBottom } from '@dcloudio/uni-app'
 	import { http } from '@/utils/http'
 	import { useCacheStore } from '@/stores/cache'
+	import { RouterUtils } from '@/utils/util';
 	import zsEmpty from '@/components/zs-empty/index.vue'
 	const cache = useCacheStore()
 	const navbarList = ref([{
@@ -66,6 +67,14 @@
 	}])
 	const sel_index = ref(0);
 	const sel_btn = ref(0);
+	onLoad((option)=>{
+		priceType.value=option.priceType
+		if(option.priceType==1){
+			sel_index.value=1
+		}else if(option.priceType==0){
+			sel_index.value=2
+		}
+	})
 	onReachBottom(() => {
 		pageNo.value++
 		if (sel_index.value === 0) {
@@ -77,9 +86,13 @@
 		}
 	})
 	onMounted(() => {
-		get_findByCourseList('', 1)
+		if(priceType.value){
+			get_findByCourseList(priceType.value, 1)
+		}else{
+			get_findByCourseList('', 1)
+		}
 	})
-	const selectType = ref()
+	const selectType = ref(1)
 	const select_btn = (e, i) => {
 		selectType.value = e.type
 		if (sel_index.value === 0) {
@@ -106,10 +119,11 @@
 	// 获取列表
 	const courseList = ref()
 	const pageNo = ref(1)
+	const priceType=ref()
 	const get_findByCourseList = (priceType : any, orderByType : number) => {
 		http.get('/detail/findByCourseList', {
 			data: {
-				priceType: priceType || '',
+				priceType: priceType,
 				longitude: cache.get('LON'),
 				latitude: cache.get('LAT'),
 				orderByType: orderByType,

+ 0 - 1
src/pages/index/userList/index.vue

@@ -84,7 +84,6 @@
 			selTotal.value--
 			selArr.value = selArr.value.filter((i:any) => i.id != item.id)
 		} 
-		console.log(selArr.value,'---1');
 	}
 
 	const addUser = () => {

+ 9 - 4
src/pages/mine/accountSetting/index.vue

@@ -11,10 +11,10 @@
 					<zzx-icon name="ashRight" size="10"></zzx-icon>
 				</view>
 			</view>
-			<view class="a-nickname-cell">
+			<view class="a-nickname-cell" @click="RouterUtils.to_page('/pages/mine/reviseNickname/index')">
 				<view class="a-nickname">昵称</view>
-				<view class="a-set-nickname" @click="RouterUtils.to_page('/pages/mine/reviseNickname/index')">
-					<view class="nickname">艾卡西亚大暴雨</view>
+				<view class="a-set-nickname">
+					<view class="nickname">{{userName}}</view>
 					<zzx-icon name="ashRight" size="10"></zzx-icon>
 				</view>
 			</view>
@@ -23,9 +23,14 @@
 </template>
 
 <script lang="ts" setup>
-	import { ref } from 'vue'
+	import { ref,computed } from 'vue'
 	import { RouterUtils } from '@/utils/util';
+	import { useCacheStore } from '@/stores/cache'
+	const cache = useCacheStore()
 	const tempFilePaths=ref()
+	const userName=computed(()=>{
+		return cache.get('USER_INFO').userName
+	})
 	const selectUpType = () => {
 		uni.chooseImage({
 			count: 1,

+ 14 - 4
src/pages/mine/feedback/index.vue

@@ -27,6 +27,7 @@
 		</view>
 		<view class="f-tips">
 			咨询问题可联系<text style="color: #222222;">在线客服</text>
+			<button class="contact-btn" open-type="contact"></button>
 		</view>
 		<view class="submit-btn" @click="submitFeedback">
 			提交
@@ -50,7 +51,7 @@
 		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'
+		feedbackImg:''
 	})
 
 	onMounted(()=>{
@@ -63,17 +64,17 @@
 	
 	// 查询分类
 	const get_dictType = () => {
-		http.get('/common/getDictItems', { data: { dictCode: 'feedback_type' } }).then(res => {
+		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=''
+			uni.navigateBack()
+			TipsUtils.tips_toast(res.message)
 		})
 	}
 </script>
@@ -168,6 +169,15 @@
 		font-weight: bold;
 		font-size: 24rpx;
 		color: #AAAAAA;
+		position: relative;
+		.contact-btn {
+			position: absolute;
+			width:160rpx;
+			top: -30rpx;
+			right:200rpx;
+			height: 70rpx;
+			opacity: 0;
+		}
 	}
 
 	.submit-btn {

+ 1 - 1
src/pages/mine/feedbackRecord/index.vue

@@ -7,7 +7,7 @@
 			<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>
+						<image :src="item.avatar" mode=""></image>
 					</view>
 					<view class="user-name">{{item.userName}}</view>
 				</view>

+ 13 - 2
src/pages/mine/index.vue

@@ -20,8 +20,8 @@
 	<view style="height: 100rpx;"></view>
 	<view class="content">
 		<view class="m-mineinfo-card">
-			<view class="item-info" v-for="(item,idnex) in cardList" :key="index"
-				@click="RouterUtils.to_page('/pages/mine/orderInfo/index')">
+			<view class="item-info" v-for="(item,index) in cardList" :key="index"
+				@click="RouterUtils.to_page(`/pages/mine/orderInfo/index?selIndex=${index}`)">
 				<zzx-icon :name="item.icon" size="30"></zzx-icon>
 				<view class="item-text">{{item.name}}</view>
 			</view>
@@ -79,6 +79,9 @@
 		name: '售后',
 		icon: 'm-after-sales'
 	},])
+	onMounted(()=>{
+		get_userinfo()
+	})
 	onPageScroll((e) => { })
 
 	const submitLogin = () => {
@@ -94,9 +97,16 @@
 		http.get('/user/loginByCode', {data:{code:item}, loading: true }).then(res => {
 			cache.set('TOKEN',res.result.token)
 			cache.set('USER_INFO',res.result)
+			get_userinfo()
 			TipsUtils.tips_toast('登录成功')
 		})
 	}
+	
+	const get_userinfo=()=>{
+		http.get('/user/getUserInfo', { loading: true }).then(res => {
+			cache.set('USER_INFO',res.result)
+		})
+	}
 </script>
 
 <style>
@@ -133,6 +143,7 @@
 						transform: translate(-50%, -50%);
 						width: 160rpx;
 						height: 160rpx;
+						border-radius: 50%;
 					}
 
 					.user-nickname {

+ 1 - 1
src/pages/mine/mineComments/index.vue

@@ -13,7 +13,7 @@
 			<view class="m-user-info">
 				<view class="user-info">
 					<view class="user-header">
-						<image src="https://img.keaitupian.cn/newupload/08/1629449018344288.jpg" mode=""></image>
+						<image :src="item.avatar" mode=""></image>
 					</view>
 					<view class="user-name">{{item.username}}</view>
 				</view>

+ 10 - 4
src/pages/mine/orderInfo/index.vue

@@ -10,18 +10,20 @@
 				<view class="order-name">场地:林旦综合运动馆</view>
 				<!-- 待付款 -->
 				<view class="order-status" v-if="selected==1">待支付(剩余14:23)</view>
-				<view class="item-order-status" v-if="selected==2">待使用</view>
+				<view class="item-order-status" style="color:#FB5B5B;" v-if="selected==2">待使用</view>
 				<view class="item-order-status" v-if="selected==3">已使用</view>
+				<view class="item-order-status" v-if="selected==4">已退款</view>
 			</view>
 			<view class="line"></view>
 			<view class="o-order-info">
 				<view class="item-info">
 					<!-- 多个商品 -->
-					<!-- 					<scroll-view class="scroll-view_H scroll-order" scroll-x="true">
+<!-- 					<scroll-view class="scroll-view_H scroll-order" scroll-x="true">
 						<view class="scroll-view-item_H scroll-order-item" v-for="item in 5">
 							<view class="item-order">
 								<view class="order-img">
-									<image src="https://img.keaitupian.cn/newupload/08/1629449018344288.jpg" mode=""></image>
+									<image src="https://img.keaitupian.cn/newupload/08/1629449018344288.jpg" mode="">
+									</image>
 								</view>
 								<view class="order-name textHidden">参赛意外险参赛意外险</view>
 							</view>
@@ -65,10 +67,14 @@
 
 <script lang="ts" setup>
 	import { ref, onMounted } from 'vue'
+	import { onLoad } from '@dcloudio/uni-app';
 	import zsEmpty from '@/components/zs-empty/index.vue'
 	const selected = ref(0)
 	const orderTypeList = ref(['全部', '待付款', '待使用', '已使用', '退款/售后'])
-
+	
+	onLoad((option)=>{
+		selected.value=option.selIndex
+	})
 	const selectedItem = (i) => {
 		selected.value = i
 	}

+ 23 - 4
src/pages/mine/reviseNickname/index.vue

@@ -2,20 +2,39 @@
 	<view class="content">
 		<view class="r-nickname-card">
 			<view class="r-nickinput">
-				<input type="text" maxlength="10" placeholder="11111" />
+				<input type="text" v-model="username" maxlength="10" placeholder="请输入新昵称" />
 			</view>
-			<view class="r-clear-icon">
+			<view class="r-clear-icon" v-if="username!==''" @click="username=''">
 				<zzx-icon name="m-clear" size="16"></zzx-icon> 
 			</view>
 		</view>
 		<view class="r-tips">限2-10个汉字</view>
 	</view>
 	<view class="r-bottom-btn">
-		<view class="submit-btn">确定</view>
+		<view class="submit-btn" @click="submit">确定</view>
 	</view>
 </template>
 
-<script>
+<script lang="ts" setup>
+	import { ref, onMounted,computed } from 'vue'
+	import { http } from '@/utils/http'
+	import { RouterUtils, TipsUtils } from '@/utils/util';
+	import { useCacheStore } from '@/stores/cache'
+	const cache = useCacheStore()
+	const username=ref('')
+	const submit=()=>{
+		if(username.value=='') return TipsUtils.tips_toast('请输入昵称')
+		http.get('/user/updateUserInfo',{data:{nickName:username.value,avatarUrl:''},loading:true}).then((res)=>{
+			get_userinfo()
+		})
+	}
+	const get_userinfo=()=>{
+		http.get('/user/getUserInfo', { loading: true }).then(res => {
+			cache.set('USER_INFO',res.result)
+			TipsUtils.tips_toast('修改成功')
+			RouterUtils.back()
+		})
+	}
 </script>
 
 <style lang="less" scoped>

+ 2 - 2
src/utils/http/index.ts

@@ -175,8 +175,8 @@ export class HttpClient {
 
 // 创建实例
 export const http = new HttpClient({
-  baseURL: 'http://192.168.1.34:8080/jeecg-boot/app',
-  // baseURL: 'http://192.168.1.253:8080/jeecg-boot/app',
+  // baseURL: 'http://192.168.1.34:8080/jeecg-boot/app',
+  baseURL: 'http://192.168.1.253:8080/jeecg-boot/app',
   headers: {
     'Content-Type': 'application/json'
   }