Browse Source

feat:亲情卡支付

zhanghui 2 years ago
parent
commit
d9c2b2842e

+ 20 - 0
common/js/api.js

@@ -831,4 +831,24 @@ export default {
         })
     },
 
+    //亲情卡支付预约费用
+    familyCardPay(data){
+        return request({
+            url: '/order/familyCardPay/pay?orderNo='+data.orderNo +'&loveCardId=' +data.loveCardId,
+            method: 'POST',
+            data: data
+        })
+    },
+
+    //亲情卡支付订单费用
+    familyCardTradePay(data){
+        return request({
+            url: '/order/familyCardPay/pay/trade?tradeNo='+data.tradeNo +'&loveCardId=' +data.loveCardId,
+            method: 'POST',
+            data: data
+        })
+    },
+
+
+
 }

+ 99 - 8
components/pay/pay.vue

@@ -7,11 +7,31 @@
 					<text class="payType">请选择支付方式</text>
 					<image class="x" src="/static/common/ox.png" @click="closePayPopup"></image>
 				</view>
-				<view class="payTitle">
-					<text>选择微信支付或余额支付</text>
-				</view>
+<!--				<view class="payTitle">-->
+<!--					<text>选择微信支付或余额支付</text>-->
+<!--				</view>-->
 
 				<view class=" payItemView">
+
+					<view v-if="lovePay && loveCard.totalBalance" class="payItem  flex-row justify-between" @click="payItem(0)">
+						<view class="flex-row">
+							<u-icon name="/static/me/familyCard_icon.png" color="#38db38" size="36"></u-icon>
+							<view class="payName flex-col justify-center">
+								<text>亲情卡支付</text>
+								<text class="balance">{{loveCard.presentUserName + loveCard.presentUserNo}}赠送的亲情卡</text>
+								<text class="balance">余额{{loveCard.totalBalance}}</text>
+<!--								<view class="select">-->
+<!--									<uni-data-select class="uni-data-select"  :clear="false" v-model="loveCardId" :localdata="loveCardList" @change="change"></uni-data-select>-->
+<!--								</view>-->
+							</view>
+						</view>
+						<view class="flex-col justify-center">
+							<u-icon v-if="curServiceTab === 0" name="checkmark-circle-fill" color="#38db38"
+									size="25"></u-icon>
+							<u-icon v-else name="/static/order/ud9.png" color="green" size="25"></u-icon>
+						</view>
+					</view>
+
 					<view v-if="blPay" class="payItem  flex-row justify-between" @click="payItem(1)">
 						<view class="flex-row">
 							<u-icon name="/static/me/u701.png" color="#38db38" size="36"></u-icon>
@@ -76,7 +96,7 @@
 	 *5,orderNo:String类型,支付的订单号。
 	 *6,openType:Number类型,1--支付预约费用,2---支付子订单费用。
 	 *7,balance:用户余额
-	 *
+	 *8.totalAmount 需要支付的金额
 	 *   function 回调函数
 	 * 1,payResult(e),支付结果回调。
 	 * 2,improperClose 点击遮罩层和关闭按钮x 关闭弹窗时的回调
@@ -96,6 +116,12 @@
 					return true
 				}
 			},
+			lovePay: {
+				type: Boolean,
+				default () {
+					return true
+				}
+			},
 			blPay: {
 				type: Boolean,
 				default () {
@@ -125,16 +151,33 @@
 				default () {
 					return 0
 				}
+			},
+			totalAmount: {
+				type: Number,
+				default () {
+					return 0
+				}
 			}
 		},
 		data() {
 			return {
 				curServiceTab: 2,
 				userInfo: {},
-				password: ''
+				password: '',
+				loveCard:{}
+
 			};
 		},
+		created(){
+			this.getMyReceiveList()
+		},
 		methods: {
+
+			change(e){
+				console.log(this.loveCardId)
+				console.log(e)
+				this.loveCardId = e
+			},
 			closePayPopup() {
 				this.$refs.popup.close()
 				this.$emit('improperClose')
@@ -144,7 +187,13 @@
 				this.$refs.popup.open()
 			},
 			payItem(num) {
+				if (this.loveCard.totalBalance*1 < this.totalAmount*1 && num == 0){
+					console.log(this.totalAmount)
+					uni.$u.toast('余额不足')
+					return
+				}
 				if (!this.selectBlPay) {
+					uni.$u.toast('余额不足')
 					return
 				}
 				this.curServiceTab = num
@@ -155,6 +204,9 @@
 
 			payment() {
 				this.$refs.popup.close()
+				if (this.curServiceTab === 0) {
+					this.familyCardPay()
+				}
 				if (this.curServiceTab === 1) {
 					if (this.needPassword) {
 						this.$refs.passwordPopup.open()
@@ -162,7 +214,8 @@
 						//余额支付
 						this.balancePay()
 					}
-				} else {
+				}
+				if (this.curServiceTab === 2) {
 						//微信支付
 					if (this.openType == 1){
 						this.wechatPay()     //支付预约费用
@@ -202,6 +255,23 @@
 				});
 			},
 
+			familyCardPay(){
+				this.$api.familyCardPay({
+					orderNo: this.orderNo,
+					loveCardId: this.loveCard.id
+				}).then(res=>{
+					this.$emit('payResult',{
+						payResult:true,
+						res:res
+					})
+				}).catch((res) => {
+					this.$emit('payResult',{
+						payResult:false,
+						res:res
+					})
+				});
+			},
+
 			//调起微信支付
 			requestPayment(param){
 				uni.requestPayment({
@@ -269,13 +339,30 @@
 				}
 
 			},
+
+			//查询我的亲情卡
+			getMyReceiveList(){
+				this.$api.getMyReceiveList().then(res=>{
+					this.loveCard = res.data.data[0]
+					// if (this.loveCardList){
+					// 	this.loveCardId = res.data.data[0].id
+					// 	res.data.data.forEach(item=>{
+					// 		let tempItem = {
+					// 			value:item.id,
+					// 			text:item.presentUserName + item.presentUserNo + '亲情卡'
+					// 		}
+					// 		this.loveCardList.push(tempItem)
+					// 	})
+					// }
+				})
+			}
 		}
 	}
 </script>
 
 <style lang="scss" scoped>
 	.payView {
-		height: 638rpx;
+		/*height: 638rpx;*/
 		background: #FFFFFF;
 		box-shadow: 0rpx -4rpx 8rpx 0rpx rgba(0, 0, 0, 0.03);
 		border-radius: 24rpx 24rpx 0rpx 0rpx;
@@ -304,7 +391,7 @@
 		margin-top: 8rpx;
 	}
 	.payItemView{
-		height: 345rpx;
+		min-height: 345rpx;
 	}
 
 	.payItem {
@@ -362,4 +449,8 @@
 		text-align: center;
 		margin-top: 80rpx;
 	}
+	.select{
+		width: 400rpx;
+	}
+
 </style>

+ 1 - 1
myPages/familyCard/unbindFamilyCard/module/mescrollUni-item.vue

@@ -11,7 +11,7 @@
       <view class="useList" v-for="(item,index) in list" :key="index">
         <view style="display: flex;align-items: center">
           <view class="icon">{{ item.type == 0 ? "消费" : "增加" }}</view>
-          <text>{{ item.paymentTime }}</text>
+          <text>{{ item.createTime }}</text>
         </view>
         <view>
           <view>

+ 1 - 1
myPages/familyCard/unbindFamilyCard/unbindFamilyCard.vue

@@ -22,7 +22,7 @@
           </view>
         </view>
         <text style="margin:24rpx 0;overflow: hidden">使用记录</text>
-        <view>
+        <view v-if="data.id">
           <mescroll-item ref="MescrollItem" :i="0" :index="0" :cardId="data.id" :height="scrollViewHeight">
           </mescroll-item>
         </view>

+ 2 - 1
orderPages/bookService/index.vue

@@ -122,7 +122,8 @@
 				</view>
 			</view>
 		</view>
-		<myPay ref="myPay" :selectBlPay="userInfo.balance >= price" :balance="userInfo.balance"  :orderNo="subOrderNo" @payResult="payResult" @improperClose="improperClose"></myPay>
+		<myPay ref="myPay" :selectBlPay="userInfo.balance >= price" :balance="userInfo.balance" :totalAmount="price"
+			   :orderNo="subOrderNo" @payResult="payResult" @improperClose="improperClose"></myPay>
 	</view>
 </template>
 

+ 1 - 1
orderPages/orderDetail/index.rpx.scss

@@ -265,7 +265,7 @@
 
 
 .payView{
-  height: 638rpx;
+  //height: 638rpx;
   background: #FFFFFF;
   box-shadow: 0rpx -4rpx 8rpx 0rpx rgba(0,0,0,0.03);
   border-radius: 24rpx 24rpx 0rpx 0rpx;

+ 59 - 4
orderPages/orderDetail/index.vue

@@ -188,11 +188,25 @@
 					<text class="payType">请选择支付方式</text>
 					<image class="x" src="/static/common/ox.png" @click="closePayPopup"></image>
 				</view>
-				<view class="payTitle">
-					<text>选择微信支付或余额支付</text>
+<!--				<view class="payTitle">-->
+<!--					<text>选择微信支付或余额支付</text>-->
+<!--				</view>-->
+				<view v-if="loveCard.totalBalance" class="payItem  flex-row justify-between" @click="payItem(0)">
+					<view class="flex-row">
+						<u-icon name="/static/me/familyCard_icon.png" color="#38db38" size="36"></u-icon>
+						<view class="payName flex-col justify-center">
+							<text>亲情卡支付</text>
+							<text class="balance">{{loveCard.presentUserName + loveCard.presentUserNo}}赠送的亲情卡</text>
+							<text class="balance">余额{{loveCard.totalBalance}}</text>
+						</view>
+					</view>
+					<view class="flex-col justify-center">
+						<u-icon v-if="curServiceTab === 0" name="checkmark-circle-fill" color="#38db38"
+								size="25"></u-icon>
+						<u-icon v-else name="/static/order/ud9.png" color="green" size="25"></u-icon>
+					</view>
 				</view>
 
-
 				<view class="payItem flex-row justify-between" @click="payItem(1)">
 					<view class="flex-row">
 						<u-icon name="/static/me/u701.png" color="#38db38" size="36"></u-icon>
@@ -265,6 +279,7 @@
 		},
 		data() {
 			return {
+				loveCard:{},
 				title: 'Hello',
 				tabIndex: 3,
 				order:{},
@@ -286,14 +301,45 @@
 		},
 		onShow(){
 			this.getOrderDetailByOrderId(this.orderId )
+			this.getMyReceiveList()
 		},
 		methods: {
+
+			getMyReceiveList(){
+				this.$api.getMyReceiveList().then(res=>{
+					this.loveCard = res.data.data[0]
+				})
+			},
+
 			getUserInfo() {
 				this.$api.getUserInfo().then(res => {
 					this.userInfo = res.data.data
 					uni.setStorageSync('userInfo', res.data.data);
 				});
 			},
+
+			familyCardPay(){
+				let that = this;
+				this.$api.familyCardTradePay({
+					tradeNo:this.tradeNo,
+					loveCardId:this.loveCard.id
+				}).then(res=>{
+					this.requestStatus=false
+					uni.hideLoading();
+					uni.showToast({
+						title: '支付成功!'
+					});
+					that.getOrderDetailByOrderId(that.orderId)
+				}).catch((err) =>{
+					this.requestStatus=false
+					uni.hideLoading();
+					uni.showToast({
+						title: err.msg,
+						icon:'error'
+					})
+				});
+			},
+
 			balancePay(){
 
 				let that = this;
@@ -355,6 +401,9 @@
 				});
 				this.$refs.popup.close()
 				let that =this
+				if (this.curServiceTab===0){
+					this.familyCardPay()
+				}
 				if (this.curServiceTab===1){
 					// that.password = '';
 					// this.$refs.popup.close()
@@ -362,7 +411,8 @@
 
 					this.balancePay()
 
-				}else {
+				}
+				if (this.curServiceTab===2){
 					this.$api.wechatPayTradeNo({tradeNo:this.tradeNo}).then(res=>{
 						var param = res.data.data;
 						uni.requestPayment({
@@ -498,7 +548,12 @@
 				console.log('this.userInfo.balance',this.userInfo.balance*1)
 				console.log('this.price',this.order.totalAmount*1)
 
+				if (this.loveCard.totalBalance*1 < this.order.totalAmount*1 && num == 0){
+					uni.$u.toast('余额不足')
+					return
+				}
 				if (this.userInfo.balance*1 < this.order.totalAmount*1 && num == 1){
+					uni.$u.toast('余额不足')
 					return
 				}
 				this.curServiceTab = num

+ 1 - 1
pages/order/index.rpx.scss

@@ -396,7 +396,7 @@
 
 
 .payView{
-  height: 638rpx;
+  //height: 638rpx;
   background: #FFFFFF;
   box-shadow: 0rpx -4rpx 8rpx 0rpx rgba(0,0,0,0.03);
   border-radius: 24rpx 24rpx 0rpx 0rpx;

+ 93 - 5
pages/order/index.vue

@@ -70,12 +70,28 @@
 					<text class="payType">请选择支付方式</text>
 					<image class="x" src="/static/common/ox.png" @click="closePayPopup"></image>
 				</view>
-				<view class="payTitle">
-					<text>选择微信支付或余额支付</text>
-				</view>
+<!--				<view class="payTitle">-->
+<!--					<text>选择微信支付或余额支付</text>-->
+<!--				</view>-->
+
 
+				<view :style="{'min-height':'380rpx'}">
 
-				<view :style="{'height':'380rpx'}">
+					<view v-if="loveCard.totalBalance" class="payItem  flex-row justify-between" @click="payItem(0)">
+						<view class="flex-row">
+							<u-icon name="/static/me/familyCard_icon.png" color="#38db38" size="36"></u-icon>
+							<view class="payName flex-col justify-center">
+								<text>亲情卡支付</text>
+								<text class="balance">{{loveCard.presentUserName + loveCard.presentUserNo}}赠送的亲情卡</text>
+								<text class="balance">余额{{loveCard.totalBalance}}</text>
+							</view>
+						</view>
+						<view class="flex-col justify-center">
+							<u-icon v-if="curServiceTab === 0" name="checkmark-circle-fill" color="#38db38"
+									size="25"></u-icon>
+							<u-icon v-else name="/static/order/ud9.png" color="green" size="25"></u-icon>
+						</view>
+					</view>
 
 					<view class="payItem flex-row justify-between"  @click="payItem(1)">
 						<view class="flex-row">
@@ -154,6 +170,7 @@
 		},
 		data() {
 			return {
+				loveCard:{},
 				orderNumberData:{},
 				num: 0,
 				title: 'Hello',
@@ -204,6 +221,7 @@
 			uni.removeStorageSync('orderListIndex');
 
 			this.$refs.MescrollItem[this.tabIndex].downCallback()
+			this.getMyReceiveList()
 		},
 
 		methods: {
@@ -274,7 +292,59 @@
 			},
 
 
+			familyCardPay(){
+				let that = this;
+				if (this.openType == 2){
+					this.$api.familyCardPay({
+						orderNo: this.appointmentOrder.subOrderNo,
+						loveCardId: this.loveCard.id
+					}).then(res=>{
+						this.requestStatus=false
+						uni.hideLoading();
+						that.$refs.popup.close()
+						uni.showToast({
+							title: '支付成功'
+						})
+						that.$refs.MescrollItem[that.tabIndex].downCallback()
+						that.getUserInfo()
+						that.password = ''
+					}).catch((err) =>{
+						this.requestStatus=false
+						uni.hideLoading();
+						that.$refs.popup.close()
+						uni.showToast({
+							title: err.msg,
+							icon:'error'
+						})
+						that.password = ''
+					});
+				}else{
+					this.$api.familyCardTradePay({
+						tradeNo:this.tradeNo,
+						loveCardId:this.loveCard.id
+					}).then(res=>{
+						this.requestStatus=false
+						uni.hideLoading();
+						that.$refs.popup.close()
+						uni.showToast({
+							title: '支付成功'
+						})
+						that.$refs.MescrollItem[that.tabIndex].downCallback()
+						that.getUserInfo()
+						that.password = ''
+					}).catch((err) =>{
+						this.requestStatus=false
+						uni.hideLoading();
+						that.$refs.popup.close()
+						uni.showToast({
+							title: err.msg,
+							icon:'error'
+						})
+						that.password = ''
+					});
+				}
 
+			},
 
 
 			balancePay(){
@@ -350,7 +420,13 @@
 
 				console.log(this.userInfo.balance*1,this.appointmentOrder.totalAmount*1)
 
+				if (this.loveCard.totalBalance*1 < this.appointmentOrder.totalAmount*1 && num == 0){
+					uni.$u.toast('余额不足')
+					return
+				}
+
 				if (this.userInfo.balance*1 < this.appointmentOrder.totalAmount*1){
+					uni.$u.toast('余额不足')
 					return
 				}
 				this.curServiceTab = num
@@ -384,12 +460,18 @@
 					title: '支付中'
 				});
 				let that =this
+
+				if (this.curServiceTab===0){
+					this.familyCardPay()
+				}
+
 				if (this.curServiceTab===1){
 					// this.$refs.popup.close()
 					// that.password = ''
 					// this.$refs.passwordPopup.open()
 					this.balancePay()
-				}else {
+				}
+				if (this.curServiceTab===2) {
 
 					if (this.openType == 2){
 						//支付预约费用
@@ -452,6 +534,12 @@
 				this.currentTab = currentTab
 			},
 
+			getMyReceiveList(){
+				this.$api.getMyReceiveList().then(res=>{
+					this.loveCard = res.data.data[0]
+				})
+			}
+
 		}
 	}
 </script>

+ 37 - 0
uni_modules/uni-data-select/changelog.md

@@ -0,0 +1,37 @@
+## 1.0.7(2024-01-20)
+- 修复 长文本回显超过容器的bug,超过容器部分显示省略号
+## 1.0.6(2023-04-12)
+- 修复 微信小程序点击时会改变背景颜色的 bug
+## 1.0.5(2023-02-03)
+- 修复 禁用时会显示清空按钮
+## 1.0.4(2023-02-02)
+- 优化 查询条件短期内多次变更只查询最后一次变更后的结果
+- 调整 内部缓存键名调整为 uni-data-select-lastSelectedValue
+## 1.0.3(2023-01-16)
+- 修复 不关联服务空间报错的问题
+## 1.0.2(2023-01-14)
+- 新增  属性 `format` 可用于格式化显示选项内容
+## 1.0.1(2022-12-06)
+- 修复  当where变化时,数据不会自动更新的问题
+## 0.1.9(2022-09-05)
+- 修复 微信小程序下拉框出现后选择会点击到蒙板后面的输入框
+## 0.1.8(2022-08-29)
+- 修复 点击的位置不准确
+## 0.1.7(2022-08-12)
+- 新增 支持 disabled 属性
+## 0.1.6(2022-07-06)
+- 修复 pc端宽度异常的bug
+## 0.1.5
+- 修复 pc端宽度异常的bug
+## 0.1.4(2022-07-05)
+- 优化 显示样式
+## 0.1.3(2022-06-02)
+- 修复 localdata 赋值不生效的 bug
+- 新增 支持  uni.scss 修改颜色
+- 新增 支持选项禁用(数据选项设置 disabled: true 即禁用)
+## 0.1.2(2022-05-08)
+- 修复 当 value 为 0 时选择不生效的 bug
+## 0.1.1(2022-05-07)
+- 新增 记住上次的选项(仅 collection 存在时有效)
+## 0.1.0(2022-04-22)
+- 初始化

+ 527 - 0
uni_modules/uni-data-select/components/uni-data-select/uni-data-select.vue

@@ -0,0 +1,527 @@
+<template>
+	<view class="uni-stat__select">
+		<span v-if="label" class="uni-label-text hide-on-phone">{{label + ':'}}</span>
+		<view class="uni-stat-box" :class="{'uni-stat__actived': current}">
+			<view class="uni-select" :class="{'uni-select--disabled':disabled}">
+				<view class="uni-select__input-box" @click="toggleSelector">
+					<view v-if="current" class="uni-select__input-text">{{textShow}}</view>
+					<view v-else class="uni-select__input-text uni-select__input-placeholder">{{typePlaceholder}}</view>
+					<view v-if="current && clear && !disabled" @click.stop="clearVal" >
+						<uni-icons type="clear" color="#c0c4cc" size="24"/>
+					</view>
+					<view v-else>
+						<uni-icons :type="showSelector? 'top' : 'bottom'" size="14" color="#999" />
+					</view>
+				</view>
+				<view class="uni-select--mask" v-if="showSelector" @click="toggleSelector" />
+				<view class="uni-select__selector" v-if="showSelector">
+					<view class="uni-popper__arrow"></view>
+					<scroll-view scroll-y="true" class="uni-select__selector-scroll">
+						<view class="uni-select__selector-empty" v-if="mixinDatacomResData.length === 0">
+							<text>{{emptyTips}}</text>
+						</view>
+						<view v-else class="uni-select__selector-item" v-for="(item,index) in mixinDatacomResData" :key="index"
+							@click="change(item)">
+							<text :class="{'uni-select__selector__disabled': item.disable}">{{formatItemName(item)}}</text>
+						</view>
+					</scroll-view>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	/**
+	 * DataChecklist 数据选择器
+	 * @description 通过数据渲染的下拉框组件
+	 * @tutorial https://uniapp.dcloud.io/component/uniui/uni-data-select
+	 * @property {String} value 默认值
+	 * @property {Array} localdata 本地数据 ,格式 [{text:'',value:''}]
+	 * @property {Boolean} clear 是否可以清空已选项
+	 * @property {Boolean} emptyText 没有数据时显示的文字 ,本地数据无效
+	 * @property {String} label 左侧标题
+	 * @property {String} placeholder 输入框的提示文字
+	 * @property {Boolean} disabled 是否禁用
+	 * @event {Function} change  选中发生变化触发
+	 */
+
+	export default {
+		name: "uni-data-select",
+		mixins: [uniCloud.mixinDatacom || {}],
+		props: {
+			localdata: {
+				type: Array,
+				default () {
+					return []
+				}
+			},
+			value: {
+				type: [String, Number],
+				default: ''
+			},
+			modelValue: {
+				type: [String, Number],
+				default: ''
+			},
+			label: {
+				type: String,
+				default: ''
+			},
+			placeholder: {
+				type: String,
+				default: '请选择'
+			},
+			emptyTips: {
+				type: String,
+				default: '无选项'
+			},
+			clear: {
+				type: Boolean,
+				default: true
+			},
+			defItem: {
+				type: Number,
+				default: 0
+			},
+			disabled: {
+				type: Boolean,
+				default: false
+			},
+			// 格式化输出 用法 field="_id as value, version as text, uni_platform as label" format="{label} - {text}"
+			format: {
+				type: String,
+				default: ''
+			},
+		},
+		data() {
+			return {
+				showSelector: false,
+				current: '',
+				mixinDatacomResData: [],
+				apps: [],
+				channels: [],
+				cacheKey: "uni-data-select-lastSelectedValue",
+			};
+		},
+		created() {
+			this.debounceGet = this.debounce(() => {
+				this.query();
+			}, 300);
+			if (this.collection && !this.localdata.length) {
+				this.debounceGet();
+			}
+		},
+		computed: {
+			typePlaceholder() {
+				const text = {
+					'opendb-stat-app-versions': '版本',
+					'opendb-app-channels': '渠道',
+					'opendb-app-list': '应用'
+				}
+				const common = this.placeholder
+				const placeholder = text[this.collection]
+				return placeholder ?
+					common + placeholder :
+					common
+			},
+			valueCom(){
+				// #ifdef VUE3
+				return this.modelValue;
+				// #endif
+				// #ifndef VUE3
+				return this.value;
+				// #endif
+			},
+			textShow(){
+				// 长文本显示
+				let text = this.current;
+				if (text.length > 10) {
+					return text.slice(0, 25) + '...';
+				}
+				return text;
+			}
+		},
+
+		watch: {
+			localdata: {
+				immediate: true,
+				handler(val, old) {
+					if (Array.isArray(val) && old !== val) {
+						this.mixinDatacomResData = val
+					}
+				}
+			},
+			valueCom(val, old) {
+				this.initDefVal()
+			},
+			mixinDatacomResData: {
+				immediate: true,
+				handler(val) {
+					if (val.length) {
+						this.initDefVal()
+					}
+				}
+			},
+
+		},
+		methods: {
+			debounce(fn, time = 100){
+				let timer = null
+				return function(...args) {
+					if (timer) clearTimeout(timer)
+					timer = setTimeout(() => {
+						fn.apply(this, args)
+					}, time)
+				}
+			},
+			// 执行数据库查询
+			query(){
+				this.mixinDatacomEasyGet();
+			},
+			// 监听查询条件变更事件
+			onMixinDatacomPropsChange(){
+				if (this.collection) {
+					this.debounceGet();
+				}
+			},
+			initDefVal() {
+				let defValue = ''
+				if ((this.valueCom || this.valueCom === 0) && !this.isDisabled(this.valueCom)) {
+					defValue = this.valueCom
+				} else {
+					let strogeValue
+					if (this.collection) {
+						strogeValue = this.getCache()
+					}
+					if (strogeValue || strogeValue === 0) {
+						defValue = strogeValue
+					} else {
+						let defItem = ''
+						if (this.defItem > 0 && this.defItem <= this.mixinDatacomResData.length) {
+							defItem = this.mixinDatacomResData[this.defItem - 1].value
+						}
+						defValue = defItem
+					}
+          if (defValue || defValue === 0) {
+					  this.emit(defValue)
+          }
+				}
+				const def = this.mixinDatacomResData.find(item => item.value === defValue)
+				this.current = def ? this.formatItemName(def) : ''
+			},
+
+			/**
+			 * @param {[String, Number]} value
+			 * 判断用户给的 value 是否同时为禁用状态
+			 */
+			isDisabled(value) {
+				let isDisabled = false;
+
+				this.mixinDatacomResData.forEach(item => {
+					if (item.value === value) {
+						isDisabled = item.disable
+					}
+				})
+
+				return isDisabled;
+			},
+
+			clearVal() {
+				this.emit('')
+				if (this.collection) {
+					this.removeCache()
+				}
+			},
+			change(item) {
+				if (!item.disable) {
+					this.showSelector = false
+					this.current = this.formatItemName(item)
+					this.emit(item.value)
+				}
+			},
+			emit(val) {
+				this.$emit('input', val)
+				this.$emit('update:modelValue', val)
+				this.$emit('change', val)
+				if (this.collection) {
+					this.setCache(val);
+				}
+			},
+			toggleSelector() {
+				if (this.disabled) {
+					return
+				}
+
+				this.showSelector = !this.showSelector
+			},
+			formatItemName(item) {
+				let {
+					text,
+					value,
+					channel_code
+				} = item
+				channel_code = channel_code ? `(${channel_code})` : ''
+
+				if (this.format) {
+					// 格式化输出
+					let str = "";
+					str = this.format;
+					for (let key in item) {
+						str = str.replace(new RegExp(`{${key}}`,"g"),item[key]);
+					}
+					return str;
+				} else {
+					return this.collection.indexOf('app-list') > 0 ?
+						`${text}(${value})` :
+						(
+							text ?
+							text :
+							`未命名${channel_code}`
+						)
+				}
+			},
+			// 获取当前加载的数据
+			getLoadData(){
+				return this.mixinDatacomResData;
+			},
+			// 获取当前缓存key
+			getCurrentCacheKey(){
+				return this.collection;
+			},
+			// 获取缓存
+			getCache(name=this.getCurrentCacheKey()){
+				let cacheData = uni.getStorageSync(this.cacheKey) || {};
+				return cacheData[name];
+			},
+			// 设置缓存
+			setCache(value, name=this.getCurrentCacheKey()){
+				let cacheData = uni.getStorageSync(this.cacheKey) || {};
+				cacheData[name] = value;
+				uni.setStorageSync(this.cacheKey, cacheData);
+			},
+			// 删除缓存
+			removeCache(name=this.getCurrentCacheKey()){
+				let cacheData = uni.getStorageSync(this.cacheKey) || {};
+				delete cacheData[name];
+				uni.setStorageSync(this.cacheKey, cacheData);
+			},
+		}
+	}
+</script>
+
+<style lang="scss">
+	$uni-base-color: #6a6a6a !default;
+	$uni-main-color: #333 !default;
+	$uni-secondary-color: #909399 !default;
+	$uni-border-3: #e5e5e5;
+
+
+	/* #ifndef APP-NVUE */
+	@media screen and (max-width: 500px) {
+		.hide-on-phone {
+			display: none;
+		}
+	}
+
+	/* #endif */
+	.uni-stat__select {
+		display: flex;
+		align-items: center;
+		// padding: 15px;
+		/* #ifdef H5 */
+		cursor: pointer;
+		/* #endif */
+		width: 100%;
+		flex: 1;
+		box-sizing: border-box;
+	}
+
+	.uni-stat-box {
+		width: 100%;
+		flex: 1;
+	}
+
+	.uni-stat__actived {
+		width: 100%;
+		flex: 1;
+		// outline: 1px solid #2979ff;
+	}
+
+	.uni-label-text {
+		font-size: 14px;
+		font-weight: bold;
+		color: $uni-base-color;
+		margin: auto 0;
+		margin-right: 5px;
+	}
+
+	.uni-select {
+		font-size: 14px;
+		border: 1px solid $uni-border-3;
+		box-sizing: border-box;
+		border-radius: 4px;
+		padding: 0 5px;
+		padding-left: 10px;
+		position: relative;
+		/* #ifndef APP-NVUE */
+		display: flex;
+		user-select: none;
+		/* #endif */
+		flex-direction: row;
+		align-items: center;
+		border-bottom: solid 1px $uni-border-3;
+		width: 100%;
+		flex: 1;
+		height: 35px;
+
+		&--disabled {
+			background-color: #f5f7fa;
+			cursor: not-allowed;
+		}
+	}
+
+	.uni-select__label {
+		font-size: 16px;
+		// line-height: 22px;
+		height: 35px;
+		padding-right: 10px;
+		color: $uni-secondary-color;
+	}
+
+	.uni-select__input-box {
+		height: 35px;
+		position: relative;
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex: 1;
+		flex-direction: row;
+		align-items: center;
+	}
+
+	.uni-select__input {
+		flex: 1;
+		font-size: 14px;
+		height: 22px;
+		line-height: 22px;
+	}
+
+	.uni-select__input-plac {
+		font-size: 14px;
+		color: $uni-secondary-color;
+	}
+
+	.uni-select__selector {
+		/* #ifndef APP-NVUE */
+		box-sizing: border-box;
+		/* #endif */
+		position: absolute;
+		top: calc(100% + 12px);
+		left: 0;
+		width: 100%;
+		background-color: #FFFFFF;
+		border: 1px solid #EBEEF5;
+		border-radius: 6px;
+		box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
+		z-index: 3;
+		padding: 4px 0;
+	}
+
+	.uni-select__selector-scroll {
+		/* #ifndef APP-NVUE */
+		max-height: 200px;
+		box-sizing: border-box;
+		/* #endif */
+	}
+
+	/* #ifdef H5 */
+	@media (min-width: 768px) {
+		.uni-select__selector-scroll {
+			max-height: 600px;
+		}
+	}
+	/* #endif */
+
+	.uni-select__selector-empty,
+	.uni-select__selector-item {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		cursor: pointer;
+		/* #endif */
+		line-height: 35px;
+		font-size: 14px;
+		text-align: center;
+		/* border-bottom: solid 1px $uni-border-3; */
+		padding: 0px 10px;
+	}
+
+	.uni-select__selector-item:hover {
+		background-color: #f9f9f9;
+	}
+
+	.uni-select__selector-empty:last-child,
+	.uni-select__selector-item:last-child {
+		/* #ifndef APP-NVUE */
+		border-bottom: none;
+		/* #endif */
+	}
+
+	.uni-select__selector__disabled {
+		opacity: 0.4;
+		cursor: default;
+	}
+
+	/* picker 弹出层通用的指示小三角 */
+	.uni-popper__arrow,
+	.uni-popper__arrow::after {
+		position: absolute;
+		display: block;
+		width: 0;
+		height: 0;
+		border-color: transparent;
+		border-style: solid;
+		border-width: 6px;
+	}
+
+	.uni-popper__arrow {
+		filter: drop-shadow(0 2px 12px rgba(0, 0, 0, 0.03));
+		top: -6px;
+		left: 10%;
+		margin-right: 3px;
+		border-top-width: 0;
+		border-bottom-color: #EBEEF5;
+	}
+
+	.uni-popper__arrow::after {
+		content: " ";
+		top: 1px;
+		margin-left: -6px;
+		border-top-width: 0;
+		border-bottom-color: #fff;
+	}
+
+	.uni-select__input-text {
+		// width: 280px;
+		width: 100%;
+		color: $uni-main-color;
+		white-space: nowrap;
+		text-overflow: ellipsis;
+		-o-text-overflow: ellipsis;
+		overflow: hidden;
+	}
+
+	.uni-select__input-placeholder {
+		color: $uni-base-color;
+		font-size: 12px;
+	}
+
+	.uni-select--mask {
+		position: fixed;
+		top: 0;
+		bottom: 0;
+		right: 0;
+		left: 0;
+		z-index: 2;
+	}
+</style>

+ 85 - 0
uni_modules/uni-data-select/package.json

@@ -0,0 +1,85 @@
+{
+  "id": "uni-data-select",
+  "displayName": "uni-data-select 下拉框选择器",
+  "version": "1.0.7",
+  "description": "通过数据驱动的下拉框选择器",
+  "keywords": [
+    "uni-ui",
+    "select",
+    "uni-data-select",
+    "下拉框",
+    "下拉选"
+],
+  "repository": "https://github.com/dcloudio/uni-ui",
+  "engines": {
+    "HBuilderX": "^3.1.1"
+  },
+  "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"
+  },
+  "uni_modules": {
+    "dependencies": ["uni-load-more"],
+    "encrypt": [],
+    "platforms": {
+      "cloud": {
+        "tcb": "y",
+        "aliyun": "y"
+      },
+      "client": {
+        "App": {
+          "app-vue": "u",
+          "app-nvue": "n"
+        },
+        "H5-mobile": {
+          "Safari": "y",
+          "Android Browser": "y",
+          "微信浏览器(Android)": "y",
+          "QQ浏览器(Android)": "y"
+        },
+        "H5-pc": {
+          "Chrome": "y",
+          "IE": "y",
+          "Edge": "y",
+          "Firefox": "y",
+          "Safari": "y"
+        },
+        "小程序": {
+          "微信": "y",
+          "阿里": "u",
+          "百度": "u",
+          "字节跳动": "u",
+        "QQ": "u",
+        "京东": "u"
+        },
+        "快应用": {
+          "华为": "u",
+          "联盟": "u"
+        },
+        "Vue": {
+            "vue2": "y",
+            "vue3": "y"
+        }
+      }
+    }
+  }
+}

+ 8 - 0
uni_modules/uni-data-select/readme.md

@@ -0,0 +1,8 @@
+## DataSelect 下拉框选择器
+> **组件名:uni-data-select**
+> 代码块: `uDataSelect`
+
+当选项过多时,使用下拉菜单展示并选择内容
+
+### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-data-select)
+#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 

+ 19 - 0
uni_modules/uni-load-more/changelog.md

@@ -0,0 +1,19 @@
+## 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": "沒有更多數據了"
+}

File diff suppressed because it is too large
+ 112 - 0
uni_modules/uni-load-more/components/uni-load-more/uni-load-more.vue


+ 86 - 0
uni_modules/uni-load-more/package.json

@@ -0,0 +1,86 @@
+{
+  "id": "uni-load-more",
+  "displayName": "uni-load-more 加载更多",
+  "version": "1.3.3",
+  "description": "LoadMore 组件,常用在列表里面,做滚动加载使用。",
+  "keywords": [
+    "uni-ui",
+    "uniui",
+    "加载更多",
+    "load-more"
+],
+  "repository": "https://github.com/dcloudio/uni-ui",
+  "engines": {
+    "HBuilderX": ""
+  },
+  "directories": {
+    "example": "../../temps/example_temps"
+  },
+  "dcloudext": {
+    "category": [
+      "前端组件",
+      "通用组件"
+    ],
+    "sale": {
+      "regular": {
+        "price": "0.00"
+      },
+      "sourcecode": {
+        "price": "0.00"
+      }
+    },
+    "contact": {
+      "qq": ""
+    },
+    "declaration": {
+      "ads": "无",
+      "data": "无",
+      "permissions": "无"
+    },
+    "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui"
+  },
+  "uni_modules": {
+    "dependencies": ["uni-scss"],
+    "encrypt": [],
+    "platforms": {
+      "cloud": {
+        "tcb": "y",
+        "aliyun": "y"
+      },
+      "client": {
+        "App": {
+          "app-vue": "y",
+          "app-nvue": "y"
+        },
+        "H5-mobile": {
+          "Safari": "y",
+          "Android Browser": "y",
+          "微信浏览器(Android)": "y",
+          "QQ浏览器(Android)": "y"
+        },
+        "H5-pc": {
+          "Chrome": "y",
+          "IE": "y",
+          "Edge": "y",
+          "Firefox": "y",
+          "Safari": "y"
+        },
+        "小程序": {
+          "微信": "y",
+          "阿里": "y",
+          "百度": "y",
+          "字节跳动": "y",
+          "QQ": "y"
+        },
+        "快应用": {
+          "华为": "u",
+          "联盟": "u"
+        },
+        "Vue": {
+            "vue2": "y",
+            "vue3": "y"
+        }
+      }
+    }
+  }
+}

+ 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 
+
+

Some files were not shown because too many files changed in this diff