Zory 1 місяць тому
батько
коміт
5977ffd185
33 змінених файлів з 1814 додано та 114 видалено
  1. 40 0
      奥莱优品/api/model/chat.js
  2. 6 0
      奥莱优品/api/model/goods.js
  3. 16 0
      奥莱优品/api/model/order.js
  4. 78 0
      奥莱优品/components/kfService/complaint.vue
  5. 1 1
      奥莱优品/components/kfService/kfService.vue
  6. 36 4
      奥莱优品/components/login/halfScreen.vue
  7. 13 2
      奥莱优品/pages.json
  8. 112 27
      奥莱优品/pages/goods/detail.vue
  9. 17 8
      奥莱优品/pages/index/index.vue
  10. 574 0
      奥莱优品/pages/order/detail.vue
  11. 157 23
      奥莱优品/pages/order/order.vue
  12. 167 39
      奥莱优品/pages/service/chat.vue
  13. 84 8
      奥莱优品/pages/service/service.vue
  14. 10 2
      奥莱优品/pages/user/user.vue
  15. BIN
      奥莱优品/static/image/empty.png
  16. BIN
      奥莱优品/static/image/kefu.png
  17. 0 0
      奥莱优品/static/image/order/goon.svg
  18. 1 0
      奥莱优品/static/image/order/refund.svg
  19. 1 0
      奥莱优品/static/image/order/success.svg
  20. 1 0
      奥莱优品/static/image/order/time.svg
  21. 36 0
      奥莱优品/uni_modules/ikun-qrcode/changelog.md
  22. 6 0
      奥莱优品/uni_modules/ikun-qrcode/components/ikun-qrcode/ikun-qrcode.vue
  23. 33 0
      奥莱优品/uni_modules/ikun-qrcode/components/ikun-qrcode/uqrcode_latest.js
  24. 100 0
      奥莱优品/uni_modules/ikun-qrcode/package.json
  25. 43 0
      奥莱优品/uni_modules/ikun-qrcode/readme.md
  26. 23 0
      奥莱优品/uni_modules/uni-load-more/changelog.md
  27. 5 0
      奥莱优品/uni_modules/uni-load-more/components/uni-load-more/i18n/en.json
  28. 8 0
      奥莱优品/uni_modules/uni-load-more/components/uni-load-more/i18n/index.js
  29. 5 0
      奥莱优品/uni_modules/uni-load-more/components/uni-load-more/i18n/zh-Hans.json
  30. 5 0
      奥莱优品/uni_modules/uni-load-more/components/uni-load-more/i18n/zh-Hant.json
  31. 117 0
      奥莱优品/uni_modules/uni-load-more/components/uni-load-more/uni-load-more.vue
  32. 105 0
      奥莱优品/uni_modules/uni-load-more/package.json
  33. 14 0
      奥莱优品/uni_modules/uni-load-more/readme.md

+ 40 - 0
奥莱优品/api/model/chat.js

@@ -0,0 +1,40 @@
+import request from '@/static/js/request.js'
+
+export default {
+	list: {
+		url: `/chat/list`,
+		get: async function(data={}) {
+			return await request.request(this.url,"GET",data,false,true,true)
+		}
+	},
+	service: {
+		url: `/chat/service`,
+		get: async function(data={}) {
+			return await request.request(this.url,"GET",data,false,true,true)
+		}
+	},
+	msg: {
+		url: `/chat/msg`,
+		get: async function(data={}) {
+			return await request.request(this.url,"GET",data,false,true,true)
+		}
+	},
+	sendText: {
+		url: `/chat/text`,
+		post: async function(data={}) {
+			return await request.request(this.url,"POST",data,false,true,true)
+		}
+	},
+	sendImage: {
+		url: `/chat/image`,
+		get: async function(data={}) {
+			return await request.request(this.url,"POST",data,false,true,true)
+		}
+	},
+	sendAddress: {
+		url: `/chat/address`,
+		get: async function(data={}) {
+			return await request.request(this.url,"POST",data,false,true,true)
+		}
+	},
+}

+ 6 - 0
奥莱优品/api/model/goods.js

@@ -18,5 +18,11 @@ export default {
 		get: async function(data={}) {
 			return await request.request(this.url,"GET",data,false,true,true)
 		}
+	},
+	check: {
+		url: `/goods/check`,
+		get: async function(data={}) {
+			return await request.request(this.url,"GET",data,false,true,true)
+		}
 	}
 }

+ 16 - 0
奥莱优品/api/model/order.js

@@ -0,0 +1,16 @@
+import request from '@/static/js/request.js'
+
+export default {
+	list: {
+		url: `/order/list`,
+		get: async function(data={}) {
+			return await request.request(this.url,"GET",data,false,true,true)
+		}
+	},
+	detail: {
+		url: `/order/detail`,
+		get: async function(data={}) {
+			return await request.request(this.url,"GET",data,false,true,true)
+		}
+	}
+}

+ 78 - 0
奥莱优品/components/kfService/complaint.vue

@@ -0,0 +1,78 @@
+<template>
+	<uni-popup ref="servicePop" type="bottom" border-radius="10px 10px 0 0" background-color="#f1f1f1">
+		<view class="ts-body">
+			<view class="ts-title">
+				选择投诉问题
+				<view class="right" @click="orderTs(2)"><image src="/static/image/close.png"></image></view>
+			</view>
+			<view class="ts-content">
+				<view class="ts-list">
+					<view class="ts-sub-title">订单与退款问题</view>
+					<view class="ts-item-body">
+						<view class="ts-item" @click="toTs('未按约定提供服务')">未按约定提供服务<image src="/static/image/right-black.png"></image></view>
+						<view class="ts-item" @click="toTs('买错了/不想要')">买错了/不想要<image src="/static/image/right-black.png"></image></view>
+						<view class="ts-item" @click="toTs('无退款入口')">无退款入口<image src="/static/image/right-black.png"></image></view>
+						<view class="ts-item" @click="toTs('催促退款')">催促退款<image src="/static/image/right-black.png"></image></view>
+						<view class="ts-item" @click="toTs('支付后找不到订单')">支付后找不到订单<image src="/static/image/right-black.png"></image></view>
+						<view class="ts-item" @click="toTs('无故被扣费/核销')">无故被扣费/核销<image src="/static/image/right-black.png"></image></view>
+						<view class="ts-item" @click="toTs('其他')">其他<image src="/static/image/right-black.png"></image></view>
+					</view>
+				</view>
+				<view class="ts-list">
+					<view class="ts-sub-title">商品与履约问题</view>
+					<view class="ts-item-body">
+						<view class="ts-item" @click="toTs('商品/内容描述不符')">商品/内容描述不符<image src="/static/image/right-black.png"></image></view>
+						<view class="ts-item" @click="toTs('商品/内容质量差')">商品/内容质量差<image src="/static/image/right-black.png"></image></view>
+						<view class="ts-item" @click="toTs('符合退款条件不退款')">符合退款条件不退款<image src="/static/image/right-black.png"></image></view>
+						<view class="ts-item" @click="toTs('未收到货')">未收到货<image src="/static/image/right-black.png"></image></view>
+						<view class="ts-item" @click="toTs('申请退款仍然发货')">申请退款仍然发货<image src="/static/image/right-black.png"></image></view>
+					</view>
+				</view>
+				<view class="ts-list">
+					<view class="ts-sub-title">客服问题</view>
+					<view class="ts-item-body">
+						<view class="ts-item" @click="toTs('客服不回复/回复慢')">客服不回复/回复慢<image src="/static/image/right-black.png"></image></view>
+						<view class="ts-item" @click="toTs('涉及辱骂/骚扰')">涉及辱骂/骚扰<image src="/static/image/right-black.png"></image></view>
+					</view>
+				</view>
+			</view>
+		</view>
+	</uni-popup>
+</template>
+
+<script>
+export default {
+	data() {
+		return {
+			orderSn:0
+		}
+	},
+	methods: {
+		orderTs(type){
+			if (type == 1) {
+				this.$refs.servicePop.open()
+			} else {
+				this.$refs.servicePop.close()
+			}
+		},
+		open(data) {
+			this.orderSn = data;
+			this.$nextTick(()=>{
+				this.$refs.servicePop.open()
+			})
+		}
+	}
+}
+</script>
+
+<style>
+.ts-body .ts-title{display: flex;align-items: center;justify-content: space-between;font-size: 28upx;padding: 20upx;}
+.ts-body .ts-title image{width: 40upx;height: 40upx;}
+.ts-body .ts-content{height: 40vh;overflow: auto;padding: 20upx;}
+.ts-body .ts-list{margin-bottom: 20upx;}
+.ts-body .ts-list .ts-sub-title{line-height: 32upx;color: #666;font-size: 24upx;margin-bottom: 20upx;}
+.ts-body .ts-list .ts-item-body{background-color: #fff;border-radius: 10upx;padding: 20upx;}
+.ts-body .ts-list .ts-item-body .ts-item{font-size: 28upx;color: #333;display: flex;align-items: center;justify-content: space-between;border-bottom: 2upx solid #f8f8f8;padding: 20upx 0;}
+.ts-body .ts-list .ts-item-body .ts-item:last-child{border-bottom: 0;}
+.ts-body .ts-list .ts-item-body .ts-item image{width: 40upx;height: 40upx;}
+</style>

+ 1 - 1
奥莱优品/components/kfService/kfService.vue

@@ -13,7 +13,7 @@
 				<view class="top">
 					<view class="item">客服时间:{{storeData.start_at}}-{{storeData.end_at}}</view>
 					<view class="item">
-						<button class="btn" @click="$dialog.jumpUri('/pages/service/chat/chat?poi='+storeData.poi_id+'&source=home',1);showService(2)">在线咨询商家</button>
+						<button class="btn" @click="$dialog.jumpUri('/pages/service/chat?poi='+storeData.poi_id+'&source=home',1);showService(2)">在线咨询商家</button>
 					</view>
 					<view class="item" v-if="storeData.service_mobile" @click="callMobile(storeData.service_mobile)">商家客服电话</view>
 				</view>

+ 36 - 4
奥莱优品/components/login/halfScreen.vue

@@ -9,7 +9,8 @@
 					</view>
 					<view class="login-close" @click="closeLogin"><text class="cuIcon-close"></text></view>
 				</view>
-				<view class="login-desc">为了更好的为您提供服务,本次操作需要您关联手机号码</view>
+				<view class="login-desc" v-if="loginType==1">为了更好的为您提供服务,本次操作需要您关联手机号码</view>
+				<view class="login-desc" v-else>为了更好的区分完善信息,还需授权获取到您的头像、昵称信息</view>
 				<view class="login-footer">
 					<view :class="checkTrueState?'checkBox active':'checkBox'" @click="checkTrue">
 						<text class="cuIcon-check"></text>
@@ -17,10 +18,15 @@
 					<view @click="checkTrue">我已阅读并同意</view>
 					<text @click="toWeb('privacy')">用户协议、</text><text @click="toWeb('privacy')">隐私协议</text>
 				</view>
-				<view class="logi-btn">
+				<view class="logi-btn" v-if="loginType==1">
 					<button class="u-button full" open-type="getPhoneNumber" @getphonenumber="getPhoneNumberData" v-if="checkTrueState">快捷一键登录</button>
 					<button class="u-button full" @click="toLoginCheck" v-else>快捷登录</button>
 					<button class="u-button" @click="closeLogin">暂不登录</button>
+				</view>
+				<view class="logi-btn" v-else>
+					<button class="u-button full" open-type="getUserInfo" @click="getUserInfo" v-if="checkTrueState">快捷一键获取</button>
+					<button class="u-button full" @click="toLoginCheck" v-else>快捷获取</button>
+					<button class="u-button" @click="closeLogin">再看看</button>
 				</view>
 			</view>
 		</uni-popup>
@@ -32,7 +38,8 @@ import { show } from '@/utils/js/index.js';
 export default {
 	data() {
 		return {
-			checkTrueState:false
+			checkTrueState:false,
+			loginType:1
 		}
 	},
 	methods: {
@@ -58,6 +65,30 @@ export default {
 				})
 				return ;
 			}
+		},
+		getUserInfo(e){
+			uni.getUserProfile({
+				force: true,
+				success: async (resp)=> {
+					if (resp.errMsg == 'getUserProfile:ok') {
+						var detail = {};
+						detail.avatar = resp.userInfo.avatarUrl
+						detail.nickname = resp.userInfo.nickName
+						var aresp = await this.$api.auth.nick.post(detail);
+						if (aresp.code !== 1) {
+							return show(aresp.msg);
+						}
+						uni.showTabBar()
+						this.$nextTick(()=>{
+							this.$refs.loginPop.close()
+						})
+						this.$emit('success',null);
+					}
+				},
+				fail(e) {
+					console.log(e)
+				}
+			})
 		},
 		getPhoneNumberData(event){
 			uni.login({
@@ -83,8 +114,9 @@ export default {
 				}
 			})
 		},
-		open() {
+		open(type = 1) {
 			uni.hideTabBar();
+			this.loginType = type;
 			this.$nextTick(()=>{
 				this.$refs.loginPop.open()
 			})

+ 13 - 2
奥莱优品/pages.json

@@ -65,13 +65,24 @@
 			"style": {
 				"navigationBarTitleText": "服务资质"
 			}
+		},
+		{
+			"path": "pages/order/detail",
+			"style": {
+				"navigationBarTitleText": "订单详情",
+				"navigationBarBackgroundColor": "#f1f1f1",
+				"navigationBarTextStyle": "black",
+				"usingComponents": {
+					"pay-button-sdk": "tta5a3d31e3aecfb9b11://pay-button"
+				}
+			}
 		}
 	],
 	"globalStyle": {
 		"navigationBarTextStyle": "black",
 		"navigationBarTitleText": "奥莱优品",
-		"navigationBarBackgroundColor": "#F8F8F8",
-		"backgroundColor": "#F8F8F8"
+		"navigationBarBackgroundColor": "#f1f1f1",
+		"backgroundColor": "#f1f1f1"
 	},
 	"tabBar": {
 		"backgroundColor": "#ffffff",

+ 112 - 27
奥莱优品/pages/goods/detail.vue

@@ -33,7 +33,7 @@
 							<span class="mix-item" v-if="goodsData.use_date_type==1">
 								自购买之日起{{ goodsData.day_duration }}天有效
 							</span>
-							<span class="mix-item" v-if="goodsData.use_date_type==2">
+							<span class="mix-item" v-else>
 								有效期:{{ $dialog.dateFormat(goodsData.use_time_start,'yyyy-MM-dd') }}至{{ $dialog.dateFormat(goodsData.use_time_end,'yyyy-MM-dd') }}
 							</span>
 							 <image src="/static/image/right-black.png"></image></view>
@@ -70,7 +70,7 @@
 										<span class="mix-item" v-if="goodsData.use_date_type==1">
 											自购买之日起{{ goodsData.day_duration }}天有效
 										</span>
-										<span class="mix-item" v-if="goodsData.use_date_type==2">
+										<span class="mix-item" v-else>
 											有效期:{{ $dialog.dateFormat(goodsData.use_time_start,'yyyy-MM-dd') }}至{{ $dialog.dateFormat(goodsData.use_time_end,'yyyy-MM-dd') }}
 										</span>
 									</view>
@@ -133,6 +133,56 @@
 				<view class="footer-safe"></view>
 			</view>
 		</view>
+		<uni-popup ref="rulepopup" type="bottom" border-radius="10px 10px 0 0" background-color="#f1f1f1" :mask-click="false">
+			<view class="rule-popup">
+				<view class="title">
+					购买须知
+					<view class="close" @click="openRule(2)"><image src="/static/image/close.png"></image></view>
+				</view>
+				<view class="buy-rule" v-if="goodsData">
+					<view class="rule-list">
+						<view class="rule-item">
+							<view class="icon"><image src="/static/image/rule-date.png"></image></view>
+							<view class="item-top">
+								<view class="name">可用日期</view>
+								<view class="desc">
+									<span class="mix-item" v-if="goodsData.use_date_type==1">
+										自购买之日起{{ goodsData.day_duration }}天有效
+									</span>
+									<span class="mix-item" v-else>
+										有效期:{{ $dialog.dateFormat(goodsData.use_time_start,'yyyy-MM-dd') }}至{{ $dialog.dateFormat(goodsData.use_time_end,'yyyy-MM-dd') }}
+									</span>
+								</view>
+							</view>
+						</view>
+						<view class="rule-item">
+							<view class="icon"><image src="/static/image/rule-time.png"></image></view>
+							<view class="item-top">
+								<view class="name">可用时间</view>
+								<view class="desc" v-if="goodsData.can_no_use_date==1">商家营业时间可用</view>
+							</view>
+						</view>
+						<view class="rule-item">
+							<view class="icon"><image src="/static/image/rule-rule.png"></image></view>
+							<view class="item-top">
+								<view class="name">预约规则</view>
+								<view class="desc" v-if="goodsData.booking_type==1">无需预约,高峰期可能需要排队</view>
+								<view class="desc" v-if="goodsData.booking_type==2">
+									需要提前<span>{{ goodsData.booking_date }}</span>{{ goodsData.booking_unit==1?'天':'小时' }}预约
+								</view>
+							</view>
+						</view>
+						<view class="rule-item">
+							<view class="icon"><image src="/static/image/rule-refund.png"></image></view>
+							<view class="item-top">
+								<view class="name">退款政策<view class="tips">随时退/过期退</view></view>
+								<view class="desc">随时退款:未核销的商品支持随时申请退款;过期自动退:商品若在有效时间内未核销使用,到期之后系统将自动发起退款</view>
+							</view>
+						</view>
+					</view>
+				</view>
+			</view>
+		</uni-popup>
 		<uni-popup ref="buypopup" type="bottom" border-radius="10px 10px 0 0" background-color="#ffffff" :mask-click="false">
 			<view class="service-popup popup-flex popup-height" v-if="goodsData">
 				<view class="tags-top">
@@ -201,7 +251,8 @@ export default {
 			bannerData:[],
 			buyGoods:null,
 			currIndex:0,
-			swiperHeight:0
+			swiperHeight:240,
+			userState:0
 		}
 	},
 	onLoad(options) {
@@ -218,7 +269,14 @@ export default {
 		this.$scope.onErrors = this.onErrors;
 		this.$scope.onPay = this.onPay;
 	},
-	methods: {
+	methods: {
+		openRule(type){
+			if (type == 1) {
+				app.$refs.rulepopup.open()
+			} else {
+				app.$refs.rulepopup.close()
+			}
+		},
 		getGoodsInfo(){
 			return new Promise(resolve => {
 				resolve({
@@ -364,11 +422,25 @@ export default {
 		toLogin(){
 			this.$refs.loginCom.open();
 		},
-		kfPop(){
+		async kfPop(){
+			if (!app.isLogin) {
+				this.$refs.loginCom.open();
+				return ;
+			}
+			var resp = await this.$api.goods.check.get();
+			if (resp.code == 0) {
+				return app.$dialog.showSuccess(resp.msg);
+			}
+			if (resp.data.user == 0) {
+				this.$refs.loginCom.open(2);
+				return ;
+			}
 			this.$refs.kfService.open(app.storeData);
 		},
 		loginSuccess(token){
-			app.isLogin = token;
+			if (token) {
+				app.isLogin = token;
+			}
 		},
 		toNav(type) {
 			var url = "";
@@ -472,6 +544,37 @@ export default {
 		}
 	}
 }
+.rule-popup {
+	.buy-rule {
+		padding: 20rpx;
+	}
+	.title{
+		line-height: 80upx;font-size: 32rpx;color: #333;font-weight: bold;display: flex;align-items: center;
+		border-bottom: 2upx solid #f8f8f8;
+		padding: 0 20rpx;
+		justify-content: space-between;
+		image{width: 40upx;height: 40upx;}
+	}
+}
+.buy-rule{
+	background-color: #fff;
+	width: 95%;
+	margin:20rpx auto;
+	padding: 0 20rpx 20rpx;
+	border-radius: 20rpx;
+	.title{
+		line-height: 80upx;font-size: 32rpx;color: #333;font-weight: bold;display: flex;align-items: center;
+		border-bottom: 2upx solid #f8f8f8;
+	}
+	.rule-item{
+		display: flex;margin-top: 40upx;align-items: start;gap:20rpx;
+		image{width: 50upx;height: 50upx;}
+		.name{
+			font-size: 28rpx;color: #333;font-weight: bold;margin-bottom: 10upx;display: flex;align-items: center;
+			.tips{color: #333;border: 2upx solid #ddd;border-radius: 5upx;font-size: 22rpx;font-weight: normal;margin-left: 40upx;background-color: #fff;padding: 5upx 10upx;}
+		}
+	}
+}
 .content {
 	background-color: #f8f8f8;
 	height: 100vh;
@@ -489,7 +592,7 @@ export default {
 			background-color: #fff;
 			width: 95%;
 			margin:20rpx auto;
-			padding: 20rpx;
+			padding: 0 20rpx 20rpx;
 			border-radius: 20rpx;
 			.title{
 				line-height: 80upx;font-size: 32rpx;color: #333;font-weight: bold;display: flex;align-items: center;
@@ -497,30 +600,11 @@ export default {
 				margin-bottom: 20rpx;
 			}
 		}
-		.buy-rule{
-			background-color: #fff;
-			width: 95%;
-			margin:20rpx auto;
-			padding: 20rpx;
-			border-radius: 20rpx;
-			.title{
-				line-height: 80upx;font-size: 32rpx;color: #333;font-weight: bold;display: flex;align-items: center;
-				border-bottom: 2upx solid #f8f8f8;
-			}
-			.rule-item{
-				display: flex;margin-top: 40upx;align-items: start;gap:20rpx;
-				image{width: 50upx;height: 50upx;}
-				.name{
-					font-size: 28rpx;color: #333;font-weight: bold;margin-bottom: 10upx;display: flex;align-items: center;
-					.tips{color: #333;border: 2upx solid #ddd;border-radius: 5upx;font-size: 22rpx;font-weight: normal;margin-left: 40upx;background-color: #fff;padding: 5upx 10upx;}
-				}
-			}
-		}
 		.goods-store{
 			background-color: #fff;
 			width: 95%;
 			margin:20rpx auto;
-			padding: 20rpx;
+			padding: 0 20rpx 20rpx;
 			border-radius: 20rpx;
 			.title{
 				line-height: 80upx;
@@ -611,6 +695,7 @@ export default {
 		.home-banner {
 			.swiper{
 				height: 380upx;
+				transition: height 0.5s ease;
 				image{width: 100%;height: auto;}
 			}
 		}

+ 17 - 8
奥莱优品/pages/index/index.vue

@@ -142,18 +142,27 @@ export default {
 			app.goodsData = resp.data.rows;
 		},
 		toDetail(id){
+			// if (!app.isLogin) {
+			// 	this.$refs.loginCom.open();
+			// 	return ;
+			// }
+			uni.navigateTo({
+				url:`/pages/goods/detail?goods=${id}`
+			})
+		},
+		async kfPop(){
 			if (!app.isLogin) {
 				this.$refs.loginCom.open();
 				return ;
 			}
-			// uni.navigateTo({
-			// 	url:`/pages/goods/detail?goods=${id}`
-			// })
-			uni.navigateTo({
-				url:`/pages/order/tips?goods=${id}`
-			})
-		},
-		kfPop(){
+			var resp = await this.$api.goods.check.get();
+			if (resp.code == 0) {
+				return app.$dialog.showSuccess(resp.msg);
+			}
+			if (resp.data.user == 0) {
+				this.$refs.loginCom.open(2);
+				return ;
+			}
 			const data = uni.getStorageSync("contact");
 			this.$refs.kfService.open(data);
 		}

+ 574 - 0
奥莱优品/pages/order/detail.vue

@@ -0,0 +1,574 @@
+<template>
+	<view class="content">
+		<template v-if="!isLogin">
+			<view class="empty-body">
+				<view class="imgs">
+					<image src="/static/image/empty.png" mode="widthFix"></image>
+					<view class="tip">请先完成登录~</view>
+				</view>
+				<view class="re-btn" @click="toLogin">去登陆</view>
+			</view>
+		</template>
+		<template v-else>
+			<template v-if="loading">
+				<view class="skeleton">
+					<view class="skeleton-line max animate" style="height: 200upx;"></view>
+					<view class="skeleton-line animate"></view>
+					<view class="skeleton-line min animate"></view>
+					<view class="skeleton-line min animate"></view>
+					<view class="skeleton-line max animate" style="height: 200upx;"></view>
+					<view class="skeleton-line max animate" style="height: 200upx;"></view>
+				</view>
+			</template>
+			<template v-else>
+				<scroll-view class="goods-body" scroll-y scroll-with-animation>
+					<view class="order-body">
+						<view class="status-body">
+							<view class="order_status">
+								<template v-if="orderData && orderData.status == 0">
+									<view class="status-name">待支付</view>
+									<view class="status-desc">超过30分钟未支付,订单将自动取消</view>
+								</template>
+								<template v-if="orderData && orderData.status == 1">
+									<view class="status-name">
+										<image src="/static/image/order/time.svg"></image>待使用
+									</view>
+									<view class="status-desc" v-if="orderData.end_at">有效期至:{{ orderData.end_at }}</view>
+									<view class="status-desc" v-else>如有疑问,可咨询客服</view>
+								</template>
+								<template v-if="orderData && orderData.status == 2">
+									<view class="status-name success">
+										<image src="/static/image/order/success.svg"></image>已完成
+									</view>
+									<view class="status-desc">服务已完成,欢迎您再次使用</view>
+								</template>
+								<template v-if="orderData && orderData.status == 3">
+									<view class="status-name">
+										<image src="/static/image/order/refund.svg"></image>
+										退款成功
+									</view>
+									<view class="status-desc">{{ $dialog.formatMoney(orderData.pay_money,true) }} 已原路退回</view>
+								</template>
+								<template v-if="orderData && orderData.status == 4">
+									<view class="status-name">
+										<image src="/static/image/order/refund.svg"></image>退款中</view>
+									<view class="status-desc">已申请退款,钱款预计1-3个自然日到账</view>
+								</template>
+								<template v-if="orderData && orderData.status == 5">
+									<view class="status-name">已关闭</view>
+									<view class="status-desc">订单已取消或已关闭</view>
+								</template>
+								<template v-if="orderData && orderData.status == 6">
+									<view class="status-name">部分退款</view>
+									<view class="status-desc">已退款{{orderData.refund_num}}份</view>
+								</template>
+								<template v-if="orderData && orderData.status == 7">
+									<view class="status-name">
+										<image src="/static/image/order/goon.svg"></image>履约中
+									</view>
+									<view class="status-desc">服务进行中,有疑问请咨询客服</view>
+								</template>
+							</view>
+						</view>
+						<view class="item-goods">
+							<view class="item-goods-body">
+								<view class="image">
+									<image :src="orderData.img"></image>
+								</view>
+								<view class="info">
+									<view class="title">
+										<view class="name">{{ goodsData.product_name }}</view>
+										<view class="num">x{{ orderData.number }}</view>
+									</view>
+									<view class="tags">
+										{{orderData.sku_name?orderData.sku_name:'默认'}}
+										<view class="price">{{ $dialog.formatMoney(orderData.price,true) }}</view>
+									</view>
+									<view class="price-right">实付 <text>{{ $dialog.formatMoney(orderData.pay_money,true) }}</text></view>
+								</view>
+							</view>
+							<view class="order-qrcode" v-if="orderData.status == 1">
+								<view class="qrcode-img">
+									<ikun-qrcode
+										width="200"
+										height="200"
+										unit="rpx"
+										color="#000000"
+										:data="orderData.order_sn">
+									</ikun-qrcode>
+								</view>
+								<view class="qrcode-text">券码 {{orderData.order_sn}} <text @click="copyOrder(orderData.order_sn)">复制</text></view>
+							</view>
+						</view>
+						<view class="home-store">
+							<view class="service-detail" @click="kfPop()">
+								<view class="left">
+									<image src="/static/image/kefu.png"></image>
+									<view class="name">联系客服</view>
+								</view>
+								<view class="right" v-if="storeData">
+									<image src="/static/image/right-black.png"></image>
+								</view>
+							</view>
+							<view class="service-detail" @click="orderTs()">
+								<view class="left">
+									<image src="/static/image/face.svg"></image>
+									<view class="name">我要投诉</view>
+								</view>
+								<view class="right">
+									<image src="/static/image/right-black.png"></image>
+								</view>
+							</view>
+						</view>
+						<view class="goods-store" v-if="poiData">
+							<view class="title">适用门店</view>
+							<view class="store-info">
+								<view class="store-left">
+									<view class="name">{{poiData?poiData.poi_name:'-'}}</view>
+									<view class="address">{{poiData?poiData.poi_address:'-'}}</view>
+								</view>
+								<view class="store-right">
+									<view class="right-item" @click="toMap">
+										<image src="/static/image/amap.png"></image>
+										<view class="desc">导航</view>
+									</view>
+								</view>
+							</view>
+						</view>
+						<view class="order-info">
+							<view class="title">订单信息</view>
+							<view class="info-item">
+								<view class="name">订单编号</view>
+								<view class="right">{{ orderData.out_order_no }} <text @click="copyOrder(orderData.out_order_no)">复制</text></view>
+							</view>
+							<view class="info-item">
+								<view class="name">手机号码</view>
+								<view class="right">{{ orderData.mobile }}</view>
+							</view>
+							<view class="info-item">
+								<view class="name">下单时间</view>
+								<view class="right">{{ orderData.create_at }}</view>
+							</view>
+							<view class="info-item">
+								<view class="name">付款时间</view>
+								<view class="right">{{ orderData.pay_at }}</view>
+							</view>
+							<view class="info-item" v-if="orderData.status == 3">
+								<view class="name">退款时间</view>
+								<view class="right">{{ orderData.refund_at }}</view>
+							</view>
+						</view>
+					</view>
+					<view class="line-height"></view>
+				</scroll-view>
+				<view class="footer">
+					<view class="footer-op">
+						<view class="footer-left"></view>
+						<view class="footer-right">
+							<template v-if="orderData.status == 1 || orderData.status == 6">
+								<pay-button-sdk
+									class="btn"
+									:mode="1"
+									:goods-type="1"
+									:order-status="1"
+									:order-id="orderData.out_order_no"
+									:goods-id="orderData.life_goods_id"
+									:refund-total-amount="orderData.pay_money"
+									bind:applyrefund="applyRefund"
+									bind:refund="handleRefund"
+									bind:error="onErrors"
+								></pay-button-sdk>
+								<view class="btn full" @click="$dialog.jumpUri('/pages/service/chat?poi='+storeData.poi_id+'&source=apply&order='+orderData.order_sn,1);">立即预约</view>
+							</template>
+							<template v-if="orderData.status == 2">
+								<view class="btn" @click="toGoods">再来一单</view>
+								<view class="btn full" @click="toAfter">申请售后</view>
+							</template>
+							<template v-if="orderData.status == 3 || orderData.status == 4">
+								<view class="btn">再次购买</view>
+							</template>
+							<template v-if="orderData.status == 5">
+								<view class="btn" @click="toGoods">再次购买</view>
+							</template>
+						</view>
+					</view>
+					<view class="footer-safe"></view>
+				</view>
+			</template>
+		</template>
+		<halfLogin ref="loginCom" @success="loginSuccess"></halfLogin>
+		<kfService ref="kfService"></kfService>
+		<complaint ref="complaint"></complaint>
+	</view>
+</template>
+
+<script>
+var app;
+import complaint from "@/components/kfService/complaint";
+export default {
+	components: {
+		complaint
+	},
+	data() {
+		return {
+			optionData:null,
+			storeData:null,
+			order:0,
+			loading:true,
+			goodsData:null,
+			orderTime:null,
+			poiData:null,
+			orderData:null,
+			isLogin:true,
+			userState:1
+		}
+	},
+	created() {
+		this.$scope.applyRefund = this.applyRefund;
+		this.$scope.onPay = this.onPay;
+		this.$scope.handleRefund = this.handleRefund;
+		this.$scope.onErrors = this.onErrors;
+	},
+	onShow(){
+	    let allPages = getCurrentPages(); //获取当前页面栈的实例;
+		let lastPages = allPages.length - 1; // 获得倒数第二个元素的索引;
+		let option = allPages[lastPages].options; // 获得上个页面传递的参数;
+		this.order = option.order?option.order:''
+		this.optionData = option
+		this.getOrder();
+	},
+	onLoad() {
+		app = this;
+	},
+	methods: {
+		kfPop(){
+			if (app.userState == 0) {
+				this.$refs.loginCom.open(2);
+				return ;
+			}
+			this.$refs.kfService.open(app.storeData);
+		},
+		orderTs(){
+			this.$refs.complaint.open(app.order);
+		},
+		toLogin(){
+			this.$refs.loginCom.open();
+		},
+		loginSuccess(){
+			app.getOrder();
+		},
+		async getOrder(){
+			app.loading = true;
+			var res = await app.$api.order.detail.get({"order":app.order});
+			app.loading = false;
+			if (res.code && res.code == 0) {
+				app.$dialog.showSuccess(res.msg);
+				uni.navigateBack()
+				return ;
+			}
+			if (res.code && res.code == 401) {
+				app.isLogin = false;
+				this.$refs.loginCom.open();
+				return ;
+			}
+			app.isLogin = true;
+			uni.setStorageSync("poiId",res.data.poi_id);
+			app.poiData = res.data.poi;
+			app.userState = res.data.user;
+			const storeDataTemp = {
+				"end_at":app.poiData.end_at,
+				"latitude":app.poiData.latitude,
+				"longitude":app.poiData.longitude,
+				"poi_address":app.poiData.poi_address,
+				"poi_city":app.poiData.poi_city,
+				"poi_id":app.poiData.poi_id,
+				"poi_logo":app.poiData.poi_logo,
+				"poi_name":app.poiData.poi_name,
+				"service_mobile":app.poiData.service_mobile,
+				"start_at":app.poiData.start_at
+			};
+			uni.setStorageSync("contact",storeDataTemp);
+			app.storeData = storeDataTemp;
+			app.goodsData = res.data.product;
+			app.orderData = res.data;
+			app.orderTime = res.data.end_time
+		},
+		copyOrder(order){
+			uni.setClipboardData({
+				data:order,
+				success() {
+					app.$dialog.showSuccess("复制成功")
+				},
+				fail() {
+					app.$dialog.showSuccess("复制失败")
+				}
+			})
+		},
+		toMap(){
+			var poi = app.poiData;
+			uni.openLocation({
+				latitude:poi.latitude,
+				longitude:poi.longitude,
+				name:poi.poi_name,
+				address:poi.poi_address,
+				success() {
+					console.log("open success")
+				},
+				fail(err) {
+					app.$dialog.showSuccess("打开导航失败")
+					console.log(err)
+				}
+			})
+		},
+		applyRefund(){},
+		onPay(){},
+		handleRefund(){},
+		onErrors(){},
+	}
+}
+</script>
+
+<style lang="scss" scoped>
+.content{
+    position: fixed;
+    z-index: 1;
+    top: 0;
+    left: 0;
+    bottom: 0;
+    right: 0;
+    background-color: #f1f1f1;
+	display: flex;
+	flex-direction: column;
+	.line-height{
+		height: 40rpx;
+		width: 100%;
+	}
+}
+.empty-body{
+	display: flex;align-items: center;justify-content: center;flex-direction: column;height: calc(100vh - 100upx);
+	.imgs{
+		text-align: center;font-size: 28upx;color: #666;
+		image{height: 160upx;width: 160upx;}
+		.tip{margin-top: 20upx;}
+	}
+	.re-btn{
+		width: 180upx;
+		height: 80upx;
+		line-height: 80upx;
+		text-align: center;
+		font-size: 28upx;
+		color: #fff;
+		background-color: $main-color;
+		border-radius: 10upx;
+		margin-top: 60upx;
+	}
+}
+.order-qrcode {
+	.qrcode-img {
+		margin-top: 20rpx;
+		padding: 40rpx 0;
+		border-top: 5rpx dotted #f8f8f8;
+		border-bottom: 5rpx dotted #f8f8f8;
+		display: flex;
+		align-items: center;
+		justify-content: center;
+	}
+	.qrcode-text{
+		text-align: center;
+		margin-top: 20upx;
+		text{margin-left: 10upx;color: #007aff;}
+	}
+}
+.home-store{
+	margin: 20upx auto;
+	display: flex;
+	align-items: center;
+	gap: 20upx;
+	justify-content: space-between;
+	.service-detail{
+		display: flex;
+		align-items: center;
+		background-color: #fff;
+		border-radius: 10upx;
+		height: 120upx;padding: 0 20upx;
+		flex: 1;
+		.left{
+			display: flex;align-items: center;
+			image{width: 50upx;height: 50upx;margin-right: 15upx;}
+		}
+		.right {
+			margin-left: auto;margin-right: 0;display: flex;align-items: center;
+			image{width: 50upx;height: 50upx;}
+		}
+	}
+	.service-btn{
+		background-color: #fff;text-align: center;padding: 0 30upx;font-size: 28upx;height: 120upx;line-height: 120upx;display: flex;align-items: center;justify-content: space-between;
+		image{width: 50upx;height: 50upx;}
+		.btn-name{
+			margin-left: 15upx;
+			image{width: 40upx;height: 40upx;}
+		}
+	}
+}
+.footer{
+	background-color: #fff;
+	padding: 20upx 20upx 0 20upx;border-top: 2upx solid #f8f8f8;
+	.footer-safe {
+		height: env(safe-area-inset-bottom);width: 100%;
+	}
+	.footer-op{
+		display: flex;
+		align-items: center;
+		justify-content: space-between;
+		.footer-right{
+			display: flex;
+			align-items: center;
+			gap: 20rpx;
+			.btn{
+				font-size: 28rpx;
+				height: 80upx;
+				border-radius: 10upx;
+				line-height: 80upx;
+				text-align: center;
+				min-width: 200rpx;
+				color: #333;
+				border: 2rpx solid #ccc;
+				&.full{
+					background-color: $main-color;
+					color: #fff;
+					border: 2rpx solid $main-color;
+				}
+			}
+		}
+	}
+}
+.goods-body{
+	height: 0;
+	flex: 1;
+}
+.order-body {
+	width: 95%;
+	margin: 20rpx auto;
+	.order_status{
+		.status-name{
+			display: flex;
+			align-items: center;
+			gap: 20rpx;
+			font-size: 38rpx;
+			color: #000;
+			font-weight: 800;
+			image {
+				width: 50rpx;
+				height: 50rpx;
+			}
+		}
+	}
+	.item-goods{
+		background-color: #fff;
+		margin-top: 20rpx;
+		border-radius: 20rpx;
+		padding: 20rpx;
+		.item-goods-body{
+			display: flex;
+			align-items: center;
+			gap: 20rpx;
+		}
+		.stock{
+			text-align: right;
+		}
+		.image {
+			height: 140rpx;
+			overflow: hidden;display: flex;align-items: center;min-width: 140rpx;
+			position: relative;
+			image {
+				width: 140rpx;
+				border-radius: 10upx;
+				height: 100%;
+			}
+		}
+		.info{
+			flex: 1 1 0%;
+			overflow: hidden;
+			.title{
+				display: flex;
+				align-items: center;
+				justify-content: space-between;
+				.name {
+					overflow: hidden;
+					text-overflow: ellipsis;
+					font-size: 32rpx;
+					display: -webkit-box;
+					-webkit-line-clamp: 2;
+					 -webkit-box-orient: vertical;
+					color: #333;
+					font-weight: 900;
+				}
+			}
+			.price-right{
+				text-align: right;
+				color: $main-color;
+				margin-top: 20rpx;
+				font-size: 28rpx;
+				text {
+					font-size: 30rpx;
+					font-weight: 800;
+				}
+			}
+			.tags {
+				color: #94a3b8;
+				font-size: 24rpx;
+				margin: 10rpx 0;
+				display: flex;
+				align-items: center;
+				justify-content: space-between;
+				.price {
+					font-size: 28rpx;
+					color: $main-text-color;
+					font-weight: 600;
+				}
+			}
+		}
+	}
+	.order-info{
+		border-radius: 20rpx;
+		background-color: #fff;padding: 20upx;margin-top: 20upx;
+		.title{font-size: 32upx;color: #333;font-weight: bold;margin-bottom: 20upx;}
+		.info-item{
+			height: 80upx;line-height: 80upx;font-size: 28upx;display: flex;align-items: center;
+			.right{
+				color: #666;margin-left: auto;margin-right: 0;
+				text{border: 2upx solid #ccc;color: #333;font-size: 24upx;padding: 0 15upx;margin-left: 20upx;border-radius: 5upx;}
+			}
+		}
+	}
+	.status-desc{
+		font-size: 24rpx;color: #666;margin-top: 20rpx;
+	}
+	.goods-store{
+		background-color: #fff;
+		margin:20rpx 0;
+		padding: 0 20rpx 20rpx;
+		border-radius: 20rpx;
+		.title{
+			line-height: 80upx;
+			font-size: 32rpx;
+			color: #333;
+			font-weight: bold;
+			display: flex;
+			align-items: center;
+			border-bottom: 2upx solid #f8f8f8;
+		}
+		.store-info{
+			display: flex;align-items: center;padding: 20upx 0;
+			.store-right{
+				margin-left: auto;margin-right: 0;font-size: 24rpx;color: #999;
+				image{width: 50upx;height: 50upx;margin-bottom: 10upx;}
+			}
+			.store-left {
+				.name{font-size: 30rpx;color: #333;font-weight: bold;line-height: 80upx;}
+				.address{font-size: 24rpx;color: #999;}
+			}
+		}
+	}
+}
+</style>

+ 157 - 23
奥莱优品/pages/order/order.vue

@@ -2,67 +2,177 @@
 	<view class="content">
 		<view class="tab-menu">
 			<view :class="orderState==0?'tab-item active':'tab-item'" @click="orderStatus(0)">全部</view>
-			<view :class="orderState==1?'tab-item active':'tab-item'" @click="orderStatus(1)">待使用</view>
-			<view :class="orderState==2?'tab-item active':'tab-item'" @click="orderStatus(2)">已完成</view>
-			<view :class="orderState==3?'tab-item active':'tab-item'" @click="orderStatus(3)">已退款</view>
-			<view :class="orderState==6?'tab-item active':'tab-item'" @click="orderStatus(6)">已关闭</view>
+			<view :class="orderState==2?'tab-item active':'tab-item'" @click="orderStatus(2)">待使用</view>
+			<view :class="orderState==3?'tab-item active':'tab-item'" @click="orderStatus(3)">已完成</view>
+			<view :class="orderState==4?'tab-item active':'tab-item'" @click="orderStatus(4)">已退款</view>
+			<view :class="orderState==8?'tab-item active':'tab-item'" @click="orderStatus(8)">履约中</view>
 		</view>
-		<scroll-view class="order-body" scroll-y scroll-with-animation>
-			<view class="order-list">
-				<view class="order-item" v-for="(item,indx) in 10" :key="indx">
+		<scroll-view class="order-body" scroll-y scroll-with-animation @scrolltoupper="scrolltoupper" @scrolltolower="scrolltolower" upper-threshold="80">
+			<view class="order-list" v-if="orderList.length == 0 && orderData.loading">
+				<view class="order-item" v-for="(item,indx) in 3" :key="indx">
 					<view class="item-header">
+						<view class="item-store" style="flex: 1;"><view class="skeleton-line animate"></view></view>
+					</view>
+					<view class="item-goods">
+						<view class="image">
+							<view class="skeleton-line animate"></view>
+						</view>
+						<view class="info">
+							<view class="title">
+								<view class="skeleton-line animate"></view>
+							</view>
+							<view class="tags">
+								<view class="skeleton-line animate"></view>
+							</view>
+							<view class="tags">
+								<view class="skeleton-line animate"></view>
+							</view>
+						</view>
+					</view>
+					<view class="mt15">
+						<view class="skeleton-line animate"></view>
+					</view>
+					<view class="item-footer mt15">
+						<view class="footer-left" style="width: 30%;">
+							<view class="skeleton-line animate"></view>
+						</view>
+						<view class="footer-group-btn" style="width: 30%;">
+							<view class="skeleton-line animate"></view>
+						</view>
+					</view>
+				</view>
+			</view>
+			<view class="order-list" v-else>
+				<view class="empty-body" v-if="orderList.length == 0">
+					<view class="imgs">
+						<image src="/static/image/empty.png" mode="widthFix"></image>
+						<view class="tip">没有更多数据啦~</view>
+						<view class="re-btn" @click="toLogin" v-if="!isLogin">立即登录</view>
+					</view>
+				</view>
+				<view class="order-item" v-for="(item,indx) in orderList" :key="item.id" v-else>
+					<view class="item-header" @click="toDetail(item.out_order_no)">
 						<view class="item-store">
 							<image src="/static/image/store.svg"></image>
-							<text>桃奢妍奥莱城</text>
+							<text>{{item.poi.poi_name}}</text>
 						</view>
-						<view class="item-status success">已完成</view>
+						<view class="item-status danger" v-if="item.status == 1">待使用</view>
+						<view class="item-status success" v-if="item.status == 2">已完成</view>
+						<view class="item-status fail" v-if="item.status == 3">已退款</view>
+						<view class="item-status warn" v-if="item.status == 4">退款中</view>
+						<view class="item-status fail" v-if="item.status == 5">已关闭</view>
+						<view class="item-status warn" v-if="item.status == 6">部分退款</view>
+						<view class="item-status success" v-if="item.status == 7">履约中</view>
 					</view>
-					<view class="item-goods">
+					<view class="item-goods" @click="toDetail(item.out_order_no)">
 						<view class="image">
-							<image src="https://washmy.oss-cn-guangzhou.aliyuncs.com/storage/20260727/2e9fd491e2def96b0dd0677f43d7a31913cf959e.png"></image>
+							<image :src="item.img"></image>
 						</view>
 						<view class="info">
 							<view class="title">
-								<view class="name">赫莲娜/HR黑绷带50ml小露珠200ml两件套 线下兑换券</view>
-								<view class="num">x1</view>
+								<view class="name">{{ item.product.product_name }}</view>
+								<view class="num">x{{ item.number }}</view>
 							</view>
 							<view class="tags">
-								默认
-								<view class="price">¥199.90</view>
+								{{item.sku_name?item.sku_name:'默认'}}
+								<view class="price">{{ $dialog.formatMoney(item.price,true) }}</view>
 							</view>
 						</view>
 					</view>
 					<view class="item-time">
-						<view class="time-list">订单编号:XM20260811082315</view>
-						<view class="time-list">下单时间:2026-08-11 08:23</view>
+						<view class="time-list">订单编号:{{ item.order_sn }}</view>
+						<view class="time-list">下单时间:{{item.create_at}}</view>
 					</view>
-					<view class="item-footer">
-						<view class="footer-left">实付 <text>¥199.90</text></view>
+					<view class="item-footer" @click="toDetail(item.out_order_no)">
+						<view class="footer-left">实付 <text>{{ $dialog.formatMoney(item.pay_money,true) }}</text></view>
 						<view class="footer-group-btn">
 							<view :class="indx%2==0?'button border':'button warn'">继续支付</view>
 							<view class="button fail">申请退款</view>
 						</view>
 					</view>
 				</view>
+				<uni-load-more status="loading" v-if="orderData.loading"></uni-load-more>
+				<uni-load-more status="noMore" v-if="orderList.length > 0 && orderData.isDone"></uni-load-more>
 			</view>
+			<view class="line-height"></view>
 		</scroll-view>
+		<halfLogin ref="loginCom" @success="loginSuccess"></halfLogin>
 	</view>
 </template>
 
 <script>
 var app;
+const pageSize = 20;
 export default {
 	data() {
 		return {
-			orderState:0
+			orderState:0,
+			orderData:{
+				size:pageSize,
+				page:1,
+				loading:false,
+				isDone:false
+			},
+			orderList:[],
+			isLogin:true
 		}
 	},
 	onLoad() {
 		app = this;
+		app.getOrder()
 	},
 	methods: {
+		scrolltoupper(){},
+		scrolltolower(e){
+			if (app.orderData.isDone || app.orderList.length == 0) return ;
+			app.getOrder()
+		},
+		toDetail(order){
+			uni.navigateTo({
+				url:"/pages/order/detail?order="+order
+			})
+		},
+		loginSuccess(){
+			app.getOrder()
+		},
+		toLogin(){
+			app.$refs.loginCom.open();
+		},
 		orderStatus(state) {
-			this.orderState = state
+			app.orderState = state
+			app.orderList = [];
+			app.orderData = {
+				size:pageSize,
+				page:1,
+				loading:false,
+				isDone:false
+			};
+			app.getOrder()
+		},
+		async getOrder(){
+			app.orderData.loading = true;
+			var formData = {};
+			const tokenPoi = uni.getStorageSync("contact");
+			formData.poi = tokenPoi.poi_id;
+			formData.page = app.orderData.page;
+			formData.size = app.orderData.size;
+			formData.status = app.orderState;
+			var resp = await app.$api.order.list.get(formData)
+			app.orderData.loading = false;
+			if (resp.code == 401) {
+				app.isLogin = false;
+				return ;
+			}
+			if (resp.code == 0) {
+				return app.$dialog.showSuccess(resp.msg)
+			}
+			app.isLogin = true;
+			if (resp.data.rows.length > 0) {
+				app.orderData.page ++;
+				app.orderList = [...app.orderList,...resp.data.rows];
+			} else {
+				app.orderData.isDone = true;
+			}
 		}
 	}
 }
@@ -79,7 +189,31 @@ export default {
     background-color: #ededed;
 	display: flex;
 	flex-direction: column;
+	.line-height{
+		height: 40rpx;
+		width: 100%;
+	}
+}
+.empty-body{
+	display: flex;align-items: center;justify-content: center;flex-direction: column;height: calc(100vh - 100upx);
+	.imgs{
+		text-align: center;font-size: 28upx;color: #666;
+		image{height: 160upx;width: 160upx;}
+		.tip{margin-top: 20upx;}
+	}
+	.re-btn{
+		width: 180upx;
+		height: 80upx;
+		line-height: 80upx;
+		text-align: center;
+		font-size: 28upx;
+		color: #fff;
+		background-color: $main-color;
+		border-radius: 10upx;
+		margin-top: 60upx;
+	}
 }
+
 .tab-menu{
 	height: 80rpx;
 	line-height: 80rpx;
@@ -253,8 +387,8 @@ export default {
 						color: #b45309;
 					}
 					&.warn{
-						background-color: #fef3c7;
-						color: #b45309;
+						background-color: #ffedd5;
+						color: #e95b22;
 					}
 				}
 				.item-store{

+ 167 - 39
奥莱优品/pages/service/chat.vue

@@ -12,7 +12,7 @@
 								{{ renderMessageDate(item, index) }}
 							</view>
 							<view class="message" :class="[item.userType]">
-								<image :src="item.avatar" v-if="item.userType === 'friend'" class="avatar" mode="widthFix"></image>
+								<image :src="chatData.service" v-if="item.userType === 'friend'" class="avatar" mode="widthFix"></image>
 								<view class="message-con">
 									<view v-if="item.msgType == 'text'">
 										<view v-html="renderTextMessage(item.content)"></view>
@@ -50,7 +50,7 @@
 										</view>
 									</view>
 								</view>
-								<image :src="item.avatar" v-if="item.userType === 'self'" class="avatar" mode="widthFix"></image>
+								<image :src="chatData.self" v-if="item.userType === 'self'" class="avatar" mode="widthFix"></image>
 							</view>
 						</view>
 					</template>
@@ -92,6 +92,7 @@ import {
 	to as tofn
 } from '@/utils/js/index.js';
 import { getHistoryMsg } from "@/utils/js/history-msg.js";
+var {Push} = require("@/static/js/push.js")
 
 import emoji from '@/components/chat/emoji';
 import more from '@/components/chat/more';
@@ -124,19 +125,26 @@ export default {
 			screenWidth:0,
 			pushData: {
 				obj:null,
-				auth:"https://tran.jsshuita.cn/plugin/webman/push/auth",
-				url: 'wss://tran.jsshuita.cn/ws',
+				auth:"http://192.168.3.16:9881/plugin/webman/push/auth",
+				url: 'ws://192.168.3.16:3131',
 			},
-			isFocus:false
+			isFocus:false,
+			chatData:{
+				userId:"",
+				self:"",
+				service:""
+			},
+			isServiceUser:0, // 1已转人工 0未转人工
 		}
 	},
 	onLoad() {
 		app = this;
 		const systemInfo = uni.getSystemInfoSync();
 		app.screenWidth = systemInfo.screenWidth;
-		this.getMessage()
+		// this.getMessage()
+		this.getServiceData();
 		uni.setNavigationBarTitle({
-			title:"与xxx对话"
+			title:"加载中..."
 		})
 	},
 	computed: mapState({
@@ -151,16 +159,81 @@ export default {
 		},
 	}),
 	beforeDestroy() {
-		cursor = 0;
+		cursor = 0;
+		this.pushData.obj.disconnect()
 		clearInterval(getSelectedTextRangeSetInterval);
 	},
 	methods: {
+		async getServiceData(){
+			var formData = {};
+			const tokenPoi = uni.getStorageSync("contact");
+			formData.poi = tokenPoi.poi_id;
+			formData.page = app.msgData.page;
+			formData.size = app.msgData.rows;
+			var resp = await this.$api.chat.service.get(formData);
+			if (resp.code == 0) {
+				show(resp.msg);
+				uni.navigateBack();
+				return ;
+			}
+			uni.setNavigationBarTitle({
+				title:resp.data.store.shopName
+			})
+			app.chatData.userId = resp.data.userId;
+			app.chatData.self = resp.data.avatar;
+			app.chatData.service = resp.data.service;
+			var msgData = resp.data.msg.data;
+			var pushData = [];
+			var quickData = resp.data.quick;
+			pushData.push({
+				content: quickData.star_msg,
+				userType: 'friend',
+				avatar: resp.data.service,
+				msgType:"quick",
+				list:quickData.quick,
+				messageId: Date.now(),
+				timestamp: Date.now(),
+			})
+			if (msgData.length > 0) {
+				msgData.forEach(item => pushData.push(app.formatMsg(item)))
+			}
+			this.msgData.list = pushData;
+			app.msgData.page = 2;
+			setTimeout(()=>{
+				this.scrollToBottom()
+			}, 150)
+			app.initPush();
+		},
+		initPush(){
+			var _this = this;
+			this.pushData.obj = new Push({
+				"url":this.pushData.url,
+				"app_key":"265c33b73d5c04f918978577df2c48d2",
+				"auth":this.pushData.auth
+			});
+			var user_channel = this.pushData.obj.subscribe('user-' + this.chatData.userId);
+			user_channel.on('message', function (data) {
+				console.log(data);
+				// _this.formatMsg(data);
+			})
+		},
+		quickQs(data){
+			if (!data.answer) return ;
+			app.msgData.list.unshift({
+				content: data.answer,
+				userType: 'friend',
+				avatar: app.chatData.service,
+				msgType:"text",
+				list:[],
+				messageId: Date.now(),
+				timestamp: Date.now(),
+			})
+			app.scrollToBottom()
+		},
 		focus(){
 			this.setCursor();
 		},
-		setCursor() {
-
-		},
+		setCursor() {},
 		scroll(){},
 		// 滚动到顶部
 		scrolltoupper(){
@@ -182,6 +255,37 @@ export default {
 				this.scrollToBottom()
 			}, 150)
 		},
+		formatMsg(item){
+			var payload = "";
+			if (item.type == 'text') {
+				payload = item.content
+			}
+			if (item.type == 'order') {
+				var order = JSON.parse(item.content)
+				payload = order
+			}
+			if (item.type == 'pay') {
+				var order = JSON.parse(item.content)
+				payload = order
+			}
+			if (item.type == 'address') {
+				var order = JSON.parse(item.content)
+				payload = order
+			}
+			if (item.type == 'image') {
+				payload = item.content
+			}
+			const message = {
+				content: payload,
+				userType: item.userType,
+				avatar: item.avatar,
+				msgType:item.type,
+				list:[],
+				messageId: item.msgId,
+				timestamp: item.time,
+			};
+			return message
+		},
 		tapEmoji() {
 			this.isEmoji = !this.isEmoji;
 			if (this.isEmoji) {
@@ -260,16 +364,23 @@ export default {
 				this.text = this.text.substring(0, this.text.length - 1);
 			}
 		},
-		sendingText(){
+		async sendingText(){
 			if (app.text === '') return ;
 			app.msgData.isSend = true;
 			const sendMsg = app.text;
 			app.text = ''
-			setTimeout(function(){
-				app.msgData.isSend = false;
-				app.sendMessage(sendMsg,"text");
-				app.scrollToBottom()
-			},2000)
+			var formData = {};
+			const tokenPoi = uni.getStorageSync("contact");
+			formData.groupId = tokenPoi.poi_id;
+			formData.type = "text";
+			formData.content = sendMsg;
+			var resp = await app.$api.chat.sendText.post(formData);
+			app.msgData.isSend = false;
+			if (resp.code == 0) {
+				return show(resp.msg);
+			}
+			app.sendMessage(sendMsg,"text");
+			app.scrollToBottom()
 		},
 		sendMessage(content,type){
 			const message = {
@@ -286,28 +397,40 @@ export default {
 		getMessage(){
 			let get = async ()=>{
 				this.msgData.allLoaded = true;
-				let data = await getHistoryMsg({
-					page:this.msgData.page,
-					rows: this.msgData.page == 3 ? 5 : this.msgData.rows
-				});
-				const selector = `msg-${data?.[0]?.messageId}`;;
-				this.msgData.list = this.msgData.list.concat(data);
-				// 数据挂载后执行,不懂的请自行阅读 Vue.js 文档对 Vue.nextTick 函数说明。
-				this.$nextTick(()=>{
-					// 设置当前滚动的位置
-					this.scrollIntoViewId = selector;
-					if(data.length < this.msgData.rows){
-						this.msgData.allLoaded = true;
-						this.msgData.flag = false;
-						// 当前消息数据条数小于请求要求条数时,则无更多消息,不再允许请求。
-						// 可在此处编写无更多消息数据时的逻辑
-					}else{
-						this.msgData.flag = true;
-						this.msgData.allLoaded = false;
-						this.msgData.page ++;
-					}
+				var formData = {};
+				const tokenPoi = uni.getStorageSync("contact");
+				formData.poi = tokenPoi.poi_id;
+				formData.page = app.msgData.page;
+				formData.size = app.msgData.rows;
+				let data = await app.$api.chat.msg.get(formData);
+				// var msgData = resp.data.msg.data;
+				// var pushData = [];
+				// if (msgData.length > 0) {
+				// 	msgData.forEach(item => pushData.push(app.formatMsg(item)))
+				// }
 
-				})
+				// let data = await getHistoryMsg({
+				// 	page:this.msgData.page,
+				// 	rows: this.msgData.page == 3 ? 5 : this.msgData.rows
+				// });
+				// const selector = `msg-${data?.[0]?.messageId}`;;
+				// this.msgData.list = this.msgData.list.concat(data);
+				// // 数据挂载后执行,不懂的请自行阅读 Vue.js 文档对 Vue.nextTick 函数说明。
+				// this.$nextTick(()=>{
+				// 	// 设置当前滚动的位置
+				// 	this.scrollIntoViewId = selector;
+				// 	if(data.length < this.msgData.rows){
+				// 		this.msgData.allLoaded = true;
+				// 		this.msgData.flag = false;
+				// 		// 当前消息数据条数小于请求要求条数时,则无更多消息,不再允许请求。
+				// 		// 可在此处编写无更多消息数据时的逻辑
+				// 	}else{
+				// 		this.msgData.flag = true;
+				// 		this.msgData.allLoaded = false;
+				// 		this.msgData.page ++;
+				// 	}
+
+				// })
 			}
 			get();
 		},
@@ -508,5 +631,10 @@ export default {
 	text-align: center;
 	font-size: 24rpx;
 }
-
+.isrobot{
+	color: blue;
+	font-size: 28upx;
+	line-height: 48upx;
+	margin-top: 10rpx;
+}
 </style>

+ 84 - 8
奥莱优品/pages/service/service.vue

@@ -11,33 +11,88 @@
 					<view class="title-tips">Message center</view>
 					<view class="name">聊天列表</view>
 				</view>
-				<view class="list-service">
-					<view class="service-item" @click="toChat">
-						<view class="avatar"><image src="/static/logo.jpg"></image></view>
+				<view class="empty-chat" v-if="dataList.length == 0">
+					<view class="imgs">
+						<image src="/static/image/empty.png" mode="widthFix"></image>
+						<view class="tip">通过首页、订单、商品中可发起客服咨询</view>
+					</view>
+					<view class="re-btn" @click="toHome" v-if="isLogin">去下单</view>
+					<view class="re-btn" @click="toLogin" v-else>立即登录</view>
+				</view>
+				<view class="list-service" v-else>
+					<view class="service-item" @click="toChat" v-for="(item,index) in dataList" :key="index">
+						<view class="avatar"><image :src="item.avatar"></image></view>
 						<view class="info">
-							<view class="name">桃奢妍奥莱城</view>
-							<view class="desc">[订单消息]</view>
+							<view class="name">{{ item.poi_name }}</view>
+							<view class="desc" v-if="item.last.type=='text'">{{item.last.content}}</view>
+							<view class="desc" v-if="item.last.type=='order'">[订单消息]</view>
+							<view class="desc" v-if="item.last.type=='image'">[图片消息]</view>
+							<view class="desc" v-if="item.last.type=='video'">[视频消息]</view>
+							<view class="desc" v-if="item.last.type=='pay'">[支付消息]</view>
+							<view class="desc" v-if="item.last.type=='address'">[地址消息]</view>
 						</view>
-						<view class="time">今天</view>
+						<view class="time">{{ item.last.create_at }}</view>
 					</view>
 				</view>
 			</view>
 		</scroll-view>
+		<halfLogin ref="loginCom" @success="loginSuccess"></halfLogin>
 	</view>
 </template>
 
 <script>
+var app;
 export default {
 	data() {
-		return {
-
+		return {
+			dataList:[],
+			isLogin:true,
+			userState:1
 		}
 	},
+	onLoad() {
+		app = this;
+		app.getService()
+	},
 	methods: {
+		loginSuccess(){
+			app.getService()
+		},
+		toLogin(){
+			app.$refs.loginCom.open(1);
+		},
+		async getService(){
+			var formData = {};
+			formData.page = 1;
+			formData.size = 100;
+			const tokenPoi = uni.getStorageSync("contact");
+			formData.poi = tokenPoi.poi_id;
+			var res = await app.$api.chat.list.get(formData);
+			uni.hideLoading();
+			if (res.code == 401) {
+				app.isLogin = false;
+				return ;
+			}
+			if (res.code == 0) {
+				return app.$dialog.showSuccess(res.msg);
+			}
+			app.isLogin = true;
+			app.dataList = res.data.data.rows;
+			app.userState = res.data.user;
+		},
 		toChat(){
+			if (app.userState == 0) {
+				app.$refs.loginCom.open(2);
+				return ;
+			}
 			uni.navigateTo({
 				url:"/pages/service/chat"
 			})
+		},
+		toHome(){
+			uni.switchTab({
+				url:"/pages/index/index"
+			})
 		}
 	}
 }
@@ -55,6 +110,27 @@ export default {
 	display: flex;
 	flex-direction: column;
 }
+
+.empty-chat{
+	display: flex;align-items: center;justify-content: center;flex-direction: column;
+	height: 50vh;
+	.imgs{
+		text-align: center;font-size: 28upx;color: #666;
+		image{height: 160upx;width: 160upx;}
+		.tip{margin-top: 20upx;}
+	}
+	.re-btn{
+		width: 180upx;
+		height: 80upx;
+		line-height: 80upx;
+		text-align: center;
+		font-size: 28upx;
+		color: #fff;
+		background-color: $main-color;
+		border-radius: 10upx;
+		margin-top: 60upx;
+	}
+}
 .service-header{
 	background-color: $main-color;
 	padding: 20rpx;

+ 10 - 2
奥莱优品/pages/user/user.vue

@@ -35,8 +35,8 @@
 					<view class="right"><image src="/static/image/right.svg"></image></view>
 				</navigator>
 			</view>
-			<view class="user-menu">
-				<view class="menu-item">
+			<view class="user-menu" v-if="isLogin">
+				<view class="menu-item" @click="outLogin">
 					<view class="icon"><image src="/static/image/out.png"></image></view>
 					<view class="name">退出</view>
 					<view class="right"><image src="/static/image/right.svg"></image></view>
@@ -81,6 +81,14 @@ export default {
 		},
 		loginSuccess(token){
 			app.getUser()
+		},
+		outLogin(){
+			app.$dialog.showError("确定要退出登录吗",function(res){
+				if (res.confirm) {
+					app.userInfo = null;
+					uni.clearStorageSync();
+				}
+			})
 		},
 		kfPop(){
 			const isLogin = uni.getStorageSync("user_token");

BIN
奥莱优品/static/image/empty.png


BIN
奥莱优品/static/image/kefu.png


Різницю між файлами не показано, бо вона завелика
+ 0 - 0
奥莱优品/static/image/order/goon.svg


+ 1 - 0
奥莱优品/static/image/order/refund.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1786726559025" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2648" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M512 97.52381c228.912762 0 414.47619 185.563429 414.47619 414.47619s-185.563429 414.47619-414.47619 414.47619S97.52381 740.912762 97.52381 512 283.087238 97.52381 512 97.52381z m0 73.142857C323.486476 170.666667 170.666667 323.486476 170.666667 512s152.81981 341.333333 341.333333 341.333333 341.333333-152.81981 341.333333-341.333333S700.513524 170.666667 512 170.666667z m96.060952 120.441904l51.687619 51.687619L563.736381 438.857143H694.857143v73.142857h-146.285714v60.952381h146.285714v73.142857h-146.285714v97.52381h-73.142858v-97.52381h-146.285714v-73.142857h146.285714V512h-146.285714v-73.142857h131.145143l-96.060952-96.060953 51.736381-51.687619L512 387.120762l96.060952-96.060952z" p-id="2649"></path></svg>

+ 1 - 0
奥莱优品/static/image/order/success.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1786726554434" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2320" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M512 97.52381c228.912762 0 414.47619 185.563429 414.47619 414.47619s-185.563429 414.47619-414.47619 414.47619S97.52381 740.912762 97.52381 512 283.087238 97.52381 512 97.52381z m0 73.142857C323.486476 170.666667 170.666667 323.486476 170.666667 512s152.81981 341.333333 341.333333 341.333333 341.333333-152.81981 341.333333-341.333333S700.513524 170.666667 512 170.666667z m193.194667 145.188571l52.467809 50.956191-310.662095 319.683047-156.379429-162.230857 52.662858-50.761143 103.936 107.812572 257.974857-265.45981z" p-id="2321"></path></svg>

+ 1 - 0
奥莱优品/static/image/order/time.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1786726556868" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2484" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M512 97.52381c228.912762 0 414.47619 185.563429 414.47619 414.47619s-185.563429 414.47619-414.47619 414.47619S97.52381 740.912762 97.52381 512 283.087238 97.52381 512 97.52381z m0 73.142857C323.486476 170.666667 170.666667 323.486476 170.666667 512s152.81981 341.333333 341.333333 341.333333 341.333333-152.81981 341.333333-341.333333S700.513524 170.666667 512 170.666667z m36.571429 89.697523v229.86362h160.865523v73.142857H512a36.571429 36.571429 0 0 1-36.571429-36.571429V260.388571h73.142858z" p-id="2485"></path></svg>

+ 36 - 0
奥莱优品/uni_modules/ikun-qrcode/changelog.md

@@ -0,0 +1,36 @@
+## 1.0.18(2026-03-20)
+docs:不支持uniapp-x, 近期没有适配计划,已更新到说明文档。
+## 1.0.17(2025-10-23)
+chore: 增加开源地址
+## 1.0.16(2025-07-10)
+doc:整理文档
+## 1.0.15(2025-07-04)
+doc: unit字段 只支持rpx,px,为了兼容nvue。
+## 1.0.14(2025-04-28)
+doc: 文档更新
+## 1.0.13(2025-04-28)
+feat: 添加中间的logo图片
+## 1.0.12(2025-04-22)
+修复微信小程序rpx计算误差,使用vw来代替
+## 1.0.11(2025-04-14)
+docs: 不支持canvas相关的属性,如保存。
+## 1.0.10(2024-10-16)
+优化markdown排版
+## 1.0.9(2024-10-16)
+更新微信小程序在各平台测试结果
+## 1.0.8(2024-10-16)
+ipados 18.0微信小程序发行正式版,测试可以正常出二维码。 (PS: 如果一直转圈动画,排查你的url变量是否为空,是否被微信拦截了接口数据)、 
+## 1.0.7(2024-08-02)
+fix: cssName修复
+## 1.0.6(2024-08-01)
+修复README.md
+## 1.0.5(2024-08-01)
+README新增:vue2,vue3详细用法
+## 1.0.4(2024-08-01)
+更新vue2,vue3详细用法
+## 1.0.3(2024-08-01)
+更新vue2/vue3详细用法
+## 1.0.0版本
+极简的二维码生成组件,vue2 / vue3 可用. 100行搞定。
+### 特点
+- 使用基础的view来生成二维码的点,而不是canvas,避免带来层级问题。

Різницю між файлами не показано, бо вона завелика
+ 6 - 0
奥莱优品/uni_modules/ikun-qrcode/components/ikun-qrcode/ikun-qrcode.vue


Різницю між файлами не показано, бо вона завелика
+ 33 - 0
奥莱优品/uni_modules/ikun-qrcode/components/ikun-qrcode/uqrcode_latest.js


+ 100 - 0
奥莱优品/uni_modules/ikun-qrcode/package.json

@@ -0,0 +1,100 @@
+{
+  "id": "ikun-qrcode",
+  "displayName": "【ikun-qrcode】极简的二维码生成组件,使用view而非canvas避免层级问题",
+  "version": "1.0.18",
+  "description": "ikun-qrcode,极简的二维码生成组件,使用view而非canvas避免层级问题",
+  "keywords": [
+    "ikun-qrcode",
+    "qrcode",
+    "二维码"
+],
+  "repository": "https://github.com/ikun-ui-uniapp/ikun-qrcode.git",
+  "engines": {
+    "HBuilderX": "^3.97",
+    "uni-app": "^3.7.1",
+    "uni-app-x": ""
+  },
+  "dcloudext": {
+    "type": "component-vue",
+    "sale": {
+      "regular": {
+        "price": "0.00"
+      },
+      "sourcecode": {
+        "price": "0.00"
+      }
+    },
+    "contact": {
+      "qq": ""
+    },
+    "declaration": {
+      "ads": "无",
+      "data": "插件不采集任何数据",
+      "permissions": "无"
+    },
+    "npmurl": "",
+    "darkmode": "x",
+    "i18n": "x",
+    "widescreen": "√"
+  },
+  "uni_modules": {
+    "dependencies": [],
+    "encrypt": [],
+    "platforms": {
+      "cloud": {
+        "tcb": "√",
+        "aliyun": "√",
+        "alipay": "√"
+      },
+      "client": {
+        "uni-app": {
+          "vue": {
+            "vue2": "√",
+            "vue3": "√"
+          },
+          "web": {
+            "safari": "√",
+            "chrome": "√"
+          },
+          "app": {
+            "vue": "√",
+            "nvue": "√",
+            "android": "√",
+            "ios": "√",
+            "harmony": "√"
+          },
+          "mp": {
+            "weixin": "√",
+            "alipay": "√",
+            "toutiao": "√",
+            "baidu": "√",
+            "kuaishou": "√",
+            "jd": "√",
+            "harmony": "√",
+            "qq": "√",
+            "lark": "√",
+            "xhs": "-"
+          },
+          "quickapp": {
+            "huawei": "√",
+            "union": "√"
+          }
+        },
+        "uni-app-x": {
+          "web": {
+            "safari": "-",
+            "chrome": "-"
+          },
+          "app": {
+            "android": "-",
+            "ios": "-",
+            "harmony": "-"
+          },
+          "mp": {
+            "weixin": "-"
+          }
+        }
+      }
+    }
+  }
+}

Різницю між файлами не показано, бо вона завелика
+ 43 - 0
奥莱优品/uni_modules/ikun-qrcode/readme.md


+ 23 - 0
奥莱优品/uni_modules/uni-load-more/changelog.md

@@ -0,0 +1,23 @@
+## 1.3.7(2025-08-20)
+- 修复 微信小程序css警告问题
+## 1.3.6(2024-10-15)
+- 修复 微信小程序中的getSystemInfo警告
+## 1.3.3(2022-01-20)
+- 新增 showText属性 ,是否显示文本
+## 1.3.2(2022-01-19)
+- 修复 nvue 平台下不显示文本的bug
+## 1.3.1(2022-01-19)
+- 修复 微信小程序平台样式选择器报警告的问题
+## 1.3.0(2021-11-19)
+- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource)
+- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-load-more](https://uniapp.dcloud.io/component/uniui/uni-load-more)
+## 1.2.1(2021-08-24)
+- 新增 支持国际化
+## 1.2.0(2021-07-30)
+- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834)
+## 1.1.8(2021-05-12)
+- 新增 组件示例地址
+## 1.1.7(2021-03-30)
+- 修复 uni-load-more 在首页使用时,h5 平台报 'uni is not defined' 的 bug
+## 1.1.6(2021-02-05)
+- 调整为uni_modules目录规范

+ 5 - 0
奥莱优品/uni_modules/uni-load-more/components/uni-load-more/i18n/en.json

@@ -0,0 +1,5 @@
+{
+	"uni-load-more.contentdown": "Pull up to show more",
+	"uni-load-more.contentrefresh": "loading...",
+	"uni-load-more.contentnomore": "No more data"
+}

+ 8 - 0
奥莱优品/uni_modules/uni-load-more/components/uni-load-more/i18n/index.js

@@ -0,0 +1,8 @@
+import en from './en.json'
+import zhHans from './zh-Hans.json'
+import zhHant from './zh-Hant.json'
+export default {
+	en,
+	'zh-Hans': zhHans,
+	'zh-Hant': zhHant
+}

+ 5 - 0
奥莱优品/uni_modules/uni-load-more/components/uni-load-more/i18n/zh-Hans.json

@@ -0,0 +1,5 @@
+{
+	"uni-load-more.contentdown": "上拉显示更多",
+	"uni-load-more.contentrefresh": "正在加载...",
+	"uni-load-more.contentnomore": "没有更多数据了"
+}

+ 5 - 0
奥莱优品/uni_modules/uni-load-more/components/uni-load-more/i18n/zh-Hant.json

@@ -0,0 +1,5 @@
+{
+	"uni-load-more.contentdown": "上拉顯示更多",
+	"uni-load-more.contentrefresh": "正在加載...",
+	"uni-load-more.contentnomore": "沒有更多數據了"
+}

Різницю між файлами не показано, бо вона завелика
+ 117 - 0
奥莱优品/uni_modules/uni-load-more/components/uni-load-more/uni-load-more.vue


+ 105 - 0
奥莱优品/uni_modules/uni-load-more/package.json

@@ -0,0 +1,105 @@
+{
+  "id": "uni-load-more",
+  "displayName": "uni-load-more 加载更多",
+  "version": "1.3.7",
+  "description": "LoadMore 组件,常用在列表里面,做滚动加载使用。",
+  "keywords": [
+    "uni-ui",
+    "uniui",
+    "加载更多",
+    "load-more"
+],
+  "repository": "https://github.com/dcloudio/uni-ui",
+  "engines": {
+    "HBuilderX": "",
+    "uni-app": "^4.07",
+    "uni-app-x": ""
+  },
+  "directories": {
+    "example": "../../temps/example_temps"
+  },
+  "dcloudext": {
+    "sale": {
+      "regular": {
+        "price": "0.00"
+      },
+      "sourcecode": {
+        "price": "0.00"
+      }
+    },
+    "contact": {
+      "qq": ""
+    },
+    "declaration": {
+      "ads": "无",
+      "data": "无",
+      "permissions": "无"
+    },
+    "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui",
+    "type": "component-vue",
+    "darkmode": "x",
+    "i18n": "x",
+    "widescreen": "x"
+  },
+  "uni_modules": {
+    "dependencies": [
+      "uni-scss"
+    ],
+    "encrypt": [],
+    "platforms": {
+      "cloud": {
+        "tcb": "x",
+        "aliyun": "x",
+        "alipay": "x"
+      },
+      "client": {
+        "uni-app": {
+          "vue": {
+            "vue2": "√",
+            "vue3": "√"
+          },
+          "web": {
+            "safari": "√",
+            "chrome": "√"
+          },
+          "app": {
+            "vue": "√",
+            "nvue": "-",
+            "android": "√",
+            "ios": "√",
+            "harmony": "√"
+          },
+          "mp": {
+            "weixin": "√",
+            "alipay": "√",
+            "toutiao": "√",
+            "baidu": "√",
+            "kuaishou": "-",
+            "jd": "-",
+            "harmony": "-",
+            "qq": "√",
+            "lark": "-"
+          },
+          "quickapp": {
+            "huawei": "√",
+            "union": "√"
+          }
+        },
+        "uni-app-x": {
+          "web": {
+            "safari": "-",
+            "chrome": "-"
+          },
+          "app": {
+            "android": "-",
+            "ios": "-",
+            "harmony": "-"
+          },
+          "mp": {
+            "weixin": "-"
+          }
+        }
+      }
+    }
+  }
+}

+ 14 - 0
奥莱优品/uni_modules/uni-load-more/readme.md

@@ -0,0 +1,14 @@
+
+
+### LoadMore 加载更多
+> **组件名:uni-load-more**
+> 代码块: `uLoadMore`
+
+
+用于列表中,做滚动加载使用,展示 loading 的各种状态。
+
+
+### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-load-more)
+#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 
+
+

Деякі файли не було показано, через те що забагато файлів було змінено