From 8e5fb21a2bf621291c1ceee396c01e3d42553511 Mon Sep 17 00:00:00 2001
From: web <candymxq888@outlook.com>
Date: 星期四, 03 七月 2025 17:23:23 +0800
Subject: [PATCH] 修改首页,添加记录

---
 pages/record/chongzhi.vue      |   95 +++++++
 static/images/facilityImg.svg  |    1 
 pages/device/index.vue         |  214 ++++++++++++++++-
 pages/user/index.vue           |   24 +
 pages.json                     |    5 
 pages/userSet/index.vue        |  120 ++++++++++
 static/images/default-head.png |    0 
 App.vue                        |   10 
 /dev/null                      |   12 -
 pages/record/qushui.vue        |   87 +++++++
 static/images/icon-point.svg   |    1 
 api/index.js                   |   27 ++
 pages/index/index.vue          |   84 ++++--
 13 files changed, 611 insertions(+), 69 deletions(-)

diff --git a/App.vue b/App.vue
index 2208e81..4f96dce 100644
--- a/App.vue
+++ b/App.vue
@@ -2,11 +2,11 @@
 	export default {
 		onLaunch: function() {
 			console.log('App Launch')
-			if(!uni.getStorageSync('openId') || !uni.getStorageSync('token')){
-				uni.redirectTo({
-					url:'/pages/login/index'
-				}) 
-			}
+			// if(!uni.getStorageSync('openId') || !uni.getStorageSync('token')){
+			// 	uni.redirectTo({
+			// 		url:'/pages/login/index'
+			// 	}) 
+			// }
 		},
 		onShow: function() {
 			console.log('App Show')
diff --git a/api/index.js b/api/index.js
index 1d996ca..2273148 100644
--- a/api/index.js
+++ b/api/index.js
@@ -5,12 +5,37 @@
 	return request('/user/wxLogin',data,'POST')
 }
 
+// 用户信息
+export function getUserInfo(){
+	return request('/api/user/getUser',{},'GET')
+}
+
+// 修改用户信息
+export function setUserInfo(data){
+	return request('/api/user/editUser',data,'POST')
+}
+
 //微信支付
 export function wxPayApi(data){
 	return request('/pay/service/wxPay',data,'POST')
 }
 
-//水卡充值
+//水卡充值*
 export function rechargeApi(data){
 	return request('/rechargeRecords/fees',data,'POST')
+}
+
+// 设备列表
+export function getFacitily(data) {
+	return request('/api/user/searchFacility', data, 'POST')
+}
+
+// 取水记录
+export function getqushuiRecord(data) {
+	return request('/api/user/searchPaymentRecords', data, 'POST')
+}
+
+// 充值记录
+export function getrechargeRecord(data) {
+	return request('/api/user/searchRechargeRecords', data, 'POST')
 }
\ No newline at end of file
diff --git a/pages.json b/pages.json
index 674c215..6250aec 100644
--- a/pages.json
+++ b/pages.json
@@ -3,10 +3,10 @@
 		{"path": "pages/index/index"},
 		{"path": "pages/login/index"},
 		{"path": "pages/user/index"},
+		{"path": "pages/userSet/index"},
 		{"path": "pages/device/index"},
 		{"path": "pages/recharge/index"},
 		{"path": "pages/record/qushui"},
-		{"path": "pages/record/shuiliang"},
 		{"path": "pages/record/chongzhi"}
 	],
 	"tabBar": {
@@ -30,6 +30,7 @@
 	"globalStyle": {
 		"navigationBarTextStyle": "black",
 		"navigationBarBackgroundColor": "#F8F8F8",
-		"navigationStyle": "custom"
+		"navigationStyle": "custom",
+		"onReachBottomDistance": 100
 	}
 }
diff --git a/pages/device/index.vue b/pages/device/index.vue
index 75b83c5..52aab37 100644
--- a/pages/device/index.vue
+++ b/pages/device/index.vue
@@ -1,33 +1,223 @@
 <template>
 	<view class="device">
 		<Navbar title="设备列表"></Navbar>
+		<view class="content">
+			<view class="list">
+				<block v-for="(item,index) in facitilyList" :key="index">
+					<view class="item">
+						<view class="item-img">
+							<image v-if="item.facilityUrl" :src="BASE_URL + '/upload' + item.facilityUrl" alt='' mode="aspectFit"></image>
+							<image v-else src="../../static/images/facilityImg.svg" alt='' mode="aspectFit"></image>
+						</view>
+						<view class="item-info">
+							<view class="info-name">
+								<view class="name">{{item.facilityName}}</view>
+								<view class="btn" @click="handleQushui(item.id)">取水</view>
+							</view>
+							<view class="info-addr" @click="openMap(item.lat,item.lon)">
+								<text class="addr-text">地址:{{item.address}}</text>
+								<view>
+									<image src="../../static/images/icon-point.svg" alt=''></image>
+									<text>{{item.distanceValue}}km</text>
+								</view>
+							</view>
+						</view>
+					</view>
+				</block>
+			</view>
+		</view>
+		<uni-popup ref="qushuiDialog" type="dialog">
+			<uni-popup-dialog type="info" cancelText="取消" confirmText="确认" title="请输入取水量" 
+				@confirm="dialogConfirm"
+				@close="dialogClose"
+			>
+				<view>
+					<input v-model="qushuiNum" placeholder="请输入取水量(L)" />
+				</view>
+			</uni-popup-dialog>
+		</uni-popup>
 	</view>
 </template>
 
 <script setup>
 	import{ ref, onMounted } from 'vue'
 	import Navbar from '../../components/navbar/navbar.vue'
+	import { getFacitily } from '@/api/index.js'
+	import { BASE_URL } from '../../config/index.js'
 	
 	const userLocation = ref()
+	const facitilyList = ref([])
+	const qushuiDialog = ref()
+	const facitilyId = ref()
+	const qushuiNum = ref()
 	
+	const getFacitilyList = () => {
+		const data = {
+			longitude: userLocation.value?.lon,
+			latitude: userLocation.value?.lat,
+			limit: 100,
+			page: 1
+		}
+		getFacitily(data).then(res => {
+			if(res.code === 200) {
+				facitilyList.value = res.data.list
+			}
+		})
+	}
 	
-	// 根据经纬度计算距离,根据经纬度计算距离,参数分别为第一点的纬度,经度(用户);第二点的纬度,经度(设备)
-	const getDistances = (lat1, lon1, lat2, lon2) => {
-		let EARTH_RADIUS = 6378.137;// 地球半径
-		let radLat1 = lat1 * Math.PI / 180.0; //lat1 * Math.PI / 180.0=>弧度计算
-		let radLat2 = lat2 * Math.PI / 180.0;
-		let a = radLat1 - radLat2;
-		let b = lon1 * Math.PI / 180.0 - lon2 * Math.PI / 180.0;
-		let s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) + Math.cos(radLat1) * Math.cos(radLat2) * Math.pow(Math.sin(b / 2), 2)));
-		s = s * EARTH_RADIUS; 
-		s = Math.round(s * 10000) / 10000;// 输出为公里
-		return { m: s * 1000, km: Number(s.toFixed(2)) }
+	// 取水
+	const handleQushui = (id) => {
+		facitilyId.value = id
+		qushuiDialog.value.open()
+	}
+	
+	// 取消
+	const dialogClose = () => {
+		facitilyId.value = ''
+		qushuiNum.value = ''
+	}
+	
+	// 确认
+	const dialogConfirm = () => {
+		
+	}
+	
+	//打开地图导航
+	const openMap = (lat,lon) => {
+		uni.openLocation({
+			latitude: parseFloat(lat),
+			longitude: parseFloat(lon),
+			scale:18
+		})
+	}
+	
+	//获取用户位置并存储
+	const storageLocation = () => {
+		uni.getLocation({
+			type:'gcj02',
+			isHighAccuracy:true,
+			success:(res) =>{
+				userLocation.value = {
+					lat: res.latitude,
+					lon: res.longitude
+				}
+				uni.setStorageSync('userLocation',JSON.stringify(userLocation.value))
+			},
+			fail:(err) =>{
+				locationToast()
+			}
+		})
+	}
+	//用户拒绝授权
+	const locationToast = () => {
+		uni.showModal({
+			title: "请求授权当前位置",
+			content: "请求获取您的位置,加载附近饮水设备信息!",
+			confirmText: "前往设置",
+			success: (res) => {
+				if (res.confirm) {
+					uni.openSetting({
+						 success:(res1) =>{ //打开设置成功
+							if (res1.authSetting['scope.userLocation']){
+								setTimeout(() =>{
+									storageLocation()
+								},1000)
+							}
+						},
+					})
+				}else{
+					uni.showToast({
+						title: '请先授权!',
+						duration: 2000,
+						icon:'none'
+					});
+				}
+			},
+		});
 	}
 	
 	onMounted(() => {
-		userLocation.value = JSON.parse(uni.getStorageSync('userLocation'))
+		const location = uni.getStorageSync('userLocation')
+		if(location) {
+			userLocation.value = JSON.parse(location)
+			getFacitilyList()
+		}else{
+			locationToast()
+		}
 	})
 </script>
 
 <style lang="scss" scoped>
+	.content{
+		width: 100%;
+		height:calc(100vh - 176rpx);
+		background:linear-gradient(to top,#FFFFFF,#E8EFFF);
+		padding:32rpx 32rpx 100rpx;
+		box-sizing: border-box;
+		.list{
+			width:100%;
+			height:100%;
+			overflow: scroll;
+			// background-color: #f1ffef;
+			.item{
+				height:200rpx;
+				width:100%;
+				background-color: #FFFFFF;
+				border-radius: 24rpx;
+				padding:0 20rpx;
+				margin-bottom:20rpx;
+				box-sizing: border-box;
+				display: flex;
+				align-items:center;
+				.item-img{
+					image{
+						width:130rpx;
+						height: 130rpx;
+					}
+				}
+				.item-info{
+					display: flex;
+					flex-direction: column;
+					margin-left:20rpx;
+					justify-content: space-between;
+					.info-name{
+						color:#222c35;
+						display: flex;
+						justify-content: space-between;
+						align-items: center;
+						.btn{
+							padding: 10rpx 20rpx;
+							background-color: $uni-primary;
+							border-radius: 10rpx;
+							color: #fff;
+						}
+					}
+					.info-addr{
+						display: flex;
+						justify-content: space-between;
+						align-items:center;
+						.addr-text{
+							width:340rpx;
+							height:80rpx;
+							color: #6a6e75;
+							font-size:26rpx;
+						}
+						view{
+							display: flex;
+							justify-content: space-between;
+							align-items:center;
+							image{
+								width:50rpx;
+								height:50rpx;
+							}
+							text{
+								color: #6a6e75;
+								font-size:26rpx;
+							}
+						}
+					}
+				}
+			}
+		}
+	}
 </style>
\ No newline at end of file
diff --git a/pages/index/index.vue b/pages/index/index.vue
index dcec281..c1abbf2 100644
--- a/pages/index/index.vue
+++ b/pages/index/index.vue
@@ -1,26 +1,30 @@
 <template>
 	<view class="container" :style="{paddingTop:topHeight + 'rpx'}">
 		<view class="content">
-			<view class="user">
+<!-- 			<view class="user">
 				<view class="userImg">
 					<image src="/static/images/login/wx.png" mode="widthFix"></image>
 				</view>
 				<view class="info">
 					<text class="name">张三</text>
 				</view>
-			</view>
+			</view> -->
 			<view class="card">
-				<view class="water">
-					<text>水量:</text>
-					<text>750m³</text>
+				<view class="water item">
+					<text>剩余水量:</text>
+					<text>{{userInfo?.balance}}m³</text>
+				</view>
+				<view class="by item">
+					<text>总购水量:</text>
+					<text>{{userInfo?.sumBuyCount}}m³</text>
+				</view>
+				<view class="all item">
+					<text>累计水量:</text>
+					<text>{{userInfo?.sumUseCount}}m³</text>
 				</view>
 				<view class="btn">
 					<button type="primary" @click="handleNav('/pages/recharge/index')">充值</button>
 				</view>
-			</view>
-			<view class="near" @click="handleNav('/pages/device/index')">
-				<image src="/static/images/address.png" mode="widthFix"></image>
-				<text>附近设备</text>
 			</view>
 			<view class="domain">
 				<view class="t">功能列表</view>
@@ -29,19 +33,15 @@
 						<image src="/static/images/qushui.png"></image>
 						<view>取水记录</view>
 					</view>
-					<view class="item" @click="handleNav('/pages/record/shuiliang')">
-						<image src="/static/images/shuiliang.png"></image>
-						<view>水量记录</view>
-					</view>
 					<view class="item" @click="handleNav('/pages/record/chongzhi')">
 						<image src="/static/images/chongzhi.png"></image>
 						<view>充值记录</view>
 					</view>
-					<view class="item" @click="handleNav()">
-						<image src="/static/images/kefu.png"></image>
-						<view>联系客服</view>
-					</view>
 				</view>
+			</view>
+			<view class="near" @click="handleNav('/pages/device/index')">
+				<image src="/static/images/address.png" mode="widthFix"></image>
+				<text>附近设备</text>
 			</view>
 		</view>
 	</view>
@@ -50,8 +50,10 @@
 <script setup>
     import { onMounted, ref } from "vue";
 	import { BASE_URL } from '../../config/index.js';
+	import { getUserInfo } from '@/api/index.js'
 	
 	const topHeight = ref(0)
+	const userInfo = ref()
 	let userLocation = {
 		lat:'',
 		lon:'',
@@ -74,6 +76,16 @@
 		}
 		uni.navigateTo({
 			url: url
+		})
+	}
+	
+	// 获取用户信息
+	const getUserDatail = () => {
+		getUserInfo().then(res => {
+			if(res.code == 200){
+				userInfo.value = res.data
+				uni.setStorageSync('userInfo',JSON.stringify(res.data))
+			}
 		})
 	}
 	
@@ -133,6 +145,8 @@
 	}
 	onMounted(() => {
 		getTopHeight()
+		getUserDatail()
+		// 获取位置信息
 		getUserLocation()
 	})
 </script>
@@ -172,23 +186,26 @@
 			background-size: 100% 100%;
 			margin-top: 40rpx;
 			color: #fff;
-			font-size: 60rpx;
+			font-size: 40rpx;
 			padding: 0 30rpx;
 			box-sizing: border-box;
 			position: relative;
-			.water{
-				width: 100%;
-				padding: 20rpx 0;
-				word-break: break-all;
-				display: -webkit-box;
-				-webkit-box-orient: vertical;
-				-webkit-line-clamp: 2;
+			.item{
+				padding: 15rpx 0;
 				overflow: hidden;
+				text-overflow: ellipsis;
+				white-space: nowrap;
+			}
+			.water .by{
+				width: 100%;
+			}
+			.all{
+				width: 68%;
 			}
 			.btn{
 				position: absolute;
 				right: 30rpx;
-				bottom: 50rpx;
+				bottom: 30rpx;
 				button{
 					width: 200rpx;
 					height: 80rpx;
@@ -216,19 +233,24 @@
 		}
 		.domain{
 			margin-top: 40rpx;
+			.t{
+				padding: 0 20rpx;
+			}
 			.c{
 				margin-top: 20rpx;
 				height: 180rpx;
-				background: #FFFFFF;
-				box-shadow: 0 0 12rpx 0 rgba(13,118,255,0.0608);
-				border: 2rpx solid #D6ECFF;
-				border-radius: 20rpx;
-				padding: 20rpx 40rpx;
+				padding: 0 20rpx;
 				display: flex;
 				align-items: center;
 				justify-content: space-between;
 				.item{
+					width: 30%;
 					text-align: center;
+					background: #FFFFFF;
+					box-shadow: 0 0 12rpx 0 rgba(13,118,255,0.0608);
+					border: 2rpx solid #D6ECFF;
+					border-radius: 20rpx;
+					padding: 20rpx 30rpx;
 					image{
 						width: 100rpx;
 						height: 100rpx;
diff --git a/pages/record/chongzhi.vue b/pages/record/chongzhi.vue
index 8820e3a..238b031 100644
--- a/pages/record/chongzhi.vue
+++ b/pages/record/chongzhi.vue
@@ -1,12 +1,105 @@
 <template>
-	<view class="device">
+	<view class="record">
 		<Navbar title="充值记录"></Navbar>
+		<view class="header">
+			<uni-data-select
+				v-model="dateType"
+				:localdata="dataTypeOption"
+				@change="changeTime"
+				:clear="false"
+			/>
+		</view>
+		<view class="chongzhi">
+			<view class="item" v-for="(item, index) in list" :key="index">
+				<vie class="info">
+					<view>充值金额:<text class="val">{{item.rechargeAmount}}</text>元</view>
+					<view>充值水量:<text class="val">{{item.rechargeWater}}</text>m³</view>
+				</vie>
+				<view class="status">
+					<view v-if="item.rechargeStatus === 1" style="color: #19d60b;">已充值</view>
+					<view v-else style="color: #818181;">未充值</view>
+				</view>
+				<view class="tm">{{item.createTimeView}}</view>
+			</view>
+		</view>
 	</view>
 </template>
 
 <script setup>
+	import {ref, onMounted} from 'vue'
 	import Navbar from '../../components/navbar/navbar.vue'
+	import {getrechargeRecord} from '@/api/index.js'
+	import { onReachBottom } from '@dcloudio/uni-app';
+	
+	const list = ref([])
+	const page = ref(1)
+	const dateType = ref(0)
+	
+	const dataTypeOption = [
+		{ text: '全部', value: 0 },
+		{ text: '本日', value: 1 },
+		{ text: '本周', value: 2 },
+		{ text: '本月', value: 3 },
+		{ text: '本年', value: 4 }
+	]
+	
+	const getData = () => {
+		const data = {
+			dateType: dateType.value,
+			limit: 10,
+			page: page.value
+		}
+		getrechargeRecord(data).then(res => {
+			if(res.code === 200) {
+				list.value = res.data.list
+			}
+		})
+	}
+	
+	// 选择时间
+	const changeTime = () => {
+		page.value = 1
+		getData()
+	}
+	
+	// 触底加载数据
+	onReachBottom(() => {
+		page.value ++
+		getData()
+	})
+	
+	onMounted(() => {
+		getData()
+	})
 </script>
 
 <style lang="scss" scoped>
+	.chongzhi{
+		padding: 0 20rpx;
+		.item{
+			padding: 20rpx;
+			border-bottom: 1px solid #ddd;
+			display: flex;
+			align-items: center;
+			justify-content: space-between;
+			.info{
+				width: 45%;
+				flex-shrink: 0;
+				text-align: left;
+				font-size: 24rpx;
+				.val{
+					font-size: 28rpx;
+				}
+			}
+			.status{
+				flex-grow: 1;
+				text-align: center;
+			}
+			.tm{
+				flex-grow: 1;
+				text-align: right;
+				font-size: 24rpx;
+			}
+		}
+	}
 </style>
\ No newline at end of file
diff --git a/pages/record/qushui.vue b/pages/record/qushui.vue
index ae22ce0..48e97a6 100644
--- a/pages/record/qushui.vue
+++ b/pages/record/qushui.vue
@@ -1,12 +1,97 @@
 <template>
-	<view class="device">
+	<view class="record">
 		<Navbar title="取水记录"></Navbar>
+		<view class="header">
+			<uni-data-select
+				v-model="dateType"
+				:localdata="dataTypeOption"
+				@change="changeTime"
+				:clear="false"
+			/>
+		</view>
+		<view class="qushui">
+			<view class="item" v-for="(item, index) in list" :key="index">
+				<vie class="info">
+					<view>取水量:<text class="val">{{item.waterAmount}}</text>m³</view>
+					<view>剩余水量:<text class="val">{{item.balance}}</text>m³</view>
+				</vie>
+				<view class="tm">{{item.payTime}}</view>
+			</view>
+		</view>
 	</view>
 </template>
 
 <script setup>
+	import {ref, onMounted} from 'vue'
 	import Navbar from '../../components/navbar/navbar.vue'
+	import {getqushuiRecord} from '@/api/index.js'
+	import { onReachBottom } from '@dcloudio/uni-app';
+	
+	const list = ref([])
+	const page = ref(1)
+	const dateType = ref(0)
+	
+	const dataTypeOption = [
+		{ text: '全部', value: 0 },
+		{ text: '本日', value: 1 },
+		{ text: '本周', value: 2 },
+		{ text: '本月', value: 3 },
+		{ text: '本年', value: 4 }
+	]
+	
+	const getData = () => {
+		const data = {
+			dateType: dateType.value,
+			limit: 10,
+			page: page.value
+		}
+		getqushuiRecord(data).then(res => {
+			if(res.code === 200) {
+				list.value = res.data.list
+			}
+		})
+	}
+	
+	// 选择时间
+	const changeTime = () => {
+		page.value = 1
+		getData()
+	}
+	
+	// 触底加载数据
+	onReachBottom(() => {
+		page.value ++
+		getData()
+	})
+	
+	onMounted(() => {
+		getData()
+	})
 </script>
 
 <style lang="scss" scoped>
+	.qushui{
+		padding: 0 20rpx;
+		.item{
+			padding: 20rpx;
+			border-bottom: 1px solid #ddd;
+			display: flex;
+			align-items: center;
+			justify-content: space-between;
+			.info{
+				width: 50%;
+				flex-shrink: 0;
+				text-align: left;
+				font-size: 24rpx;
+				.val{
+					font-size: 28rpx;
+				}
+			}
+			.tm{
+				flex-grow: 1;
+				text-align: right;
+				font-size: 24rpx;
+			}
+		}
+	}
 </style>
\ No newline at end of file
diff --git a/pages/record/shuiliang.vue b/pages/record/shuiliang.vue
deleted file mode 100644
index 7349680..0000000
--- a/pages/record/shuiliang.vue
+++ /dev/null
@@ -1,12 +0,0 @@
-<template>
-	<view class="device">
-		<Navbar title="水量记录"></Navbar>
-	</view>
-</template>
-
-<script setup>
-	import Navbar from '../../components/navbar/navbar.vue'
-</script>
-
-<style lang="scss" scoped>
-</style>
\ No newline at end of file
diff --git a/pages/user/index.vue b/pages/user/index.vue
index d8afa7c..3bdda58 100644
--- a/pages/user/index.vue
+++ b/pages/user/index.vue
@@ -1,18 +1,26 @@
 <template>
 	<view class="user" :style="{paddingTop:topHeight + 'rpx'}">
 		<view class="content">
-			<view class="user">
+			<view class="user" @click="setUser">
 				<view class="userImg">
-					<image src="/static/images/login/wx.png" mode="widthFix"></image>
+					<image :src="userInfo?.headImg" mode="widthFix"></image>
 				</view>
 				<view class="info">
-					<text class="name">张三</text>
+					<text class="name">{{userInfo?.nickName}}</text>
 				</view>
 			</view>
 			<view class="typeList">
 				<view class="typeItem">
 					<view class="name">剩余水量</view>
-					<view class="val">750m³</view>
+					<view class="val">{{userInfo?.balance}}m³</view>
+				</view>
+				<view class="typeItem">
+					<view class="name">总购水量</view>
+					<view class="val">{{userInfo?.sumBuyCount}}m³</view>
+				</view>
+				<view class="typeItem">
+					<view class="name">累计水量</view>
+					<view class="val">{{userInfo?.sumUseCount}}m³</view>
 				</view>
 			</view>
 			<view class="loginOut">
@@ -26,12 +34,19 @@
 	import { onMounted, ref } from "vue";
 	
 	const topHeight = ref(0)
+	const userInfo = ref()
 	
 	// 获取状态栏高度
 	const getTopHeight = () => {
 		if(uni.getMenuButtonBoundingClientRect){
 			topHeight.value = uni.getMenuButtonBoundingClientRect().bottom * 2
 		}
+	}
+	
+	const setUser = () => {
+		uni.navigateTo({
+			url: '/pages/userSet/index'
+		})
 	}
 	
 	// 退出登录
@@ -53,6 +68,7 @@
 	
 	onMounted(() => {
 		getTopHeight()
+		userInfo.value = JSON.parse(uni.getStorageSync('userInfo'))
 	})
 </script>
 
diff --git a/pages/userSet/index.vue b/pages/userSet/index.vue
new file mode 100644
index 0000000..1ecd1a6
--- /dev/null
+++ b/pages/userSet/index.vue
@@ -0,0 +1,120 @@
+<template>
+	<view class="setting">
+		<Navbar title="用户信息"></Navbar>
+		<view class="user">
+			<view class="userImg" @click="chooseImg">
+				<view class="t">用户头像</view>
+				<button class="cell-wrapper" open-type="chooseAvatar" @chooseavatar="chooseImg">
+					<image class="head" :src="userForm.headImg" mode="widthFix"></image>
+				</button>
+			</view>
+			<view class="userName">
+				<view class="t">用户昵称</view>
+				<input class="input" type="nickname" v-model="userForm.nickName" placeholder="请输入昵称" />
+			</view>
+			<button class="btn" @click="savaUser">保存</button>
+		</view>
+	</view>
+</template>
+
+<script setup>
+	import {ref, onMounted} from 'vue'
+	import Navbar from '../../components/navbar/navbar.vue'
+	import {setUserInfo, getUserInfo} from '@/api/index.js'
+	
+	const userForm = ref({
+		headImg: '',
+		nickName: ''
+	})
+	
+	const chooseImg = (e) => {
+		if(e.detail.avatarUrl){
+			userForm.value.headImg = e.detail.avatarUrl
+		}
+	}
+	
+	// 获取用户信息存缓存
+	const getUser = () => {
+		getUserInfo().then(res => {
+			if(res.code == 200){
+				uni.setStorageSync('userInfo',JSON.stringify(res.data))
+			}
+		})
+	}
+	
+	const savaUser = () => {
+		setUserInfo(userForm.value).then(res => {
+			if(res.code === 200) {
+				getUser()
+				uni.showToast({
+					title:'修改成功',
+					icon: 'success'
+				})
+				setTimeout(() => {
+					uni.navigateBack()
+				}, 1000)
+			}
+		})
+	}
+	
+	onMounted(() => {
+		const userInfo = JSON.parse(uni.getStorageSync('userInfo'))
+		userForm.value = {
+			id: userInfo.id,
+			headImg: userInfo.headImg,
+			nickName: userInfo.nickName
+		}
+	})
+</script>
+
+<style scoped lang="scss">
+	.user{
+		padding: 40rpx;
+		box-sizing: border-box;
+		.userImg{
+			width: 100%;
+			padding: 10rpx 20rpx;
+			box-sizing: border-box;
+			border-radius: 20rpx;
+			background-color: #fff;
+			display: flex;
+			justify-content: space-between;
+			align-items: center;
+			.cell-wrapper{
+				width: 80rpx;
+				height: 80rpx;
+				border-radius: 50%;
+				border: 0;
+				margin: 0;
+				background-color: #ddd;
+			}
+			.head{
+				width: 80rpx;
+				height: 80rpx;
+				border-radius: 50%;
+				margin-left: -30rpx;
+			}
+		}
+		.userName{
+			margin-top: 40rpx;
+			width: 100%;
+			padding: 30rpx 20rpx;
+			box-sizing: border-box;
+			border-radius: 20rpx;
+			background-color: #fff;
+			display: flex;
+			justify-content: space-between;
+			align-items: center;
+			.input{
+				width: 200rpx;
+				text-align: right;
+			}
+		}
+		.btn{
+			margin-top: 100rpx;
+			background-color: $uni-primary;
+			border-color: $uni-primary;
+			color: #fff;
+		}
+	}
+</style>
\ No newline at end of file
diff --git a/static/images/default-head.png b/static/images/default-head.png
new file mode 100644
index 0000000..d5c7dd8
--- /dev/null
+++ b/static/images/default-head.png
Binary files differ
diff --git a/static/images/facilityImg.svg b/static/images/facilityImg.svg
new file mode 100644
index 0000000..c4564b1
--- /dev/null
+++ b/static/images/facilityImg.svg
@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1734678578243" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="22526" width="65" height="65" xmlns:xlink="http://www.w3.org/1999/xlink"><path d="M82.697658 0m93.090909 0l605.090909 0q93.090909 0 93.090909 93.090909l0 837.818182q0 93.090909-93.090909 93.090909l-605.090909 0q-93.090909 0-93.090909-93.090909l0-837.818182q0-93.090909 93.090909-93.090909Z" fill="#3d9bfc" p-id="22527" data-spm-anchor-id="a313x.search_index.0.i1.6e3b3a81RusiQL" class="selected"></path><path d="M222.334022 46.545455h512a93.090909 93.090909 0 0 1 93.090909 93.090909v325.818181a46.545455 46.545455 0 0 1-46.545455 46.545455H175.788567a46.545455 46.545455 0 0 1-46.545454-46.545455V139.636364a93.090909 93.090909 0 0 1 93.090909-93.090909z" fill="#FFFFFF" p-id="22528"></path><path d="M681.504931 93.090909h-127.069091c-3.374545 0-6.283636-1.536-6.283636-3.653818v-15.965091c0-1.978182 2.653091-3.653818 6.283636-3.653818h127.069091c3.374545 0 6.283636 1.536 6.283636 3.653818v15.965091c-0.232727 2.094545-2.909091 3.653818-6.283636 3.653818z m-5.352727 23.272727h-116.363637c-6.283636 0-11.636364 3.723636-11.636363 8.564364v85.597091c0 4.654545 5.096727 8.564364 11.636363 8.564364h4.608S601.958749 256 608.265658 256h19.409455c6.283636 0 42.170182-36.910545 42.170182-36.910545h6.306909c6.283636 0 11.636364-3.746909 11.636363-8.564364V124.928C687.788567 120.087273 682.69184 116.363636 676.152204 116.363636zM402.232204 93.090909H275.163113C271.788567 93.090909 268.879476 91.554909 268.879476 89.437091v-15.965091C268.879476 71.493818 271.532567 69.818182 275.163113 69.818182h127.069091c3.374545 0 6.283636 1.536 6.283636 3.653818v15.965091c-0.232727 2.094545-2.909091 3.653818-6.283636 3.653818z m-5.352728 23.272727h-116.363636c-6.283636 0-11.636364 3.723636-11.636364 8.564364v85.597091c0 4.654545 5.096727 8.564364 11.636364 8.564364h4.608S322.686022 256 328.992931 256h19.409454c6.283636 0 42.170182-36.910545 42.170182-36.910545h6.306909c6.283636 0 11.636364-3.746909 11.636364-8.564364V124.928C408.51584 120.087273 403.419113 116.363636 396.879476 116.363636z" fill="#1A87FF" p-id="22529"></path><path d="M617.970385 418.909091a46.545455 46.545455 0 0 0 46.545455-46.545455c0-17.128727-15.522909-43.659636-46.545455-79.592727-31.022545 35.933091-46.545455 62.464-46.545454 79.592727a46.545455 46.545455 0 0 0 46.545454 46.545455z" fill="#1A87FF" p-id="22530"></path></svg>
\ No newline at end of file
diff --git a/static/images/icon-point.svg b/static/images/icon-point.svg
new file mode 100644
index 0000000..457cef7
--- /dev/null
+++ b/static/images/icon-point.svg
@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1734588187711" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1709" width="43" height="43" xmlns:xlink="http://www.w3.org/1999/xlink"><path d="M890.4 959.6H132.9l102.6-185.7h552.3z" fill="#E5ECFF" p-id="1710"></path><path d="M787.5 599.9c42.2-56 67.2-125.7 67.2-201.3 0-185-150-335-335-335s-335 150-335 335c0 75.6 25 145.3 67.2 201.3l-0.5 0.5 4.2 4.2c16.9 21.6 36.4 41.1 58 58L501 870.8l18.7-2.1 206-206c21.6-16.9 41.1-36.4 58-58l4.2-4.2-0.4-0.6z" fill="#A4BEFF" p-id="1711"></path><path d="M763.3 599.9c42.2-56 67.2-125.7 67.2-201.3 0-185-150-335-335-335s-335 150-335 335c0 75.6 25 145.3 67.2 201.3l-0.5 0.5 4.2 4.2c16.9 21.6 36.4 41.1 58 58l206 206 206-206c21.6-16.9 41.1-36.4 58-58l4.2-4.2-0.3-0.5z" fill="#5B79FB" p-id="1712"></path><path d="M503.6 366.3m-92.8 0a92.8 92.8 0 1 0 185.6 0 92.8 92.8 0 1 0-185.6 0Z" fill="#FFFFFF" p-id="1713"></path><path d="M778.1 928.3H245.3l16.1-34.3h500.5z" fill="#FF7E71" p-id="1714"></path></svg>
\ No newline at end of file

--
Gitblit v1.9.3