Ver código fonte

账户与安全模块 基本资料修改

XSXS 8 meses atrás
pai
commit
820e357362

+ 32 - 0
components/CustomPopup/CustomPopup.vue

@@ -0,0 +1,32 @@
+<template>
+  <uv-popup ref="popup" mode="center" bgColor="none" class="popupCenter" style="width: 300rpx; ">
+    <view>
+      <slot></slot>
+    </view>
+  </uv-popup>
+</template>
+
+<script>
+export default {
+  name: 'CustomPopup',
+  methods: {
+    open() {
+      this.$refs.popup.open();
+    },
+    close() {
+      this.$refs.popup.close();
+    }
+  }
+}
+</script>
+
+<style scoped>
+/* 可以在这里添加样式 */
+.popupCenter
+{
+  background-color: #fff; 
+  width: 600rpx;
+
+ 
+}
+</style>

+ 58 - 0
components/CustomerServicePopup/CustomerServicePopup.vue

@@ -0,0 +1,58 @@
+<template>
+  <CustomPopup ref="customPopup">
+    <view class="customerService">
+      <image src="../../static/dome/er-code.png"></image>
+      <view class="text">截图至相册,微信扫一扫</view>
+      <view class="btn-box" @click="closeCustomPopup">知道了</view>
+    </view>
+  </CustomPopup>
+</template>
+
+<script>
+import CustomPopup from '@/components/CustomPopup/CustomPopup.vue'
+
+export default {
+  components: { CustomPopup },
+  methods: {
+    closeCustomPopup() {
+      this.$refs.customPopup.close()
+    }
+  }
+}
+</script>
+
+<style scoped lang="scss">
+.customerService {
+  width: 600rpx;
+  height: 660rpx;
+  background: #ffffff;
+  border-radius: 14rpx;
+  padding: 30rpx 70rpx;
+
+  image {
+    width: 460rpx;
+    height: 460rpx;
+  }
+
+  .text {
+    padding-top: 8rpx;
+    padding-bottom: 26rpx;
+    text-align: center;
+  }
+
+  .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;
+  }
+}
+</style>

+ 26 - 16
components/DialogBox/DialogBox.scss

@@ -1,5 +1,5 @@
 .page-total{
-	position: absolute;
+	position: fixed;
 	left: 0;
 	top: 0;
 	display: flex;
@@ -19,68 +19,77 @@
 /* 文件重命名 */
 .dialog-box{
 	width: 80%;
-	height: 340rpx;
-	background-color: #28292D;
+	height: 370rpx;
+	background-color: #fff;
 	border-radius: 24rpx;
 	overflow: hidden;
 	.title{
 		display: flex;
 		justify-content: center;
 		align-items: center;
+		font-family: 'PingFang SC-Bold'; 
 		width: 100%;
-		height: 100rpx;
+		height: 130rpx;
 		font-size: 32rpx;
-		color: #fff;
-		font-weight: bold;
+		color: #1F1F1F; 
 	}
 	.content{
 		display: flex;
 		align-items: center;
 		justify-content: space-between;
+		font-family: 'PingFang SC-Medium';
 		width: 90%;
 		height: 100rpx;
 		margin: 0 auto;
+		font-weight: 400;
 		border-radius: 10rpx;
 		input{
 			width: 80%;
 			height: 100%;
 			font-size: 28rpx;
-			color: #ffffff;
+			color: #1F1F1F;
 			padding: 0 4%;
 		}
 		text{
 			font-size: 34rpx;
-			color: #ffffff;
+			color: #1F1F1F;
 			margin-right: 4%;
 		}
 	}
 	.inquiry{
-		padding: 0 4%;
+		padding: 0 100rpx;
 		height: 120rpx;
 		text-align: center;
 		text{
 			font-size: 28rpx;
-			color: #ffffff;
+			color: #1F1F1F;
 			line-height: 40rpx;
 		}
 	}
 	.operation-btn{
 		display: flex;
 		align-items: center;
+		justify-content: space-evenly;
 		width: 100%;
 		height: 100rpx;
 		margin-top: 20rpx;
-		border-top: 2rpx solid #393939;
 		.btn{
 			position: relative;
 			display: flex;
 			justify-content: center;
 			align-items: center;
-			width: 50%;
-			height: 100%;
+			width: 244rpx;
+			height: 72rpx;
+			border-radius: 12rpx;
+			border: solid 2rpx #1F1F1F;
+			font-family: 'PingFang SC-Bold'; 
+			// font-weight: 400;
+			&:last-child{
+				background-color: #1F1F1F;
+			}
 			text{
-				font-size: 28rpx;
-				color: #999999;
+				font-size: 32rpx;
+				color: #1F1F1F;
 			}
 			.tag{
 				position: absolute;
@@ -89,9 +98,10 @@
 				width: 2rpx;
 				height: 40%;
 				background-color: #393939;
+				display: none;
 			}
 			.activity{
-				color: #FF2A95;
+				color: #fff;
 			}
 		}
 	}

+ 1 - 0
components/DialogBox/DialogBox.vue

@@ -160,4 +160,5 @@
 
 <style scoped lang="scss">
 	@import 'DialogBox.scss'
+	
 </style>

+ 108 - 0
components/NicknamePopup/NicknamePopup.vue

@@ -0,0 +1,108 @@
+<template>
+	<uv-popup ref="popup" mode="bottom" bgColor="none">
+		<view class="heard">
+			<slot name="heard"></slot>
+			<text class="title">{{ title }}</text>
+		</view>
+		<view v-if="subtitle" class="subtitle">{{ subtitle }}</view>
+		<view class="content">
+			<slot name="content"></slot>
+		 
+		</view>
+		<image class="close" src="@/static/icon/wd_icon_guanbi.png" @click="close()"></image>
+		 
+		<view class="bottomCompatibility"></view>
+	</uv-popup>
+</template>
+
+<script>
+import uvPopup from '@/uni_modules/uv-popup/components/uv-popup/uv-popup.vue'
+
+export default {
+	name: 'NicknamePopup',
+	components: {
+		uvPopup
+	},
+	props: {
+		title: {
+			type: String,
+			default: ''
+		},
+		subtitle: {
+			type: String,
+			default: ''
+		}
+	},
+	methods: {
+		open() {
+			this.$refs.popup.open();
+		},
+		close() {
+			this.$refs.popup.close();
+		}
+	}
+}
+</script>
+
+<style scoped lang="scss">
+/* 添加样式 */
+.bottomCompatibility {
+	height: --window-bottom;
+}
+
+.subtitle {
+	font-family: 'PingFang SC-Medium';
+	color: #999;
+	font-size: 24rpx;
+	font-weight: 400;
+	text-align: center;
+	padding-top: 18rpx;
+}
+
+::v-deep.uv-popup .uv-popup__content {
+	border-radius: 28rpx 28rpx 0 0;
+	min-height: 400rpx;
+	background: url("../../static/me/wd_bg_jianjie.png") center top/100% auto no-repeat, #fff !important;
+	padding-bottom: 40rpx;
+
+}
+
+.heard {
+	padding-top: 28rpx;
+	height: 72rpx;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+
+	.title {
+		font-size: 36rpx;
+		font-weight: 700;
+		font-family: 'Alimama ShuHeiTi-Bold';
+		color: #1F1F1F;
+	}
+}
+
+.close {
+	position: absolute;
+	right: 44rpx;
+	top: 36rpx;
+	width: 40rpx;
+	height: 40rpx;
+	border-radius: 50%;
+}
+
+::v-deep.content .btn-box {
+	background: #1F1F1F;
+	border-radius: 76rpx;
+	color: #fff;
+	margin: 0 auto;
+	width: 626rpx;
+	height:88rpx;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+}
+.content{
+	margin-top: 32rpx;
+}
+</style>

+ 15 - 25
components/custome-confirm/customeConfirm.scss

@@ -19,77 +19,68 @@
 /* 文件重命名 */
 .dialog-box{
 	width: 80%;
-	height: 370rpx;
-	background-color: #fff;
+	height: 340rpx;
+	background-color: #28292D;
 	border-radius: 24rpx;
 	overflow: hidden;
 	.title{
 		display: flex;
 		justify-content: center;
 		align-items: center;
-		font-family: 'PingFang SC-Bold'; 
 		width: 100%;
-		height: 130rpx;
+		height: 100rpx;
 		font-size: 32rpx;
-		color: #1F1F1F; 
+		color: #fff;
+		font-weight: bold;
 	}
 	.content{
 		display: flex;
 		align-items: center;
 		justify-content: space-between;
-		font-family: 'PingFang SC-Medium';
 		width: 90%;
 		height: 100rpx;
 		margin: 0 auto;
-		font-weight: 400;
 		border-radius: 10rpx;
 		input{
 			width: 80%;
 			height: 100%;
 			font-size: 28rpx;
-			color: #1F1F1F;
+			color: #ffffff;
 			padding: 0 4%;
 		}
 		text{
 			font-size: 34rpx;
-			color: #1F1F1F;
+			color: #ffffff;
 			margin-right: 4%;
 		}
 	}
 	.inquiry{
-		padding: 0 100rpx;
+		padding: 0 4%;
 		height: 120rpx;
 		text-align: center;
 		text{
 			font-size: 28rpx;
-			color: #1F1F1F;
+			color: #ffffff;
 			line-height: 40rpx;
 		}
 	}
 	.operation-btn{
 		display: flex;
 		align-items: center;
-		justify-content: space-evenly;
 		width: 100%;
 		height: 100rpx;
 		margin-top: 20rpx;
+		border-top: 2rpx solid #393939;
 		.btn{
 			position: relative;
 			display: flex;
 			justify-content: center;
 			align-items: center;
-			width: 244rpx;
-			height: 72rpx;
-			border-radius: 12rpx;
-			border: solid 2rpx #1F1F1F;
-			font-family: 'PingFang SC-Bold'; 
-			// font-weight: 400;
-			&:last-child{
-				background-color: #1F1F1F;
-			}
+			width: 50%;
+			height: 100%;
 			text{
-				font-size: 32rpx;
-				color: #1F1F1F;
+				font-size: 28rpx;
+				color: #999999;
 			}
 			.tag{
 				position: absolute;
@@ -98,10 +89,9 @@
 				width: 2rpx;
 				height: 40%;
 				background-color: #393939;
-				display: none;
 			}
 			.activity{
-				color: #fff;
+				color: #FF2A95;
 			}
 		}
 	}

+ 0 - 1
components/custome-confirm/customeConfirm.vue

@@ -160,5 +160,4 @@
 
 <style scoped lang="scss">
 	@import 'customeConfirm.scss'
-	
 </style>

+ 20 - 1
pages.json

@@ -62,6 +62,13 @@
 				"navigationStyle": "custom",
 				"navigationBarBackgroundColor": "#ffffff"
 			}
+		}, {
+			"path": "pages/AboutUs/UserLogoutAgreement",
+			"style": {
+				"navigationBarTitleText": "注销协议",
+				"navigationStyle": "custom",
+				"navigationBarBackgroundColor": "#ffffff"
+			}
 		}, {
 			"path": "pages/AboutUs/yong",
 			"style": {
@@ -170,7 +177,7 @@
 		}, {
 			"path": "pages/my/editMobile",
 			"style": {
-				"navigationBarTitleText": "修改手机号",
+				"navigationBarTitleText": "更换绑定手机号",
 				"navigationBarBackgroundColor": "#ffffff"
 			}
 		}, {
@@ -209,6 +216,18 @@
 				"navigationBarTitleText": "任务中心",
 				"navigationBarBackgroundColor": "#ffffff"
 			}
+		}, {
+			"path": "pages/my/DelMemConfirm",
+			"style": {
+				"navigationBarTitleText": "注销账号",
+				"navigationBarBackgroundColor": "#ffffff"
+			}
+		}, {
+			"path": "pages/my/DelMemVerify",
+			"style": {
+				"navigationBarTitleText": "",
+				"navigationBarBackgroundColor": "#ffffff"
+			}
 		}, {
 			"path": "pages/AboutUs/xieyi",
 			"style": {

+ 49 - 0
pages/AboutUs/UserLogoutAgreement.vue

@@ -0,0 +1,49 @@
+<template>
+	<view class="page">
+
+		<!-- <view class="code">
+			<image src="../../static/code.png" mode=""></image>
+			<text>扫描二维码,您的朋友也可以使用或下载哦~</text>
+		</view> -->
+
+		<view class="xy-list">
+
+			<view class="list">
+				<view class="content">
+					<text>
+						注销删除须知
+						</text>
+				</view>
+			</view>
+
+			<view class="list">
+				<view class="content">
+					<text>
+						在你申请注销删除本产品账号之前,请谨慎操作。请你认真阅读、理解并同意《账号注销删除须知》(以下称"注销须知")。
+						【特别提示】在此善意提醒你,注销删除本产品账号为不可恢复的操作,注销删除账号后你将无法再使用本账号或找回因注销导致删除的任何内容或信息(即使你使用相同的手机号码再次注册并使用本产品)。
+						建议你在注销删除前自行备份本产品账号相关的所有信息,并请确认与本产品账号相关的所有服务均已进行妥善处理。注销删除成功后,我们将删除你的个人信息,或对其进行匿名化处理。请你知悉并理解,根据相关法律法规规定相关日志记录将保留不少于6个月的时间。
+						为了提供一致化的服务,你的部分账号信息会在我们统一提供的不同关联方产品之间同步。如你希望仅删除本产品的账号信息,可以选择"删除当前应用使用痕迹",如你希望清空所有关联方产品的账号信息,可以选择"注销账号"。
+						一、删除当前应用使用痕迹 1.我们对你删除当前应用使用痕迹的决定深表遗憾。如果你仍执意删除,你的账号需同时满足以下条件:
+						1.1账号处于安全状态:账号处于正常使用状态,经平台安全检查无被盗用风险。1.2账号权限解除:账号已解除与其他产品的
+					</text>
+				</view>
+
+			</view>
+
+		</view>
+
+	</view>
+</template>
+<script>
+	export default {
+		data() {
+			return {
+
+			};
+		}
+	}
+</script>
+
+<style scoped lang="scss">
+	@import 'AboutUs.scss';
+</style>

+ 162 - 0
pages/my/DelMemConfirm.vue

@@ -0,0 +1,162 @@
+<template>
+  <view class="page">
+    <view class="list_info">
+      <view class="title">为保证你的账号安全,在你提交的注销申请生效前,需同时满足以下条件</view>
+
+      <view class="content">
+        <view class="paragraph">
+          <view class="subheading">1. 账号处于安全状态</view>
+          <view class="subtitle">账号处于正常使用状态,无被盗风险</view>
+        </view>
+        <view class="paragraph">
+          <view class="subheading">2.账号权限解除</view>
+          <view class="subtitle">账号已解除与其他产品的授权登录或绑定关系</view>
+        </view>
+        <view class="paragraph">
+          <view class="subheading">3.账号无任何纠纷,包括投诉举报</view>
+          <view class="subtitle">本账号及通过本账号接入的第三方产品中没有未完成和/或存在争议的服务
+            <view style="margin-top: 10rpx;">本账号无任何纠纷,包括投诉举报、侵权等</view>
+          </view>
+        </view>
+        <view class="paragraph red">
+          注意:删除账号后,你将无法找回账号信息,你的所有数据和消息也会一并删除
+        </view>
+      </view>
+      <view class="agree">
+        <checkbox-group @change="agreeChange">
+          <label>
+            <checkbox value="agree" :checked="agree" :class="{ 'checked': agree, 'custom-checkbox': true }"
+              style="display: none;" />
+            <view class="custom-checkbox-box" :class="{ 'checked': agree }"></view>
+          </label>
+        </checkbox-group>
+        <text @click="goPage()"><text style="color: #7c7c7c;padding-right: 5rpx;">我已阅读并同意</text> 注销协议</text>
+      </view>
+      <view class="btn_submit" @click="nextStep" :class="{ disabled: !agree }">下一步</view>
+    </view>
+  </view>
+</template>
+
+<script>
+export default {
+  data() {
+    return {
+      agree: false,
+    };
+  },
+  methods: {
+    goPage() {
+      console.log(66666);
+      uni.navigateTo({
+        url: '/pages/AboutUs/UserLogoutAgreement'
+      })
+
+    },
+    agreeChange(e) {
+      this.agree = e.detail.value.includes('agree');
+    },
+    nextStep() {
+      if (this.agree) {
+        uni.navigateTo({
+          url: '/pages/my/DelMemVerify',
+        });
+      }
+    },
+  },
+};
+</script>
+
+<style scoped lang="scss">
+.page {
+  padding: 40rpx;
+  box-sizing: border-box;
+}
+
+.list_info {
+  display: flex;
+  flex-direction: column;
+  justify-content: flex-start;
+  align-items: center;
+  color: #1F1F1F;
+
+  .title {
+    margin-top: 60rpx;
+    font-family: 'PingFang SC-Bold';
+    font-weight: 400;
+    font-size: 40rpx;
+    margin-bottom: 34rpx;
+  }
+
+  .paragraph {
+    margin-bottom: 36rpx;
+
+    .subheading {
+      font-size: 28rpx;
+      font-family: 'PingFang SC-Bold';
+      font-weight: 400;
+    }
+
+    .subtitle {
+      margin-top: 4rpx;
+      font-size: 24rpx;
+      font-family: 'PingFang SC';
+      font-weight: 400;
+      color: #7C7C7C;
+    }
+
+    &.red {
+      color: #FF0000;
+      font-size: 24rpx;
+      font-weight: 400;
+    }
+  }
+
+  .agree {
+    margin-top: 200rpx;
+    text-align: left;
+    width: 626rpx;
+    color: #333;
+    font-size: 28rpx;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    font-size: 24rpx;
+    font-family: 'PingFang SC-Medium';
+
+    .custom-checkbox-box {
+      display: inline-block;
+      width: 28rpx;
+      height: 28rpx;
+      background-image: url('../../static/icon/wd_icon_gouxuan01.png'); // 未选中状态图片路径
+      background-size: cover;
+      margin-right: 10rpx;
+      vertical-align: middle;
+
+    }
+
+    .custom-checkbox-box.checked {
+      background-image: url('../../static/icon/wd_icon_gouxuan02.png'); // 选中状态图片路径 
+    }
+  }
+
+  .btn_submit {
+    width: 660rpx;
+    height: 96rpx;
+    margin: 0 auto;
+    margin-top: 40rpx;
+    background: #1f1f1f;
+    border-radius: 50rpx;
+    font-weight: bold;
+    font-size: 32rpx;
+    color: #ffffff;
+    display: flex;
+    flex-direction: row;
+    justify-content: center;
+    align-items: center;
+
+    &.disabled {
+      background: #999;
+    }
+  }
+}
+</style>

+ 334 - 0
pages/my/DelMemVerify.vue

@@ -0,0 +1,334 @@
+<template>
+  <view class="page">
+    <view class="list_info">
+      <view class="title">删除账号</view>
+      <view class="subtitle">若要继续,你需要完成短信验证。请输入我们通过短信发送的验证码</view>
+      <view class="subtitle">验证码已发送至{{ formatPhoneNumber(phoneNumber) }}</view>
+
+      <view class="card">
+        <!-- <view class="title">block</view> -->
+        <!-- <view><button @click="onClear" style="background: #ff5500; color: #fff;">清除内容</button></view> -->
+        <view class="body">
+          <yi-code ref="code" inputType="number" :width="660" :maxlength="6" @onComplete="complete"></yi-code>
+        </view>
+      </view>
+
+
+      <view class="blankHeight"></view>
+    </view>
+    <view class="code">
+      <view class="btn" v-if="captchaTime === 0" @click="obtainVerificationCode()">重新发送</view>
+      <view class="btn disabled" v-else>{{ captchaTime }}秒后重试</view>
+    </view>
+    <view class="btn_submit" @click="DelMem()">确认删除</view>
+    <DialogBox ref="DialogBox"></DialogBox>
+  </view>
+</template>
+
+<script>
+import DialogBox from '@/components/DialogBox/DialogBox.vue';
+
+export default {
+  components: { DialogBox },
+  data() {
+    return {
+      mobile: '',
+      code: '',
+      captchaTime: 0,
+      phoneNumber: '',
+    };
+  },
+  onLoad() {
+    this.loadUserInfo();
+    this.obtainVerificationCode();
+  },
+  methods: {
+    onClear() {
+      this.$refs.code.clear()
+    },
+    complete(code) {
+      console.log(`complete:${code}`);
+    },
+
+    formatPhoneNumber(phoneNumber) {
+      if (phoneNumber && phoneNumber.length === 11) {
+        return phoneNumber.replace(/(\d{3})\d{4}(\d{4})/, '$1****$2');
+      }
+      return phoneNumber;
+    },
+    loadUserInfo() {
+      // 这里添加获取用户信息的逻辑
+      // 获取手机号等信息
+      uni.request({
+        url: this.$apiHost + "/User/getinfo",
+        data: {
+          uuid: getApp().globalData.uuid,
+          skey: getApp().globalData.skey,
+        },
+        header: {
+          "content-type": "application/json",
+          sign: getApp().globalData.headerSign,
+        },
+        success: (res) => {
+          this.phoneNumber = res.data.mobile;
+        },
+        complete: (com) => {
+        },
+        fail: (e) => {
+          console.log("----e:", e);
+        },
+      });
+    },
+    obtainVerificationCode() {
+      if (this.code) {
+        this.onClear();
+      }
+      uni.request({
+        url: this.$apiHost + "/Member/getcode",
+        data: {
+          uuid: getApp().globalData.uuid,
+
+        },
+        header: {
+          'content-type': 'application/json'
+        },
+        success: (res) => {
+
+          uni.showToast({
+            title: res.data.str,
+            icon: 'none'
+          })
+          if (res.data.success == 'yes') {
+            this.getCodeTime();
+          } else {
+            this.captchaTime = 0;
+          }
+        }
+      });
+    },
+    DelMem() {
+      var that = this;
+      //   验证原始手机号 
+      uni.request({
+        url: this.$apiHost + '/Member/checkMobile',
+        data: {
+          uuid: getApp().globalData.uuid,
+          code: this.code,
+        },
+        header: {
+          'content-type': 'application/json'
+        },
+        success: (res) => {
+          console.log("----", res.data);
+          uni.showToast({
+            title: res.data.str,
+            icon: 'none'
+          });
+          if (res.data.success == "yes") {
+            this.$refs['DialogBox'].confirm({
+              title: '警告',
+              content: '1、注销账号是不可逆操作,该账号下所有一切资料一旦注销无法恢复;\n2、注销后,你账号下所有权益将被清除。',
+              DialogType: 'inquiry',
+              btn1: '否',
+              btn2: '是',
+              animation: 0
+            }).then(() => {
+              console.log('确定删除账号');
+
+              // uni.request({
+              // 	url: that.$apiHost + '/My/delete', //检测是否已绑定
+              // 	data: {
+              // 		uuid: getApp().globalData.uuid
+              // 	},
+              // 	header: {
+              // 		'content-type': 'application/json' //自定义请求头信息
+              // 	},
+              // 	success: (res) => {
+              // 		uni.removeStorageSync("wapptoken");
+              // 		uni.redirectTo({
+              // 			url: '/pages/login/login',
+              // 		})
+
+              // 	}
+              // });
+            })
+          }
+        }
+      });
+
+
+    },
+    getCodeTime() {
+      this.captchaTime = 60;
+      let timer = setInterval(() => {
+        this.captchaTime--;
+        if (this.captchaTime < 1) {
+          clearInterval(timer);
+          this.captchaTime = 0
+        }
+      }, 1000)
+    },
+
+  },
+};
+</script>
+
+<style scoped lang="scss">
+.list_info {
+  display: flex;
+  flex-direction: column;
+  justify-content: flex-start;
+  align-items: center;
+  color: #fff;
+  width: 750rpx;
+
+  .title {
+    text-align: center;
+    margin-top: 96rpx;
+    width: 100%;
+    font-weight: 600;
+    font-family: PingFang SC, PingFang SC;
+    font-weight: 500;
+    font-size: 48rpx;
+    color: #1F1F1F;
+  }
+
+  .subtitle {
+    font-size: 24rpx;
+    font-weight: 400;
+    color: #959595;
+    text-align: center;
+    margin-top: 20rpx;
+    width: 100%;
+  }
+
+  .phone_input {
+    width: 626rpx;
+    height: 84rpx;
+    margin-top: 96rpx;
+    background: #ffffff;
+    border-radius: 24rpx;
+    display: flex;
+    align-items: center;
+    border: 4rpx solid #000000;
+    border-radius: 74rpx;
+
+    .area_code {
+      padding: 0 20rpx;
+      font-size: 28rpx;
+      color: #333;
+      border-right: 1rpx solid #e0e0e0;
+    }
+
+    .input {
+      flex: 1;
+      height: 100%;
+      padding-left: 20rpx;
+      font-size: 28rpx;
+      color: #333;
+    }
+  }
+
+  .code_input {
+    width: 626rpx;
+    height: 84rpx;
+    margin-top: 20rpx;
+    background: #ffffff;
+    border-radius: 24rpx;
+    display: flex;
+    align-items: center;
+    border: 4rpx solid #000000;
+    border-radius: 74rpx;
+    padding-right: 8rpx;
+
+    .input {
+      flex: 1;
+      height: 100%;
+      padding-left: 20rpx;
+      font-size: 28rpx;
+      color: #333;
+    }
+
+    .btn {
+      padding: 11rpx 26rpx;
+      font-size: 28rpx;
+      background: #000000;
+      border-radius: 74rpx;
+      font-family: 'PingFang SC-Bold';
+
+      &.disabled {
+        color: #999;
+        background: transparent;
+      }
+    }
+  }
+
+  .btn_submit {
+    width: 660rpx;
+    height: 96rpx;
+    margin: 0 auto;
+    margin-top: 74rpx;
+    background: #1f1f1f;
+    border-radius: 50rpx;
+    font-weight: bold;
+    font-size: 32rpx;
+    color: #ffffff;
+    display: flex;
+    flex-direction: row;
+    justify-content: center;
+    align-items: center;
+  }
+
+  .card {
+    margin: 40rpx auto;
+    color: #000000;
+
+    .title {
+      font-size: 14px;
+      text-align: center;
+      line-height: 30px;
+      border-bottom: 1px solid #f0f0f0;
+    }
+
+    .body {
+      display: flex;
+      align-items: center;
+      justify-content: center;
+      height: 150rpx;
+    }
+
+  }
+}
+
+::v-deep.yi-code {
+  .yi-code-show {
+    .yi-code-show-item {
+      width: 90rpx;
+      height: 90rpx;
+      border: 4rpx #000 solid;
+      border-radius: 20rpx;
+    }
+  }
+}
+.btn{
+  color: #0084FF;
+  text-align: center;
+  font-family: 'PingFang SC-Medium';
+  font-weight: 400;
+  &.disabled{
+    color: #7C7C7C;
+  }
+}
+ .btn_submit {
+	background: #1F1F1F;
+	border-radius: 76rpx;
+	color: #fff;
+	margin: 0 auto;
+	margin-top: 500rpx;
+	width: 626rpx;
+	height:88rpx;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+}
+</style>

+ 124 - 26
pages/my/editInfo.vue

@@ -1,6 +1,6 @@
 <template>
 	<view class="page">
-		<PageHeader title="" class="PageHeader"  > 
+		<PageHeader title="" class="PageHeader">
 			<template slot="center">
 				基本资料
 			</template>
@@ -10,27 +10,17 @@
 			<view class="bcenter">
 				<view class="avator" @click="upload">
 					<!-- <image class="img" :src="avator" mode="aspectFill" /> -->
-					<CircleAvatar
-                  class="avator"
-                  :src="avator" style="width: 200rpx; height: 200rpx;"
-                ></CircleAvatar>
+					<CircleAvatar class="avator" :src="avator" style="width: 200rpx; height: 200rpx;"></CircleAvatar>
 					<image class="photo" src="../../static/me/photo.png" mode="widthFix" />
 				</view>
 			</view>
 			<view class="section_title">基本信息</view>
 			<view class="info_card">
-				<view class="info_item">
+				<view class="info_item" @click="openNicknamePopUpWindow">
 					<text class="label">昵称</text>
 					<view class="content">
-						<input type="text" placeholder="请输入昵称" v-model="nickname" maxlength="30" />
-						<image class="arrow" src="../../static/me/arrow_right_gray.png" mode="widthFix" />
-					</view>
-				</view>
-
-				<view class="info_item">
-					<text class="label">简介</text>
-					<view class="content">
-						<input type="text" placeholder="请输入简介" v-model="content" maxlength="32" />
+						<text v-if="nickname" class="textContent">{{ nickname }}</text>
+						<text v-else class="textPrompt">请输入昵称</text>
 						<image class="arrow" src="../../static/me/arrow_right_gray.png" mode="widthFix" />
 					</view>
 				</view>
@@ -38,7 +28,7 @@
 				<view class="info_item" @click="SetSex">
 					<text class="label">性别</text>
 					<view class="content">
-						<input type="text" placeholder="选择" v-model="sexText" disabled="true" />
+						<input type="text" placeholder="选择你的性别" v-model="sexText" disabled="true" />
 						<image class="arrow" src="../../static/me/arrow_right_gray.png" mode="widthFix" />
 					</view>
 				</view>
@@ -47,7 +37,7 @@
 					<text class="label">生日</text>
 					<view class="content">
 						<picker mode="date" :value="birthday" :end="endDate" @change="onBirthdayChange">
-							<input type="text" placeholder="选择生日" v-model="birthday" disabled="true" />
+							<input type="text" placeholder="选择你的生日" v-model="birthday" disabled="true" />
 						</picker>
 						<image class="arrow" src="../../static/me/arrow_right_gray.png" mode="widthFix" />
 					</view>
@@ -56,15 +46,27 @@
 				<view class="info_item">
 					<text class="label">星座</text>
 					<view class="content">
-						<input type="text" :value="xinzuo_sel" disabled="true" />
+						<input type="text" placeholder="根据你的生日自动匹配" :value="xinzuo_sel" disabled="true"
+							style="padding-right: 43rpx;" />
 						<!-- <image class="arrow" src="../../static/me/arrow_right_gray.png" mode="widthFix" /> -->
 					</view>
 				</view>
+
+				<view class="info_item" @click="openContentPopUpWindow">
+					<text class="label">简介</text>
+					<view class="content">
+						<!-- <input type="text" placeholder="做个自我介绍吧~" v-model="content" maxlength="32" /> -->
+						<text v-if="content" class="textContent one-omit">{{ content }}</text>
+						<text v-else class="textPrompt">做个自我介绍吧</text>
+						<image class="arrow" src="../../static/me/arrow_right_gray.png" mode="widthFix" />
+					</view>
+				</view>
+
 			</view>
 			<view class="section_title">个性标签</view>
 			<view class="info_card">
 				<view class="item_tag">
-					<view class="tag" v-for="(item, index) in sel_tags" :key = "index">
+					<view class="tag" v-for="(item, index) in sel_tags" :key="index">
 						{{ item }}
 						<image class="close" src="../../static/me/close.png" mode="widthFix" @click="delTag(item)" />
 					</view>
@@ -74,7 +76,7 @@
 			<view class="blankHeight"></view>
 		</view>
 
-		<view class="btn_submit" @click="submitData">提交保存</view>
+		<view class="btn_submit" @click="submitData(true)">保存</view>
 		<DialogBox ref="DialogBox"></DialogBox>
 
 		<view class="popSel" v-if="showPop" @tap.stop="onPreview">
@@ -82,9 +84,9 @@
 				<view class="name">你的兴趣爱好是?</view>
 				<view class="desc">提示:最多选择10个兴趣爱好标签</view>
 				<view class="item_tag">
-					<view @tap.stop="chkTag(item)" class="tag" :class=" selTags(item) ? 'active' : ''"
+					<view @tap.stop="chkTag(item)" class="tag" :class="selTags(item) ? 'active' : ''"
 						v-for="(item, index) in list_tag" :key="index">
-						{{ item }} 
+						{{ item }}
 					</view>
 				</view>
 			</view>
@@ -100,6 +102,27 @@
 			<text
 				style="width:90%;color:#666666;font-size:28rpx;text-align: left;padding:10rpx 20rpx;">该权限用于获取设备拍摄或获取本地应用相册,进行头像或图片上传。</text>
 		</view>
+		<view>
+			<NicknamePopup title="编辑昵称" subtitle="" class="openNicknamePopUpWindow" ref="openNicknamePopUpWindow">
+				<template slot="content">
+					<view class="input-box">
+						<uv-input placeholder="请输入昵称" border="surround" v-model="nickname" maxlength="20"></uv-input>
+						<view class="length-indicator">{{ nickname.length }}/20</view>
+					</view>
+					<view class="btn-box" @click="submitData">保存</view>
+				</template>
+			</NicknamePopup>
+
+			<NicknamePopup title="专属于你的简介" subtitle="好的简介让你在社区更受关注" class="openContentPopUpWindow"
+				ref="openContentPopUpWindow">
+				<template slot="content">
+
+					<uv-textarea v-model="content" maxlength="50" count placeholder="请输入内容"></uv-textarea>
+
+					<view class="btn-box" @click="submitData">保存</view>
+				</template>
+			</NicknamePopup>
+		</view>
 	</view>
 </template>
 
@@ -110,8 +133,9 @@ import {
 } from '../index/permission.js'
 import PageHeader from '@/components/PageHeader/PageHeader.vue';
 import CircleAvatar from '@/components/CircleAvatar/CircleAvatar.vue';
+import NicknamePopup from '@/components/NicknamePopup/NicknamePopup.vue';
 export default {
-	components: {PageHeader,CircleAvatar},
+	components: { PageHeader, CircleAvatar, NicknamePopup },
 	data() {
 		return {
 			showRights: false,
@@ -142,12 +166,23 @@ export default {
 	},
 	onLoad() {
 		let tagStr =
-			"篮球、羽毛球、兵乓球、足球、滑板、滑旱冰、跑步、跳绳、举重、听音乐、看电影、绘画、写小说、看书、做弹弓玩、做木剑玩、做橡皮枪玩、积木、用麻将搭金字塔、拼图、拆装、扑克牌、小汽车、手表、鞋之类的、弹吉他、钢琴、萨克斯、葫芦丝、大号、小号、折纸、剪纸、品茶、涂鸦、英雄联盟、qq堂、cs、cf、地下城勇士、桌面游戏";
+			"🎮 游戏、🎁 盲盒、😊 小可爱、😊 小可爱、🐱 喵星人、💪 纹身、跑步、跳绳、举重、听音乐、看电影、绘画、写小说、看书、做弹弓玩、做木剑玩、做橡皮枪玩、积木、用麻将搭金字塔、拼图、拆装、扑克牌、小汽车、手表、鞋之类的、弹吉他、钢琴、萨克斯、葫芦丝、大号、小号、折纸、剪纸、品茶、涂鸦、英雄联盟、qq堂、cs、cf、地下城勇士、桌面游戏";
 		this.list_tag = tagStr.split("、");
 		this.getInfoData();
 	},
 	onShow() { },
 	methods: {
+		openNicknamePopUpWindow() {
+			this.$refs.openNicknamePopUpWindow.open();
+		},
+		openContentPopUpWindow() {
+			this.$refs.openContentPopUpWindow.open();
+		},
+		closePropUp() {
+			this.$refs.openNicknamePopUpWindow.close();
+			this.$refs.openContentPopUpWindow.close();
+
+		},
 		onBack() { },
 		onPreview() { },
 		chkSel() {
@@ -249,7 +284,7 @@ export default {
 				}
 			});
 		},
-		submitData() {
+		submitData(isBack) {
 			let aihao = this.sel_tags.join(',')
 			let obj2 = {
 				uuid: getApp().globalData.uuid,
@@ -278,10 +313,14 @@ export default {
 						title: res.data.str,
 						animation: 0
 					});
-					if (res.data.success == 'yes') {
+					if (res.data.success == 'yes' && isBack == true) {
 						setTimeout(function () {
+							console.log('返回');
+
 							uni.navigateBack()
 						}, 800)
+					} else {
+this.closePropUp()
 					}
 					this.getInfoData()
 				}
@@ -396,4 +435,63 @@ export default {
 	width: 100vh;
 	height: 100vh;
 }
+
+.openNicknamePopUpWindow {
+	.length-indicator {
+		font-size: 24rpx;
+		color: #999;
+		text-align: right;
+		margin-top: 10rpx;
+		margin-right: 20rpx;
+		position: absolute;
+		right: 24rpx;
+		top: 24rpx;
+
+	}
+}
+.item_tag {
+    display: flex;
+    flex-direction: row;
+    justify-content: flex-start;
+    align-items: center;
+    flex-wrap: wrap;
+    width: 690rpx;
+    padding: 20rpx;
+    .tag {
+      border-radius: 12rpx;
+      margin-right: 10rpx;
+      margin-top: 10rpx;
+      padding: 8rpx 16rpx;
+      height: 60rpx;
+      border: 2rpx solid #eee;
+      color: #333;
+      display: flex;
+      flex-direction: row;
+      justify-content: center;
+      align-items: center;
+      background: #eeeeee;
+      .close {
+        width: 28rpx;
+        margin-left: 2rpx;
+        position: relative;
+      }
+    }
+    .active {
+      border-radius: 20rpx;
+      border: 2rpx solid #ff5967;
+    }
+    .addNew {
+      margin-right: 10rpx;
+      margin-top: 10rpx;
+      padding: 0rpx 20rpx;
+      height: 60rpx;
+      border-radius: 12rpx;
+      background: #1f1f1f;
+      color: #fff;
+      display: flex;
+      flex-direction: row;
+      justify-content: center;
+      align-items: center;
+    }
+  }
 </style>

+ 578 - 103
pages/my/editMobile.vue

@@ -2,147 +2,622 @@
 	<view class="page">
 		<view class="list_info">
 			<!-- 标题和说明 -->
-			<view class="title">手机号验证</view>
-			<view class="subtitle">该账号绑定的原手机号 139****5599,完成手机验证</view>
+			<view class="title"> <template v-if="processProgress == 1">新</template> 手机号验证</view>
+			<view class="subtitle">该账号绑定的原手机号 {{ formatPhoneNumber(originalPhoneNumber) }},完成手机验证</view>
 
 			<!-- 手机号输入 -->
 			<view class="phone_input">
 				<text class="area_code">+86</text>
-				<input type="text" class="input" placeholder="请输入手机号" v-model="mobile" maxlength="11" />
+				<input type="number" class="input" placeholder="请输入手机号" v-model="mobile" maxlength="11" />
 			</view>
 
 			<!-- 验证码输入 -->
 			<view class="code_input">
-				<input type="text" class="input" placeholder="请输入验证码" v-model="code" maxlength="6" />
+				<input type="number" class="input" placeholder="请输入验证码" v-model="code" maxlength="6" />
 				<view class="btn" v-if="captchaTime === 0" @click="getCode">获取验证码</view>
-				<view class="btn disabled" v-else>{{captchaTime}}秒后重试</view>
+				<view class="btn disabled" v-else>{{ captchaTime }}秒后重试</view>
 			</view>
 
 			<view class="blankHeight"></view>
 		</view>
 
-		<view class="btn_submit">确定</view>
+		<view class="btn_submit" @click="processProgress == 0 ? submitData() : newSubmitData()">确定</view>
+		<view class="mobilePhoneNotAvailable" @click="openCustomPopup">现手机已不可用?</view>
+		<DialogBox ref="DialogBox"></DialogBox>
+		<CustomerServicePopup ref="customerServicePopup"></CustomerServicePopup>
 	</view>
 </template>
 
 <script>
-	export default {
-		components: {},
-		data() {
-			return {
-				title: '',
-				mobile: '',
-				code: '',
-				captchaTime: 0,
+import CustomPopup from '@/components/CustomPopup/CustomPopup.vue'
+import CustomerServicePopup from '@/components/CustomerServicePopup/CustomerServicePopup.vue'
+
+export default {
+	components: { CustomPopup, CustomerServicePopup },
+	data() {
+		return {
+			title: '',
+			mobile: '',
+			originalPhoneNumber: '',
+			code: '',
+			captchaTime: 0,
+			processProgress: 0, // 0原手机号验证逻辑,1新手机号验证逻辑
+		}
+	},
+	onLoad(e) {
+		if (e.originalPhoneNumber) {
+			this.originalPhoneNumber = e.originalPhoneNumber;
+		}
+	},
+	onShow() {
+		// this.loadData();
+	},
+	methods: {
+		openCustomPopup() {
+			this.$refs.customerServicePopup.$refs.customPopup.open()
+		},
+		formatPhoneNumber(phoneNumber) {
+			if (phoneNumber && phoneNumber.length === 11) {
+				return phoneNumber.replace(/(\d{3})\d{4}(\d{4})/, '$1****$2');
 			}
+			return phoneNumber;
 		},
-		onLoad() {},
-		onShow() {
-			// this.loadData();
+		onBack() { },
+		chkSel() {
+			if (this.sel == 1) {
+				this.sel = 0;
+			} else {
+				this.sel = 1;
+			}
 		},
-		methods: {
-			onBack() {},
-			chkSel() {
-				if (this.sel == 1) {
-					this.sel = 0;
-				} else {
-					this.sel = 1;
+		getCodeTime() {
+			this.captchaTime = 60;
+			let timer = setInterval(() => {
+				this.captchaTime--;
+				if (this.captchaTime < 1) {
+					clearInterval(timer);
+					this.captchaTime = 0
 				}
-			},
-			getCodeTime() {
-				this.captchaTime = 60;
-				let timer = setInterval(() => {
-					this.captchaTime--;
-					// console.log(this.captchaTime)
-					if (this.captchaTime < 1) {
-						clearInterval(timer);
-						this.captchaTime = 0
-					}
-				}, 1000)
-			},
-			getCode() {
-				if (this.mobile.length != 11) {
+			}, 1000)
+		},
+		getCode() {
+			var _this = this
+			if (this.mobile.length != 11) {
+				uni.showToast({
+					title: '请输入完整手机号',
+					icon: 'none'
+				});
+				return;
+			}
+			// 验证原手机号的逻辑
+			if (this.processProgress == 0 && this.mobile != this.originalPhoneNumber) {
+				uni.showToast({
+					title: '请输入正确的原手机号',
+					icon: 'none'
+				});
+				return;
+			}
+
+			const phoneRegex = /^1[3-9]\d{9}$/;
+			if (!phoneRegex.test(this.mobile)) {
+				uni.showToast({
+					title: '请输入有效的手机号',
+					icon: 'none'
+				});
+				return;
+			}
+
+			if (this.captchaTime > 0) {
+				uni.showToast({
+					title: '不能重复获取',
+					icon: 'none'
+				});
+				return;
+			}
+			this.captchaTime = 60;
+			var url = '/Web/getcode'
+			var data = {}
+			if (this.processProgress == 0) {
+				url = '/Member/getcode'
+				data = {}
+			}
+			if (this.processProgress == 1) {
+				url = '/Web/getcode'
+				data = { mobile: _this.mobile, skey: this.skey,}
+			}
+			uni.request({
+				url: this.$apiHost + url,
+				data: { 
+					uuid: getApp().globalData.uuid,
+					...data
+				},
+				header: {
+					'content-type': 'application/json'
+				},
+				success: (res) => {
+					console.log("----", res.data)
 					uni.showToast({
-						title: '请输入手机号',
+						title: res.data.str,
 						icon: 'none'
-					});
-					return;
+					})
+					if (res.data.success == 'yes') {
+						this.getCodeTime();
+					} else {
+						this.captchaTime = 0;
+					}
 				}
-				if (this.captchaTime > 0) {
+			});
+		},
+		submitData() {
+			console.log('submitData');
+			
+			if (this.mobile == "") {
+				uni.showToast({
+					title: "请输入手机号",
+					icon: 'none'
+				});
+				return;
+			}
+			if (this.code == "") {
+				uni.showToast({
+					title: "请输入验证码",
+					icon: 'none'
+				});
+				return;
+			}
+			//   验证原始手机号 
+			uni.request({
+				url: this.$apiHost + '/Member/checkMobile',
+				data: {
+					uuid: getApp().globalData.uuid,
+					code: this.code,
+				},
+				header: {
+					'content-type': 'application/json'
+				},
+				success: (res) => {
+					console.log("----", res.data);
 					uni.showToast({
-						title: '不能重复获取',
+						title: res.data.str,
 						icon: 'none'
 					});
-					return;
-				}
-				this.captchaTime = 60;
-
-				uni.request({
-					url: this.$apiHost + '/Web/getcode',
-					data: {
-						skey: this.skey,
-						mobile: this.mobile,
-					},
-					header: {
-						'content-type': 'application/json'
-					},
-					success: (res) => {
-						console.log("----", res.data)
-						uni.showToast({
-							title: res.data.str,
-							icon: 'none'
-						})
-						if (res.data.success == 'yes') {
-							this.getCodeTime();
-						} else {
-							this.captchaTime = 0;
-						}
+					if (res.data.success == "yes") {
+						this.$refs['DialogBox'].confirm({
+							title: '确认修改手机号',
+							content: '当前绑定的手机号为 ' + this.mobile + ' 吗?',
+							DialogType: "inquiry",
+							btn1: "再考虑一下",
+							btn2: "确认更换",
+							animation: 0
+						}).then(() => {
+							// 用户点击确认后,发送请求
+							this.mobile = ''
+							this.code = ''
+							this.captchaTime = 0
+							this.processProgress = 1
+							
+							uni.showToast({
+								title: "请输入新手机号",
+								icon: 'none'
+							});
+						}).catch(() => {
+							// 用户点击取消后,不发送请求
+							console.log('用户取消了修改手机号');
+						});
 					}
+				}
+			});
+			// 弹窗确认是否修改手机号
+
+		},
+		newSubmitData() {
+			console.log("newSubmitData");
+			
+			if (this.mobile == "") {
+				uni.showToast({
+					title: "请输入手机号",
+					icon: 'none'
+				});
+				return;
+			}
+			if (this.code == "") {
+				uni.showToast({
+					title: "请输入验证码",
+					icon: 'none'
 				});
+				return;
+			}
 
-			},
-			submitData() {
-				if (this.mobile == "") {
-					uni.showToast({
-						title: "请输入手机号",
-						icon: 'none'
-					});
-					return;
-				}
-				if (this.code == "") {
+			const phoneRegex = /^1[3-9]\d{9}$/;
+			if (!phoneRegex.test(this.mobile)) {
+				uni.showToast({
+					title: '请输入有效的手机号',
+					icon: 'none'
+				});
+				return;
+			}
+			// 更改为新手机号时发送验证请求
+			uni.request({
+				url: this.$apiHost + '/Member/editMobile',
+				data: {
+					uuid: getApp().globalData.uuid,
+					mobile: this.mobile,
+					code: this.code,
+				},
+				header: {
+					'content-type': 'application/json'
+				},
+				success: (res) => {
+					console.log("----", res.data);
 					uni.showToast({
-						title: "请输入验证码",
+						title: res.data.str,
 						icon: 'none'
 					});
-					return;
-				}
-				uni.request({
-					url: this.$apiHost + '/Member/editMobile',
-					data: {
-						uuid: getApp().globalData.uuid,
-						mobile: this.mobile,
-						code: this.code,
-					},
-					header: {
-						'content-type': 'application/json'
-					},
-					success: (res) => {
-						console.log("----", res.data);
-						uni.showToast({
-							title: res.data.str,
-							icon: 'none'
-						});
-						if (res.data.success == "yes") {
-
-						}
+					if (res.data.success == "yes") {
+						// 可以在此处添加修改成功后的逻辑
 					}
-				});
-
-			},
+				}
+			});
 		}
 	}
+}
 </script>
 
 <style scoped lang="scss">
-	@import 'normal.scss';
+.list_info {
+	display: flex;
+	flex-direction: column;
+	justify-content: flex-start;
+	align-items: center;
+	color: #fff;
+	width: 750rpx;
+
+	.textContent {
+		color: #1f1f1f;
+		max-width: 400rpx;
+	}
+
+	.textPrompt {
+		color: #999999;
+	}
+
+	.name {
+		width: 690rpx;
+		display: flex;
+		flex-direction: row;
+		justify-content: space-between;
+		align-items: flex-start;
+		color: #333;
+		font-size: 28rpx;
+		margin-top: 20rpx;
+
+		.right {
+			font-size: 28rpx;
+			color: #ff2a95;
+		}
+	}
+
+	.desc {
+		width: 690rpx;
+		display: flex;
+		flex-direction: row;
+		justify-content: space-between;
+		align-items: flex-start;
+		color: #999;
+		font-size: 24rpx;
+		margin-top: 20rpx;
+	}
+
+	.item {
+		width: 690rpx;
+		height: 84rpx;
+		margin-top: 20rpx;
+		background: #ffffff;
+		position: relative;
+		border-radius: 24rpx 24rpx 24rpx 24rpx;
+
+		input {
+			width: 100%;
+			height: 100%;
+			padding-left: 20rpx;
+			font-size: 28rpx;
+			color: #333;
+			border: solid 1px #f0f0f0;
+			border-radius: 12rpx;
+		}
+
+		.btn {
+			position: absolute;
+			right: 20rpx;
+			top: 0rpx;
+			font-weight: 400;
+			font-size: 28rpx;
+			line-height: 84rpx;
+			color: #ff2a95;
+		}
+
+		.arrow {
+			width: 36rpx;
+			position: absolute;
+			right: 20rpx;
+			top: 24rpx;
+		}
+	}
+
+	.bcenter {
+		display: flex;
+		flex-direction: row;
+		justify-content: center;
+		align-items: center;
+		margin-top: 120rpx;
+
+		.avator {
+			width: 200rpx;
+			height: 200rpx;
+			position: relative;
+
+			.img {
+				width: 172rpx;
+				height: 172rpx;
+				border-radius: 86rpx;
+			}
+
+			.photo {
+				width: 64rpx;
+				height: 64rpx;
+				position: absolute;
+				bottom: 0;
+				right: 10rpx;
+			}
+		}
+	}
+
+	.item2 {
+		width: 690rpx;
+		height: 84rpx;
+		margin-top: 20rpx;
+		display: flex;
+		flex-direction: row;
+		justify-content: center;
+		align-items: center;
+
+		.sex {
+			width: 334rpx;
+			height: 84rpx;
+			background: #ffffff;
+			border-radius: 24rpx;
+			border: 2rpx solid #282828;
+			color: #999;
+			display: flex;
+			flex-direction: row;
+			justify-content: center;
+			align-items: center;
+		}
+
+		.active {
+			border: 4rpx solid #ff2a95;
+			color: #ff2a95;
+		}
+
+		.sex2 {
+			image {
+				width: 172rpx;
+			}
+		}
+	}
+
+	.itemSex {
+		width: 690rpx;
+		margin-top: 20rpx;
+		display: flex;
+		flex-direction: row;
+		justify-content: center;
+		align-items: center;
+
+		.sex2 {
+			display: flex;
+			flex-direction: column;
+			justify-content: flex-end;
+			align-items: center;
+			width: 210rpx;
+			height: 210rpx;
+
+			text {
+				color: #999;
+			}
+
+			image {
+				width: 132rpx;
+				height: 132rpx;
+			}
+		}
+
+		.active {
+			text {
+				color: #fff;
+			}
+
+			image {
+				border: 4rpx solid #36d6ff;
+				border-radius: 172rpx;
+				width: 172rpx;
+				height: 172rpx;
+			}
+		}
+	}
+
+	.itemSingle {
+		width: 690rpx;
+		height: 84rpx;
+		margin-top: 20rpx;
+		display: flex;
+		flex-direction: row;
+		justify-content: center;
+		align-items: center;
+
+		.slider {
+			width: 100%;
+		}
+	}
+
+	.itemXL {
+		width: 690rpx;
+	}
+
+	.item_tag {
+		display: flex;
+		flex-direction: row;
+		justify-content: flex-start;
+		align-items: center;
+		flex-wrap: wrap;
+		width: 690rpx;
+		padding: 20rpx;
+
+		.tag {
+			border-radius: 12rpx;
+			margin-right: 10rpx;
+			margin-top: 10rpx;
+			padding: 8rpx 16rpx;
+			height: 60rpx;
+			border: 2rpx solid #eee;
+			color: #333;
+			display: flex;
+			flex-direction: row;
+			justify-content: center;
+			align-items: center;
+			background: #eeeeee;
+
+			.close {
+				width: 28rpx;
+				margin-left: 2rpx;
+				position: relative;
+			}
+		}
+
+		.active {
+			border-radius: 20rpx;
+			border: 2rpx solid #ff5967;
+		}
+
+		.addNew {
+			margin-right: 10rpx;
+			margin-top: 10rpx;
+			padding: 0rpx 20rpx;
+			height: 60rpx;
+			border-radius: 12rpx;
+			background: #1f1f1f;
+			color: #fff;
+			display: flex;
+			flex-direction: row;
+			justify-content: center;
+			align-items: center;
+		}
+	}
+
+	.title {
+		text-align: center;
+		margin-top: 96rpx;
+		width: 100%;
+		font-weight: 600;
+		font-family: PingFang SC, PingFang SC;
+		font-weight: 500;
+		font-size: 48rpx;
+		color: #1F1F1F;
+	}
+
+	.subtitle {
+		font-size: 24rpx;
+		font-weight: 400;
+		color: #959595;
+		text-align: center;
+		margin-top: 20rpx;
+		width: 100%;
+	}
+
+	.phone_input {
+		width: 626rpx;
+		height: 84rpx;
+		margin-top: 96rpx;
+		background: #ffffff;
+		border-radius: 24rpx;
+		display: flex;
+		align-items: center;
+		border: 4rpx solid #000000;
+		border-radius: 74rpx;
+
+		.area_code {
+			padding: 0 20rpx;
+			font-size: 28rpx;
+			color: #333;
+			border-right: 1rpx solid #e0e0e0;
+		}
+
+		.input {
+			flex: 1;
+			height: 100%;
+			padding-left: 20rpx;
+			font-size: 28rpx;
+			color: #333;
+		}
+	}
+
+	.code_input {
+		width: 626rpx;
+		height: 84rpx;
+		margin-top: 20rpx;
+		background: #ffffff;
+		border-radius: 24rpx;
+		display: flex;
+		align-items: center;
+		border: 4rpx solid #000000;
+		border-radius: 74rpx;
+		padding-right: 8rpx;
+
+		.input {
+			flex: 1;
+			height: 100%;
+			padding-left: 20rpx;
+			font-size: 28rpx;
+			color: #333;
+		}
+
+		.btn {
+			padding: 11rpx 26rpx;
+			font-size: 28rpx;
+			background: #000000;
+			border-radius: 74rpx;
+			font-family: 'PingFang SC-Bold';
+
+			&.disabled {
+				color: #999;
+				background: transparent;
+			}
+		}
+	}
+}
+
+.btn_submit {
+	width: 660rpx;
+	height: 96rpx;
+	margin: 0 auto;
+	margin-top: 74rpx;
+	background: #1f1f1f;
+	border-radius: 50rpx;
+	font-weight: bold;
+	font-size: 32rpx;
+	color: #ffffff;
+	display: flex;
+	flex-direction: row;
+	justify-content: center;
+	align-items: center;
+}
+
+.mobilePhoneNotAvailable {
+	font-family: PingFang SC, PingFang SC;
+	font-weight: 400;
+	font-size: 24rpx;
+	color: #0084FF;
+	text-align: center;
+	margin-top: 42rpx;
+}
 </style>

+ 40 - 11
pages/my/normal.scss

@@ -3,10 +3,7 @@ page {
       auto no-repeat,
     #f2f6f2;
 }
-.page {
-}
-.topbg {
-}
+ 
 .PageHeader {
   background: url("../../static/me/wd_bg_bianjiziliao.png") center top / 100%
       auto no-repeat,
@@ -27,6 +24,14 @@ page {
   align-items: center;
   color: #fff;
   width: 750rpx;
+  .textContent {
+    color: #1f1f1f;
+    max-width: 400rpx;
+
+  }
+  .textPrompt {
+    color: #999999;
+  }
   .name {
     width: 690rpx;
     display: flex;
@@ -206,12 +211,11 @@ page {
       flex-direction: row;
       justify-content: center;
       align-items: center;
-	  background: #eeeeee;
+      background: #eeeeee;
       .close {
         width: 28rpx;
         margin-left: 2rpx;
-		position: relative;
-		
+        position: relative;
       }
     }
     .active {
@@ -224,7 +228,7 @@ page {
       padding: 0rpx 20rpx;
       height: 60rpx;
       border-radius: 12rpx;
-      background: #1F1F1F;
+      background: #1f1f1f;
       color: #fff;
       display: flex;
       flex-direction: row;
@@ -313,8 +317,7 @@ page {
     justify-content: space-between;
     align-items: center;
     border-bottom: solid 0px #393939;
-    text {
-    }
+    
     .arrow {
       width: 36rpx;
     }
@@ -333,7 +336,7 @@ page {
   position: fixed;
   bottom: 50rpx;
   left: 45rpx;
-  background: rgb(85, 85, 85);
+  background: #1f1f1f;
   border-radius: 50rpx;
   font-weight: bold;
   font-size: 32rpx;
@@ -469,3 +472,29 @@ page {
   font-family: "PingFang SC-Medium";
   width: 690rpx;
 }
+.openNicknamePopUpWindow {
+  .input-box {
+    position: relative;
+    left: 0;
+    top: 0;
+   
+  }
+  ::v-deep.uv-input {
+    width: 694rpx !important;
+    height: 88rpx !important;
+    border-radius: 20rpx !important;
+    border: 1rpx solid #000000 !important;
+    margin: 0 auto;
+    margin-bottom: 44rpx;
+  }
+}
+.openContentPopUpWindow {
+ 
+  ::v-deep.uv-textarea {
+    width: 694rpx !important; 
+    border-radius: 20rpx !important;
+    border: 1rpx solid #000000 !important;
+    margin: 0 auto;
+    margin-bottom: 44rpx;
+  }
+}

+ 134 - 89
pages/my/security.vue

@@ -1,100 +1,145 @@
 <template>
-	<view class="page">
-		<!-- 基本资料组 -->
-		<view class="group">
-			<view class="item" @click="goPage('/pages/my/editInfo')">
-				<text class="title">基本资料</text>
-				<view class="right">
-					<text class="value">去完善</text>
-					<image class="arrow" src="../../static/me/arrow_right_gray.png" mode="widthFix"></image>
-				</view>
-			</view>
-		</view>
+  <view class="page">
+    <!-- 基本资料组 -->
+    <view class="group">
+      <view class="item" @click="goPage('/pages/my/editInfo')">
+        <text class="title">基本资料</text>
+        <view class="right">
+          <text class="value">去完善</text>
+          <image class="arrow" src="../../static/me/arrow_right_gray.png" mode="widthFix"></image>
+        </view>
+      </view>
+    </view>
 
-		<!-- 账号安全组 -->
-		<view class="group">
-			<view class="item" @click="goPage('/pages/my/editMobile')">
-				<text class="title">手机号</text>
-				<view class="right">
-					<text class="value">{{ phoneNumber || '未绑定' }}</text>
-					<image class="arrow" src="../../static/me/arrow_right_gray.png" mode="widthFix"></image>
-				</view>
-			</view>
-			<view class="item" @click="goPage('/pages/my/editPass')">
-				<text class="title">登录密码</text>
-				<view class="right">
-					<text class="value">未设置</text>
-					<image class="arrow" src="../../static/me/arrow_right_gray.png" mode="widthFix"></image>
-				</view>
-			</view>
-		</view>
+    <!-- 账号安全组 -->
+    <view class="group">
+      <view class="item" @click="goPage('/pages/my/editMobile?originalPhoneNumber='+ phoneNumber)">
+        <text class="title">手机号</text>
+        <view class="right">
+          <text class="value">{{ formatPhoneNumber( phoneNumber )|| '未绑定' }}</text>
+          <image class="arrow" src="../../static/me/arrow_right_gray.png" mode="widthFix"></image>
+        </view>
+      </view>
+      <view class="item" @click="goPage('/pages/my/editPass')" v-if="false">
+        <text class="title">登录密码</text>
+        <view class="right">
+          <text class="value">未设置</text>
+          <image class="arrow" src="../../static/me/arrow_right_gray.png" mode="widthFix"></image>
+        </view>
+      </view>
+    </view>
 
-		<!-- 第三方账号组 -->
-		<view class="group">
-			<view class="item" @click="bindWechat">
-				<text class="title">微信账号</text>
-				<view class="right">
-					<text class="value">未授权</text>
-					<image class="arrow" src="../../static/me/arrow_right_gray.png" mode="widthFix"></image>
-				</view>
-			</view>
-			<view class="item" @click="bindQQ">
-				<text class="title">QQ账号</text>
-				<view class="right">
-					<text class="value">未授权</text>
-					<image class="arrow" src="../../static/me/arrow_right_gray.png" mode="widthFix"></image>
-				</view>
-			</view>
-		</view>
+    <!-- 第三方账号组 -->
+    <view class="group">
+      <view class="item" @click="bindWechat">
+        <text class="title">微信账号</text>
+        <view class="right">
+          <text class="value">{{ wechat || '未绑定' }}</text>
+          <image class="arrow" src="../../static/me/arrow_right_gray.png" mode="widthFix"></image>
+        </view>
+      </view>
+      <view class="item" @click="bindQQ" v-if="false">
+        <text class="title">QQ账号</text>
+        <view class="right">
+          <text class="value">未授权</text>
+          <image class="arrow" src="../../static/me/arrow_right_gray.png" mode="widthFix"></image>
+        </view>
+      </view>
+    </view>
 
-		<!-- 删除账号组 -->
-		<view class="group">
-			<view class="item" @click="goPage('/pages/my/editInfo')">
-				<text class="title red">删除用户</text>
-				<view class="right" >
-					<text class="value red">注销账户</text>
-					<image class="arrow" style="width: 30rpx; height: 30rpx;" src="../../static/me/wd_icon_jiantou_red.png" mode="widthFix"></image>
-				</view>
-			</view>
-		</view>
-	</view>
+    <!-- 删除账号组 -->
+    <view class="group">
+      <view class="item"  @click="goPage('/pages/my/DelMemConfirm')" >
+        <text class="title red">删除用户</text>
+        <view class="right">
+          <text class="value red">注销账户</text>
+          <image class="arrow" style="width: 30rpx; height: 30rpx;" src="../../static/me/wd_icon_jiantou_red.png" mode="widthFix"></image>
+        </view>
+      </view>
+    </view>
+    <DialogBox ref="DialogBox"></DialogBox>
+
+  </view>
 </template>
 
 <script>
+
+
 export default {
-	data() {
-		return {
-			phoneNumber: '', // 用户手机号
-		}
-	},
-	onLoad() {
-		this.loadUserInfo()
-	},
-	methods: {
-		loadUserInfo() {
-			// 这里添加获取用户信息的逻辑
-			// 获取手机号等信息
-		},
-		goPage(url) {
-			uni.navigateTo({
-				url: url
-			})
-		},
-		bindWechat() {
-			// 微信绑定逻辑
-			uni.showToast({
-				title: '暂未开放',
-				icon: 'none'
-			})
-		},
-		bindQQ() {
-			// QQ绑定逻辑
-			uni.showToast({
-				title: '暂未开放',
-				icon: 'none'
-			})
-		}
-	}
+  components: {   }, // 注册组件
+  data() {
+    return {
+      phoneNumber: '', // 用户手机号 
+      wechat: '',
+    }
+  },
+  onLoad() {
+    this.loadUserInfo()
+  },
+  methods: {
+    loadUserInfo() {
+      // 这里添加获取用户信息的逻辑
+      // 获取手机号等信息
+      uni.request({
+        url: this.$apiHost + "/User/getinfo",
+        data: {
+          uuid: getApp().globalData.uuid,
+          skey: getApp().globalData.skey,
+        },
+        header: {
+          "content-type": "application/json",
+          sign: getApp().globalData.headerSign,
+        },
+        success: (res) => { 
+          this.phoneNumber = res.data.mobile;
+          this.wechat = res.data.wechat;
+        },
+        complete: (com) => { 
+        },
+        fail: (e) => {
+          console.log("----e:", e);
+        },
+      });
+    },
+    goPage(url) { 
+      uni.navigateTo({
+        url: url
+      })
+    },
+    bindWechat() {
+      // 微信绑定逻辑
+      // uni.showToast({
+      // 	title: '暂未开放',
+      // 	icon: 'none'
+      // })
+      this.$refs['DialogBox'].confirm({
+          title: '确认解绑',
+          content: '解绑微信账号后将无法继续使用它登录该App账号',
+          DialogType: 'inquiry',
+          btn1: '再考虑一下',
+          btn2: '确认解绑',
+          animation: 0
+        }).then(() => {
+          uni.showToast({
+            title: '暂未开放',
+            icon: 'none'
+          })
+        })
+    },
+    bindQQ() {
+      // QQ绑定逻辑
+      uni.showToast({
+        title: '暂未开放',
+        icon: 'none'
+      })
+    },
+    formatPhoneNumber(phoneNumber) {
+      if (phoneNumber && phoneNumber.length === 11) {
+        return phoneNumber.replace(/(\d{3})\d{4}(\d{4})/, '$1****$2');
+      }
+      return phoneNumber;
+    },
+  }
 }
 </script>
 

+ 42 - 11
pages/my/setting.scss

@@ -19,14 +19,14 @@ page {
 
   .group-header {
     padding: 24rpx;
-	padding-bottom: 0;
+    padding-bottom: 0;
     font-size: 26rpx;
     color: #000;
-	font-family: 'PingFang SC-Medium';
+    font-family: "PingFang SC-Medium";
     background-color: #fff;
-	overflow: hidden; 
-	border-top-left-radius: 20rpx;
-	border-top-right-radius: 20rpx;
+    overflow: hidden;
+    border-top-left-radius: 20rpx;
+    border-top-right-radius: 20rpx;
   }
 
   .item {
@@ -65,29 +65,60 @@ page {
     }
   }
 }
-.version-info { 
+.version-info {
   width: 100%;
   text-align: center;
   font-size: 24rpx;
-  color: #999; 
+  color: #999;
   margin-top: 166rpx;
 }
 .btn_submit {
   width: 660rpx;
-  height: 96rpx; 
+  height: 96rpx;
   border: 2rpx solid #f0f0f0;
   border-radius: 28rpx;
   font-size: 32rpx;
-  color: #1F1F1F;
-  font-family: 'PingFang SC-Bold';
+  color: #1f1f1f;
+  font-family: "PingFang SC-Bold";
   display: flex;
   flex-direction: row;
   justify-content: center;
   align-items: center;
   background-color: #fff;
   margin: 0 auto;
-  margin-top: 15rpx; 
+  margin-top: 15rpx;
 }
 .blankHeight {
   height: 300rpx;
 }
+.customerService {
+  width: 600rpx;
+  height: 660rpx;
+  background: #ffffff;
+  border-radius: 14rpx;
+  padding: 30rpx 70rpx; 
+  image {
+    width: 460rpx;
+    height: 460rpx;
+  }
+  .text{
+    padding-top: 8rpx;
+    padding-bottom: 26rpx;
+    text-align: center; 
+  }
+  .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;
+  }
+}

+ 255 - 241
pages/my/setting.vue

@@ -2,296 +2,310 @@
 	<view class="page">
 		<view class="list_info">
 			<view class="">
-					<!-- 基础设置组 -->
-			<view class="group-header">基础设置</view>
-			<view class="item basic" v-for="(item,index) in basicSettings" :key="item.name + index" @click="goPage(item.path)">
-				<view class="item-left">
-					<image class="icon" :src="item.icon" mode="widthFix"></image>
-					<text>{{item.name}}</text>
+				<!-- 基础设置组 -->
+				<view class="group-header">基础设置</view>
+				<view class="item basic" v-for="(item, index) in basicSettings" :key="item.name + index"
+					@click="goPage(item.path)">
+					<view class="item-left">
+						<image class="icon" :src="item.icon" mode="widthFix"></image>
+						<text>{{ item.name }}</text>
+					</view>
+					<view class="item-right">
+						<switch v-if="item.switch == 1" checked class="custom-switch" color="#acf934"
+							style="transform:scale(0.7)" />
+						<image v-else class="arrow" src="../../static/me/arrow_right_gray.png" mode="widthFix"></image>
+					</view>
 				</view>
-				<view class="item-right">
-					<switch v-if="item.switch == 1" checked class="custom-switch" color="#acf934" style="transform:scale(0.7)" />
-					<image v-else class="arrow" src="../../static/me/arrow_right_gray.png" mode="widthFix"></image>
-				</view>
-			</view>
 			</view>
-		
+
 			<view class="">
 				<!-- 更多设置组 -->
-			<view class="group-header" style="margin-top: 20rpx;">更多</view>
-			<view class="item more" v-for="(item,index) in moreSettings" :key=" index + item.name" @click="goPage(item.path)">
-				<view class="item-left">
-					<image class="icon" :src="item.icon" mode="widthFix"></image>
-					<text>{{item.name}}</text>
-				</view>
-				<view class="item-right">
-					<switch v-if="item.switch == 1"  color="#acf934" @change="switch1Change" checked class="custom-switch" style="transform:scale(0.7)" />
-					<image v-else class="arrow" src="../../static/me/arrow_right_gray.png" mode="widthFix"></image>
+				<view class="group-header" style="margin-top: 20rpx;">更多</view>
+				<view class="item more" v-for="(item, index) in moreSettings" :key="index + item.name"
+					@click=" goPage(item.path, item)">
+					<view class="item-left">
+						<image class="icon" :src="item.icon" mode="widthFix"></image>
+						<text>{{ item.name }}</text>
+					</view>
+					<view class="item-right">
+						<switch v-if="item.switch == 1" color="#acf934" @change="switch1Change" checked
+							class="custom-switch" style="transform:scale(0.7)" />
+						<image v-else class="arrow" src="../../static/me/arrow_right_gray.png" mode="widthFix"></image>
+					</view>
 				</view>
 			</view>
-			</view>
-			
+
 		</view>
 
 		<!-- 版本信息 -->
 		<view class="version-info">
-			<text>版本号 {{version}}</text>
+			<text>版本号 {{ version }}</text>
 		</view>
 
 		<!-- 退出登录按钮 -->
 		<view class="btn_submit" @click="logout">退出登录</view>
 
 		<DialogBox ref="DialogBox"></DialogBox>
+		<CustomerServicePopup ref="customerServicePopup"></CustomerServicePopup>
 	</view>
 </template>
 
 <script>
-	export default {
-		components: {},
-		data() {
-			return {
-				title: '',
-				sel: 1,
-				myinfo: {},
-				version: '',
-				basicSettings: [{
-						'name': '账户与安全',
-						'desc': '',
-						'path': '/pages/my/security',
-						'icon': '../../static/me/wd_icon_zhanghuyuanquan.png'
-					},
-					{
-						'name': '基本资料',
-						'desc': '',
-						'path': '/pages/my/editInfo',
-						'icon': '../../static/me/wd_icon_jibenziliao.png'
-					},
-					{
-						'name': '青少年模式',
-						'switch': 0,
-						'desc': '',
-						'path': '/pages/my/idcheck',
-						'icon': '../../static/me/wd_icon_qingshaonianmoshi.png'
-					}
-				],
-				moreSettings: [{
-						'name': '通知设置',
-						'desc': '',
-						'path': '/pages/my/pushSet',
-						'icon': '../../static/me/wd_icon_tonzhishezhi.png'
-					},
-					{
-						'name': '服务条款',
-						'desc': '',
-						'path': '/pages/AboutUs/xieyi',
-						'icon': '../../static/me/wd_icon_fuwutiaokuan.png'
-					},
-					{
-						'name': '接收内容推荐',
-						'switch': 1,
-						'desc': '',
-						'path': '',
-						'icon': '../../static/me/wd_icon_jieshouneirongtuijian.png'
-					},
-					{
-						'name': '联系客服',
-						'desc': '',
-						'path': 'kefu',
-						'icon': '../../static/me/wd_icon_lianxikefu.png'
-					}
-				]
+import CustomerServicePopup from '@/components/CustomerServicePopup/CustomerServicePopup.vue'
+export default {
+	components: { CustomerServicePopup },
+	data() {
+		return {
+			title: '',
+			sel: 1,
+			myinfo: {},
+			version: '',
+			basicSettings: [{
+				'name': '账户与安全',
+				'desc': '',
+				'path': '/pages/my/security',
+				'icon': '../../static/me/wd_icon_zhanghuyuanquan.png',
+				'propup': ''
+			},
+			{
+				'name': '基本资料',
+				'desc': '',
+				'path': '/pages/my/editInfo',
+				'icon': '../../static/me/wd_icon_jibenziliao.png',
+				'propup': ''
+			},
+			{
+				'name': '青少年模式',
+				'switch': 0,
+				'desc': '',
+				'path': '/pages/my/idcheck',
+				'icon': '../../static/me/wd_icon_qingshaonianmoshi.png',
+				'propup': ''
 			}
-		},
-		onLoad() {
-			this.getAppVersion()
-		},
-		onShow() {
-			this.loadData();
-		},
-		methods: {
-			getAppVersion() {
-				uni.getSystemInfo({
-					success: (info) => {
-						// app系统环境
-						let appPlatform = info.platform;
-						console.log("appPlatform", info)
-						// #ifdef H5
-						this.version = 'V' + info.appVersion;
-						// #endif
-						// #ifdef APP-PLUS
-						plus.runtime.getProperty(plus.runtime.appid, (wgtinfo) => {
-							this.version = 'V' + wgtinfo.version;
-						});
-						// #endif
-					}
-				});
+			],
+			moreSettings: [{
+				'name': '通知设置',
+				'desc': '',
+				'path': '/pages/my/pushSet',
+				'icon': '../../static/me/wd_icon_tonzhishezhi.png',
+				'propup': ''
 			},
-			switch1Change(e){
-				alert(e.detail.value,"改变了")
+			{
+				'name': '服务条款',
+				'desc': '',
+				'path': '/pages/AboutUs/xieyi',
+				'icon': '../../static/me/wd_icon_fuwutiaokuan.png',
+				'propup': ''
 			},
-			onBack() {},
-			chkSel() {
-				if (this.sel == 1) {
-					this.sel = 0;
-				} else {
-					this.sel = 1;
-				}
+			{
+				'name': '接收内容推荐',
+				'switch': 1,
+				'desc': '',
+				'path': '',
+				'icon': '../../static/me/wd_icon_jieshouneirongtuijian.png',
+				'propup': ''
 			},
-			goPage(page) {
-				if (page == 'delete') {
-					this.DelMem();
-				} else if (page == 'yszc') {
-
-					// #ifdef APP-PLUS
-					plus.runtime.openURL('https://e.zhichao.art/web/yszc.php') // plus.runtime.openWeb(href);
-					// #endif
-
+			{
+				'name': '联系客服',
+				'desc': '',
+				'path': 'kefu',
+				'icon': '../../static/me/wd_icon_lianxikefu.png',
+				'propup': 'customPopup'
+			}
+			]
+		}
+	},
+	onLoad() {
+		this.getAppVersion()
+	},
+	onShow() {
+		this.loadData();
+	},
+	methods: {
+		openCustomPopup() {
+			this.$refs.customerServicePopup.$refs.customPopup.open()
+		},
+		getAppVersion() {
+			uni.getSystemInfo({
+				success: (info) => {
+					// app系统环境
+					let appPlatform = info.platform;
+					console.log("appPlatform", info)
 					// #ifdef H5
-					window.open('https://e.zhichao.art/web/yszc.php')
+					this.version = 'V' + info.appVersion;
 					// #endif
-				} else if (page == 'kefu') {
-					let that = this;
 					// #ifdef APP-PLUS
-					plus.share.getServices(res => {
-						const wechat = res.find(i => i.id === 'weixin')
-						if (wechat) {
-							wechat.openCustomerServiceChat({
-								corpid: 'wwbc06aa8311b6ac08',
-								// url: 'https://work.weixin.qq.com/kfid/kfc4b0bcb4038d00a50'
-								url: that.myinfo.wxkf
-							}, src => {
-								console.log("success:")
-							}, err => {
-								console.log("error:")
-							})
-						} else {
-							uni.showToast({
-								title: '没有检测到微信,请先安装',
-								icon: "error"
-							});
-						}
+					plus.runtime.getProperty(plus.runtime.appid, (wgtinfo) => {
+						this.version = 'V' + wgtinfo.version;
 					});
 					// #endif
-
-				} else if (page != '') {
-					uni.navigateTo({
-						url: page,
-					})
 				}
-			},
-			DelMem() {
-				var that = this;
-				this.$refs['DialogBox'].confirm({
-					title: '警告',
-					content: '1、注销账号是不可逆操作,该账号下所有一切资料一旦注销无法恢复;\n2、注销后,你账号下所有权益将被清除。',
-					DialogType: 'inquiry',
-					btn1: '否',
-					btn2: '是',
-					animation: 0
-				}).then(() => {
-					uni.request({
-						url: that.$apiHost + '/My/delete', //检测是否已绑定
-						data: {
-							uuid: getApp().globalData.uuid
-						},
-						header: {
-							'content-type': 'application/json' //自定义请求头信息
-						},
-						success: (res) => {
-							uni.removeStorageSync("wapptoken");
-							uni.redirectTo({
-								url: '/pages/login/login',
-							})
+			});
+		},
+		switch1Change(e) {
+			alert(e.detail.value, "改变了")
+		},
+		onBack() { },
+		chkSel() {
+			if (this.sel == 1) {
+				this.sel = 0;
+			} else {
+				this.sel = 1;
+			}
+		},
+		goPage(page) {
+			if (page == 'delete') {
+				this.DelMem();
+			} else if (page == 'yszc') {
 
-						}
-					});
+				// #ifdef APP-PLUS
+				plus.runtime.openURL('https://e.zhichao.art/web/yszc.php') // plus.runtime.openWeb(href);
+				// #endif
+
+				// #ifdef H5
+				window.open('https://e.zhichao.art/web/yszc.php')
+				// #endif
+			} else if (page == 'kefu') {
+				// let that = this;
+				// // #ifdef APP-PLUS
+				// plus.share.getServices(res => {
+				// 	const wechat = res.find(i => i.id === 'weixin')
+				// 	if (wechat) {
+				// 		wechat.openCustomerServiceChat({
+				// 			corpid: 'wwbc06aa8311b6ac08',
+				// 			// url: 'https://work.weixin.qq.com/kfid/kfc4b0bcb4038d00a50'
+				// 			url: that.myinfo.wxkf
+				// 		}, src => {
+				// 			console.log("success:")
+				// 		}, err => {
+				// 			console.log("error:")
+				// 		})
+				// 	} else {
+				// 		uni.showToast({
+				// 			title: '没有检测到微信,请先安装',
+				// 			icon: "error"
+				// 		});
+				// 	}
+				// });
+				// // #endif
+				this.openCustomPopup()
+			} else if (page != '') {
+				uni.navigateTo({
+					url: page,
 				})
-			},
-			loadData() {
-				console.log({
-					uuid: getApp().globalData.uuid,
-					skey: getApp().globalData.skey
-				});
+			}
+		},
+		DelMem() {
+			var that = this;
+			this.$refs['DialogBox'].confirm({
+				title: '警告',
+				content: '1、注销账号是不可逆操作,该账号下所有一切资料一旦注销无法恢复;\n2、注销后,你账号下所有权益将被清除。',
+				DialogType: 'inquiry',
+				btn1: '否',
+				btn2: '是',
+				animation: 0
+			}).then(() => {
 				uni.request({
-					url: this.$apiHost + '/Web/getinfo',
+					url: that.$apiHost + '/My/delete', //检测是否已绑定
 					data: {
 						uuid: getApp().globalData.uuid
 					},
 					header: {
-						"content-type": "application/json",
-						'sign': getApp().globalData.headerSign
+						'content-type': 'application/json' //自定义请求头信息
 					},
 					success: (res) => {
-						console.log("----:", res.data);
-						this.myinfo = res.data;
-					},
-					complete: (com) => {
-						// uni.hideLoading();
-					},
-					fail: (e) => {
-						console.log("----e:", e);
+						uni.removeStorageSync("wapptoken");
+						uni.redirectTo({
+							url: '/pages/login/login',
+						})
+
 					}
 				});
-			},
-			EditNickname() {
-				let that = this;
-				this.$refs['DialogBox'].confirm({
-					title: '更改昵称',
-					placeholder: '请输入修改的昵称',
-					value: that.myinfo.nickname,
-					DialogType: 'input',
-					animation: 0
-				}).then((res) => {
-					if (res.value.length < 1) {
+			})
+		},
+		loadData() {
+			console.log({
+				uuid: getApp().globalData.uuid,
+				skey: getApp().globalData.skey
+			});
+			uni.request({
+				url: this.$apiHost + '/Web/getinfo',
+				data: {
+					uuid: getApp().globalData.uuid
+				},
+				header: {
+					"content-type": "application/json",
+					'sign': getApp().globalData.headerSign
+				},
+				success: (res) => {
+					console.log("----:", res.data);
+					this.myinfo = res.data;
+				},
+				complete: (com) => {
+					// uni.hideLoading();
+				},
+				fail: (e) => {
+					console.log("----e:", e);
+				}
+			});
+		},
+		EditNickname() {
+			let that = this;
+			this.$refs['DialogBox'].confirm({
+				title: '更改昵称',
+				placeholder: '请输入修改的昵称',
+				value: that.myinfo.nickname,
+				DialogType: 'input',
+				animation: 0
+			}).then((res) => {
+				if (res.value.length < 1) {
+					uni.showToast({
+						title: "请输入有效的昵称",
+						icon: 'none'
+					});
+					return;
+				}
+				that.myinfo.nickname = res.value;
+				let obj2 = {
+					nickname: res.value
+				}
+				const postData = Object.assign({}, getApp().globalData.postHeader, obj2);
+				uni.request({
+					url: that.$apiHost + '/Gushi/editinfo', //检测是否已绑定
+					data: postData,
+					method: 'POST',
+					header: {
+						'content-type': 'application/json', //自定义请求头信息
+						'Access-Control-Allow-Origin': '*'
+					},
+					success: (res) => {
 						uni.showToast({
-							title: "请输入有效的昵称",
+							title: res.data.str,
 							icon: 'none'
 						});
-						return;
 					}
-					that.myinfo.nickname = res.value;
-					let obj2 = {
-						nickname: res.value
-					}
-					const postData = Object.assign({}, getApp().globalData.postHeader, obj2);
-					uni.request({
-						url: that.$apiHost + '/Gushi/editinfo', //检测是否已绑定
-						data: postData,
-						method: 'POST',
-						header: {
-							'content-type': 'application/json', //自定义请求头信息
-							'Access-Control-Allow-Origin': '*'
-						},
-						success: (res) => {
-							uni.showToast({
-								title: res.data.str,
-								icon: 'none'
-							});
-						}
-					});
-				})
-			},
-			logout() {
-				this.$refs['DialogBox'].confirm({
-					title: '提示',
-					content: '确定要退出登录吗?',
-					DialogType: 'inquiry',
-					btn1: '取消',
-					btn2: '确定',
-					animation: 0
-				}).then(() => {
-					uni.removeStorageSync("wapptoken");
-					uni.redirectTo({
-						url: '/pages/login/login',
-					})
+				});
+			})
+		},
+		logout() {
+			this.$refs['DialogBox'].confirm({
+				title: '提示',
+				content: '确定要退出登录吗?',
+				DialogType: 'inquiry',
+				btn1: '取消',
+				btn2: '确定',
+				animation: 0
+			}).then(() => {
+				uni.removeStorageSync("wapptoken");
+				uni.redirectTo({
+					url: '/pages/login/login',
 				})
-			}
+			})
 		}
 	}
+}
 </script>
 
 <style scoped lang="scss">
-	@import 'setting.scss';
-	
- 
+@import 'setting.scss';
 </style>

BIN
static/dome/er-code.png


BIN
static/icon/wd_icon_gouxuan01.png


BIN
static/icon/wd_icon_gouxuan02.png


BIN
static/icon/wd_icon_guanbi.png


BIN
static/me/wd_bg_jianjie.png


+ 28 - 0
uni_modules/uv-textarea/changelog.md

@@ -0,0 +1,28 @@
+## 1.0.11(2023-12-26)
+1. 优化confirmType默认值改成return
+## 1.0.10(2023-09-13)
+1. 修复设置autoHeight后出现高度异常的BUG
+## 1.0.9(2023-08-08)
+1. 优化
+## 1.0.8(2023-08-07)
+1. 修复值为null或undefined时显示错误的bug
+## 1.0.7(2023-08-05)
+1. v-model设置为数据时的BUG
+2. 复制过多内容,计数显示错误的BUG
+3. maxlength为-1改成不显示计数
+## 1.0.6(2023-07-30)
+1. 增加confirm-hold参数,参考官方文档
+## 1.0.5(2023-07-25)
+1. 增加textStyle属性,自定义文本样式
+2. 增加countStyle属性,自定义统计数字的样式
+## 1.0.4(2023-07-14)
+1. 修复  设置maxlength为-1时不生效的BUG
+## 1.0.3(2023-07-13)
+1. 修复  uv-textarea设置value属性不生效的BUG 
+## 1.0.2(2023-05-16)
+1. 优化组件依赖,修改后无需全局引入,组件导入即可使用
+2. 优化部分功能
+## 1.0.1(2023-05-12)
+1. 修复vue3中双向绑定问题
+## 1.0.0(2023-05-10)
+uv-textarea 文本域

+ 138 - 0
uni_modules/uv-textarea/components/uv-textarea/props.js

@@ -0,0 +1,138 @@
+export default {
+	props: {
+		value: {
+			type: [String, Number],
+			default: ''
+		},
+		modelValue: {
+			type: [String, Number],
+			default: ''
+		},
+		// 输入框为空时占位符
+		placeholder: {
+			type: [String, Number],
+			default: ''
+		},
+		// 指定placeholder的样式类,注意页面或组件的style中写了scoped时,需要在类名前写/deep/
+		placeholderClass: {
+			type: String,
+			default: 'textarea-placeholder'
+		},
+		// 指定placeholder的样式
+		placeholderStyle: {
+			type: [String, Object],
+			default: 'color: #c0c4cc'
+		},
+		// 输入框高度
+		height: {
+			type: [String, Number],
+			default: 70
+		},
+		// 设置键盘右下角按钮的文字,仅微信小程序,App-vue和H5有效
+		confirmType: {
+			type: String,
+			default: 'return'
+		},
+		// 是否禁用
+		disabled: {
+			type: Boolean,
+			default: false
+		},
+		// 是否显示统计字数
+		count: {
+			type: Boolean,
+			default: false
+		},
+		// 是否自动获取焦点,nvue不支持,H5取决于浏览器的实现
+		focus: {
+			type: Boolean,
+			default: false
+		},
+		// 是否自动增加高度
+		autoHeight: {
+			type: Boolean,
+			default: false
+		},
+		// 如果textarea是在一个position:fixed的区域,需要显示指定属性fixed为true
+		fixed: {
+			type: Boolean,
+			default: false
+		},
+		// 指定光标与键盘的距离
+		cursorSpacing: {
+			type: Number,
+			default: 0
+		},
+		// 指定focus时的光标位置
+		cursor: {
+			type: [String, Number],
+			default: ''
+		},
+		// 是否显示键盘上方带有”完成“按钮那一栏,
+		showConfirmBar: {
+			type: Boolean,
+			default: true
+		},
+		// 光标起始位置,自动聚焦时有效,需与selection-end搭配使用
+		selectionStart: {
+			type: Number,
+			default: -1
+		},
+		// 光标结束位置,自动聚焦时有效,需与selection-start搭配使用
+		selectionEnd: {
+			type: Number,
+			default: -1
+		},
+		// 键盘弹起时,是否自动上推页面
+		adjustPosition: {
+			type: Boolean,
+			default: true
+		},
+		// 是否去掉 iOS 下的默认内边距,只微信小程序有效
+		disableDefaultPadding: {
+			type: Boolean,
+			default: false
+		},
+		// focus时,点击页面的时候不收起键盘,只微信小程序有效
+		holdKeyboard: {
+			type: Boolean,
+			default: false
+		},
+		// 最大输入长度,设置为 -1 的时候不限制最大长度
+		maxlength: {
+			type: [String, Number],
+			default: 140
+		},
+		// 边框类型,surround-四周边框,bottom-底部边框
+		border: {
+			type: String,
+			default: 'surround'
+		},
+		// 用于处理或者过滤输入框内容的方法
+		formatter: {
+			type: [Function, null],
+			default: null
+		},
+		// 是否忽略组件内对文本合成系统事件的处理
+		ignoreCompositionEvent: {
+			type: Boolean,
+			default: true
+		},
+		// 是否忽略组件内对文本合成系统事件的处理
+		confirmHold: {
+			type: Boolean,
+			default: false
+		},
+		// 文本样式
+		textStyle: {
+			type: [Object, String],
+			default: () => {}
+		},
+		// 统计数字的样式
+		countStyle: {
+			type: [Object, String],
+			default: () => {}
+		},
+		...uni.$uv?.props?.textarea
+	}
+}

+ 238 - 0
uni_modules/uv-textarea/components/uv-textarea/uv-textarea.vue

@@ -0,0 +1,238 @@
+<template>
+	<view class="uv-textarea"
+		:class="textareaClass"
+		:style="[textareaStyle]">
+		<textarea class="uv-textarea__field"
+			:value="innerValue"
+			:style="[
+				{height: autoHeight ? 'auto' :$uv.addUnit(height)},
+				$uv.addStyle(textStyle)
+			]"
+			:placeholder="placeholder"
+			:placeholder-style="$uv.addStyle(placeholderStyle, 'string')"
+			:placeholder-class="placeholderClass"
+			:disabled="disabled"
+			:focus="focus"
+			:autoHeight="autoHeight"
+			:fixed="fixed"
+			:cursorSpacing="cursorSpacing"
+			:cursor="cursor"
+			:showConfirmBar="showConfirmBar"
+			:selectionStart="selectionStart"
+			:selectionEnd="selectionEnd"
+			:adjustPosition="adjustPosition"
+			:disableDefaultPadding="disableDefaultPadding"
+			:holdKeyboard="holdKeyboard"
+			:maxlength="maxlen"
+			:confirmType="confirmType"
+			:ignoreCompositionEvent="ignoreCompositionEvent"
+			:confirm-hold="confirmHold"
+			@focus="onFocus"
+			@blur="onBlur"
+			@linechange="onLinechange"
+			@input="onInput"
+			@confirm="onConfirm"
+			@keyboardheightchange="onKeyboardheightchange"></textarea>
+			<text class="uv-textarea__count"
+			:style="[{
+        'background-color': disabled ? 'transparent' : '#fff',
+      },$uv.addStyle(countStyle)]"
+			v-if="count && maxlen!=-1">{{ getCount }}/{{ maxlen }}</text>
+	</view>
+</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";
+	/**
+	 * Textarea 文本域
+	 * @description 文本域此组件满足了可能出现的表单信息补充,编辑等实际逻辑的功能,内置了字数校验等
+	 * @tutorial https://www.uvui.cn/components/textarea.html
+	 *
+	 * @property {String | Number} 		value	/ v-model				输入框的内容
+	 * @property {String | Number}		placeholder				输入框为空时占位符
+	 * @property {String}			    placeholderClass		指定placeholder的样式类,注意页面或组件的style中写了scoped时,需要在类名前写/deep/ ( 默认 'input-placeholder' )
+	 * @property {String | Object}	    placeholderStyle		指定placeholder的样式,字符串/对象形式,如"color: red;"
+	 * @property {String | Number}		height					输入框高度(默认 70 )
+	 * @property {String}				confirmType				设置键盘右下角按钮的文字,仅微信小程序,App-vue和H5有效(默认 'done' )
+	 * @property {Boolean}				disabled				是否禁用(默认 false )
+	 * @property {Boolean}				count					是否显示统计字数(默认 false )
+	 * @property {Boolean}				focus					是否自动获取焦点,nvue不支持,H5取决于浏览器的实现(默认 false )
+	 * @property {Boolean | Function}	autoHeight				是否自动增加高度(默认 false )
+	 * @property {Boolean}				fixed					如果textarea是在一个position:fixed的区域,需要显示指定属性fixed为true(默认 false )
+	 * @property {Number}				cursorSpacing			指定光标与键盘的距离(默认 0 )
+	 * @property {String | Number}		cursor					指定focus时的光标位置
+	 * @property {Function}			    formatter			    内容式化函数
+	 * @property {Boolean}				showConfirmBar			是否显示键盘上方带有”完成“按钮那一栏,(默认 true )
+	 * @property {Number}				selectionStart			光标起始位置,自动聚焦时有效,需与selection-end搭配使用,(默认 -1 )
+	 * @property {Number | Number}		selectionEnd			光标结束位置,自动聚焦时有效,需与selection-start搭配使用(默认 -1 )
+	 * @property {Boolean}				adjustPosition			键盘弹起时,是否自动上推页面(默认 true )
+	 * @property {Boolean | Number}		disableDefaultPadding	是否去掉 iOS 下的默认内边距,只微信小程序有效(默认 false )
+	 * @property {Boolean}				holdKeyboard			focus时,点击页面的时候不收起键盘,只微信小程序有效(默认 false )
+	 * @property {String | Number}		maxlength				最大输入长度,设置为 -1 的时候不限制最大长度(默认 140 )
+	 * @property {String}				border					边框类型,surround-四周边框,none-无边框,bottom-底部边框(默认 'surround' )
+	 * @property {Boolean}				ignoreCompositionEvent	是否忽略组件内对文本合成系统事件的处理
+	 * @property {Boolean} confirmHold 点击键盘右下角按钮时是否保持键盘不收起
+	 * @property {Object}	textStyle	文本样式
+	 * @property {Object}	countStyle	统计数字的样式
+	 *
+	 * @event {Function(e)} focus					输入框聚焦时触发,event.detail = { value, height },height 为键盘高度
+	 * @event {Function(e)} blur					输入框失去焦点时触发,event.detail = {value, cursor}
+	 * @event {Function(e)} linechange				输入框行数变化时调用,event.detail = {height: 0, heightRpx: 0, lineCount: 0}
+	 * @event {Function(e)} input					当键盘输入时,触发 input 事件
+	 * @event {Function(e)} confirm					点击完成时, 触发 confirm 事件
+	 * @event {Function(e)} keyboardheightchange	键盘高度发生变化的时候触发此事件
+	 * @example <uv--textarea v-model="value1" placeholder="请输入内容" ></uv--textarea>
+	 */
+	export default {
+		name: "uv-textarea",
+		mixins: [mpMixin, mixin, props],
+		data() {
+			return {
+				// 输入框的值
+				innerValue: "",
+				// 是否处于获得焦点状态
+				focused: false,
+				// 过滤处理方法
+				innerFormatter: value => value
+			}
+		},
+		created() {
+			// #ifndef VUE3
+			this.innerValue = this.value;
+			// #endif
+			// #ifdef VUE3
+			this.innerValue = this.modelValue;
+			// #endif
+		},
+		watch: {
+			value(newVal) {
+				this.innerValue = newVal;
+			},
+			modelValue(newVal) {
+				this.innerValue = newVal;
+			}
+		},
+		computed: {
+			// 组件的类名
+			textareaClass() {
+				let classes = [],
+					{ border, disabled } = this;
+				border === "surround" && (classes = classes.concat(["uv-border", "uv-textarea--radius"]));
+				border === "bottom" && (classes = classes.concat(["uv-border-bottom", "uv-textarea--no-radius", ]));
+				disabled && classes.push("uv-textarea--disabled");
+				return classes.join(" ");
+			},
+			// 组件的样式
+			textareaStyle() {
+				const style = {};
+				// #ifdef APP-NVUE
+				// 由于textarea在安卓nvue上的差异性,需要额外再调整其内边距
+				if (this.$uv.os() === "android") {
+					style.paddingTop = "6px";
+					style.paddingLeft = "9px";
+					style.paddingBottom = "3px";
+					style.paddingRight = "6px";
+				}
+				// #endif
+				return this.$uv.deepMerge(style, this.$uv.addStyle(this.customStyle));
+			},
+			maxlen() {
+				return this.maxlength < 0 ? this.maxlength < 0 ? -1 : 140 : this.maxlength;
+			},
+			getCount() {
+				try{
+					return this.innerValue.length > this.maxlen ? this.maxlen: this.innerValue.length;
+				}catch(e){
+					return 0;
+				}
+			}
+		},
+		methods: {
+			// 在微信小程序中,不支持将函数当做props参数,故只能通过ref形式调用
+			setFormatter(e) {
+				this.innerFormatter = e
+			},
+			onFocus(e) {
+				this.$emit("focus", e);
+			},
+			onBlur(e) {
+				this.$emit("blur", e);
+				// 尝试调用uv-form的验证方法
+				this.$uv.formValidate(this, "blur");
+			},
+			onLinechange(e) {
+				this.$emit("linechange", e);
+			},
+			onInput(e) {
+				let { value = "" } = e.detail || {};
+				// 格式化过滤方法
+				const formatter = this.formatter || this.innerFormatter
+				const formatValue = formatter(value)
+				// 为了避免props的单向数据流特性,需要先将innerValue值设置为当前值,再在$nextTick中重新赋予设置后的值才有效
+				this.innerValue = value
+				this.$nextTick(() => {
+					this.innerValue = formatValue;
+					this.valueChange();
+				})
+			},
+			// 内容发生变化,进行处理
+			valueChange() {
+				const value = this.innerValue;
+				this.$nextTick(() => {
+					this.$emit("input", value);
+					this.$emit("update:modelValue", value);
+					this.$emit("change", value);
+					// 尝试调用uv-form的验证方法
+					this.$uv.formValidate(this, "change");
+				});
+			},
+			onConfirm(e) {
+				this.$emit("confirm", e);
+			},
+			onKeyboardheightchange(e) {
+				this.$emit("keyboardheightchange", e);
+			},
+		},
+	};
+</script>
+<style lang="scss" scoped>
+	$show-border: 1;
+	$show-border-surround: 1;
+	$show-border-bottom: 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-textarea {
+		border-radius: 4px;
+		background-color: #fff;
+		position: relative;
+		@include flex;
+		flex: 1;
+		padding: 9px;
+		&--radius {
+			border-radius: 4px;
+		}
+		&--no-radius {
+			border-radius: 0;
+		}
+		&--disabled {
+			background-color: #f5f7fa;
+		}
+		&__field {
+			flex: 1;
+			font-size: 15px;
+			color: $uv-content-color;
+			width: 100%;
+		}
+		&__count {
+			position: absolute;
+			right: 5px;
+			bottom: 2px;
+			font-size: 12px;
+			color: $uv-tips-color;
+			background-color: #ffffff;
+			padding: 1px 4px;
+		}
+	}
+</style>

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

@@ -0,0 +1,87 @@
+{
+  "id": "uv-textarea",
+  "displayName": "uv-textarea 文本域 全面兼容vue3+2、app、h5、小程序等多端",
+  "version": "1.0.11",
+  "description": "文本域此组件满足了可能出现的表单信息补充,编辑等实际逻辑的功能,内置了字数校验等。",
+  "keywords": [
+    "uv-textarea",
+    "uvui",
+    "uv-ui",
+    "textarea",
+    "文本域"
+],
+  "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"
+				}
+			}
+		}
+  }
+}

+ 19 - 0
uni_modules/uv-textarea/readme.md

@@ -0,0 +1,19 @@
+## Textarea 文本域
+
+> **组件名:uv-textarea**
+
+文本域此组件满足了可能出现的表单信息补充,编辑等实际逻辑的功能,内置了字数校验等。
+
+# <a href="https://www.uvui.cn/components/textarea.html" target="_blank">查看文档</a>
+
+## [下载完整示例项目](https://ext.dcloud.net.cn/plugin?name=uv-ui) <small>(请不要 下载插件ZIP)</small>
+
+### [更多插件,请关注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>

+ 18 - 0
uni_modules/yi-code/changelog.md

@@ -0,0 +1,18 @@
+## 1.0.8(2024-10-05)
+修复vue2输入内容获取为空的BUG
+## 1.0.7(2024-09-02)
+修复部分情况下undefined BUG
+## 1.0.6(2024-08-01)
+增加ref方法 clear 清除输入内容
+## 1.0.5(2024-06-26)
+修复因text-align导致的input显示问题
+## 1.0.4(2024-06-26)
+更新隐藏input长度过短显示数字BUG
+## 1.0.3(2024-06-19)
+修复插件取消聚焦时的动画隐藏问题
+## 1.0.2(2024-05-15)
+支持自定义隐藏显示时的字符, 新增hide属性String,传入参数为隐藏显示的字符(一般使用 * 号)
+## 1.0.1(2024-03-23)
+修复在某些设备显示输入框数字的bug
+## 1.0.0(2024-03-23)
+首次更新三种样式验证框效果

+ 160 - 0
uni_modules/yi-code/components/yi-code/yi-code.vue

@@ -0,0 +1,160 @@
+<template>
+	<view class="yi-code" :style="'width: '+width+'rpx;'">
+		<view class="yi-code-show" :style="'width: '+width+'rpx;'">
+			<block v-for="i in numberArr">
+				<view
+					:class="'yi-code-show-item' + ((codes.length === i && isFocus) ? ' yi-code-show-active' : '')" 
+					:style="type !== 'block' ? (type === 'line' ? 'border-top: 0; border-left: 0; border-right: 0; border-radius: 0; border-width: 2px;' : 'border-style: dashed;') : ''"
+				> 
+				{{showVal(codes[i])}}
+				</view>
+			</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"/>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		props: {
+			/**
+			 * @description 宽度 rpx
+			 */
+			width: {
+				type: Number,
+				default: 500,
+			},
+			/**
+			 * @description 是否自动聚焦
+			 */
+			focus: {
+				type: Boolean,
+				default: true,
+			},
+			/**
+			 * @description 隐藏字符(密码效果)
+			 */
+			hide: {
+				type: String,
+				default: '',
+			},
+			/**
+			 * @description 验证码长度
+			 */
+			maxlength: {
+				type: Number,
+				default: 6
+			},
+			/**
+			 * @description 样式类型 block 方框, dashed 虚线方框,line 线
+			 */
+			type: {
+				type: String,
+				default: 'block'
+			},
+			/**
+			 * @description text | number 
+			 */
+			inputType: {
+				type: String,
+				default: 'number'
+			},
+		},
+		created() {
+			let arr = [];
+			for(let i = 0; i < this.$props.maxlength; i++){
+				arr.push(i);
+			}
+			this.numberArr = arr;
+		},
+		data(){
+			return {
+				numberArr: [], // 
+				codes: [],
+				value: '',
+				isFocus: false
+			}
+		},
+		methods: {
+			clear(){
+				this.codes = []
+				this.value = ''
+			},
+			onFocus(){
+				this.isFocus = true
+			},
+			onBlur(){
+				this.isFocus = false
+			},
+			showVal(v){
+				return v ? (this.hide || v) : '';
+			},
+			onChange(e){
+				let str = e.detail.value || e.target.value
+				if(str){
+					this.codes = String(str).split('');
+					this.$emit('onChange', str);
+					if(this.codes.length === this.$props.maxlength){
+						this.$emit('onComplete', str);
+					}
+				}else{
+					this.codes = [];
+					this.$emit('onChange', '');
+				}
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	.yi-code {
+		position: relative;
+		overflow: hidden;
+		text-align: unset;
+
+		.yi-code-show {
+			display: flex;
+			justify-content: space-between;
+			align-items: center;
+
+			.yi-code-show-item {
+				box-sizing: border-box;
+				width: 80rpx;
+				height: 80rpx;
+				border: 1px solid #777;
+				border-radius: 6rpx;
+				display: flex;
+				align-items: center;
+				justify-content: center;
+			}
+
+			.yi-code-show-active {
+				border-color: #ff5500;
+				border-width: 2px;
+				animation: myfirst 600ms infinite;
+				@keyframes myfirst
+				{
+					0%   {opacity: 0.1}
+					100% {opacity: 1}
+				}
+			}
+		}
+		
+		.yi-code-hide{
+			position: absolute;
+			z-index: 99;
+			left: 0;
+			top: 0;
+			height: 80rpx;
+			opacity: 0;
+			text-align: unset;
+			
+			input{
+				height: 80rpx;
+				text-align: unset;
+			}
+		}
+	}
+</style>

+ 83 - 0
uni_modules/yi-code/package.json

@@ -0,0 +1,83 @@
+{
+  "id": "yi-code",
+  "displayName": "验证码输入框组件、密码框、支持多种样式",
+  "version": "1.0.8",
+  "description": "动效流畅的验证码输入框组件,收藏勿走丢,详情简介有扫码预览和更多模板库地址",
+  "keywords": [
+    "验证码",
+    "输入框"
+],
+  "repository": "",
+"engines": {
+  },
+  "dcloudext": {
+    "type": "component-vue",
+    "sale": {
+      "regular": {
+        "price": "0.00"
+      },
+      "sourcecode": {
+        "price": "0.00"
+      }
+    },
+    "contact": {
+      "qq": ""
+    },
+    "declaration": {
+      "ads": "无",
+      "data": "插件不采集任何数据",
+      "permissions": "无"
+    },
+    "npmurl": ""
+  },
+  "uni_modules": {
+    "dependencies": [],
+    "encrypt": [],
+    "platforms": {
+      "cloud": {
+        "tcb": "y",
+        "aliyun": "y",
+        "alipay": "y"
+      },
+      "client": {
+        "Vue": {
+          "vue2": "y",
+          "vue3": "y"
+        },
+        "App": {
+          "app-vue": "y",
+          "app-nvue": "y",
+          "app-uvue": "u"
+        },
+        "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",
+          "钉钉": "y",
+          "快手": "y",
+          "飞书": "y",
+          "京东": "y"
+        },
+        "快应用": {
+          "华为": "u",
+          "联盟": "u"
+        }
+      }
+    }
+  }
+}

+ 102 - 0
uni_modules/yi-code/readme.md

@@ -0,0 +1,102 @@
+### 线上预览
+![image](https://masteryi-localhost.oss-cn-hangzhou.aliyuncs.com/uni-app/yi-code-qrcode.png)
+
+[更多UNI-APP模板点击查看](https://www.masteryi.cn/uni-app)
+
+### 使用方法
+`<yi-code @onComplete="complete" @onChange="change"></yi-code>`
+
+### 参数
+
+| 属性            | 类型             | 说明                                | 默认值    |
+|---------------|----------------|-----------------------------------|--------|
+| width         | number         | 宽度 rpx                            | 500    |
+| maxlength     | number         | 验证码长度                             | 6      |
+| focus         | boolean        | 是否自动聚焦                            | true   |
+| type          | string      | 组件风格支持block方框, dashed 虚线方框,line 线 | block  |
+| inputType     | string    | 输入框类型 支持text、number               | number | 
+| hide     		| string    | 隐藏字符,传值则会使用该字符隐藏对应的验证码数字,类似于传 * 模拟密码遮盖效果  | null | 
+| @onComplete    | (code: string) |  输入长度===maxlength时的完成回调onComplete            |   null     |
+| @onChange      | (code: string) |  code值变更回调onChange                         |   null     |
+| clear      | ref function |  清除输入内容                      |        |
+
+### 示例代码
+```
+<template>
+	<view class="page">
+		<view class="card">
+			<view class="title">block</view>
+			<view><button @click="onClear" style="background: #ff5500; color: #fff;">清除内容</button></view>
+			<view class="body">
+				<yi-code ref="code" :width="600" @onComplete="complete" @onChange="change"></yi-code>
+			</view>
+		</view>
+		
+		<view class="card">
+			<view class="title">dashed</view>
+			<view class="body">
+				<yi-code :focus="false" :maxlength="5" type="dashed"></yi-code>
+			</view>
+		</view>
+		
+		<view class="card">
+			<view class="title">line</view>
+			<view class="body">
+				<yi-code :focus="false" :maxlength="4" type="line"></yi-code>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	// 注意测试案例的时候 focus只保持一个自动聚焦, 其他设置false,防止调试输入不了;
+	
+	export default {
+		data() {
+			return {
+			}
+		},
+		onLoad() {
+			
+		},
+		methods: {
+			onClear(){
+				this.$refs.code.clear()	
+			},
+			complete(code){
+				console.log(`complete:${code}`);
+			},
+			change(code){
+				console.log(`change:${code}`);
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	.page {
+		display: flex;
+		flex-wrap: wrap;
+		.card{
+			width: 720rpx;
+			margin: 30rpx auto;
+			border: 1px solid #f0f0f0;
+			border-radius: 12rpx;
+			
+			.title{
+				font-size: 14px;
+				text-align: center;
+				line-height: 30px;
+				border-bottom: 1px solid #f0f0f0;
+			}
+			
+			.body{
+				display: flex;
+				align-items: center;
+				justify-content: center;
+				height: 150rpx;
+			}
+		}
+	}
+</style>
+```