zhengkaixin пре 1 месец
родитељ
комит
56ad1f232e

+ 6 - 0
assets/img/tabbarImg/item1a.svg

@@ -0,0 +1,6 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 32 32" width="72" height="72" style="" filter="none">
+    
+    <g>
+    <path d="M12 24h-6.667v-10.667h6.667v10.667zM20 24h-6.667v-16h6.667v16zM28 24h-6.667v-21.333h6.667v21.333zM29.333 29.333h-25.333v-2.667h25.333v2.667z" fill="rgba(22,119,255,1)"></path>
+    </g>
+  </svg>

+ 6 - 0
assets/img/tabbarImg/item1b.svg

@@ -0,0 +1,6 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 32 32" width="72" height="72" style="" filter="none">
+    
+    <g>
+    <path d="M12 24h-6.667v-10.667h6.667v10.667zM20 24h-6.667v-16h6.667v16zM28 24h-6.667v-21.333h6.667v21.333zM29.333 29.333h-25.333v-2.667h25.333v2.667z" fill="rgba(153,153,153,1)"></path>
+    </g>
+  </svg>

+ 6 - 0
assets/img/tabbarImg/item2a.svg

@@ -0,0 +1,6 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 32 32" width="72" height="72" style="" filter="none">
+    
+    <g>
+    <path d="M4 4h10.667v10.667h-10.667v-10.667zM4 17.333h10.667v10.667h-10.667v-10.667zM17.333 4h10.667v10.667h-10.667v-10.667zM17.333 17.333h10.667v10.667h-10.667v-10.667z" fill="rgba(22,119,255,1)"></path>
+    </g>
+  </svg>

+ 6 - 0
assets/img/tabbarImg/item2b.svg

@@ -0,0 +1,6 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 32 32" width="72" height="72" style="" filter="none">
+    
+    <g>
+    <path d="M4 4h10.667v10.667h-10.667v-10.667zM4 17.333h10.667v10.667h-10.667v-10.667zM17.333 4h10.667v10.667h-10.667v-10.667zM17.333 17.333h10.667v10.667h-10.667v-10.667z" fill="rgba(153,153,153,1)"></path>
+    </g>
+  </svg>

+ 6 - 0
assets/img/tabbarImg/item3a.svg

@@ -0,0 +1,6 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 32 32" width="72" height="72" style="" filter="none">
+    
+    <g>
+    <path d="M16.552 6.667h11.448c0.736 0 1.333 0.597 1.333 1.333v0 18.667c0 0.736-0.597 1.333-1.333 1.333v0h-24c-0.736 0-1.333-0.597-1.333-1.333v0-21.333c0-0.736 0.597-1.333 1.333-1.333v0h9.885l2.667 2.667zM16 17.333c1.841 0 3.333-1.492 3.333-3.333s-1.492-3.333-3.333-3.333v0c-1.841 0-3.333 1.492-3.333 3.333s1.492 3.333 3.333 3.333v0zM10.667 24h10.667c0-2.946-2.388-5.333-5.333-5.333s-5.333 2.388-5.333 5.333v0z" fill="rgba(22,119,255,1)"></path>
+    </g>
+  </svg>

+ 6 - 0
assets/img/tabbarImg/item3b.svg

@@ -0,0 +1,6 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 32 32" width="72" height="72" style="" filter="none">
+    
+    <g>
+    <path d="M16.552 6.667h11.448c0.736 0 1.333 0.597 1.333 1.333v0 18.667c0 0.736-0.597 1.333-1.333 1.333v0h-24c-0.736 0-1.333-0.597-1.333-1.333v0-21.333c0-0.736 0.597-1.333 1.333-1.333v0h9.885l2.667 2.667zM16 17.333c1.841 0 3.333-1.492 3.333-3.333s-1.492-3.333-3.333-3.333v0c-1.841 0-3.333 1.492-3.333 3.333s1.492 3.333 3.333 3.333v0zM10.667 24h10.667c0-2.946-2.388-5.333-5.333-5.333s-5.333 2.388-5.333 5.333v0z" fill="rgba(153,153,153,1)"></path>
+    </g>
+  </svg>

+ 6 - 0
assets/img/tabbarImg/item4a.svg

@@ -0,0 +1,6 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 32 32" width="72" height="72" style="" filter="none">
+    
+    <g>
+    <path d="M26.667 29.333h-21.333v-2.667c0-3.682 2.985-6.667 6.667-6.667v0h8c3.682 0 6.667 2.985 6.667 6.667v0 2.667zM16 17.333c-4.418 0-8-3.582-8-8s3.582-8 8-8v0c4.418 0 8 3.582 8 8s-3.582 8-8 8v0z" fill="rgba(22,119,255,1)"></path>
+    </g>
+  </svg>

+ 6 - 0
assets/img/tabbarImg/item4b.svg

@@ -0,0 +1,6 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 32 32" width="72" height="72" style="" filter="none">
+    
+    <g>
+    <path d="M26.667 29.333h-21.333v-2.667c0-3.682 2.985-6.667 6.667-6.667v0h8c3.682 0 6.667 2.985 6.667 6.667v0 2.667zM16 17.333c-4.418 0-8-3.582-8-8s3.582-8 8-8v0c4.418 0 8 3.582 8 8s-3.582 8-8 8v0z" fill="rgba(153,153,153,1)"></path>
+    </g>
+  </svg>

+ 6 - 6
components/Tabbar.vue

@@ -34,13 +34,13 @@
 						text: '主页 ',
 						pagePath: "/pages/index/index",
 					},
-					 {
-					 	iconPath: img4,
-					 	selectedIconPath: img3,
-					 	text: '地锁',
-					 	pagePath: "/pages/deviceTab/index",
+					 // {
+					 // 	iconPath: img4,
+					 // 	selectedIconPath: img3,
+					 // 	text: '地锁',
+					 // 	pagePath: "/pages/deviceTab/index",
 					 	
-					 },
+					 // },
 					// {
 					// 	iconPath: img6,
 					// 	selectedIconPath: img5,

+ 83 - 0
pages.json

@@ -77,6 +77,89 @@
 			{
 				"navigationBarTitleText" : ""
 			}
+		},
+		{
+			"path" : "pages/myTab/index",
+			"style" : 
+			{
+				"navigationBarTitleText" : ""
+			}
+		},{
+			"path" : "pages/myTab/myMessage",
+			"style" : 
+			{
+				"navigationBarTitleText" : ""
+			}
+		},
+		{
+			"path" : "pages/myTab/abnormalList",
+			"style" : 
+			{
+				"navigationBarTitleText" : ""
+			}
+		},
+		{
+			"path" : "pages/myTab/abnormalInfo",
+			"style" : 
+			{
+				"navigationBarTitleText" : ""
+			}
+		},
+		{
+			"path" : "pages/myTab/feedbackList",
+			"style" : 
+			{
+				"navigationBarTitleText" : ""
+			}
+		},
+		{
+			"path" : "pages/myTab/feedbackSubmit",
+			"style" : 
+			{
+				"navigationBarTitleText" : ""
+			}
+		},
+		{
+			"path" : "pages/myTab/customerService",
+			"style" : 
+			{
+				"navigationBarTitleText" : ""
+			}
+		},
+		{
+			"path" : "pages/myTab/changePassword",
+			"style" : 
+			{
+				"navigationBarTitleText" : ""
+			}
+		},
+		{
+			"path" : "pages/myTab/changePhone",
+			"style" : 
+			{
+				"navigationBarTitleText" : ""
+			}
+		},
+		{
+			"path" : "pages/myTab/dataUser",
+			"style" : 
+			{
+				"navigationBarTitleText" : ""
+			}
+		},
+		{
+			"path" : "pages/myTab/setting",
+			"style" : 
+			{
+				"navigationBarTitleText" : ""
+			}
+		},
+		{
+			"path" : "pages/myTab/cropImage",
+			"style" : 
+			{
+				"navigationBarTitleText" : ""
+			}
 		}
 	],
 

+ 10 - 2
pages/index/index.vue

@@ -239,7 +239,10 @@
 
 
 
-		<u-divider border-color="#CFD2D5">已经到底了</u-divider>
+		<u-divider border-color="#CFD2D5">已经到底了</u-divider>
+		
+		<tabbar :current="0"></tabbar>
+		
 	</view>
 </template>
 
@@ -247,9 +250,14 @@
 	import * as API from '@/apis/pagejs/index.js'
 
 	import * as echarts from 'echarts';
+	import Tabbar from '@/components/Tabbar.vue'
 
 
-	export default {
+	export default {
+		components: {
+			Tabbar,
+			
+		},
 		data() {
 			return {
 				echartsList: {},

+ 107 - 0
pages/myTab/abnormalInfo.vue

@@ -0,0 +1,107 @@
+<template>
+	<view>
+		<u-navbar title="异常告警记录"></u-navbar>
+		<view class="main">
+			<view class="line line1">
+				<view class="name">
+					告警单号:A100001
+
+				</view>
+				<view class="value value1">
+					电量过低
+				</view>
+			</view>
+			
+			<view class="line">
+				<view class="name">
+					告警地锁
+
+			
+				</view>
+				<view class="value">
+					荆鹏软件园-A01
+
+				</view>
+			</view>
+			<view class="line">
+				<view class="name">
+					告警内容
+
+			
+				</view>
+				<view class="value value2">
+					电量过低 <20%
+
+				</view>
+			</view>
+			<view class="line">
+				<view class="name">
+					地址
+
+			
+				</view>
+				<view class="value">
+					沙市区江津东路附155号
+
+				</view>
+			</view>
+			<view class="line">
+				<view class="name">
+					告警时间
+			
+				</view>
+				<view class="value">
+					2024-02-04 20:00:00
+
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				
+			}
+		},
+		methods: {
+			
+		}
+	}
+</script>
+
+<style scoped lang="scss">
+	.main{
+		background-color: rgba(255,255,255,1);
+		.line1{
+			box-shadow: 0px 2px 2px 0px rgba(0,0,0,0.1);
+		}
+		.line{
+			    display: flex;
+			    justify-content: space-between;
+			padding:11px 16px;
+			color: rgba(51,51,51,1);
+			font-size: 16px;
+			border-bottom: 1px solid rgba(242,242,242,1);
+			.value{
+				color: rgba(16,16,16,1);
+
+			}
+			.value1{
+				border-radius: 4px;
+				background-color: rgba(255,255,255,1);
+				color: rgba(255,61,0,1);
+				border: 1px solid rgba(255,61,0,1);
+				padding: 2px;
+				font-size: 12px;
+			
+			}
+			.value2{
+				color: rgba(255,61,0,1);
+
+			}
+		}
+	}
+</style>

+ 273 - 0
pages/myTab/abnormalList.vue

@@ -0,0 +1,273 @@
+<template>
+	<view>
+		<u-navbar title="异常告警记录"></u-navbar>
+		<view class="main">
+			<view class="tabs">
+				<u-picker v-model="tabsFrom.show1" :default-selector="[tabsFrom.show1Index]" mode="selector"
+					:range="tabsFrom.selector1" range-key="label" @confirm="selector1confirm"></u-picker>
+				<u-picker-select title="日期选择" v-model="tabsFrom.show2" :defaultTime="tabsFrom.show2Index"
+					:endYear="endYear" mode="time" :params="params" @confirm="selector2confirm"
+					@reset="selector2reset"></u-picker-select>
+
+				<view class="tabsItem" @click="tabsFrom.show1=!tabsFrom.show1">{{tabsFrom.show1Text}} <u-icon
+						name="arrow-up" v-if="tabsFrom.show1"></u-icon><u-icon v-else name="arrow-down"></u-icon></view>
+				<view class="tabsItem" @click="tabsFrom.show2=!tabsFrom.show2">{{tabsFrom.show2Text}} <u-icon
+						name="arrow-up" v-if="tabsFrom.show2"></u-icon><u-icon v-else name="arrow-down"></u-icon></view>
+
+				<view class="tabsItem" @click="tabsFrom.show3=!tabsFrom.show3">{{tabsFrom.show3Text}} <u-icon
+						name="arrow-up" v-if="tabsFrom.show3"></u-icon><u-icon v-else name="arrow-down"></u-icon></view>
+			</view>
+
+			<view class="list" v-if="0">
+				<view class="line" @click="gotoUrl('/pages/myTab/abnormalInfo?id=1')">
+					<view class="body">
+						<view class="imgclass">
+							<image class="img" src="@/assets/img/deviceTab/index2-1.svg" mode=""></image>
+						</view>
+						<view class="item">
+							<view class="name">
+								<view class="text1">软件园</view>
+								<view class="text2">私人地锁</view>
+							</view>
+							<view class="value">
+								<view class="text1">2024-02-14 09:00:01</view>
+								<view class="text2">私人地锁</view>
+							</view>
+						</view>
+					</view>
+					<view class="goto">
+
+						<u-icon name="arrow-right" size="24" color="#BBBBBB"></u-icon>
+					</view>
+				</view>
+				<view class="line" @click="gotoUrl('/pages/myTab/abnormalInfo?id=1')">
+					<view class="body">
+						<view class="imgclass">
+							<image class="img" src="@/assets/img/deviceTab/index2-1.svg" mode=""></image>
+						</view>
+						<view class="item">
+							<view class="name">
+								<view class="text1">软件园</view>
+								<view class="text2">私人地锁</view>
+							</view>
+							<view class="value">
+								<view class="text1">软件园</view>
+								<view class="text2">私人地锁</view>
+							</view>
+						</view>
+					</view>
+					<view class="goto">
+
+						<u-icon name="arrow-right" size="24" color="#BBBBBB"></u-icon>
+					</view>
+				</view>
+
+
+
+			</view>
+
+
+
+		</view>
+		<u-divider :isnone="list.length==0" nonetext="没有找到相关内容" border-color="#CFD2D5">已经到底了</u-divider>
+
+
+	</view>
+</template>
+
+<script>
+	import * as API from '@/apis/pagejs/deviceTab.js'
+
+
+	export default {
+
+		data() {
+			return {
+				title: "场站列表",
+				list: [],
+				listForm: {
+					pageIndex: 1,
+					pageSize: 20,
+					recordsTotal: 1,
+				},
+				tabsFrom: {
+					show1: false,
+					show1Index: 0,
+					show2Index: '',
+					show2: false,
+					show1Text: "全部场站",
+					show2Text: "全部类型",
+					show3Text: "全部状态",
+					selector1: [{
+							label: '全部类型',
+							value: '',
+						},
+						{
+							label: '线上充值',
+							value: '1',
+						},
+						{
+							label: '线下充值',
+							value: '2',
+						},
+					]
+				},
+			};
+		},
+		onLoad(op) {
+
+			this.getList()
+		},
+		onReachBottom() {
+			if (this.list.length < this.listForm.recordsTotal) {
+				this.myLoadmore();
+			}
+		},
+		methods: {
+
+			myLoadmore() {
+				this.listForm.pageIndex += 1;
+				this.getList()
+			},
+			getList() {
+				return
+				uni.showLoading({
+					title: "加载中",
+					mask: true,
+				})
+
+				API.floorlockList(this.listForm).then((res) => {
+					var list = []
+
+					if (this.listForm.pageIndex == 1) {
+						list = res.data.data;
+					} else {
+						list = [
+							...list,
+							...res.data.data
+						];
+					}
+					this.list = res.data.data
+					uni.hideLoading();
+
+				}).catch(error => {
+
+					uni.hideLoading();
+					uni.showToast({
+						title: error,
+						icon: "none"
+					})
+				})
+			},
+		}
+	}
+</script>
+
+<style scoped lang="scss">
+	.main {
+		background-color: #fff;
+
+		.line {
+			display: flex;
+			justify-content: space-between;
+			align-items: center;
+			padding: 32rpx;
+			border-bottom: 1px solid rgba(245, 245, 245, 1);
+
+			.goto {
+				margin-left: 16rpx;
+			}
+
+			.body {
+				display: flex;
+				align-items: center;
+				width: 100%;
+
+				.imgclass {
+					display: flex;
+					align-items: center;
+					justify-content: center;
+					width: 72rpx;
+					height: 72rpx;
+					border-radius: 4px;
+					background-color: rgba(219, 234, 255, 1);
+				}
+
+				.item {
+					margin-left: 16rpx;
+					width: 100%;
+
+					.name {
+						color: rgba(51, 51, 51, 1);
+						font-weight: bold;
+
+						font-size: 28rpx;
+						display: flex;
+						align-items: center;
+						justify-content: space-between;
+
+					}
+
+					.value {
+						color: rgba(119, 119, 119, 1);
+						font-size: 24rpx;
+						display: flex;
+						align-items: center;
+						justify-content: space-between;
+
+					}
+				}
+
+			}
+		}
+
+		.img {
+			width: 48rpx;
+			height: 48rpx;
+		}
+	}
+
+	.tabs {
+		border-bottom: 1px solid rgba(232, 232, 232, 1);
+		height: 96rpx;
+		line-height: 96rpx;
+		background-color: #fff;
+		border-top: 1px solid rgba(241, 241, 241, 1);
+		display: flex;
+		justify-content: space-around;
+
+		.tabsItem {
+			color: rgba(51, 51, 51, 1);
+			font-size: 14px;
+
+		}
+
+	}
+
+	.floating-button {
+		position: fixed;
+		bottom: 120rpx;
+		width: 100%;
+		display: flex;
+
+		justify-content: center;
+
+		.button {
+			border-radius: 50px;
+			background-color: rgba(49, 51, 52, 1);
+			color: rgba(255, 255, 255, 1);
+			font-size: 28rpx;
+			width: 240rpx;
+			display: flex;
+			align-items: center;
+			justify-content: center;
+			padding: 12rpx;
+
+			.img {
+				width: 40rpx;
+				height: 40rpx;
+				margin-right: 8rpx;
+			}
+		}
+	}
+</style>

+ 103 - 0
pages/myTab/changePassword.vue

@@ -0,0 +1,103 @@
+<template>
+	<view>
+		<u-navbar title="修改密码" title-color="#101010"></u-navbar>
+		<view class="main">
+			<view class="original-password">
+				<text>原密码	</text><u-input  v-model="form.oldPassword" style="padding: 0 0 0 20px" class="password-input" type="password"  placeholder="填写原密码" :password-icon="true" />
+			</view>
+			<view class="new-password">
+				<text>新密码</text><u-input  v-model="form.password" style="padding: 0 0 0 20px" class="password-input" type="password"  placeholder="创建6-16位组合新密码" :password-icon="true" />
+			</view>
+		</view>
+		<!-- 确认修改 -->
+		<button class="confirm" @click="changePassword">确认修改</button>
+	</view>
+</template>
+
+<script>
+	import * as API from '@/apis/pagejs/user.js'
+	
+	export default {
+		data() {
+			return {
+				form: {
+					oldPassword: '',
+					password: '',
+				},
+			}
+		},
+		methods: {
+			changePassword(){
+				
+				if (!this.form.oldPassword) {
+					uni.showToast({
+						title: "请输入原密码",
+						icon: "none"
+					})
+					return
+				}
+				
+				if (!this.form.password) {
+					uni.showToast({
+						title: "请输入新密码",
+						icon: "none"
+					})
+					return
+				}
+				uni.showLoading({
+					title: "加载中",
+					mask: true,
+				})
+				API.changePassword(this.form).then((response) => {
+					uni.hideLoading();
+					this.form.password=""
+					this.form.oldPassword=""
+					uni.showModal({
+						title:"提示",
+						content:"密码修改成功!",
+						showCancel:false
+					})
+					
+				}).catch(error => {
+					uni.showToast({
+						title: error,
+						icon: "none"
+					})
+				})
+				
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.main{
+		background-color: #fff;
+		margin-top: 24rpx;
+		.original-password,.new-password{
+			line-height: 96rpx;
+			padding:0 32rpx;
+			display: flex;
+			align-items: center;
+			border-bottom: 1px solid rgba(221,221,221,1);
+			::v-deep.u-input__input{
+				height: 96rpx;
+			}
+		}
+		text{
+			display: inline-block;
+			width: 128rpx;
+			color: rgba(51,51,51,1);
+			font-size: 32rpx;
+		}
+	}
+  // 确认修改
+  .confirm{
+	  border-radius: 8px;
+	  background-color: rgba(22,119,255,1);
+	  color: rgba(255,255,255,1);
+	  font-size: 32rpx;
+	  line-height: 88rpx;
+	  margin: 24rpx 32rpx;
+  }
+</style>

+ 198 - 0
pages/myTab/changePhone.vue

@@ -0,0 +1,198 @@
+<template>
+	<view>
+		<u-navbar title="修改手机号" title-color="#101010"></u-navbar>
+		<view class="main">
+			<view class="original-password">
+				<text>新手机号</text><u-input  v-model="form.telephone" style="padding: 0 0 0 20px"  maxlength="11" type="number"  placeholder="请填写新手机号"  />
+			</view>
+			<view class="new-password">
+				<text>验证码</text><u-input  v-model="form.verifyCode" style="padding: 0 0 0 20px" maxlength="6" type="number"  placeholder="6位验证码"  />
+				<text class="verification-code" :style="isCodeTipsColor ? 'color: #999999;' : ''" @click="getCode" >{{codeTips}}</text>
+			</view>
+			<u-verification-code :seconds="sendMsgSecond" ref="uCode" @change="codeChange" @end="end" @start="start"
+				change-text="(Xs)">
+			</u-verification-code>
+		</view>
+		<!-- 确认修改 -->
+		<button class="confirm" @click="changePhone">确认修改</button>
+	</view>
+</template>
+
+<script>
+	import * as API from '@/apis/pagejs/user.js'
+	
+	import {
+		checkPhone
+	} from '@/apis/utils'
+	
+	export default {
+		data() {
+			return {
+				form: {
+					telephone: '',
+					verifyCode: '',
+				},
+				isSendMsgIng: false,
+				isCodeTipsColor: false,
+				sendMsgSecond: 60,
+				codeTips: '',
+			}
+		},
+		onReady() {
+			var time = this.carhelp.get("getvcodetime");
+			if (time) {
+				//this.$refs.uCode.start();
+				var nowtime = new Date().getTime()
+				var differ = (nowtime - time) / 1000
+				if (differ < 2 * 60) {
+					this.sendMsgSecond = 2 * 60 - parseInt(differ)
+					this.isSendMsgIng = true;
+					this.$refs.uCode.start();
+					this.isCodeTipsColor = true;
+				}
+			}
+		},
+		methods: {
+			
+			changePhone() {
+				
+				var checkPhoneResult = checkPhone(this.form.telephone);
+				
+				if (!this.form.telephone || checkPhoneResult != true) {
+					uni.showToast({
+						title: checkPhoneResult,
+						icon: "none"
+					})
+					return;
+				}
+				if (!this.form.verifyCode) {
+					uni.showToast({
+						title: "请输入验证码",
+						icon: "none"
+					})
+					return
+				}
+				uni.showLoading({
+					title: "加载中",
+					mask: true,
+				})
+			
+				
+			
+				API.changePhone(this.form).then((response) => {
+					uni.hideLoading();
+					
+					this.carhelp.logoff()
+					uni.redirectTo({
+						url: '/pages/login/login'
+					})
+				}).catch(error => {
+					uni.showToast({
+						title: error,
+						icon: "none"
+					})
+				})
+			
+			},
+			codeChange(text) {
+				this.codeTips = text;
+			},
+			//倒计时
+			end() {
+				this.sendMsgSecond = 60;
+				this.isSendMsgIng = false;
+				this.isCodeTipsColor = false;
+			},
+			// 获取验证码
+			getCode() {
+				if (this.$refs.uCode.canGetCode) {} else {
+					uni.showToast({
+						title: '倒计时结束后再发送',
+						icon: "none"
+					})
+					return
+				}
+			
+				var checkPhoneResult = checkPhone(this.form.telephone);
+			
+				if (checkPhoneResult !== true) {
+					uni.showToast({
+						icon: "none",
+						title: checkPhoneResult,
+					})
+					return;
+				}
+				this.$refs.uCode.start();
+				this.isCodeTipsColor = true;
+			},
+			start() {
+				if (!this.isSendMsgIng) {
+					uni.showLoading({
+						title: "加载中",
+						mask: true,
+					})
+					API.getVerifyCode(this.form).then((response) => {
+						uni.hideLoading();
+						this.carhelp.set("getvcodetime", new Date().getTime());
+			
+						if (!"") {
+							//倒计时
+							uni.showToast({
+								icon: "none",
+								title: "发送成功"
+							})
+						} else {
+							uni.showToast({
+								icon: "none",
+								title: "您的验证码已经发送[5分钟有效],请勿重复点击"
+							})
+						}
+					}).catch(error => {
+						uni.showToast({
+							title: error,
+							icon: "none"
+						})
+					})
+				}
+			},
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.main{
+		background-color: #fff;
+		margin-top: 24rpx;
+		.original-password,.new-password{
+			line-height: 96rpx;
+			padding:0 32rpx;
+			display: flex;
+			align-items: center;
+			border-bottom: 1px solid rgba(221,221,221,1);
+			::v-deep.u-input__input{
+				height: 96rpx;
+			}
+			
+		}
+		text{
+			display: inline-block;
+			width: 128rpx;
+			color: rgba(51,51,51,1);
+			font-size: 32rpx;
+		}
+		.verification-code{
+			width: 160rpx;
+			color: rgba(22,119,255,1);
+			font-size: 32rpx;
+		}
+	}
+  // 确认修改
+  .confirm{
+	  border-radius: 8px;
+	  background-color: rgba(22,119,255,1);
+	  color: rgba(255,255,255,1);
+	  font-size: 32rpx;
+	  line-height: 88rpx;
+	  margin: 24rpx 32rpx;
+  }
+</style>

+ 38 - 0
pages/myTab/cropImage.vue

@@ -0,0 +1,38 @@
+<template>
+	<view class="content" >
+		<limeClipper :width="options.width" :scale-ratio="2" :is-lock-width="false" :is-lock-height="false" :height="options.height" :image-url="path"  
+			@success="successFn" @cancel="cancel"  />
+	</view>
+</template>
+<script>
+import limeClipper from '@/pages/myTab/as-components/limeClipper/limeClipper.vue';
+export default {
+	components: {limeClipper},
+	data() {return {path: '',options:{"width":600,"height":600}}},
+	onLoad({path,options}) {
+		this.path = path
+		//('path-path-path-path',path);
+		if(options){
+			this.options = JSON.parse(options)
+		}
+	},
+	methods:{
+		successFn(e){
+			this.getOpenerEventChannel().emit('success',e.url)
+			uni.navigateBack()
+		},
+		cancel(){
+			uni.navigateBack()
+		}
+	}
+}
+</script>
+
+<style>
+	.box{
+		width: 400rpx;
+	}
+	.mt{
+		margin-top: -10px;
+	}
+</style>

+ 153 - 0
pages/myTab/customerService.vue

@@ -0,0 +1,153 @@
+<template>
+	<view>
+		<u-navbar title="联系客服" title-color="#101010"></u-navbar>
+		<u-divider :isnone="queryList.length==0" nonetext="没有找到相关内容" border-color="#CFD2D5">已经到底了</u-divider>
+		<view class="background" v-if="false">
+			<view class="common-problem">
+				<view class="headline">
+					常见问题
+				</view>
+				<!-- 标签 -->
+				<view class="tabs">
+					<u-tabs :list="list" font-size="28" :is-scroll="false" :current="current" @change="change"></u-tabs>
+				</view>
+				<!-- 问题 -->
+				<view class="problems">
+					<u-collapse accordion="false">
+						<u-collapse-item :title="item.head" v-for="(item, index) in itemList" :open="item.open" :key="index">
+							{{item.body}}
+						</u-collapse-item>
+					</u-collapse>
+				</view>
+			</view>
+		</view>
+
+		<u-modal v-model="openModalBl" @confirm="confirmPhone" confirm-text="拨打电话" confirm-color="#606266"
+			:show-cancel-button="true" ref="uModal" :asyncClose="true" title="客服电话" :content="content"
+			:content-style="{fontSize: '24px',color: '#101010'}"></u-modal>
+
+		<!-- 底部 -->
+		<view class="bottom">
+			<button class="service" @click="openModalBl=true">
+				<view>
+					<u-icon name="server-fill"></u-icon>
+				</view>
+				客服电话(7:00-24:00)
+			</button>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				content: "400-8899-619",
+				
+				openModalBl: false,
+				queryList: [],
+				list: [{
+					name: '软件使用'
+				}, {
+					name: '地锁状态及参数'
+				}, {
+					name: '工单相关',
+
+				}],
+				itemList: [{
+					head: "常见问题1",
+					body: "只要我们正确择取一个合适的参照物乃至稍降一格去看待他人,值得赏识的东西便会扑面而来",
+					open: true,
+
+				}, {
+					head: "常见问题2",
+					body: "学会欣赏,实际是一种积极生活的态度,是生活的调味品,会在欣赏中发现生活的美",
+					open: false,
+				}, {
+					head: "常见问题3",
+					body: "但是据说雕刻大卫像所用的这块大理石,曾被多位雕刻家批评得一无是处,有些人认为这块大理石采凿得不好,有些人嫌它的纹路不够美",
+					open: false,
+				}],
+				current: 0
+			}
+		},
+		methods: {
+			confirmPhone() {
+				this.openModalBl = false;
+				uni.makePhoneCall({
+					phoneNumber: this.content //仅为示例
+				});
+			},
+			change(index) {
+				this.current = index;
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.background {
+		position: relative;
+		height: 200px;
+		background: linear-gradient(180deg, rgba(203, 234, 255, 1) 0%, rgba(203, 234, 255, 0) 100%);
+
+		.common-problem {
+			position: absolute;
+			top: 24rpx;
+			left: 32rpx;
+			right: 32rpx;
+			background-color: #fff;
+			border-radius: 8px;
+			padding: 40rpx 32rpx;
+
+			.headline {
+				color: rgba(16, 16, 16, 1);
+				font-size: 36rpx;
+			}
+
+			// 标签
+			.tabs {
+				border-top: 1px solid rgba(232, 232, 232, 1);
+				margin-top: 28rpx;
+				width: 522rpx;
+
+				::v-deep.u-tab-item {
+
+					font-size: 24rpx !important;
+				}
+			}
+
+			.problems {
+				margin-top: 8rpx;
+			}
+		}
+	}
+
+	// 底部
+	.bottom {
+		background-color: #fff;
+		position: fixed;
+		bottom: 0;
+		left: 0;
+		right: 0;
+		padding: 24rpx 32rpx;
+
+		.service {
+			display: flex;
+			justify-content: center;
+			align-items: center;
+
+			color: rgba(255, 255, 255, 1);
+			font-size: 32rpx;
+			border-radius: 50px;
+			background: linear-gradient(-88.46deg, rgba(34, 109, 198, 1) 2.59%, rgba(9, 158, 237, 1) 97.02%);
+		}
+
+		.img {
+			width: 40rpx;
+			height: 40rpx;
+			vertical-align: middle;
+			margin-right: 16rpx;
+		}
+	}
+</style>

+ 446 - 0
pages/myTab/dataUser.vue

@@ -0,0 +1,446 @@
+<template>
+	<view class="jpmain  ">
+		<u-navbar title="个人信息" title-color="#101010"></u-navbar>
+		
+		<u-popup v-model="showMessage" mode="bottom" border-radius="30" >
+			<view class="showMessage">
+				<view class="title">用户昵称</view>
+				<view class="body">
+					<u-input :customStyle="customStyle"
+					placeholder="请填写用户昵称"
+					  v-model="nickName"></u-input>
+				</view>
+				<view class="botton">
+					<u-button @click="showMessage=false"  style="width: 35%;"   shape="square" >取消</u-button>
+					
+					<u-button  @click="updateName" style="width: 60%;" type="primary"  shape="square" >确认</u-button>
+				</view>
+			</view>
+		</u-popup>
+		<u-keyboard ref="uKeyboard"  @change="valChange" @backspace="backspace"
+		:tips="carNumber?carNumber:'请输入车牌号'" @confirm="updateCarNumber()"
+		mode="car" v-model="showCarNumber"  :abc="abc" ></u-keyboard>
+		
+		
+		
+		
+		
+
+		<view class="body">
+			<view class="page">
+			
+				<view class="page-content">
+					<view class="item">
+						<view class="title">
+							头像
+						</view>
+						<view class="goto "  @click="uploadPhoto" >
+							<view class="photo">
+								
+								<img class="img" :src="userInfo.headImg" v-if="userInfo.headImg"  alt="">
+							</view>
+							
+							
+							<u-icon name="arrow-right"  style="margin-left: 8rpx;"  size="24" color="#BBBBBB"></u-icon>
+						</view>
+					</view>
+				
+				</view>
+			</view>
+			
+			<view class="page">
+
+				<view class="page-content">
+					<!-- <view class="item">
+						<view class="title">
+							用户昵称
+
+						</view>
+						<view class="goto" @click="showMessage=true,nickName=userInfo.nickName">
+							{{userInfo.nickName?userInfo.nickName:'未设置'}}
+							<u-icon name="arrow-right" style="margin-left: 8rpx;" size="24" color="#BBBBBB"></u-icon>
+						</view>
+					</view> -->
+					<view class="item">
+						<view class="title">
+							车牌号
+					
+						</view>
+						<view class="goto" @click="carNumberBtn">
+							{{userInfo.carNumber?userInfo.carNumber:'未设置'}}
+							<u-icon name="arrow-right" style="margin-left: 8rpx;" size="24" color="#BBBBBB"></u-icon>
+						</view>
+					</view>
+					<!-- <view class="item">
+						<view class="title">
+							手机号码
+						</view>
+						<view class="goto">
+							{{userInfo.phone}}
+						</view>
+					</view> -->
+				</view>
+			</view>
+			
+			<view class="page" @click="signOut">
+			
+				<view class="button">
+					退出账号
+				
+				</view>
+			</view>
+			
+			
+			<u-modal v-model="show1" @confirm="confirm" confirm-color="#FF3D00" :show-cancel-button="true" ref="uModal"
+				:asyncClose="true" title="退出账号" content="是否退出当前账号?" :content-style="{color: '#333333'}"></u-modal>
+			
+
+		</view>
+	</view>
+</template>
+
+<script>
+	import * as API from '@/apis/pagejs/index.js'
+	
+	export default {
+		components: {
+			
+		},
+		data() {
+			return {
+				userInfo:{
+					phone:"",
+					headImg:"",
+					carNumber:"",
+				},
+				showMessage:false,
+				showCarNumber:false,
+				carNumber:"",
+				nickName:"",
+				abc:false,
+				show1:false,
+				customStyle: {
+					"border-radius": "50px",
+					"background-color": 'rgba(242, 244, 246, 1)',
+					padding: "5px 20px",
+					margin: "5px 0 ",
+					
+				},
+				
+			}
+		},
+		onLoad() {
+			this.userInfo = this.jphelp.getPersonInfo()	
+		},
+		onReady() {
+			this.$refs.refLogin.findByOpenId()
+			
+		},
+		methods: {
+			signOut() {
+				this.show1 = true;
+			},
+			confirm() {
+				uni.showLoading({
+					title: "加载中",
+					mask: true,
+				})
+				userApi.logout().then((res) => {
+					uni.hideLoading();
+					this.show1 = false;
+					this.jphelp.logoff()
+					uni.redirectTo({
+						url: '/pages/login/login'
+					})
+				}).catch(error => {
+					uni.showToast({
+						title: error,
+						icon: "none"
+					})
+				})
+			},
+			carNumberBtn(){
+				 
+					this.showCarNumber=1;
+					this.carNumber=this.userInfo.carNumber;
+					if(!this.carNumber){
+						this.carNumber=""
+					}
+					this.valInit(1)
+			},
+		
+			valInit(bl){
+				if(bl){
+					this.abc=this.carNumber.length>0
+				}else{
+					if(this.carNumber.length==1&&this.abc==false){
+						this.abc=true
+					}
+					if(this.carNumber.length==0&&this.abc==true){
+						this.abc=false
+					}
+				}
+				
+			},
+			valChange(val){
+				
+				if(this.carNumber.length>=8){
+					return
+				}
+				this.carNumber+=val
+				this.valInit()
+				this.$forceUpdate()
+			},
+			backspace(){
+				//
+				var value=this.carNumber
+				if(value.length){
+					value = value.substr(0, value.length - 1);
+					
+				}
+				this.carNumber=value
+				this.valInit()
+				
+			
+			},
+			updateCarNumber(){
+				this.userInfo.carNumber=this.carNumber
+				this.showCarNumber=false;
+				this.updatePersonInformation()
+			},
+			
+			updateName(){
+				if(this.nickName){
+					this.userInfo.nickName=this.nickName
+					this.showMessage=false;
+					this.updatePersonInformation()
+				}else{
+					this.showMessage=true;
+					uni.showToast({
+						title: "用户昵称不能为空",
+						icon: "none"
+					})	
+				}
+				
+			},
+			updatePersonInformation(){
+				uni.showLoading({
+					title: "加载中",
+					mask: true,
+				})
+				if(!this.userInfo.nickName){
+					this.userInfo.nickName=""
+				}
+				if(!this.userInfo.headImg){
+					this.userInfo.headImg=""
+				}
+				if(!this.userInfo.carNumber){
+					this.userInfo.carNumber=""
+				}
+				var obj={
+					nickName:this.userInfo.nickName,
+					headImg:this.userInfo.headImg,
+					carNumber:this.userInfo.carNumber,
+				}
+				
+				API.updatePersonInformation(obj).then((res) => {
+					
+					uni.hideLoading();
+					this.$refs.refLogin.findByOpenId()
+				}).catch(error => {
+				
+					uni.hideLoading();
+					uni.showToast({
+						title: error,
+						icon: "none"
+					})		
+				})
+			},
+			findByOpenId(res){
+				this.userInfo = this.jphelp.getPersonInfo()	
+				
+			},
+			saveRecordConfirmMethod(fileData) {
+			
+				var token = this.jphelp.getToken()
+			
+				uni.uploadFile({
+					url: process.jphelp.BASE_URL + "uploadPicture", //仅为示例,非真实的接口地址
+					filePath:fileData,
+					header: {
+						'Authorization': token,
+						//'Content-Type': 'multipart/form-data',
+						'X-Requested-With': 'XMLHttpRequest',
+						//	'content-type': 'multipart/form-data'
+					},
+					name: 'photoFile',
+					formData: {
+						subFolder: "headimg"
+					},
+					success: (uploadFileRes) => {
+						
+						
+						var obj = JSON.parse(uploadFileRes.data)
+						//.log(obj);
+						//this.src = obj.data;
+						this.userInfo.headImg=obj.data;
+						this.updatePersonInformation();
+						// uni.hideLoading();
+					}
+				});
+			},
+			uploadPhoto() {
+				let _self = this;
+			
+				const crop = {
+					quality: 100,
+					width: 600,
+					height: 600,
+					resize: true
+				};
+			
+				// 上传图片
+				uni.chooseImage({
+					count: 1,
+					crop,
+					success: async (res) => {
+						//(res);
+						let tempFile = res.tempFiles[0];
+			
+						var filePath = res.tempFilePaths[0]
+			
+						let fileData = await new Promise((callback) => {
+							uni.navigateTo({
+								url: './cropImage?path=' + filePath +
+									`&options=${JSON.stringify(crop)}`,
+								animationType: "fade-in",
+								events: {
+									success: url => {
+										callback(url)
+									}
+								}
+							});
+						})
+			
+						this.saveRecordConfirmMethod(fileData);
+			
+			
+			
+			
+					}
+				});
+			},
+		}
+	}
+</script>
+<style>
+	page {
+		background-color: rgba(242, 244, 246, 1);
+	}
+</style>
+<style scoped lang="scss">
+	/* styles.css */
+	.showMessage{
+		padding: 40rpx 40rpx 60rpx 40rpx;
+		.carNumber {
+			background-color: #F2F4F6;
+			padding: 5px 20px;
+			margin: 5px 0 15px 0;
+			height: 90rpx;
+			display: flex;
+			align-items: center;
+			border-radius: 50px;
+			
+		}
+		.carNumber1{
+			color: #bcbcbc;
+		}
+		
+		
+		.title{
+			color: rgba(16,16,16,1);
+			font-size: 36rpx;
+			margin-top: 32rpx;
+			
+			font-weight: bold;
+		}
+		.body{
+			color: rgba(16,16,16,1);
+			font-size: 32rpx;
+			padding-bottom: 66rpx;
+		}
+		.botton{
+			    display: flex;
+				justify-content: space-between;
+		}
+	}
+
+	.body {
+		padding: 32rpx;
+	}
+
+
+
+	
+
+	.page {
+
+		border-radius: 16rpx;
+		background-color: rgba(255, 255, 255, 1);
+		color: rgba(16, 16, 16, 1);
+
+		padding:0 32rpx;
+		margin-bottom: 32rpx;
+		font-size: 32rpx;
+		color: rgb(16, 16, 16);
+
+		
+
+		.page-content {
+			.item:not(:last-child) {
+			  border-bottom:1px solid rgba(232,232,232,1);
+			}
+			.item {
+				padding: 32rpx 0;
+				display: flex;
+				justify-content: space-between;
+				align-items: center;
+				font-size: 32rpx;
+				.title {
+					display: flex;
+					justify-content: space-between;
+					display: flex;
+					align-items: center;
+					color: rgba(51,51,51,1);
+					
+					
+				}
+				.goto{
+					display: flex;
+					align-items: center;
+					color: rgba(119,119,119,1);
+					
+				}
+				.photo {
+					border-radius: 50px;
+					background-color: rgba(229, 229, 229, 1);
+					height: 80rpx;
+					width: 80rpx;
+					overflow: hidden;
+					  
+					.img {
+						width: 100%;
+						height: 100%;
+					}
+				}
+			}
+		}
+
+
+		.button{
+			text-align: center;
+			color: red;
+			    padding: 32rpx 0;
+		}
+	}
+</style>

+ 146 - 0
pages/myTab/feedbackList.vue

@@ -0,0 +1,146 @@
+<template>
+	<view>
+		<u-navbar title="反馈记录" title-color="#101010"></u-navbar>
+		<view class="record" v-if="0">
+			<view class="title">
+				<view class="classify">
+					功能异常
+				</view>
+				<view class="date">
+					2024-02-04 20:00:00
+				</view>
+			</view>
+			<view class="content">
+				在使用用电监控APP时,发现数据刷新偶有延迟,实时性不足;电量消耗统计与实际存在偏差,准确性有待提升。影响用户体验,建议优化性能并校准数据准确性。
+			</view>
+			
+			<view class="picture">
+				<!-- <image class="img" src="../../assets/img/feedbackPic.png"  mode=""></image> -->
+			</view>
+		</view>
+		<u-divider :isnone="list.length==0" nonetext="没有找到相关内容" border-color="#CFD2D5">已经到底了</u-divider>
+		
+		<!-- 底部 -->
+		<view class="bottom" v-if='0'>
+			<button class="fill-in">填写反馈</button>
+		</view>
+	</view>
+</template>
+
+<script>
+	
+	export default {
+	
+		data() {
+			return {
+				title: "场站列表",
+				list: [],
+				listForm: {
+					pageIndex: 1,
+					pageSize: 20,
+					recordsTotal: 1,
+				},
+				
+			};
+		},
+		onLoad(op) {
+	
+			this.getList()
+		},
+		onReachBottom() {
+			if (this.list.length < this.listForm.recordsTotal) {
+				this.myLoadmore();
+			}
+		},
+		methods: {
+	
+			myLoadmore() {
+				this.listForm.pageIndex += 1;
+				this.getList()
+			},
+			getList() {
+				return
+				uni.showLoading({
+					title: "加载中",
+					mask: true,
+				})
+	
+				API.floorlockList(this.listForm).then((res) => {
+					var list = []
+	
+					if (this.listForm.pageIndex == 1) {
+						list = res.data.data;
+					} else {
+						list = [
+							...list,
+							...res.data.data
+						];
+					}
+					this.list = res.data.data
+					uni.hideLoading();
+	
+				}).catch(error => {
+	
+					uni.hideLoading();
+					uni.showToast({
+						title: error,
+						icon: "none"
+					})
+				})
+			},
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.record{
+		margin-top: 24rpx;
+		background-color: #fff;
+		padding: 32rpx;
+		.title{
+			display: flex;
+			align-items: center;
+			justify-content: space-between;
+			.classify{
+				color: rgba(22,119,255,1);
+				font-size: 32rpx;
+			}
+			.date{
+				color: rgba(119,119,119,1);
+			}
+		}
+		.content{
+			color: rgba(51,51,51,1);
+			line-height: 44rpx;
+			margin-top: 16rpx;
+		}
+		.picture{
+			margin-top:24rpx;
+			display: flex;
+			justify-content: space-between;
+			.img{
+				width: 144rpx;
+				height: 144rpx;
+				border-radius: 4px;
+			}
+		}
+	}
+	// 底部
+	.bottom{
+		position: fixed;
+		left: 0;
+		right: 0;
+		bottom: 0;
+		background-color: #fff;
+		padding: 20rpx 32rpx;
+		.fill-in{
+			
+			line-height: 80rpx;
+			border-radius: 4px;
+			background-color: rgba(22,119,255,1);
+			color: rgba(255,255,255,1);
+			font-size: 32rpx;
+		}
+	}
+
+</style>

+ 130 - 0
pages/myTab/feedbackSubmit.vue

@@ -0,0 +1,130 @@
+<template>
+	<view>
+		<u-navbar title="意见反馈" title-color="#101010"></u-navbar>
+		<view class="main">
+			<view class="title">
+				<text>*</text>请选择反馈问题类型:
+			</view>
+			<!-- 类型 -->
+			<view class="classify">
+				<view class="classify-item item-checked">
+					功能异常
+				</view>
+				<view class="classify-item">
+					产品建议
+				</view>
+				<view class="classify-item">
+					安全问题
+				</view>
+				<view class="classify-item">
+					其他问题
+				</view>
+			</view>
+		</view>
+		<!-- 问题描述 -->
+		  <view class="main">
+		  	<view class="title">
+		  		问题描述(必填)
+		  	</view>
+			<view class="textarea">
+				<textarea placeholder="请填写15字以上描述,以便我们更好地为您提供帮助~" ></textarea>
+			</view>
+		  </view>
+		  <!-- 上传照片 -->
+		  <view class="main">
+		  	<view class="title">
+		  		上传图片(最多3张)
+		  	</view>
+			<view class="upload">
+					<u-upload  width="144" height="144" :action="action" :file-list="fileList" max-count="3" ></u-upload>
+			</view>
+		  </view>
+		  <!-- 底部 -->
+		  <view class="bottom">
+		  	<button class="submit">提交反馈</button>
+		  </view>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				
+			}
+		},
+		methods: {
+			
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.main{
+		background-color: #fff;
+		padding: 32rpx;
+		margin-bottom: 24rpx;
+		.title{
+			color: rgb(16,16,16);
+			font-size: 32rpx;
+			font-weight: bold;
+			text{
+				color: rgba(255,0,9,1);
+			}
+		}
+		// 类型
+		.classify{
+			display: flex;
+			align-items: center;
+			flex-wrap: wrap;
+			margin-top: 24rpx;
+			.classify-item{
+				padding:0 16rpx;
+				line-height: 66rpx;
+				margin-right: 16rpx;
+				margin-bottom: 16rpx;
+				border-radius: 4px;
+				background-color: rgba(255,255,255,1);
+				color: rgba(16, 16, 16, 1);
+				text-align: center;
+				border: 1px solid rgba(216,223,232,1);
+			}
+			.item-checked{
+				background-color: rgba(22,119,255,1);
+				color: rgba(255,255,255,1);
+			}
+		}
+		.textarea{
+			margin-top: 24rpx;
+			uni-textarea{
+				width: 100%;
+				height: 200rpx;
+			}
+			::v-deep.uni-textarea-placeholder{
+				color: #b2b2b2;
+				font-size: 32rpx;
+			}
+		}
+		.upload{
+			margin-top: 24rpx;
+		}
+	}
+	// 底部
+	.bottom{
+		position: fixed;
+		left: 0;
+		right: 0;
+		bottom: 0;
+		background-color: #fff;
+		padding: 20rpx 32rpx;
+		.submit{
+			
+			line-height: 80rpx;
+			border-radius: 4px;
+			background-color: rgba(22,119,255,1);
+			color: rgba(255,255,255,1);
+			font-size: 32rpx;
+		}
+	}
+
+</style>

+ 304 - 0
pages/myTab/index.vue

@@ -0,0 +1,304 @@
+<template>
+	<view>
+		<view class="gradient-header">
+			<view class="jpback">
+		
+			</view>
+		</view>
+		
+		<view class="body">
+		
+			<view class="page-top" >
+		
+				<view class="name">
+					<view class="photo">
+						<img class="img" :src="userInfo.headImg" v-if="userInfo.headImg" alt="">
+						<img class="img" src="@/assets/img/默认头像.png" v-else alt="">
+						
+						
+					</view>
+					<view class="text">
+						<view class="text1">{{userInfo.realName}}</view>
+						<view class="text2">{{userInfo.userName}}</view>
+					</view>
+				</view>
+				<view class="value">
+					<!-- <u-icon name="arrow-right" size="24" color="#fff"></u-icon> -->
+				</view>
+			</view>
+			<view class="page" v-if="0">
+				<view class="page-main">
+		
+					<view class="item"   @click="gotoUrl('/pages/mylock/myLock')" 
+					v-if="userInfoPlus&&userInfoPlus.myAllList" >
+						<view class="name">{{userInfoPlus.myAllList.length}}</view>
+						<view class="value">地锁</view>
+					</view>
+					<view class="item2">
+		
+					</view>
+					<view class="item"  @click="gotoUrl('/pages/mylock/myWhite')"  >
+						<view class="name">{{whiteNum}}</view>
+						<view class="value">白名单</view>
+					</view>
+		
+				</view>
+			</view>
+			<view class="page">
+		
+				<view class="page-content">
+					<view class="item" @click="gotoUrl('/pages/myTab/myMessage')" >
+						<view class="title">
+							<!-- <img class="img" src="@/assets/img/myTab/icon1.svg" alt=""> -->
+							<u-icon size="40" :marginLeft="12"  label-size="32"  name="chat" label="我的消息" ></u-icon>
+							
+						</view>
+						<view class="goto">
+							<u-icon name="arrow-right" size="24" color="#BBBBBB"></u-icon>
+						</view>
+					</view>
+					<view class="item" @click="gotoUrl('/pages/myTab/feedbackList')" >
+						<view class="title">
+							
+							<u-icon name="email"  size="40"  label-size="32"  :marginLeft="12" label="意见反馈"></u-icon>
+							
+						</view>
+						<view class="goto">
+							<u-icon name="arrow-right" size="24" color="#BBBBBB"></u-icon>
+						</view>
+					</view>
+					<view class="item" @click="gotoUrl('/pages/myTab/customerService')" >
+						<view class="title">
+						
+						<u-icon name="server-fill"  size="40"  label-size="32"  :marginLeft="12" label="客服热线"></u-icon>
+							
+						</view>
+						<view class="goto">
+							<u-icon name="arrow-right" size="24" color="#BBBBBB"></u-icon>
+						</view>
+					</view>
+					<view class="item" @click="gotoUrl('/pages/myTab/abnormalList')" >
+						<view class="title">
+						
+						<u-icon name="error-circle"  size="40" label-size="32" :marginLeft="12" label="异常告警"></u-icon>
+							
+						</view>
+						<view class="goto">
+							<u-icon name="arrow-right" size="24" color="#BBBBBB"></u-icon>
+						</view>
+					</view>
+					
+				</view>
+				</view>
+				<view class="page" @click="signOut">
+				
+					<view class="button">
+						退出账号
+					
+					</view>
+				</view>
+				
+				<u-modal v-model="show1" @confirm="confirm" confirm-color="#FF3D00" :show-cancel-button="true" ref="uModal"
+					:asyncClose="true" title="退出账号" content="是否退出当前账号?" :content-style="{color: '#333333'}"></u-modal>
+				
+				
+		
+		</view>
+		<tabbar :current="3"></tabbar>
+	</view>
+</template>
+
+<script>
+	import * as API from '@/apis/pagejs/user.js'
+	
+	import Tabbar from '@/components/Tabbar.vue'
+	export default {
+		components: {
+			Tabbar
+		},
+		data() {
+			return {
+				show1:false,
+				isReady:false,
+				userInfo:{},
+				userInfoPlus:{
+					whiteList:[],
+					myAllList:[]
+				},
+				whiteNum:0,
+			};
+		},
+		onLoad() {
+			this.userInfo=this.jphelp.getPersonInfo()
+			console.log(this.userInfo)
+		},
+		methods:{
+			signOut() {
+				this.show1 = true;
+			},
+			confirm() {
+				uni.showLoading({
+					title: "加载中",
+					mask: true,
+				})
+				API.logout().then((res) => {
+					uni.hideLoading();
+					this.show1 = false;
+					this.jphelp.logoff()
+					uni.redirectTo({
+						url: '/pages/login/login'
+					})
+				}).catch(error => {
+					uni.showToast({
+						title: error,
+						icon: "none"
+					})
+				})
+			},
+		}
+	}
+</script>
+
+<style lang="scss">
+	page {
+		background-color: rgba(242, 244, 246, 1);
+	}
+	.body {
+		padding: 32rpx;
+	}
+	
+	.gradient-header {
+		height: 0px;
+	}
+	
+	.jpback {
+		height: 268rpx;
+		background: linear-gradient(180deg, rgba(22, 119, 255, 1) 20%, rgba(121, 177, 255, 1) 100%);
+	}
+	
+	.page-top {
+	
+		color: #fff;
+		display: flex;
+		justify-content: space-between;
+		margin: 48rpx 0;
+	
+		.name {
+	
+			display: flex;
+			align-items: flex-end;
+	
+			.photo {
+				border-radius: 50px;
+				background-color: rgba(229, 229, 229, 1);
+				height: 100rpx;
+				width: 100rpx;
+				overflow: hidden;
+	
+				.img {
+					width: 100%;
+					height: 100%;
+				}
+			}
+	
+			.text {
+				margin-left: 24rpx;
+	
+				.text1 {
+					font-weight: bold;
+					font-size: 40rpx;
+				}
+	
+				.text2 {
+	
+					font-size: 32rpx;
+	
+				}
+			}
+	
+		}
+	
+		.value {
+			margin-top: 24rpx;
+			font-size: 40rpx;
+			font-weight: bold;
+			color: #333333;
+		}
+	}
+	
+	.page {
+	
+		border-radius: 16rpx;
+		background-color: rgba(255, 255, 255, 1);
+		color: rgba(16, 16, 16, 1);
+	
+		padding:0 32rpx;
+		margin-bottom: 32rpx;
+		font-size: 32rpx;
+		color: rgb(16, 16, 16);
+	
+		.page-main {
+			display: flex;
+			justify-content: space-around;
+			align-items: center;
+			padding:24rpx;
+			.item {
+				.name {
+					font-size: 56rpx;
+					color: #333333;
+					font-weight: bold;
+				}
+	
+				.value {
+					color: rgba(146, 146, 176, 1);
+					font-size: 32rpx;
+				}
+	
+				display: flex;
+				flex-direction: column;
+				align-items: center;
+	
+	
+			}
+	
+			.item2 {
+				border-right: 1px solid rgba(187, 187, 187, 0.43);
+				height: 70rpx;
+			}
+	
+		}
+	
+		.page-content {
+			.item:not(:last-child) {
+			  border-bottom:1px solid rgba(232,232,232,1);
+			}
+			.item {
+				padding: 46rpx 0;
+				display: flex;
+				justify-content: space-between;
+				align-items: center;
+	
+				.title {
+					display: flex;
+					justify-content: space-between;
+					display: flex;
+					align-items: center;
+					color: rgba(51,51,51,1);
+					.img {
+						width: 32rpx;
+						height: 32rpx;
+						
+						margin-right: 16rpx;
+					}
+				}
+			}
+		}
+	
+		.button{
+			text-align: center;
+			color: red;
+			    padding: 32rpx 0;
+		}
+	
+	}
+</style>

+ 215 - 0
pages/myTab/myMessage.vue

@@ -0,0 +1,215 @@
+<template>
+	<view>
+		<u-navbar title="我的消息" ></u-navbar>
+		<view class="main"  v-if="0">
+			<view class="line">
+				<view class="imgc img1">
+					<img class="img" src="@/assets/img/myTab/message1.svg">
+				</view>
+				<view class="text">
+					<view class="info"> 
+						<view class="title">
+							故障告警
+
+						</view>
+						<view class="date">
+							02-02
+
+						</view>
+					</view>
+					<view class="message">
+						A01车位地锁于2025-02-02 23:00:01离线断网...
+
+					</view>
+				</view>
+			</view>
+			<view class="line">
+				<view class="imgc img2">
+					<img class="img" src="@/assets/img/myTab/message2.svg">
+				</view>
+				<view class="text">
+					<view class="info"> 
+						<view class="title">
+							故障告警
+			
+						</view>
+						<view class="date">
+							02-02
+			
+						</view>
+					</view>
+					<view class="message">
+						A01车位地锁于2025-02-02 23:00:01离线断网...
+			
+					</view>
+				</view>
+			</view>
+			<view class="line">
+				<view class="imgc img3">
+					<img class="img" src="@/assets/img/myTab/message3.svg">
+				</view>
+				<view class="text">
+					<view class="info"> 
+						<view class="title">
+							故障告警
+			
+						</view>
+						<view class="date">
+							02-02
+			
+						</view>
+					</view>
+					<view class="message">
+						A01车位地锁于2025-02-02 23:00:01离线断网...
+			
+					</view>
+				</view>
+			</view>
+			<view class="line">
+				<view class="imgc img4">
+					<img class="img" src="@/assets/img/myTab/message4.svg">
+				</view>
+				<view class="text">
+					<view class="info"> 
+						<view class="title">
+							故障告警
+			
+						</view>
+						<view class="date">
+							02-02
+			
+						</view>
+					</view>
+					<view class="message">
+						A01车位地锁于2025-02-02 23:00:01离线断网...
+			
+					</view>
+				</view>
+			</view>
+			
+		</view>
+		<u-divider :isnone="list.length==0" nonetext="没有找到相关内容" border-color="#CFD2D5">已经到底了</u-divider>
+		
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				list: [],
+				listForm: {
+					pageIndex: 1,
+					pageSize: 20,
+					recordsTotal: 1,
+				},
+			};
+		},
+		onLoad(op) {
+
+			this.getList()
+		},
+		onReachBottom() {
+			if (this.list.length < this.listForm.recordsTotal) {
+				this.myLoadmore();
+			}
+		},
+		methods: {
+		
+			myLoadmore() {
+				this.listForm.pageIndex += 1;
+				this.getList()
+			},
+			getList() {
+				return
+				uni.showLoading({
+					title: "加载中",
+					mask: true,
+				})
+		
+				API.floorlockList(this.listForm).then((res) => {
+					var list = []
+		
+					if (this.listForm.pageIndex == 1) {
+						list = res.data.data;
+					} else {
+						list = [
+							...list,
+							...res.data.data
+						];
+					}
+					this.list = res.data.data
+					uni.hideLoading();
+		
+				}).catch(error => {
+		
+					uni.hideLoading();
+					uni.showToast({
+						title: error,
+						icon: "none"
+					})
+				})
+			},
+		}
+	}
+</script>
+
+<style lang="scss">
+	.main{
+		
+		.line{
+			background-color: rgba(255,255,255,1);
+			border-top: 1px solid  rgba(232,232,232,1);
+			    display: flex;
+			    align-items: center;
+				padding:16px;
+				
+				.text{
+					  .info{
+						  display: flex;
+						  justify-content: space-between;
+						  .title{
+						  
+						  	color: rgba(16,16,16,1);
+						  	font-size: 16px;
+						  font-weight: bold;
+						  }
+						  .date{
+						  	color: rgb(140,140,140);
+						  	font-size: 12px;
+						  }
+						  margin-bottom:  4px;
+					  } 
+					
+				}
+				.message{
+					color: rgba(51,51,51,1);
+					font-size: 12px;
+				}
+				.imgc{
+					display: flex;
+					align-items: center;
+					    justify-content: center;
+					border-radius: 12px;
+					margin-right: 8px;
+					width: 48px;
+					height: 48px;
+					.img{
+						width: 28px;
+						height: 28px;
+					}
+					
+
+				}
+				.img1{
+					background: linear-gradient(180.29deg, rgba(255,214,125,1) 0.9%,rgba(255,150,0,1) 100.4%);
+				}
+				.img2{
+				background: linear-gradient(180.29deg, rgba(255,124,112,1) 0.9%,rgba(255,79,63,1) 100.4%);}
+				.img3{
+				background: linear-gradient(179.2deg, rgba(168,178,238,1) 6.28%,rgba(123,123,240,1) 96.94%);}
+				.img4{
+				background: linear-gradient(180deg, rgba(121,172,255,1) 0%,rgba(57,132,255,1) 100%);}
+		}
+	}
+</style>

+ 92 - 0
pages/myTab/setting.vue

@@ -0,0 +1,92 @@
+<template>
+	<view>
+		<u-navbar title="设置" title-color="#101010"></u-navbar>
+		<u-cell-group>
+			<!-- <u-cell-item title="个人信息" @click="gotoUrl('/pages/mine/personInfos')"></u-cell-item> -->
+			<u-cell-item title="修改密码" @click="gotoUrl('/pages/mine/changePassword')"></u-cell-item>
+			<u-cell-item title="修改手机号" :value="personInfo.phone" @click="gotoUrl('/pages/mine/changePhone')"></u-cell-item>
+			<u-cell-item title="注销账号" @click="gotoUrl('/pages/mine/cancelAccount')"></u-cell-item>
+		</u-cell-group>
+
+		<view class="exit" @click="signOut">
+			退出账号
+		</view>
+
+		<u-modal v-model="show1" @confirm="confirm" confirm-color="#FF3D00" :show-cancel-button="true" ref="uModal"
+			:asyncClose="true" title="退出账号" content="是否退出当前账号?" :content-style="{color: '#333333'}"></u-modal>
+
+	</view>
+
+
+</template>
+
+<script>
+	import * as userApi from '@/apis/pagejs/user.js'
+	// import * as API from '@/apis/pagejs/index.js'
+
+	export default {
+		data() {
+			return {
+				personInfo: {},
+				show1: false,
+			}
+		},
+		onLoad() {
+			if(this.carhelp.getPersonInfoPlus()) {
+				var data = this.carhelp.getPersonInfoPlus();
+				this.personInfo = data.regUser;
+				if(this.personInfo.phone != null) {
+					var phone = this.personInfo.phone;
+					phone = phone.slice(0,3) + '****' + phone.slice(-4);
+					this.personInfo.phone = phone;
+				}
+			}
+			//this.homePage()
+		},
+		methods: {
+			signOut() {
+				this.show1 = true;
+			},
+			confirm() {
+				uni.showLoading({
+					title: "加载中",
+					mask: true,
+				})
+				userApi.logout().then((res) => {
+					uni.hideLoading();
+					this.show1 = false;
+					this.carhelp.logoff()
+					uni.redirectTo({
+						url: '/pages/login/login'
+					})
+				}).catch(error => {
+					uni.showToast({
+						title: error,
+						icon: "none"
+					})
+				})
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	::v-deep.u-cell_title {
+		color: rgba(51, 51, 51, 1);
+	}
+
+	::v-deep.u-cell__value {
+		color: #777777;
+	}
+
+	;
+
+	.exit {
+		background-color: #fff;
+		margin: 24rpx 0 0 0;
+		text-align: center;
+		line-height: 96rpx;
+		color: rgba(238, 49, 56, 1);
+		font-size: 32rpx;
+	}
+</style>