Browse Source

完成 青少年模式 以及 30分钟全局提示

XSXS 2 months ago
parent
commit
2239ca8a2c

+ 61 - 1
App.vue

@@ -15,6 +15,10 @@
 // // #endif
 
 const tabbars = ['/pages/my/my', '/pages/make/index', '/pages/message/mailMessage', '/pages/index/index']
+// 执行青少年30分钟弹窗逻辑
+import { createTeenagePopUpWindow, setupTeenagePopupTimer } from '@/common/teenagePopup.js'
+uni.$createTeenagePopUpWindow = createTeenagePopUpWindow
+
 export default {
 	globalData: {
 		postHeader: null,
@@ -28,11 +32,67 @@ export default {
 		systemInfo: null,
 		nickname: '',
 		avator: '',
-		mobile:0,
+		mobile: 0,
 		user_id: 0,
 	},
 	beforeDestroy() { },
 	onLaunch: function (options) {
+		const intervalTime = 1000 * 30 * 60; // 30分钟的时间戳(毫秒)
+		var timeoutId
+		var judgingTimer = async () => {
+			var checkTheStatusOfTeenagers = () => {
+				return new Promise((resolve, reject) => {
+					uni.request({
+						url: this.$apiHost + '/Young/getYoungModeInfo',
+						data: {
+							uuid: this.globalData.uuid,
+							skey: this.globalData.skey,
+						},
+						header: {
+							"content-type": "application/json",
+							'sign': this.globalData.headerSign
+						},
+						success: (res) => {
+							console.log("检查青少年状态", res.data);
+							if (!res.data.has_password || res.data.is_open_young == 1) {
+								setupTeenagePopupTimer()
+								resolve(true)
+							} else {
+								// setupTeenagePopupTimer()
+								resolve(false)
+							}
+						},
+						complete: () => { },
+						fail: (e) => {
+							console.log("检查青少年状态失败", e);
+
+						}
+					});
+				})
+			}// 检查是否已经显示过弹窗,避免重复弹出
+			const lastPopupTime = uni.getStorageSync('teenagePopupTime');
+			const currentTime = Date.now();
+
+			// 如果从未弹出过,或者距离上次弹出已经超过30分钟
+			if (!lastPopupTime || (currentTime - lastPopupTime > intervalTime)) {
+				var isTimer = await checkTheStatusOfTeenagers()
+				console.log(isTimer, "isTimer");
+				// 记录弹窗时间
+				uni.setStorageSync('teenagePopupTime', currentTime);
+				if (timeoutId) {
+					clearTimeout(timeoutId);
+				}
+				if (isTimer) {
+					timeoutId = setTimeout(judgingTimer, intervalTime);
+				}
+			}
+		}
+
+
+		setTimeout(() => {
+			judgingTimer();
+		}, 1000 * 60);
+
 		// #ifdef APP-PLUS
 		// var brand = uni.getSystemInfoSync().deviceBrand
 		// setRequestPermissionTips(PermissionTips)

+ 77 - 0
common/teenagePopup.js

@@ -0,0 +1,77 @@
+import Vue from 'vue'
+import teenagePopUpWindow from '@/components/teenagePopUpWindow/teenagePopUpWindow.vue'
+const app = getApp();
+// 创建全局弹窗容器
+function createPopupContainer() {
+    const container = document.createElement('div');
+    container.id = 'teenage-popup-container';
+    document.body.appendChild(container);
+    return container;
+}
+
+export function createTeenagePopUpWindow(options = {}) {
+    const { title, content, confirmText, imageSrc } = options;
+
+    // 确保弹窗容器存在
+    let container = document.getElementById('teenage-popup-container');
+    if (!container) {
+        container = createPopupContainer();
+    }
+
+    // 创建 Vue 实例
+    const PopupConstructor = Vue.extend({
+        render(h) {
+            return h(teenagePopUpWindow, {
+                props: {
+                    text: content || '截图至相册,微信扫一扫',
+                    confirmText: confirmText || '知道了',
+                    imageSrc: imageSrc || '../../static/me/qingshaonianmoshi.png'
+                },
+                on: {
+                    close: this.closePopup
+                }
+            });
+        },
+        methods: {
+            closePopup() {
+                this.$destroy();
+                this.$el.remove();
+            }
+        }
+    });
+
+    // 创建并挂载实例
+    const instance = new PopupConstructor().$mount(container);
+
+    return {
+        show: () => {
+            // 在 uni-app 中使用 uni.createAnimation 或 $refs 来触发显示
+            if (instance.$children && instance.$children[0] && instance.$children[0].open) {
+                instance.$children[0].open();
+            }
+        },
+        hide: () => {
+            // 在 uni-app 中使用 uni.createAnimation 或 $refs 来触发隐藏
+            if (instance.$children && instance.$children[0] && instance.$children[0].close) {
+                instance.$children[0].close();
+            }
+        }
+    };
+}
+
+// 全局定时弹窗方法  
+export async function setupTeenagePopupTimer() {
+
+    function showTeenagePopUpWindow() { 
+        const teenagePopup = createTeenagePopUpWindow({
+            title: '青少年模式提醒',
+            content: '为保护未成年人健康成长,建议合理控制使用时间',
+            confirmText: '我知道了'
+        });
+
+        // 显示弹窗 
+        teenagePopup.show(); 
+    }
+ 
+    showTeenagePopUpWindow();  
+}

+ 2 - 2
components/PageHeader/PageHeader.vue

@@ -1,5 +1,5 @@
 <template>
-  <view class="page-header">
+  <view class="PageHeader">
     <view class="status-bar"></view>
     <view class="navbar" :style="cssStyle">
       <view class="navbar-left">
@@ -49,7 +49,7 @@ export default {
 </script>
 
 <style lang="scss" scoped>
-.page-header {
+.PageHeader {
   position: fixed;
   top: 0;
   left: 0;

+ 88 - 0
components/teenagePopUpWindow/teenagePopUpWindow.vue

@@ -0,0 +1,88 @@
+<template>
+  <CustomPopup ref="customPopup">
+    <view class="customerService">
+      <image src="../../static/me/qingshaonianmoshi.png"></image>
+      <view class="text-title">青少年模式</view>
+      <view class="text-content">为呵护未成年人健康成长,萌创星球推出青少年模式,该模式下部分功能将无法正常使用。请监护人主动选择,并设置监护密码。</view>
+      <view class="text-link" @click="goPage()">开启青少年模式 ></view>
+      <view class="btn-box" @click="close()">知道了</view>
+    </view>
+  </CustomPopup>
+</template>
+
+<script>
+import CustomPopup from '@/components/CustomPopup/CustomPopup.vue'
+
+export default {
+  components: { CustomPopup },
+  methods: {
+    open() {
+      this.$refs.customPopup.open();
+    },
+    close() {
+      this.$refs.customPopup.close();
+    },
+    goPage(){
+      this.$refs.customPopup.close();
+      uni.navigateTo({
+        url: '/pages/my/adolescent'
+      })
+    }
+  }
+}
+</script>
+
+<style scoped lang="scss">
+.customerService {
+  width: 600rpx;
+  height: 750rpx;
+  background: #ffffff;
+  border-radius: 14rpx;
+  padding: 30rpx 70rpx;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  flex-direction: column;
+
+  image {
+    width: 236rpx;
+    height: 236rpx;
+  }
+
+  .text-title {
+    padding-top: 28rpx;
+    font-family: 'PingFang SC-Bold';
+    font-weight: 400;
+    font-size: 36rpx;
+    color: #1F1F1F;
+  }
+
+  .text-content {
+    padding: 20rpx 0;
+    font-weight: 400;
+    font-size: 28rpx;
+    color: #999999;
+    font-family: 'PingFang SC-Medium';
+  }
+  .text-link{
+    font-weight: 400;
+font-size: 32rpx;
+color: #0084FF;
+  }
+  .btn-box {
+    background: #1F1F1F;
+    color: #fff;
+    margin: 0 auto;
+    width: 244rpx;
+    height: 72rpx;
+    font-size: 32rpx;
+    font-family: 'PingFang SC-Bold';
+    background: #1F1F1F;
+    border-radius: 12rpx;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    margin-top: 20rpx;
+  }
+}
+</style>

+ 2 - 0
main.js

@@ -25,6 +25,8 @@ Vue.prototype.isArray = Array.isArray || function(obj) {
 	return obj instanceof Array;
 };
 
+
+
 //挂载全局http请求
 import $http from '@/common/requestConfig'
 Vue.prototype.$http = $http;

+ 9 - 0
pages.json

@@ -3,6 +3,7 @@
 
 		{
 			"path": "pages/index/index",
+			"onReachBottomDistance":"50",
 			"style": {
 				"navigationBarTitleText": "首页",
 				"navigationStyle": "custom",
@@ -339,6 +340,14 @@
 				"navigationBarTitleText" : "青少年设置",
 				"navigationStyle": "custom"
 			}
+		},
+		{
+			"path" : "pages/my/teenagePassword",
+			"style" : 
+			{
+				"navigationBarTitleText" : "" ,
+				"navigationStyle": "custom"
+			}
 		}
 	],
 	"globalStyle": {

+ 3 - 1
pages/index/index.vue

@@ -11,7 +11,7 @@
 		<view style="display: flex; justify-content: flex-end">
 			<view class="view6 step7"></view>
 		</view>
-		<z-paging ref="paging"  v-model="dataList" @query="queryList" :style="{ height: windowHeight - 80 + 'px' }"
+		<z-paging ref="paging"  v-model="dataList"  :auto="false" :style="{ height: windowHeight - 80 + 'px' }"
 			:show-scrollbar="false">
 			<template #top>
 				<page-navbar>
@@ -400,6 +400,7 @@ export default {
 		// 不在onLoad中直接加载数据,避免与z-paging组件重复请求
 		// 让z-paging组件通过queryList方法控制数据加载 
 		this.getWeather()
+		this.queryList();
 
 	},
 	onShow() {
@@ -426,6 +427,7 @@ export default {
 	onReachBottom() {
 		this.loadMoreData();
 	},
+	
 	// 下拉刷新数据
 	methods: {
 		getWeather(city) {

+ 18 - 0
pages/my/DelMemVerify.vue

@@ -306,7 +306,25 @@ export default {
       height: 90rpx;
       border: 4rpx #000 solid;
       border-radius: 20rpx;
+
+      &.yi-code-show-active {
+        border: solid 2px #ff5500;
+        animation: myfirst 600ms infinite;
+
+        @keyframes myfirst {
+          0% {
+            opacity: 0.1
+          }
+
+          100% {
+            opacity: 1
+          }
+        }
+      }
     }
+    .yi-code-hide {
+			height: 90rpx; 
+		}
   }
 }
 

+ 108 - 10
pages/my/adolescent.vue

@@ -13,25 +13,29 @@
 				<view class="teenageMode">
 					<view class="title">
 						青少年模式
-						<view class="switchMode active" v-if="true">已开启</view>
-						<view class="switchMode " v-else>未开启</view>
+						<view class="switchMode "
+							v-if="youngModeInfo.is_open_young == 0 || youngModeInfo.is_open_young == -1">
+							未开启</view>
+						<view class="switchMode active" v-else>已开启</view>
 					</view>
 					<view class="prompt">
 						此模式下部分功能无法使用,且会带来以下限制
 					</view>
 				</view>
 				<view class="textList">
-					<view class="textItem">·青少年模式下,将不支持充值、订阅会员功</view>
-					<view class="textItem">·每日22时至次日8时,期间无法使用本应</view>
-					<view class="textItem">·未成年人每日可使用40分</view>
+					<view class="textItem"><span>·</span>青少年模式下,将不支持充值、订阅会员功</view>
+					<view class="textItem"><span>·</span>每日22时至次日8时,期间无法使用本应</view>
+					<view class="textItem"><span>·</span>未成年人每日可使用40分</view>
 				</view>
 			</view>
 			<view class="bottm-box">
-				<view class="button">开启青少年模式</view>
-				<view class="button">退出青少年模式</view>
-				<view class="setPassword">修改密码</view>
+				<view class="button" @click="goSetpossWord(1)"  v-if="youngModeInfo.has_password == false">设置密码</view>
+				<view class="button" @click="goSetpossWord(4)"  v-else-if="youngModeInfo.is_open_young == 0 || youngModeInfo.is_open_young == -1">开启青少年模式</view>
+				<view class="button" @click="goSetpossWord(4)"  v-else-if="youngModeInfo.is_open_young == 1">关闭青少年模式</view>
+				<view class="setPassword" @click="goSetpossWord(2)" v-if="youngModeInfo.has_password">修改密码</view>
 			</view>
 		</view>
+		
 	</view>
 </template>
 
@@ -39,11 +43,45 @@
 export default {
 	data() {
 		return {
-
+			youngModeInfo: {
+				has_password: false, //是否有密码
+				is_open_young: -1,  //是否开启青少年模式   
+				str: ""
+			}
 		}
 	},
+	onLoad() {
+	},
+	onShow(){
+		this.getYoungModeInfo();
+		
+	},
 	methods: {
+		getYoungModeInfo() {
+			uni.request({
+				url: this.$apiHost + '/Young/getYoungModeInfo',
+				data: {
+					uuid: getApp().globalData.uuid,
+					skey: getApp().globalData.skey,
+				},
+				header: {
+					"content-type": "application/json",
+					'sign': getApp().globalData.headerSign
+				},
+				success: (res) => {
+					console.log("数据", res.data);
+					this.youngModeInfo = res.data;
 
+				},
+				complete: () => { },
+				fail: (e) => { }
+			});
+		},
+		goSetpossWord(state) {
+			uni.navigateTo({
+				url: "/pages/my/teenagePassword?state=" + state+"&is_open_young="+this.youngModeInfo.is_open_young,
+			})
+		}
 	}
 }
 </script>
@@ -52,6 +90,7 @@ export default {
 page {
 	background: url("../../static/me/wd_bg_bianjiziliao.png") top center/ 100% auto no-repeat,
 		#f2f6f2;
+	font-family: 'PingFang SC-Medium';
 }
 
 .PageHeader {
@@ -110,14 +149,73 @@ page {
 					display: flex;
 					align-items: center;
 					justify-content: center;
-					&.active{
+
+					&.active {
 						background: url(../../static/me/text-bg-active.png) center top / 100% auto no-repeat;
 						color: #8BB849;
 					}
 				}
 			}
+
+			.prompt {
+				font-weight: 400;
+				font-size: 24rpx;
+				color: #999999;
+				padding-top: 18rpx;
+				padding-bottom: 54rpx;
+			}
 		}
 
+		.textList {
+			line-height: 2.5;
+			font-weight: 400;
+			font-size: 28rpx;
+			color: #1F1F1F;
+
+			.textItem {
+				display: flex;
+				align-items: center;
+
+				span {
+					display: inline-block;
+					padding-right: 15rpx;
+					font-size: 56rpx;
+					line-height: 0;
+					font-weight: 700;
+				}
+			}
+		}
+
+
+
+	}
+
+	.bottm-box {
+		padding: 0 62rpx;
+		margin-top: 150rpx;
+		padding-bottom: 100rpx;
+
+		.button {
+
+			font-weight: 400;
+			font-size: 32rpx;
+			color: #FFFFFF;
+			background: #1F1F1F;
+			border-radius: 58rpx;
+			padding: 22rpx 0;
+			display: flex;
+			align-items: center;
+			justify-content: center;
+		}
+
+		.setPassword {
+			text-align: center;
+			color: #0084FF;
+			font-weight: 400;
+			font-size: 24rpx;
+			color: #0084FF;
+			padding-top: 24rpx;
+		}
 	}
 }
 </style>

+ 1 - 0
pages/my/my.vue

@@ -39,6 +39,7 @@
 							<uv-text v-else class="intro_text two-omit">
 								{{ myinfo.content }}
 							</uv-text>
+							
 						</view>
 						<view class="bom">
 							<view class="follow_info" @click="navigateToFollow">

+ 2 - 1
pages/my/setting.vue

@@ -79,7 +79,8 @@ export default {
 				'name': '青少年模式',
 				'switch': 0,
 				'desc': '',
-				'path': '/pages/my/idcheck',
+				// 'path': '/pages/my/idcheck',实名认证
+				'path': '/pages/my/adolescent',
 				'icon': '../../static/me/wd_icon_qingshaonianmoshi.png',
 				'propup': ''
 			}

+ 370 - 0
pages/my/teenagePassword.vue

@@ -0,0 +1,370 @@
+<template>
+	<view>
+		<PageHeader class="page-heard" :title="'青少年模式'" />
+		<view class="reserveASeat"></view>
+		<view class="title-box">
+			<view class="title" v-if="state == 1">设置家长密码</view>
+			<view class="title" v-if="state == 2">修改密码</view>
+			<view class="title" v-if="state == 3">设置新密码</view>
+			<view class="title" v-if="state == 4">验证密码</view>
+			<view class="subtitle" v-if="state == 1">此密码为关闭青少年模式的密码</view>
+			<view class="subtitle" v-if="state == 2">请输入当前密码</view>
+			<view class="subtitle" v-if="state == 3">请输入当前密码</view>
+			<view class="subtitle" v-if="state == 4">请输入密码{{ action == 'open' ? '打开' : '关闭' }}青少年模式</view>
+		</view>
+		<view class="code-box">
+			<yi-code ref="code" class="yiCode" :width="590" @onComplete="complete" :focus="false"
+				:maxlength="4"></yi-code>
+		</view>
+		<view class="subtitle" v-if="state == 2 || state == 4"> 忘记了?<span @click="openCustomPopup">联系客服反馈</span> </view>
+		<view class="subtitle" v-if="state == 3"> 此密码为长期密码,请牢记自己的密码 </view>
+
+		<view class="btn-box">
+			<view class="btn" @click="selection(false)" v-if="state != 4">{{ state != 2 ? '确认' : '下一步' }}</view>
+			<view class="btn" @click="selection(false)" v-if="state == 4">{{ action == 'open' ? '打开' : '关闭' }}青少年模式
+			</view>
+
+		</view>
+		<CustomerServicePopup ref="customerServicePopup"></CustomerServicePopup>
+	</view>
+</template>
+
+<script>
+import PageHeader from '@/components/PageHeader/PageHeader.vue'
+export default {
+	components: { PageHeader },
+	data() {
+		return {
+			state: 1,
+			code: '',
+			password: '',
+			originalPassword: '',
+			newPassword: '',
+			action: 'open',
+		}
+	},
+	onLoad(e) {
+		// e.state   1 首次进来设置密码   2修改密码(验证原密码) 3 修改密码(验证新密码) 4 验证原密码后 切换青少年状态
+		if (e.state) {
+			this.state = e.state
+		}
+		if (e.is_open_young == 1) {
+			this.action = 'close'
+		} else if (e.is_open_young == 0 || e.is_open_young == -1) {
+			this.action = 'open'
+		}
+	},
+	onShow() {
+
+	},
+	onHide() {
+
+	},
+	methods: {
+		openCustomPopup() {
+			this.$refs.customerServicePopup.$refs.customPopup.open()
+		},
+		complete(code) {
+			this.code = code
+			this.selection(true)
+		},
+		async selection(auto) {
+			auto = auto || false
+			if (!this.code || this.code.length != 4) {
+				uni.showToast({
+					title: '请输入四位密码',
+					icon: 'none'
+				});
+				return
+			}
+			var res
+
+			// 设置密码 
+			if (this.state == 1) {
+				this.password = this.code
+				if (!auto) {
+					res = await this.setParentPassword()
+				}
+			}
+
+			// 验证原密码
+			if (this.state == 2) {
+				res = await this.verifyParentPassword()
+				if (res.str == '密码验证成功') {
+					this.originalPassword = this.code
+					this.$refs.code.clear()
+					res.str = '请输入新密码'
+					this.state = 3
+				} else {
+					res.str = '密码不正确请重新输入'
+					this.$refs.code.clear() // 清空输入框
+				}
+			}
+
+			// 设置新的密码
+			if (this.state == 3) {
+				if (!auto) {
+					res = await this.setParentPassword()
+				}
+			}
+
+			// 验证原密码后切换状态
+			if (this.state == 4) {
+				var res1 = await this.verifyParentPassword()
+				if (res1.str == '密码验证成功') {
+					res = await this.toggleYoungMode()
+					this.goBack()
+				} else {
+					res1.str = '密码不正确请重新输入'
+					uni.showToast({
+						title: res1.str,
+						icon: 'none'
+					});
+					this.$refs.code.clear() // 清空输入框
+				}
+			}
+ 
+
+			if (res && res.str) {
+				if (res && res.str == '操作成功') {
+					uni.hideToast();
+					if (this.action == 'open') {
+						res.str = '青少年模式已开启'
+					} else {
+						res.str = '青少年模式已关闭'
+					}
+				}
+
+				uni.showToast({
+					title: res.str,
+					icon: 'none'
+				});
+			}
+
+			if (res && res.str == '密码设置成功') {
+				this.goBack()
+			}
+		},
+		// 设置家长密码
+		setParentPassword() {
+			console.log('执行方法');
+
+			return new Promise((resolve, reject) => {
+				var rql = {}
+				// 第一次设置时 
+				rql.password = this.code
+				// 修改密码时
+				if (this.state == 3) {
+					rql.old_password = this.originalPassword
+				}
+				console.log(rql, 111);
+
+				uni.request({
+					url: this.$apiHost + '/Young/setParentPassword',
+					data: {
+						uuid: getApp().globalData.uuid,
+						...rql
+					},
+					header: {
+						"content-type": "application/json",
+						'sign': getApp().globalData.headerSign
+					},
+					success: (res) => {
+						console.log("设置结果:", res.data);
+						resolve(res.data);
+
+					},
+					fail: (e) => {
+						console.log("设置失败:", e);
+						reject(e);
+					}
+				});
+			});
+		},
+		// 验证家长密码
+		verifyParentPassword() {
+			return new Promise((resolve, reject) => {
+				uni.request({
+					url: this.$apiHost + '/Young/verifyParentPassword',
+					data: {
+						uuid: getApp().globalData.uuid,
+						password: this.code
+					},
+					header: {
+						"content-type": "application/json",
+						'sign': getApp().globalData.headerSign
+					},
+					success: (res) => {
+						console.log("验证结果:", res.data);
+						resolve(res.data);
+
+					},
+					fail: (e) => {
+						console.log("验证失败:", e);
+						reject(e);
+					}
+				});
+			});
+		},
+		// 切换青少年模式状态
+		toggleYoungMode() {
+			return new Promise((resolve, reject) => {
+				uni.request({
+					url: this.$apiHost + '/Young/toggleYoungMode',
+					data: {
+						uuid: getApp().globalData.uuid,
+						password: this.code,
+						action: this.action
+					},
+					header: {
+						"content-type": "application/json",
+						'sign': getApp().globalData.headerSign
+					},
+					success: (res) => {
+						console.log("切换结果:", res.data);
+						resolve(res.data);
+
+					},
+					fail: (e) => {
+						console.log("切换失败:", e);
+						reject(e);
+					}
+				});
+			});
+		},
+		goBack() {
+			setTimeout(() => {
+				uni.navigateBack();
+			}, 800)
+		},
+
+
+
+	}
+}
+</script>
+
+<style lang="scss">
+page {
+	background-color: #f2f6f2;
+	font-family: 'PingFang SC-Medium';
+	min-height: 100vh;
+	padding-bottom: calc(var (--window-bottom));
+	box-sizing: border-box;
+	position: relative;
+	left: 0;
+	top: 0;
+}
+
+.page-heard {
+	background-color: #f2f6f2;
+}
+
+.reserveASeat {
+	width: 100%;
+	height: calc(90rpx + var(--status-bar-height))
+}
+
+.title-box {
+	padding-top: 90rpx;
+	padding-bottom: 72rpx;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	flex-direction: column;
+
+	.title {
+		font-weight: 600;
+		font-size: 20px;
+		color: #1F1F1F;
+	}
+
+	.subtitle {
+		padding: 0;
+		padding-top: 20rpx;
+	}
+}
+
+.subtitle {
+	font-size: 24rpx;
+	color: #999999;
+	text-align: center;
+	padding-top: 44rpx;
+	span{
+		color: #0084FF;
+	}
+}
+
+.code-box {
+	padding: 0 80rpx;
+
+	.yiCode {
+		width: 100%;
+	}
+}
+
+.yiCode {
+	&::v-deep.yi-code {
+		.yi-code-show {
+			.yi-code-show-item {
+				width: 124rpx;
+				height: 124rpx;
+				border: 4rpx #000 solid;
+				border-radius: 20rpx;
+				font-size: 56rpx;
+				color: #1F1F1F;
+
+				&.yi-code-show-active {
+					border: solid 2px #ff5500;
+					animation: myfirst 600ms infinite;
+
+					@keyframes myfirst {
+						0% {
+							opacity: 0.1
+						}
+
+						100% {
+							opacity: 1
+						}
+					}
+				}
+			}
+		}
+
+
+		.yi-code-hide {
+			height: 124rpx;
+		}
+	}
+}
+
+.btn-box {
+	position: absolute;
+	bottom: 20rpx;
+	left: 50%;
+	transform: translateX(-50%);
+
+	.btn {
+		background: #1F1F1F;
+		color: #fff;
+		margin: 0 auto;
+		width: 626rpx;
+		height: 88rpx;
+		font-size: 32rpx;
+		font-family: 'PingFang SC-Bold';
+		background: #1F1F1F;
+		border-radius: 58rpx;
+		display: flex;
+		align-items: center;
+		justify-content: center;
+	}
+}
+</style>
+<style>
+.navbar-title
+{
+	font-weight: 500;
+	font-size: 32px;
+	font-family: 'PingFang SC-Medium' !important;
+}
+</style>

+ 7 - 0
uni_modules/uv-link/changelog.md

@@ -0,0 +1,7 @@
+## 1.0.2(2023-08-13)
+1. 修复报错的BUG
+## 1.0.1(2023-05-16)
+1. 优化组件依赖,修改后无需全局引入,组件导入即可使用
+2. 优化部分功能
+## 1.0.0(2023-05-10)
+uv-link 超链接组件

+ 40 - 0
uni_modules/uv-link/components/uv-link/props.js

@@ -0,0 +1,40 @@
+export default {
+	props: {
+		// 文字颜色
+		color: {
+			type: String,
+			default: ''
+		},
+		// 字体大小,单位px
+		fontSize: {
+			type: [String, Number],
+			default: 14
+		},
+		// 是否显示下划线
+		underLine: {
+			type: Boolean,
+			default: false
+		},
+		// 要跳转的链接
+		href: {
+			type: String,
+			default: ''
+		},
+		// 小程序中复制到粘贴板的提示语
+		mpTips: {
+			type: String,
+			default: '链接已复制,请在浏览器打开'
+		},
+		// 下划线颜色
+		lineColor: {
+			type: String,
+			default: ''
+		},
+		// 超链接的问题,不使用slot形式传入,是因为nvue下无法修改颜色
+		text: {
+			type: String,
+			default: ''
+		},
+		...uni.$uv?.props?.link
+	}
+}

+ 83 - 0
uni_modules/uv-link/components/uv-link/uv-link.vue

@@ -0,0 +1,83 @@
+<template>
+	<text
+	    class="uv-link"
+	    @tap.stop="openLink"
+	    :style="[linkStyle, $uv.addStyle(customStyle)]"
+	>{{text}}</text>
+</template>
+
+<script>
+	import mpMixin from '@/uni_modules/uv-ui-tools/libs/mixin/mpMixin.js'
+	import mixin from '@/uni_modules/uv-ui-tools/libs/mixin/mixin.js'
+	import props from './props.js';
+	/**
+	 * link 超链接
+	 * @description 该组件为超链接组件,在不同平台有不同表现形式:在APP平台会通过plus环境打开内置浏览器,在小程序中把链接复制到粘贴板,同时提示信息,在H5中通过window.open打开链接。
+	 * @tutorial https://www.uvui.cn/components/link.html
+	 * @property {String}			color		文字颜色 (默认 color['uv-primary'] )
+	 * @property {String | Number}	fontSize	字体大小,单位px (默认 15 )
+	 * @property {Boolean}			underLine	是否显示下划线 (默认 false )
+	 * @property {String}			href		跳转的链接,要带上http(s)
+	 * @property {String}			mpTips		各个小程序平台把链接复制到粘贴板后的提示语(默认“链接已复制,请在浏览器打开”)
+	 * @property {String}			lineColor	下划线颜色,默认同color参数颜色 
+	 * @property {String}			text		超链接的问题,不使用slot形式传入,是因为nvue下无法修改颜色 
+	 * @property {Object}			customStyle	定义需要用到的外部样式
+	 * 
+	 * @example <uv-link href="http://www.uvui.cn">蜀道难,难于上青天</uv-link>
+	 */
+	export default {
+		name: "uv-link",
+		emits:['click'],
+		mixins: [mpMixin, mixin, props],
+		computed: {
+			linkStyle() {
+				const style = {
+					color: this.color,
+					fontSize: this.$uv.addUnit(this.fontSize),
+					// line-height设置为比字体大小多2px
+					lineHeight: this.$uv.addUnit(this.$uv.getPx(this.fontSize) + 2),
+					textDecoration: this.underLine ? 'underline' : 'none'
+				}
+				return style
+			}
+		},
+		methods: {
+			openLink() {
+				// #ifdef APP-PLUS
+				plus.runtime.openURL(this.href)
+				// #endif
+				// #ifdef H5
+				window.open(this.href)
+				// #endif
+				// #ifdef MP
+				uni.setClipboardData({
+					data: this.href,
+					success: () => {
+						uni.hideToast();
+						this.$nextTick(() => {
+							this.$uv.toast(this.mpTips);
+						})
+					}
+				});
+				// #endif
+				this.$emit('click')
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	@import '@/uni_modules/uv-ui-tools/libs/css/components.scss';
+	@import '@/uni_modules/uv-ui-tools/libs/css/color.scss';
+	$uv-link-line-height:1 !default;
+
+	.uv-link {
+		/* #ifndef APP-NVUE */
+		line-height: $uv-link-line-height;
+		/* #endif */
+		@include flex;
+		flex-wrap: wrap;
+		flex: 1;
+		color: $uv-primary;
+	}
+</style>

+ 87 - 0
uni_modules/uv-link/package.json

@@ -0,0 +1,87 @@
+{
+  "id": "uv-link",
+  "displayName": "uv-link 超链接  全面兼容小程序、nvue、vue2、vue3等多端",
+  "version": "1.0.2",
+  "description": "uv-link 该组件为超链接组件",
+  "keywords": [
+    "uv-link",
+    "uvui",
+    "uv-ui",
+    "link",
+    "超链接"
+],
+  "repository": "",
+  "engines": {
+    "HBuilderX": "^3.1.0"
+  },
+  "dcloudext": {
+    "type": "component-vue",
+    "sale": {
+      "regular": {
+        "price": "0.00"
+      },
+      "sourcecode": {
+        "price": "0.00"
+      }
+    },
+    "contact": {
+      "qq": ""
+    },
+    "declaration": {
+    	"ads": "无",
+    	"data": "插件不采集任何数据",
+    	"permissions": "无"
+    },
+    "npmurl": ""
+  },
+  "uni_modules": {
+    "dependencies": [
+			"uv-ui-tools"
+		],
+    "encrypt": [],
+    "platforms": {
+			"cloud": {
+				"tcb": "y",
+				"aliyun": "y"
+			},
+			"client": {
+				"Vue": {
+					"vue2": "y",
+					"vue3": "y"
+				},
+				"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",
+					"飞书": "u",
+					"京东": "u"
+				},
+				"快应用": {
+					"华为": "u",
+					"联盟": "u"
+				}
+			}
+		}
+  }
+}

+ 11 - 0
uni_modules/uv-link/readme.md

@@ -0,0 +1,11 @@
+## Link 超链接
+
+> **组件名:uv-link**
+
+该组件为超链接组件,在不同平台有不同表现形式。
+
+### <a href="https://www.uvui.cn/components/link.html" target="_blank">查看文档</a>
+
+### [完整示例项目下载 | 关注更多组件](https://ext.dcloud.net.cn/plugin?name=uv-ui)
+
+#### 如使用过程中有任何问题,或者您对uv-ui有一些好的建议,欢迎加入 uv-ui 交流群:<a href="https://ext.dcloud.net.cn/plugin?id=12287" target="_blank">uv-ui</a>、<a href="https://www.uvui.cn/components/addQQGroup.html" target="_blank">官方QQ群</a>

+ 11 - 0
uni_modules/uv-text/changelog.md

@@ -0,0 +1,11 @@
+## 1.0.4(2023-08-29)
+1. nvue修复设置align不生效的BUG
+## 1.0.3(2023-08-24)
+1. 修复在nvue不能换行的问题
+## 1.0.2(2023-05-24)
+1. 去掉多余的data-index属性,避免警告
+## 1.0.1(2023-05-16)
+1. 优化组件依赖,修改后无需全局引入,组件导入即可使用
+2. 优化部分功能
+## 1.0.0(2023-05-10)
+uv-text 文本组件

+ 113 - 0
uni_modules/uv-text/components/uv-text/props.js

@@ -0,0 +1,113 @@
+export default {
+	props: {
+		// 主题颜色
+		type: {
+			type: String,
+			default: ''
+		},
+		// 是否显示
+		show: {
+			type: Boolean,
+			default: true
+		},
+		// 显示的值
+		text: {
+			type: [String, Number],
+			default: ''
+		},
+		// 前置图标
+		prefixIcon: {
+			type: String,
+			default: ''
+		},
+		// 后置图标
+		suffixIcon: {
+			type: String,
+			default: ''
+		},
+		// 文本处理的匹配模式
+		// text-普通文本,price-价格,phone-手机号,name-姓名,date-日期,link-超链接
+		mode: {
+			type: String,
+			default: ''
+		},
+		// mode=link下,配置的链接
+		href: {
+			type: String,
+			default: ''
+		},
+		// 格式化规则
+		format: {
+			type: [String, Function],
+			default: ''
+		},
+		// mode=phone时,点击文本是否拨打电话
+		call: {
+			type: Boolean,
+			default: true
+		},
+		// 小程序的打开方式
+		openType: {
+			type: String,
+			default: ''
+		},
+		// 是否粗体,默认normal
+		bold: {
+			type: Boolean,
+			default: false
+		},
+		// 是否块状
+		block: {
+			type: Boolean,
+			default: false
+		},
+		// 文本显示的行数,如果设置,超出此行数,将会显示省略号
+		lines: {
+			type: [String, Number],
+			default: ''
+		},
+		// 文本颜色
+		color: {
+			type: String,
+			default: '#303133'
+		},
+		// 字体大小
+		size: {
+			type: [String, Number],
+			default: 15
+		},
+		// 图标的样式
+		iconStyle: {
+			type: [Object, String],
+			default: () => ({
+				fontSize: '15px'
+			})
+		},
+		// 文字装饰,下划线,中划线等,可选值 none|underline|line-through
+		decoration: {
+			type: String,
+			default: 'none'
+		},
+		// 外边距,对象、字符串,数值形式均可
+		margin: {
+			type: [Object, String, Number],
+			default: 0
+		},
+		// 文本行高
+		lineHeight: {
+			type: [String, Number],
+			default: ''
+		},
+		// 文本对齐方式,可选值left|center|right
+		align: {
+			type: String,
+			default: 'left'
+		},
+		// 文字换行,可选值break-word|normal|anywhere
+		wordWrap: {
+			type: String,
+			default: 'normal'
+		},
+		...uni.$uv?.props?.text
+	}
+}

+ 218 - 0
uni_modules/uv-text/components/uv-text/uv-text.vue

@@ -0,0 +1,218 @@
+<template>
+    <view
+      class="uv-text"
+      :class="[]"
+      v-if="show"
+      :style="{
+        margin: margin,
+				justifyContent: align === 'left' ? 'flex-start' : align === 'center' ? 'center' : 'flex-end'
+      }"
+      @tap="clickHandler"
+    >
+      <text
+        :class="['uv-text__price', type && `uv-text__value--${type}`]"
+        v-if="mode === 'price'"
+        :style="[valueStyle]"
+        >¥</text
+      >
+      <view class="uv-text__prefix-icon" v-if="prefixIcon">
+        <uv-icon
+          :name="prefixIcon"
+          :customStyle="$uv.addStyle(iconStyle)"
+        ></uv-icon>
+      </view>
+      <uv-link
+        v-if="mode === 'link'"
+        :text="value"
+        :href="href"
+        underLine
+      ></uv-link>
+      <template v-else-if="openType && isMp">
+        <button
+          class="uv-reset-button uv-text__value"
+          :style="[valueStyle]"
+          :openType="openType"
+          @getuserinfo="onGetUserInfo"
+          @contact="onContact"
+          @getphonenumber="onGetPhoneNumber"
+          @error="onError"
+          @launchapp="onLaunchApp"
+          @opensetting="onOpenSetting"
+          :lang="lang"
+          :session-from="sessionFrom"
+          :send-message-title="sendMessageTitle"
+          :send-message-path="sendMessagePath"
+          :send-message-img="sendMessageImg"
+          :show-message-card="showMessageCard"
+          :app-parameter="appParameter"
+        >
+          {{ value }}
+        </button>
+      </template>
+      <text
+        v-else
+        class="uv-text__value"
+        :style="[valueStyle]"
+        :class="[
+          type && `uv-text__value--${type}`,
+          lines && `uv-line-${lines}`
+        ]"
+        >{{ value }}</text
+      >
+      <view class="uv-text__suffix-icon" v-if="suffixIcon">
+        <uv-icon
+          :name="suffixIcon"
+          :customStyle="$uv.addStyle(iconStyle)"
+        ></uv-icon>
+      </view>
+    </view>
+</template>
+<script>
+	import value from './value.js'
+	import mpMixin from '@/uni_modules/uv-ui-tools/libs/mixin/mpMixin.js'
+	import mixin from '@/uni_modules/uv-ui-tools/libs/mixin/mixin.js'
+	import button from '@/uni_modules/uv-ui-tools/libs/mixin/button.js'
+	import openType from '@/uni_modules/uv-ui-tools/libs/mixin/openType.js'
+	import props from './props.js'
+	/**
+	 * Text 文本
+	 * @description 此组件集成了文本类在项目中的常用功能,包括状态,拨打电话,格式化日期,*替换,超链接...等功能。 您大可不必在使用特殊文本时自己定义,text组件几乎涵盖您能使用的大部分场景。
+	 * @tutorial https://www.uvui.cn/components/loading.html
+	 * @property {String} 					type		主题颜色
+	 * @property {Boolean} 					show		是否显示(默认 true )
+	 * @property {String | Number}			text		显示的值
+	 * @property {String}					prefixIcon	前置图标
+	 * @property {String} 					suffixIcon	后置图标
+	 * @property {String} 					mode		文本处理的匹配模式 text-普通文本,price-价格,phone-手机号,name-姓名,date-日期,link-超链接
+	 * @property {String} 					href		mode=link下,配置的链接
+	 * @property {String | Function} 		format		格式化规则
+	 * @property {Boolean} 					call		mode=phone时,点击文本是否拨打电话(默认 false )
+	 * @property {String} 					openType	小程序的打开方式
+	 * @property {Boolean} 					bold		是否粗体,默认normal(默认 false )
+	 * @property {Boolean} 					block		是否块状(默认 false )
+	 * @property {String | Number} 			lines		文本显示的行数,如果设置,超出此行数,将会显示省略号
+	 * @property {String} 					color		文本颜色(默认 '#303133' )
+	 * @property {String | Number} 			size		字体大小(默认 15 )
+	 * @property {Object | String} 			iconStyle	图标的样式 (默认 {fontSize: '15px'} )
+	 * @property {String} 					decoration	文字装饰,下划线,中划线等,可选值 none|underline|line-through(默认 'none' )
+	 * @property {Object | String | Number}	margin		外边距,对象、字符串,数值形式均可(默认 0 )
+	 * @property {String | Number} 			lineHeight	文本行高
+	 * @property {String} 					align		文本对齐方式,可选值left|center|right(默认 'left' )
+	 * @property {String} 					wordWrap	文字换行,可选值break-word|normal|anywhere(默认 'normal' )
+	 * @event {Function} click  点击触发事件
+	 * @example <uv-text text="我用十年青春,赴你最后之约"></uv-text>
+	 */
+	export default {
+		name: 'uv-text',
+		emits: ['click'],
+		// #ifdef MP
+		mixins: [mpMixin, mixin, value, button, openType, props],
+		// #endif
+		// #ifndef MP
+		mixins: [mpMixin, mixin, value, props],
+		// #endif
+		computed: {
+			valueStyle() {
+				const style = {
+					textDecoration: this.decoration,
+					fontWeight: this.bold ? 'bold' : 'normal',
+					wordWrap: this.wordWrap,
+					fontSize: this.$uv.addUnit(this.size)
+				};
+				!this.type && (style.color = this.color);
+				this.isNvue && this.lines && (style.lines = this.lines);
+				if(this.isNvue && this.mode != 'price' && !this.prefixIcon && !this.suffixIcon) {
+					 style.flex = 1;
+					 style.textAlign = this.align === 'left' ? 'flex-start' : this.align === 'center' ? 'center' : 'right';
+				}
+				this.lineHeight && (style.lineHeight = this.$uv.addUnit(this.lineHeight));
+				!this.isNvue && this.block && (style.display = 'block');
+				return this.$uv.deepMerge(style, this.$uv.addStyle(this.customStyle));
+			},
+			isNvue() {
+				let nvue = false
+				// #ifdef APP-NVUE
+				nvue = true
+				// #endif
+				return nvue
+			},
+			isMp() {
+				let mp = false
+				// #ifdef MP
+				mp = true
+				// #endif
+				return mp
+			}
+		},
+		data() {
+			return {}
+		},
+		methods: {
+			clickHandler() {
+				// 如果为手机号模式,拨打电话
+				if (this.call && this.mode === 'phone') {
+					uni.makePhoneCall({
+						phoneNumber: this.text
+					})
+				}
+				this.$emit('click')
+			}
+		}
+	}
+</script>
+<style lang="scss" scoped>
+	$show-lines: 1;
+	$show-reset-button: 1;
+	@import '@/uni_modules/uv-ui-tools/libs/css/variable.scss';
+	@import '@/uni_modules/uv-ui-tools/libs/css/components.scss';
+	@import '@/uni_modules/uv-ui-tools/libs/css/color.scss';
+	.uv-text {
+		@include flex(row);
+		align-items: center;
+		flex-wrap: nowrap;
+		flex: 1;
+		/* #ifndef APP-NVUE */
+		width: 100%;
+		/* #endif */
+		&__price {
+			font-size: 14px;
+			color: $uv-content-color;
+		}
+		&__value {
+			font-size: 14px;
+			@include flex;
+			color: $uv-content-color;
+			flex-wrap: wrap;
+			// flex: 1;
+			text-overflow: ellipsis;
+			align-items: center;
+			&--primary {
+				color: $uv-primary;
+			}
+			&--warning {
+				color: $uv-warning;
+			}
+			&--success {
+				color: $uv-success;
+			}
+			&--info {
+				color: $uv-info;
+			}
+			&--error {
+				color: $uv-error;
+			}
+			&--main {
+				color: $uv-main-color;
+			}
+			&--content {
+				color: $uv-content-color;
+			}
+			&--tips {
+				color: $uv-tips-color;
+			}
+			&--light {
+				color: $uv-light-color;
+			}
+		}
+	}
+</style>

+ 87 - 0
uni_modules/uv-text/components/uv-text/value.js

@@ -0,0 +1,87 @@
+import { func, date, url } from '@/uni_modules/uv-ui-tools/libs/function/test.js'
+import { error, timeFormat, priceFormat } from '@/uni_modules/uv-ui-tools/libs/function/index.js'
+export default {
+    computed: {
+        // 经处理后需要显示的值
+        value() {
+            const {
+                text,
+                mode,
+                format,
+                href
+            } = this
+            // 价格类型
+            if (mode === 'price') {
+                // 如果text不为金额进行提示
+                if (!/^\d+(\.\d+)?$/.test(text)) {
+                    error('金额模式下,text参数需要为金额格式');
+                }
+                // 进行格式化,判断用户传入的format参数为正则,或者函数,如果没有传入format,则使用默认的金额格式化处理
+                if (func(format)) {
+                    // 如果用户传入的是函数,使用函数格式化
+                    return format(text)
+                }
+                // 如果format非正则,非函数,则使用默认的金额格式化方法进行操作
+                return priceFormat(text, 2)
+            } if (mode === 'date') {
+                // 判断是否合法的日期或者时间戳
+                !date(text) && error('日期模式下,text参数需要为日期或时间戳格式')
+                // 进行格式化,判断用户传入的format参数为正则,或者函数,如果没有传入format,则使用默认的格式化处理
+                if (func(format)) {
+                    // 如果用户传入的是函数,使用函数格式化
+                    return format(text)
+                } if (format) {
+                    // 如果format非正则,非函数,则使用默认的时间格式化方法进行操作
+                    return timeFormat(text, format)
+                }
+                // 如果没有设置format,则设置为默认的时间格式化形式
+                return timeFormat(text, 'yyyy-mm-dd')
+            } if (mode === 'phone') {
+                // 判断是否合法的手机号
+                // !mobile(text) && error('手机号模式下,text参数需要为手机号码格式')
+                if (func(format)) {
+                    // 如果用户传入的是函数,使用函数格式化
+                    return format(text)
+                } if (format === 'encrypt') {
+                    // 如果format为encrypt,则将手机号进行星号加密处理
+                    return `${text.substr(0, 3)}****${text.substr(7)}`
+                }
+                return text
+            } if (mode === 'name') {
+                // 判断是否合法的字符粗
+                !(typeof (text) === 'string') && error('姓名模式下,text参数需要为字符串格式')
+                if (func(format)) {
+                    // 如果用户传入的是函数,使用函数格式化
+                    return format(text)
+                } if (format === 'encrypt') {
+                    // 如果format为encrypt,则将姓名进行星号加密处理
+                    return this.formatName(text)
+                }
+                return text
+            } if (mode === 'link') {
+                // 判断是否合法的字符粗
+                !url(href) && error('超链接模式下,href参数需要为URL格式')
+                return text
+            }
+            return text
+        }
+    },
+    methods: {
+        // 默认的姓名脱敏规则
+        formatName(name) {
+            let value = ''
+            if (name.length === 2) {
+                value = name.substr(0, 1) + '*'
+            } else if (name.length > 2) {
+                let char = ''
+                for (let i = 0, len = name.length - 2; i < len; i++) {
+                    char += '*'
+                }
+                value = name.substr(0, 1) + char + name.substr(-1, 1)
+            } else {
+                value = name
+            }
+            return value
+        }
+    }
+}

+ 89 - 0
uni_modules/uv-text/package.json

@@ -0,0 +1,89 @@
+{
+  "id": "uv-text",
+  "displayName": "uv-text 文本 全面兼容vue3+2、app、h5、小程序等多端",
+  "version": "1.0.4",
+  "description": "此组件集成了文本类在项目中的常用功能,包括状态,拨打电话,格式化日期,*替换,超链接...等功能。 您大可不必在使用特殊文本时自己定义,text组件涵盖您能使用的大部分场景。",
+  "keywords": [
+    "uv-text",
+    "uvui",
+    "uv-ui",
+    "text",
+    "文本"
+],
+  "repository": "",
+  "engines": {
+    "HBuilderX": "^3.1.0"
+  },
+  "dcloudext": {
+    "type": "component-vue",
+    "sale": {
+      "regular": {
+        "price": "0.00"
+      },
+      "sourcecode": {
+        "price": "0.00"
+      }
+    },
+    "contact": {
+      "qq": ""
+    },
+    "declaration": {
+    	"ads": "无",
+    	"data": "插件不采集任何数据",
+    	"permissions": "无"
+    },
+    "npmurl": ""
+  },
+  "uni_modules": {
+    "dependencies": [
+			"uv-ui-tools",
+			"uv-icon",
+			"uv-link"
+		],
+    "encrypt": [],
+    "platforms": {
+			"cloud": {
+				"tcb": "y",
+				"aliyun": "y"
+			},
+			"client": {
+				"Vue": {
+					"vue2": "y",
+					"vue3": "y"
+				},
+				"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",
+					"飞书": "u",
+					"京东": "u"
+				},
+				"快应用": {
+					"华为": "u",
+					"联盟": "u"
+				}
+			}
+		}
+  }
+}

+ 17 - 0
uni_modules/uv-text/readme.md

@@ -0,0 +1,17 @@
+## Text 文本
+
+> **组件名:uv-text**
+
+此组件集成了文本类在项目中的常用功能,包括状态,拨打电话,格式化日期,*替换,超链接...等功能。 您大可不必在使用特殊文本时自己定义,text组件涵盖您能使用的大部分场景。
+
+# <a href="https://www.uvui.cn/components/text.html" target="_blank">查看文档</a>
+
+### [更多插件,请关注uv-ui组件库](https://ext.dcloud.net.cn/plugin?name=uv-ui)
+
+<a href="https://ext.dcloud.net.cn/plugin?name=uv-ui" target="_blank">
+
+![image](https://mp-a667b617-c5f1-4a2d-9a54-683a67cff588.cdn.bspapp.com/uv-ui/banner.png)
+
+</a>
+
+#### 如使用过程中有任何问题反馈,或者您对uv-ui有一些好的建议,欢迎加入uv-ui官方交流群:<a href="https://www.uvui.cn/components/addQQGroup.html" target="_blank">官方QQ群</a>

+ 1 - 1
uni_modules/yi-code/components/yi-code/yi-code.vue

@@ -11,7 +11,7 @@
 			</block>
 		</view>
 		<view class="yi-code-hide" :style="'width: '+(width * 2)+'rpx;left: -'+ width +'rpx;'">
-			<input v-model="value" :style="'width: '+(width * 2)+'rpx;'" :focus="focus" @focus="onFocus" @blur="onBlur" :type="inputType" @input="onChange" :maxlength="maxlength"/>
+			<input style="height: 100%;" v-model="value" :style="'width: '+(width * 2)+'rpx;'" :focus="focus" @focus="onFocus" @blur="onBlur" :type="inputType" @input="onChange" :maxlength="maxlength"/>
 		</view>
 	</view>
 </template>