Sfoglia il codice sorgente

fix: 代码合并

chenjj 4 settimane fa
parent
commit
67651982ec

+ 10 - 0
api/userSettings.js

@@ -0,0 +1,10 @@
+import request from '../utils/request'
+
+//新增受服务地址
+export function useraDdressData(data) {
+    return request({
+        url: `/core/user/address`,
+        method: 'post',
+        data: data
+    })
+}

+ 9 - 0
api/volunteerDetailsApi/details.js

@@ -93,3 +93,12 @@ export function volunteerInfoList(params) {
   });
 }
 
+
+//查询所有业务列表(树形结构)
+export function volunteerSeachgetTreeList(params) {
+  return request({
+    url: '/core/business/management/getTreeList',  
+    method: 'get',
+	params:params,
+  });
+}

File diff suppressed because it is too large
+ 4572 - 0
components/city-index/cityData.js


+ 116 - 0
components/city-index/index.vue

@@ -0,0 +1,116 @@
+<template>
+	<view>
+		<u-popup :show="show" round="20rpx" @close="close">
+			<!-- 标题 -->
+			<view class="popup-title">
+				<text class="text" @click="close">取消</text>
+				<view class="flex"></view>
+				<text class="text" @click="confirm">确定</text>
+			</view>
+			<!-- 城市数据 -->
+			<picker-view class="picker-view" :indicator-style="indicatorStyle" :value="cityIndex" @change="cityChange">
+				<picker-view-column>
+					<view v-for="(item,index) in list" :key="index">
+						<text class="name">{{item.name}}</text>
+					</view>
+				</picker-view-column>
+				<picker-view-column>
+					<view v-for="(item,index) in list[cityIndex[0]].children" :key="index">
+						<text class="name">{{item.name}}</text>
+					</view>
+				</picker-view-column>
+				<picker-view-column>
+					<view v-for="(item,index) in list[cityIndex[0]].children[cityIndex[1]].children" :key="index">
+						<text class="name">{{item.name}}</text>
+					</view>
+				</picker-view-column>
+			</picker-view>
+		</u-popup>
+	</view>
+</template>
+
+<script>
+	let cityData = require('./cityData.js').pca;
+	export default {
+		data() {
+			return {
+				show: false,
+				list: cityData,
+				cityIndex: [0, 0, 0],
+				indicatorStyle: `height: 50px;`,
+			}
+		},
+		methods: {
+			// 显示
+			showd() {
+				this.show = true
+			},
+			// 确认
+			confirm(e) {
+				let current = this.list[this.cityIndex[0]].name + '' + this.list[this.cityIndex[0]].children[this
+					.cityIndex[1]].name + '' + this.list[this.cityIndex[0]].children[this.cityIndex[1]].children[this
+					.cityIndex[2]].name;
+				this.$emit('confirm', this.list[this.cityIndex[0]], this.list[this.cityIndex[0]].children[this
+					.cityIndex[1]], this.list[this.cityIndex[0]].children[this.cityIndex[1]].children[this
+					.cityIndex[2]])
+
+				this.close();
+			},
+			// 滑动
+			cityChange(e) {
+				let currentIndex = e.detail.value;
+				if (currentIndex[0] != this.cityIndex[0]) {
+					this.cityIndex.splice(0, 3, currentIndex[0], 0, 0);
+					return;
+				}
+				if (currentIndex[1] != this.cityIndex[1]) {
+					this.cityIndex.splice(1, 2, currentIndex[1], 0);
+					return;
+				}
+				if (currentIndex[2] != this.cityIndex[2]) {
+					this.cityIndex.splice(2, 1, currentIndex[2]);
+					return;
+				}
+			},
+			// 取消
+			close() {
+				this.show = false
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	// scss混入,为了少写几行#ifndef
+	@mixin flex($direction: row) {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: $direction;
+	}
+
+	.picker-view {
+		height: 500rpx;
+
+		.name {
+			text-align: center;
+			font-size: 30rpx;
+			height: 50px;
+			line-height: 50px;
+		}
+	}
+
+	.popup-title {
+		@include flex(row);
+		align-items: center;
+		padding: 30rpx;
+
+		.text {
+			color: #3c9cff;
+		}
+
+		.flex {
+			flex: 1;
+		}
+	}
+</style>

+ 50 - 32
components/pages/classify/orderlist.vue

@@ -27,21 +27,23 @@
 						<view class="item-info">
 							<view class="info-line">姓名:{{item.name}}</view>
 							<view class="info-line">类别:{{item.orderStatus}}</view>
-							<view class="info-line">技能介绍:{{ item.skillDescribe }}</view>
+							<view class="info-line skill-description">技能介绍:{{ item.skillDescribe }}</view>
 						</view>
 
 						<!-- 右侧信息 -->
 						<view class="item-right">
-							<!-- ,,orderStatus=0,未开始,=2已完成 -->
-					
 							<view class="rating">评分:9.5</view>
-							<up-tag v-if="orderStatus == 0">未开始</up-tag>
-							<up-tag v-else-if="orderStatus == 1">进行中</up-tag>
-							<up-tag v-else-if="orderStatus == 2">已完成</up-tag>
-							<up-button type="primary" text="沟通" size="small" class="action-btn"
-							></up-button>
-								<up-button type="error" text="查看" size="small" class="action-btn"
+							<view class="status-tags">
+								<up-tag v-if="item.orderStatus == 0" type="info">未开始</up-tag>
+								<up-tag v-else-if="item.orderStatus == 1" type="warning">进行中</up-tag>
+								<up-tag v-else-if="item.orderStatus == 2" type="success">已完成</up-tag>
+							</view>
+							<view class="Wrap-Btn">
+								<up-button type="primary" text="沟通" size="mini" shape="circle"
+									class="action-btn"></up-button>
+								<up-button type="error" text="查看" size="mini" shape="circle" class="action-btn"
 									@click="handlClick(item)"></up-button>
+							</view>
 						</view>
 					</view>
 				</up-list-item>
@@ -95,7 +97,7 @@
 			default: () => [],
 		},
 	})
-	
+
 	const emits = defineEmits([
 		'fetchData'
 	])
@@ -110,59 +112,75 @@
 
 	function onChange(tabItem) {
 		// tab.value = tabItem.value;
-		emits('fetchData', tabItem.value )
+		emits('fetchData', tabItem.value)
 	}
 </script>
 
 <style scoped>
 	.list-item {
 		display: flex;
-		padding: 24rpx 24rpx;
-		align-items: flex-start;
-		gap: 24rpx;
+		padding: 12px;
+		border-bottom: 1px solid #f5f5f5;
 	}
 
 	.item-image {
-		width: 160rpx;
-		height: 180rpx;
-		border-radius: 16rpx;
-		object-fit: cover;
+		width: 80px;
+		height: 80px;
+		border-radius: 8px;
+		margin-right: 12px;
 	}
 
 	.item-info {
 		flex: 1;
-		display: flex;
-		flex-direction: column;
-		gap: 14rpx;
+		margin-right: 12px;
+		overflow: hidden;
 	}
 
 	.info-line {
-		font-size: 28rpx;
+		margin-bottom: 6px;
+		font-size: 14px;
 		color: #333;
-		line-height: 1.6;
+	}
+
+	.skill-description {
+		display: -webkit-box;
+		-webkit-line-clamp: 2;
+		/* 限制两行 */
+		-webkit-box-orient: vertical;
+		overflow: hidden;
+		text-overflow: ellipsis;
+		line-height: 1.4;
+		min-height: 2.8em;
+		/* 两行高度 */
 	}
 
 	.item-right {
+		width: 120px;
 		display: flex;
 		flex-direction: column;
 		align-items: flex-end;
-		gap: 16rpx;
-		min-width: 160rpx;
 	}
 
 	.rating {
-		font-size: 28rpx;
+		font-size: 13px;
 		color: #f39c12;
-		font-weight: bold;
+		margin-bottom: 6px;
+	}
+
+	.status-tags {
+		margin-bottom: 6px;
 	}
 
-	.tag {
-		transform: scale(0.9);
-		/* 缩小标签尺寸 */
+	.Wrap-Btn {
+		display: flex;
+		gap: 6px;
+		/* 按钮间距 */
 	}
 
 	.action-btn {
-		margin-top: 18rpx;
-		width: 100%;
+		padding: 0 8px;
+		height: 28px;
+		line-height: 28px;
+		font-size: 12px;
 	}
 </style>

File diff suppressed because it is too large
+ 4915 - 0
components/pickerAddress/areadata.js


+ 105 - 0
components/pickerAddress/pickerAddress.vue

@@ -0,0 +1,105 @@
+<template>
+	<!-- 地址选择器组件 -->
+	<picker @change="bindPickerChange" @columnchange="columnchange" :range="array" range-key="name" :value="value" mode="multiSelector">
+			<slot></slot>
+	</picker>
+</template>
+
+<script>
+import AllAddress from './areadata.js'
+let selectVal = ['','','']
+export default {
+		data() {
+			return{
+				value: [0,0,0],
+				array: [],
+				index: 0
+			}
+		},
+		props:{
+			selectValue: {
+				type: Array,
+				default: [0,0,0]
+			}
+		},
+		created() {
+			this.value = this.selectValue
+			this.initSelect()
+		},
+		methods:{
+			// 初始化地址选项
+			initSelect() {
+				this.updateSourceDate() // 更新源数据
+				.updateAddressDate() // 更新结果数据
+				.$forceUpdate()  // 触发双向绑定
+			},
+			// 地址控件改变控件
+			columnchange(d) {
+				this.updateSelectIndex(d.detail.column, d.detail.value) // 更新选择索引
+				.updateSourceDate() // 更新源数据
+				.updateAddressDate() // 更新结果数据
+				.$forceUpdate()  // 触发双向绑定
+			},
+			
+			/**
+			 * 更新源数据
+			 * */
+			updateSourceDate() {
+				// console.log(AllAddress, '>>>>>>>AllAddress');
+				this.array = []
+				this.array[0] = AllAddress.map(obj => {
+					return { name: obj.name }
+				})
+				this.array[1] = AllAddress[this.value[0]].city.map(obj => {
+					return { name: obj.name }
+				})
+				this.array[2] = AllAddress[this.value[0]].city[this.value[1]].area.map(obj => { 
+					return { name: obj }
+				})
+				return this
+			},
+			
+			/**
+			 * 更新索引
+			 * */
+			updateSelectIndex(column, value){
+				let arr = JSON.parse(JSON.stringify(this.value)) 
+				arr[column] = value
+				if(column === 0 ) {
+						arr[1] = 0
+						arr[2] = 0
+				}
+				if(column === 1 ) {
+						arr[2] = 0
+				}
+				this.value = arr
+				return this
+			},
+			
+			/**
+			 * 更新结果数据 
+			 * */
+			updateAddressDate() {
+				selectVal[0] = this.array[0][this.value[0]].name
+				selectVal[1] = this.array[1][this.value[1]].name 
+				selectVal[2] = this.array[2][this.value[2]].name 
+				return this
+			},
+			
+			/**
+			 * 点击确定
+			 * */
+			bindPickerChange(e) {
+				this.$emit('change', {
+					index: this.value,
+					data: selectVal
+				})
+				return this
+			}
+		}
+}
+</script>
+
+<style>
+</style>
+

+ 111 - 0
components/xlh-picker/xlh-picker.vue

@@ -0,0 +1,111 @@
+<template>
+	<view>
+		<uni-forms ref="baseForm" >
+			<uni-forms-item label="城市" required>
+				<picker class="addRess" @change="bindPickerChange" @columnchange="pluginclass" :value="pickVal" :range="cityArr"
+					range-key="AreaName" mode="multiSelector">
+					<view v-if="pickVal2.length==0">请选择</view>
+					<view v-else class="uni-input">
+						<text>{{cityArr[0][pickVal2[0]].AreaName}}</text>
+						<text>{{cityArr[1][pickVal2[1]].AreaName}}</text>
+						<text>{{cityArr[2][pickVal2[2]].AreaName}}</text>
+					</view>
+				</picker>
+			</uni-forms-item>
+		</uni-forms>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				pickVal: [0, 0, 0], // 选择器默认值
+				pickVal2:[],   // 辅助城市名字线索
+				cityArr: [],   // 所有城市
+			}
+		},
+		mounted() {
+			// 页面初始化
+			this.loadProvinces()
+		},
+		methods: {
+			loadProvinces() { // 加载省份
+				uni.request({
+					url: 'http://test-api.tiananhub.com/api/province/GetListProvince',
+					method: 'get',
+					success: async (res) => {
+						let {
+							data
+						} = res.data
+						console.log(data)
+						this.cityArr[0] = data
+						this.loadCities(data[0].AreaId)
+						this.$forceUpdate()
+					},
+					fail: async (res) => {}
+				})
+			},
+			// 请求地级市
+			loadCities(AreaId) {
+				uni.request({
+					url: 'http://test-api.tiananhub.com/api/province/GetListCity',
+					data: {
+						AreaId
+					},
+					method: 'get',
+					success: async (res) => {
+						let {
+							data
+						} = res.data
+						this.cityArr[1] = data
+						this.loadAreas(data[0].AreaId)
+
+						this.$forceUpdate()
+					},
+					fail: async (res) => {}
+				})
+			},
+			// 请求县区市
+			loadAreas(AreaId) {
+				uni.request({
+					url: 'http://test-api.tiananhub.com/api/province/GetListCity',
+					data: {
+						AreaId
+					},
+					method: 'get',
+					success: async (res) => {
+						let {
+							data
+						} = res.data
+						this.cityArr[2] = data
+
+						this.$forceUpdate()
+					},
+					fail: async (res) => {}
+				})
+			},
+			// 确定其他选择的值
+			bindPickerChange(data) {
+				this.pickVal=data.target.value;
+				this.pickVal2=data.target.value;
+				// 以下拓展区域业务逻辑
+			},
+			// 选择时且未点击确定是的值
+			pluginclass(e) {
+				console.log('修改的列为:' + e.detail.column + ',值为:' + e.detail.value)
+				if (e.detail.column == 0) {
+					this.loadCities(this.cityArr[0][e.detail.value].AreaId);
+				}
+				if (e.detail.column == 1) {
+					this.loadAreas(this.cityArr[1][e.detail.value].AreaId);
+				}
+			}
+		}
+	}
+</script>
+<style lang="scss" scoped>
+	.addRess{
+		line-height: 80rpx;
+	}
+</style>

+ 0 - 5
index.html

@@ -2,7 +2,6 @@
 <html lang="en">
   <head>
     <meta charset="UTF-8" />
-    <meta name="viewport" content="initial-scale=1.0, user-scalable=no"> 
     <script>
       var coverSupport = 'CSS' in window && typeof CSS.supports === 'function' && (CSS.supports('top: env(a)') ||
         CSS.supports('top: constant(a)'))
@@ -17,9 +16,5 @@
   <body>
     <div id="app"><!--app-html--></div>
     <script type="module" src="/main.js"></script>
-
-    <!-- index.html -->
-    <!-- <script src="https://map.qq.com/api/js?v=2.exp&key=KFEBZ-P2GKZ-A5PX4-7Q6Y7-KXOBF-XCB4C"></script> -->
   </body>
 </html>
-  

+ 19 - 0
package (2).json

@@ -0,0 +1,19 @@
+{
+    "id": "xlh-picker",
+    "name": "APP、小程序城市选择器、三级联动、二级联动",
+    "displayName": "APP、小程序城市选择器、三级联动、二级联动",
+    "version": "1.0.0",
+    "description": "适于用于各端的城市选择器、地址选择器、三级联动耳机联动",
+    "keywords": [
+        "picker",
+        "选择器",
+        "城市",
+        "三级联动"
+    ],
+    "dcloudext": {
+        "category": [
+            "前端组件",
+            "通用组件"
+        ]
+    }
+}

+ 18 - 0
pages.json

@@ -154,6 +154,24 @@
 					"style": {
 						"navigationBarTitleText": "银行卡详情"
 					}
+				},
+				// {
+				// 	"path": "serviceInforMation/index",
+				// 	"style": {
+				// 		"navigationBarTitleText": "设置"
+				// 	}
+				// },
+				{
+					"path": "setupUser/index",
+					"style": {
+						"navigationBarTitleText": "设置"
+					}
+				},
+				{
+					"path": "setupUser/Address",
+					"style": {
+						"navigationBarTitleText": "设置"
+					}
 				}
 			]
 		},

+ 262 - 297
pages/Client/new_file.vue

@@ -21,16 +21,13 @@
 		<template v-else-if="userType == 2">
 			<view class="Wrapper-grid">
 				<up-grid :border="false" col="4" @click="handleGridClick">
-					<up-grid-item v-for="(item, index) in serviceList2" :key="index" :custom-style="custmoStyle">
-						<view class="grid-box">
-							<!-- 图标 -->
-							<view class="grid-icon">
-								<image :src="item.icon" class="service-img" mode="aspectFit" />
-							</view>
-
-							<!-- 文本 -->
-							<text class="grid-text">{{ item.name }}</text>
-						</view>
+					<up-grid-item v-for="(item, index) in serviceList2" :key="index"
+						:custom-style="{ padding: '20rpx' }">
+						<!-- 图标 -->
+						<image :src="item.icon" class="service-img" mode="aspectFit" />
+
+						<!-- 文本 -->
+						<text class="grid-text">{{ item.name }}</text>
 					</up-grid-item>
 				</up-grid>
 
@@ -41,261 +38,257 @@
 		<Calendar ref="calendar" class="uni-calendar--hook" :clear-date="false" :date="info.date" :insert="info.insert"
 			:lunar="info.lunar" :range="info.range" @change="change" :clearDate="true" @confirm="confirm"
 			:selected="selected" @delete="onDelete" />
-
-
 	</view>
 
 </template>
 
 <script setup>
-import {
-	ref,
-	onMounted,
-	watch,
-	computed
-} from 'vue';
-// import {
-// 	typeOptionSelect
-// } from "@/api/volunteerDetailsApi/details.js"
-import {
-	workDate,
-	getDataTime,
-	getVolunteerInfo
-} from '@/api/volunteer.js'
-import Calendar from '../../components/uni-calendar/components/uni-calendar/uni-calendar.vue'
-
-// Toast 控制宫格
-const uToastRef = ref(null);
-const userType = uni.getStorageSync('userType') //读取本地存储
-// 用户/志愿者 识别标识
-const userOrWorker = uni.getStorageSync('storage_data').vuex_userOrWorker //读取本地存储
-
-const calendar = ref(null)
-const info = ref({
-	lunar: true,
-	range: true,
-	insert: false,
-})
-const selected = ref([])
-
-const custmoStyle = {
-	// borderRadius: '8px',
-	display: 'flex',
-	alignItems: 'center',
-	justifyContent: 'center',
-	// background:'rgba(0, 122, 255, 0.1);'
-}
-
-
-// 普通用户
-const serviceList1 = ref([{
-	icon: '/static/img/统一知识平台-营运@1x.png',
-	name: '孩子陪护',
-	key: 1,
-},
-{
-	icon: '/static/img/编组.png',
-	name: '陪伴陪聊',
-	key: 2,
-},
-{
-	icon: '/static/img/清空.png',
-	name: '家庭助理',
-	key: 3,
-},
-{
-	icon: '/static/img/构建.png',
-	name: '健康管理',
-	key: 4,
-},
-{
-	icon: '/static/img/报事报修@6x.png',
-	name: '家庭清洁',
-	key: 5,
-},
-{
-	icon: '/static/img/报事报修@6x.png',
-	name: '家务帮手',
-	key: 6,
-},
-{
-	icon: '/static/img/报事报修@6x.png',
-	name: '资讯与服务',
-	key: 7,
-},
-]);
-//志愿者
-const serviceList2 = ref([
-	{
-		icon: '/static/serverImg/home/icon/icon2.png',
-		name: '陪伴陪聊',
-		key: 1,
-	},
-	{
-		icon: '/static/serverImg/home/icon/icon4.png',
-		name: '孩子陪护',
-		key: 2,
-	},
-	{
-		icon: '/static/serverImg/home/icon/icon1.png',
-		name: '家庭助理',
-		key: 3,
-	},
-	{
-		icon: '/static/serverImg/home/icon/icon6.png',
-		name: '健康管理',
-		key: 4
-	},
-	{
-		icon: '/static/serverImg/home/icon/icon2.png',
-		name: '家庭清洁',
-		key: 5
-	},
-	{
-		icon: '/static/serverImg/home/icon/icon5.png',
-		name: '家务帮手',
-		key: 6
-	},
-	{
-		icon: '/static/serverImg/home/icon/icon7.png',
-		name: '咨询服务',
-		key: 8
-	},
-	{
-		icon: '/static/serverImg/home/icon/icon8.png',
-		name: '排班管理',
-		key: 7
-	},
-]);
-
-
-
-
-// 宫格点击事件
-const handleGridClick = async (index) => {
-	const service = serviceList1.value[index]; // 获取点击的服务条目
-	// 用户
-	if (userType == 1) {
-		// 只有第一条和第二条可以跳转
-		if (index === 0 || index === 1) {
-			uni.navigateTo({
-				url: `/pages_home/pages/client/details?name=${encodeURIComponent(service.name)}`
-			});
-		} else {
-			// 其他条目提示“敬请期待”
-			uni.showToast({
-				title: '敬请期待',
-				icon: 'none'
-			});
-		}
-	}
-	// 志愿者
-	if (userType == 2 && uToastRef.value) {
-		// pages_home/pages
-
-		const data = serviceList2.value[index]
-		if (data.key !== 7) {
-			const res = await getVolunteerInfo({ serviceCategory: data.key });
-			if (res.code === 200 && res.data) {
-				//已有注册,跳转详情页面
+	import {
+		ref,
+		onMounted,
+		watch,
+		computed,
+		provide
+	} from 'vue';
+	// import {
+	// 	typeOptionSelect
+	// } from "@/api/volunteerDetailsApi/details.js"
+	import {
+		workDate,
+		getDataTime
+	} from '@/api/volunteer.js'
+	import {
+		volunteerSeachgetTreeList,
+	} from "@/api/volunteerDetailsApi/details.js"
+	import Calendar from '../../components/uni-calendar/components/uni-calendar/uni-calendar.vue'
+
+
+	// Toast 控制宫格
+	const uToastRef = ref(null);
+	const userType = uni.getStorageSync('userType') //读取本地存储
+	// 用户/志愿者 识别标识
+	const userOrWorker = uni.getStorageSync('storage_data').vuex_userOrWorker //读取本地存储
+
+	const calendar = ref(null)
+	const info = ref({
+		lunar: true,
+		range: true,
+		insert: false,
+	})
+	const selected = ref([])
+
+
+
+
+	// 普通用户
+	const serviceList1 = ref([{
+			icon: '/static/img/统一知识平台-营运@1x.png',
+			name: '孩子陪护',
+			key: 2,
+		},
+		{
+			icon: '/static/img/编组.png',
+			name: '陪伴陪聊',
+			key: 1,
+		},
+		{
+			icon: '/static/img/清空.png',
+			name: '家庭助理',
+			key: 3,
+		},
+		{
+			icon: '/static/img/构建.png',
+			name: '健康管理',
+			key: 4,
+		},
+		{
+			icon: '/static/img/报事报修@6x.png',
+			name: '家庭清洁',
+			key: 5,
+		},
+		{
+			icon: '/static/img/报事报修@6x.png',
+			name: '家务帮手',
+			key: 6,
+		},
+		{
+			icon: '/static/img/报事报修@6x.png',
+			name: '资讯与服务',
+			key: 7,
+		},
+	]);
+	//志愿者
+	const serviceList2 = ref([{
+			icon: '/static/img/统一知识平台-营运@1x.png',
+			name: '孩子陪护注册',
+			key: 2,
+		},
+		{
+			icon: '/static/img/编组.png',
+			name: '陪伴陪聊注册',
+			key: 1,
+		},
+		{
+			icon: '/static/img/清空.png',
+			name: '家庭助理注册',
+			key: 3,
+		},
+		{
+			icon: '/static/img/构建.png',
+			name: '健康管理注册',
+			key: 4
+		},
+		{
+			icon: '/static/img/报事报修@6x.png',
+			name: '家庭清洁注册',
+			key: 5
+		},
+		{
+			icon: '/static/img/报事报修@6x.png',
+			name: '家务帮手注册',
+			key: 6
+		},
+		{
+			icon: '/static/img/清空.png',
+			name: '排班管理',
+			key: 7
+		},
+	]);
+
+	const parentIdMap = {
+		'孩子陪护': 2,
+		'陪伴陪聊': 1,
+		'家庭助理': 3,
+		'健康管理': 4,
+		'家庭清洁': 5,
+		'家务帮手': 6,
+		'资讯与服务': 7,
+	};
+
+	const getParentId = (service) => parentIdMap[service.name] || 1;
+
+	// 宫格点击事件
+	const handleGridClick = async (index) => {
+		const service = serviceList1.value[index]; // 获取点击的服务条目
+		// 用户
+		if (userType == 1) {
+			// 动态获取 parentId
+			const parentId = getParentId(service); // 通过服务条目动态获取 parentId
+			const params = {
+				parentId: parentId
+			}
+			const res = await volunteerSeachgetTreeList(params)
+			console.log(res, '>>>>>dictSort = null')
+		
+			// 只有第一条和第二条可以跳转
+			if (index === 0 || index === 1) {
 				uni.navigateTo({
-					url: `/pages_home/pages/details/index?data=${encodeURIComponent(JSON.stringify(data))}`
+					url: `/pages_home/pages/client/details?dataList=${encodeURIComponent(JSON.stringify(res.data))}`
+				});
+			} else {
+				// 其他条目提示“敬请期待”
+				uni.showToast({
+					title: '敬请期待',
+					icon: 'none'
+				});
+			}
+		}
+		// 志愿者
+		if (userType == 2 && uToastRef.value) {
+			const data = serviceList2.value[index]
+			if (data.key !== 7) {
+				data.key === 1 || data.key === 2 ? uni.navigateTo({
+					url: `/pages_home/pages/register/index?data=${encodeURIComponent(JSON.stringify(data))}`
+				}) : uni.showToast({
+					title: '敬请期待',
+					icon: 'none'
 				})
-				return
+				return;
 			}
-			data.key === 1 || data.key === 2 ? uni.navigateTo({
-				url: `/pages_home/pages/register/index?data=${encodeURIComponent(JSON.stringify(data))}`
-			}) : uni.showToast({
-				title: '敬请期待',
-				icon: 'none'
+			init();
+			calendar.value.open();
+		}
+	};
+
+
+	const change = (e) => {
+		console.log('change', e);
+		let dates = [{
+			date: e.fulldate,
+			info: `${e.time.startTime}~${e.time.endTime}`,
+			time: e.time
+		}]
+		if (e.range.before && e.range.after) {
+			dates = e.range.data.map(item => {
+				return {
+					date: item,
+					info: `${e.time.startTime}~${e.time.endTime}`,
+					time: e.time
+				}
 			})
-			return;
 		}
-		init();
-
+		selected.value = [...selected.value, ...dates]
 	}
-};
-
-
-const change = (e) => {
-	console.log('change', e);
-	let dates = [{
-		date: e.fulldate,
-		info: `${e.time.startTime}~${e.time.endTime}`,
-		time: e.time
-	}]
-	if (e.range.before && e.range.after) {
-		dates = e.range.data.map(item => {
-			return {
-				date: item,
-				info: `${e.time.startTime}~${e.time.endTime}`,
-				time: e.time
-			}
+
+	const onDelete = (e) => {
+		selected.value = selected.value.filter(item => {
+			console.log('item.fulldate !== e.date', item.date, e.fulldate);
+
+			return item.date !== e.fulldate
 		})
+		console.log(e, selected.value);
 	}
-	selected.value = [...selected.value, ...dates]
-}
-
-const onDelete = (e) => {
-	selected.value = selected.value.filter(item => {
-		console.log('item.fulldate !== e.date', item.date, e.fulldate);
 
-		return item.date !== e.fulldate
-	})
-	console.log(e, selected.value);
-}
 
+	//排班时间去重处理
+	const handleDates = computed(() => {
+		const parmas = selected.value.map(item => {
+			return {
+				workDate: item.date,
+				workStartTime: item.time.startTime,
+				workEndTime: item.time.endTime
+			}
+		})
+		return parmas.reduce((acc, current) => {
+			const existing = acc.find(item => item.workDate === current.workDate);
+			if (existing) {
+				Object.assign(existing, current);
+			} else {
+				acc.push(current);
+			}
+			return acc;
+		}, []);
+	});
+	const confirm = (e) => {
+		const parmas = handleDates.value;
+		console.log('确定', parmas);
+		workDate(parmas).then(res => {
+			if (res.code == 200) {
+				uni.showToast({
+					title: '修改成功',
+					icon: 'success',
+					success: () => {
+						setTimeout(() => {
+							close();
+						}, 1000)
+					}
+				})
 
-//排班时间去重处理
-const handleDates = computed(() => {
-	const parmas = selected.value.map(item => {
-		return {
-			workDate: item.date,
-			workStartTime: item.time.startTime,
-			workEndTime: item.time.endTime
-		}
-	})
-	return parmas.reduce((acc, current) => {
-		const existing = acc.find(item => item.workDate === current.workDate);
-		if (existing) {
-			Object.assign(existing, current);
-		} else {
-			acc.push(current);
-		}
-		return acc;
-	}, []);
-});
-const confirm = (e) => {
-	const parmas = handleDates.value;
-	console.log('确定', parmas);
-	workDate(parmas).then(res => {
-		if (res.code == 200) {
+				return;
+			}
 			uni.showToast({
-				title: '修改成功',
-				icon: 'success',
-				success: () => {
-					setTimeout(() => {
-						close();
-					}, 1000)
-				}
+				title: res.msg,
+				icon: 'none'
 			})
-
-			return;
-		}
-		uni.showToast({
-			title: res.msg,
-			icon: 'none'
 		})
-	})
-};
-const close = () => {
-	calendar.value.close();
-}
-
-const init = () => {
-	getDataTime().then(res => {
-		console.log('res', res);
-		if (res.code === 200) {
+	};
+	const close = () => {
+		calendar.value.close();
+	}
+
+	const init = () => {
+		getDataTime().then(res => {
+			console.log('res', res);
 			selected.value = res.data.map(item => {
 				return {
 					date: item.workDate,
@@ -306,62 +299,34 @@ const init = () => {
 					}
 				}
 			})
-			calendar.value.open();
-		}
-
 
-	})
-}
+		})
+	}
 
 
 
-onMounted(() => {
-	// init();
-});
+	onMounted(() => {
+		// init();
+	});
 </script>
 
 <style scoped>
-.Wrapper-grid {
-	/* margin-top: 170rpx; */
-	margin-top: 36rpx;
-}
-
-/* 图标样式 */
-.service-img {
-	/* width: 80rpx;
-	height: 80rpx; */
-	/* margin-bottom: 15rpx; */
-}
-
-/* 文本样式 */
-.grid-text {
-	font-size: 24rpx;
-	color: #333;
-	text-align: center;
-	margin-top: 18rpx;
-}
-
-.grid-box {
-	display: flex;
-	align-items: center;
-	justify-content: center;
-	flex-direction: column;
-	margin-bottom: 48rpx;
-}
-
-.grid-icon {
-	width: 96rpx;
-	height: 96rpx;
-	opacity: 1;
-	border-radius: 8rpx;
-	background: rgba(0, 122, 255, 0.1);
-	display: flex;
-	align-items: center;
-	justify-content: center;
-}
-
-.service-img {
-	width: 48rpx;
-	height: 48rpx;
-}
+	.Wrapper-grid {
+		margin-top: 170rpx;
+	}
+
+	/* 图标样式 */
+	.service-img {
+		width: 80rpx;
+		height: 80rpx;
+		margin-bottom: 15rpx;
+	}
+
+	/* 文本样式 */
+	.grid-text {
+		font-size: 24rpx;
+		color: #333;
+		text-align: center;
+		margin-top: 10rpx;
+	}
 </style>

+ 82 - 63
pages/Volunteerside/Side_index.vue

@@ -3,8 +3,12 @@
 		<up-waterfall v-model="flowList">
 			<template #left :listData="listData">
 				<view class="demo-warter" v-for="(item, index) in listData" :key="index" @click="goToDetail(item)">
-					<up-lazy-load threshold="-450" border-radius="10" :image="item.volunteerPicture" :index="index"></up-lazy-load>
+					<up-lazy-load threshold="-450" border-radius="10" :image="item.volunteerPicture"
+						:index="index"></up-lazy-load>
 					<view class="demo-title">
+						{{item.businessTierName}}
+					</view>
+					<view class="demo-skillDescribe">
 						{{item.skillDescribe}}
 					</view>
 					<view class="demo-PriceDome">
@@ -12,17 +16,18 @@
 							<image :src="item.volunteerPicture" class="name-image"></image>
 							{{item.name}}
 						</view>
-						<view class="dome-Like">
-							<text style="font-size: 25rpx; color: red;">¥</text>
-							<text style="font-size: 35rpx; color: red;">1.4w</text>
-						</view>
+
 					</view>
 				</view>
 			</template>
 			<template #right :rightList="rightList">
 				<view class="demo-warter" v-for="(item, index) in rightList" :key="index" @click="goToDetail(item)">
-					<up-lazy-load threshold="-450" border-radius="10" :image="item.volunteerPicture" :index="index"></up-lazy-load>
+					<up-lazy-load threshold="-450" border-radius="10" :image="item.volunteerPicture"
+						:index="index"></up-lazy-load>
 					<view class="demo-title">
+						{{item.businessTierName}}
+					</view>
+					<view class="demo-skillDescribe">
 						{{item.skillDescribe}}
 					</view>
 					<view class="demo-PriceDome">
@@ -30,10 +35,7 @@
 							<image :src="item.volunteerPicture" class="name-image"></image>
 							{{item.name}}
 						</view>
-						<view class="dome-Like">
-							<text style="font-size: 25rpx; color: red;">¥</text>
-							<text style="font-size: 35rpx; color: red;">1.4w</text>
-						</view>
+
 					</view>
 				</view>
 			</template>
@@ -58,6 +60,7 @@
 
 
 	const flowList = ref([]); //list数据
+	const total = ref(0)
 	const loadStatus = ref('loadmore');
 	const userType = uni.getStorageSync('userType') //读取本地存储
 
@@ -70,33 +73,39 @@
 
 
 	const getList = async () => {
-		const res = await volunteerinfolist()
-
-		// 处理左右数据展示
-		let leftArr = []
-		let rightArr = []
-
-		console.log(res.data, '>>>res.data');
-
-		(res.data || []).forEach((item, index) => {
-			index % 2 != 0 ? leftArr.push(item) : rightArr.push(item)
-		})
-
-		listData.value = leftArr
-		rightList.value = rightArr
-	}
-
+		try {
+			const res = await volunteerinfolist();
+			if (!res || !res.rows) {
+				console.error('No data returned from API');
+				return;
+			}
+
+			let leftArr = [];
+			let rightArr = [];
+
+			(res.rows || []).forEach((item, index) => {
+				index % 2 !== 0 ? leftArr.push(item) : rightArr.push(item);
+			});
+
+			listData.value = leftArr;
+			rightList.value = rightArr;
+			total.value = res.rows;
+		} catch (error) {
+			console.error('Error fetching data:', error);
+		}
+	};
 
 	const goToDetail = async (item) => {
-	  const params = {
-	    volunteerId: item.volunteerId,       // 获取 volunteerId
-	    serviceCategory: item.serviceCategory // 获取 serviceCategory
-	  };
-	
-	  // 使用 JSON.stringify 将对象传递给 URL 参数
-	  uni.navigateTo({
-	    url: `/pages/goodsDetails/goodsDetails?params=${JSON.stringify(params)}`
-	  });
+		const params = {
+			volunteerId: item.volunteerId, // 获取 volunteerId
+			serviceCategory: item.serviceCategory, // 获取 serviceCategory
+			businessManagementId: item.businessManagementId, //获取 businessManagementId
+		};
+
+		// 使用 JSON.stringify 将对象传递给 URL 参数
+		uni.navigateTo({
+			url: `/pages/goodsDetails/goodsDetails?params=${JSON.stringify(params)}`
+		});
 	}
 
 	onShow(() => {
@@ -124,9 +133,21 @@
 	}
 
 	.demo-title {
+		font-size: 25rpx;
+		margin-top: 5px;
+		color: #ccc;
+		/* margin-left: 15rpx; */
+		display: -webkit-box;
+		-webkit-box-orient: vertical;
+		-webkit-line-clamp: 3;
+		overflow: hidden;
+		text-overflow: ellipsis;
+		word-break: break-all;
+	}
+	.demo-skillDescribe{
 		font-size: 30rpx;
 		margin-top: 5px;
-		color: $up-main-color;
+		color: black;
 		/* margin-left: 15rpx; */
 		display: -webkit-box;
 		-webkit-box-orient: vertical;
@@ -135,9 +156,6 @@
 		text-overflow: ellipsis;
 		word-break: break-all;
 	}
-
-
-
 	.demo-img {
 		width: 40rpx;
 		height: 40rpx;
@@ -146,35 +164,36 @@
 	}
 
 	.demo-PriceDome {
-	  display: flex;
-	  justify-content: space-between;
-	  align-items: center;
-	  width: 100%;
-	  margin-top: 15rpx;
+		display: flex;
+		justify-content: space-between;
+		align-items: center;
+		width: 100%;
+		margin-top: 15rpx;
 	}
-	
+
 	.demo-price {
-	  display: flex;
-	  align-items: center;
-	  flex: 1;
-	  overflow: hidden; /* 防止内容溢出 */
+		display: flex;
+		align-items: center;
+		flex: 1;
+		overflow: hidden;
+		/* 防止内容溢出 */
 	}
-	
+
 	.name-image {
-	  width: 40rpx;
-	  height: 40rpx;
-	  margin-right: 10rpx;
+		width: 40rpx;
+		height: 40rpx;
+		margin-right: 10rpx;
+		border-radius: 50%;
 	}
-	
+
 	.name-text {
-	  white-space: nowrap; /* 禁止换行 */
-	  overflow: hidden;    /* 超出部分隐藏 */
-	  text-overflow: ellipsis; /* 显示省略号 */
-	  max-width: 120rpx; /* 6个中文字符大约占120rpx */
-	}
-	
-	.dome-Like {
-	  display: flex;
-	  align-items: baseline; /* 让¥和1.4w底部对齐 */
+		white-space: nowrap;
+		/* 禁止换行 */
+		overflow: hidden;
+		/* 超出部分隐藏 */
+		text-overflow: ellipsis;
+		/* 显示省略号 */
+		max-width: 120rpx;
+		/* 6个中文字符大约占120rpx */
 	}
 </style>

+ 11 - 17
pages/goodsDetails/goodsDetails.vue

@@ -10,10 +10,11 @@
 						<!-- 中间信息(姓名/类别等) -->
 						<view class="card-info">
 							<view class="info-item">姓名:{{listData.name}}</view>
-							<view class="info-item">类别:{{listData.serviceCategory}}</view>
-							<view class="info-item">科目:{{listData.serviceSubject}}</view>
+							<view class="info-item">服务项目:{{listData.projectName}}</view>
+							<view v-if="serviceSubjectName != null" class="info-item">类别:{{ listData.projectTypeName }}
+							</view>
+							<view class="Telephone">科目:{{listData.serviceSubjectName}}</view>
 							<view class="Telephone">电话:{{listData.phonenumber}}</view>
-							<view class="info-item">住址:{{listData.address}}</view>
 						</view>
 
 						<!-- 右上角评分 - 使用绝对定位 -->
@@ -39,16 +40,6 @@
 
 		</view>
 
-		<!-- <up-card title="评论" :thumb="thumb" :head-style="{ height: '100rpx', padding: '0rpx 20rpx' }">
-			<template #body>
-				
-				<view class="" style="height: 200px; width: 300px; border: 4px solid red;">
-					999999
-				</view>
-			</template>
-		</up-card> -->
-
-
 		<!-- 底部弹框 -->
 		<view>
 			<up-popup :show="show" @close="close" @open="open">
@@ -183,6 +174,7 @@
 	const onePrice = ref(400)
 	const volunteerId = ref(''); // 存储志愿者ID
 	const serviceCategory = ref('') //存储大类别
+	const businessManagementId = ref('') //具体分类id
 	const doorToDoorTimeArr = ref([]) // 完整时间范围
 	const doorToDoorTime = ref([]) // 只具备开始、结束 时间
 	const timeHostArr = ref([]) // 时间段数组
@@ -196,7 +188,7 @@
 	const show = ref(false); //立即购买
 	const showSum = ref(false);
 	const showNotify = ref(false) //支付成功提示
-	const skillDescribe = ref('')//备注
+	const skillDescribe = ref('') //备注
 
 	const computeMoney = computed(() => {
 		return totalTimes.value * onePrice.value
@@ -302,7 +294,8 @@
 		const params = JSON.parse(options.params);
 		const {
 			volunteerId: id,
-			serviceCategory: categoy
+			serviceCategory: categoy,
+			businessManagementId: manage
 		} = params;
 
 		// 将volunteerId赋值给响应式变量
@@ -311,7 +304,8 @@
 		// 使用传递的参数调用 API
 		const res = await getDetailsvolunteerId({
 			volunteerId: id,
-			serviceCategory: categoy
+			serviceCategory: categoy,
+			businessManagementId: manage,
 		});
 
 		// 将获取到的结果赋值给响应式变量
@@ -398,7 +392,7 @@
 				addressId: 7,
 				remark: "我是图图小淘气,面对世界很好奇!",
 				volunteerId: volunteerId.value,
-				skillDescribe:skillDescribe.value
+				skillDescribe: skillDescribe.value
 			},
 			workDateList: [
 				// {

+ 42 - 0
pages/index/index.nvue

@@ -0,0 +1,42 @@
+<template>
+	<view class="content">
+		{{title}}
+		<u-button @click="show" type="primary" text="选择城市"></u-button>
+		<!-- 城市组件 -->
+		<city ref="city" @confirm="confirm"></city>
+	</view>
+</template>
+
+<script>
+	import city from '@/components/city-index/index.vue'
+	export default {
+		components: {
+			city
+		},
+		data() {
+			return {
+				title:''
+			}
+		},
+		onLoad() {
+
+		},
+		methods: {
+			// 确定选择
+			confirm(e,e1,e2) {
+				console.log(e,e1,e2)
+				this.title = e.name+e1.name+e2.name
+			},
+			// 显示
+			show() {
+				this.$refs.city.showd()
+			}
+		}
+	}
+</script>
+
+<style>
+	.content {
+		padding: 100rpx;
+	}
+</style>

+ 104 - 30
pages/mine.vue

@@ -93,6 +93,27 @@ const priceList = [{
 	decimals: 0
 }
 ]
+const orderList = ref([{
+	name: '预约单',
+	key: 'orderCount'
+},
+
+{
+	name: '进行单',
+	key: 'orderCount'
+
+},
+{
+	name: '完成单',
+	key: 'orderCount'
+
+},
+{
+	name: '取消单',
+	key: 'orderCount'
+
+}
+]);
 const data = ref({
 	balance: 0.0,
 	orderCount: 0,
@@ -189,31 +210,6 @@ const userList = ref(
 	]);
 
 
-
-
-const rateValue = ref(3);
-
-const orderList = ref([{
-	name: '预约单',
-	key: 'orderCount'
-},
-
-{
-	name: '进行单',
-	key: 'orderCount'
-
-},
-{
-	name: '完成单',
-	key: 'orderCount'
-
-},
-{
-	name: '取消单',
-	key: 'orderCount'
-
-}
-]);
 const onClick = (record) => {
 	console.log('record', record, record.page);
 	if (record.page && record.value) {
@@ -227,16 +223,23 @@ const onClick = (record) => {
 		});
 		return;
 	}
-	if (record.page) {
-		uni.navigateTo({
-			url: record.page
-		});
-	}
+}
+
+const getDetails = async () => {
+	try {
+		// const res = await getVolunteerAccount();
+		// console.log('res',res);
 
+	} catch (error) {
+		console.log('error', error);
 
+	}
 }
 
 
+
+
+
 const geUserInfo = () => {
 	console.log(store.state, '>>>>99');
 	userInfo.value = store.state.user
@@ -331,6 +334,77 @@ onShow(() => {
 			}
 		}
 
+		.service-img {
+			width: 60rpx;
+			height: 60rpx;
+			margin-bottom: 10rpx;
+		}
+
+		.service-list {
+			padding-bottom: 12px;
+		}
+
+		.grid-text {
+			font-size: 14px;
+			color: #909399;
+			padding: 10rpx 0 20rpx 0rpx;
+			/* #ifndef APP-PLUS */
+			box-sizing: border-box;
+			/* #endif */
+		}
+
+
+		.grid-box {
+			display: flex;
+			align-items: center;
+			justify-content: center;
+			flex-direction: column;
+			position: relative;
+
+			.item-badge {
+				position: absolute;
+			}
+		}
+
+		.price-box {
+			display: flex;
+			align-content: center;
+			justify-content: space-between;
+			// padding: 12px;
+
+			.price-item {
+				width: 50%;
+				padding: 12px;
+				display: flex;
+				flex-direction: column;
+				align-items: center;
+				justify-content: center;
+
+				.price-name {
+					font-size: 28rpx;
+					font-weight: 400;
+					line-height: 42rpx;
+					color: rgba(102, 102, 102, 1);
+				}
+
+				.price-data {
+					font-size: 48rpx;
+					font-weight: 400;
+					line-height: 72rpx;
+					color: rgba(51, 51, 51, 1);
+				}
+
+				.grid-min-price {
+					font-size: 24rpx;
+					font-weight: 400;
+					line-height: 36rpx;
+					color: rgba(153, 153, 153, 1);
+				}
+
+
+			}
+		}
+
 		.status-card {
 			display: grid;
 			grid-template-columns: repeat(3, 1fr);

+ 48 - 15
pages_classify/pages/orderItem/orderdetails.vue

@@ -1,20 +1,26 @@
 <template>
 	<view>
-		<view>
-			<view>
-				<up-tag text="标签" type="error" style="width: 40rpx; height: 30rpx;"></up-tag>
-				<view>
-					{{listData.address.area}}
-				</view>
-				<view>
-					{{listData.address.name}}
-					{{listData.address.telephone}}
-				</view>
-				<view>
-					{{listData.address.address}}
-				</view>
+			<view class="address-container">
+			  <view class="address-header">
+			    <!-- 左侧默认标签-->
+			    <up-tag text="默认" type="error" style="width: 40rpx; height: 30rpx; margin-right: 10rpx;"></up-tag>
+			    
+			    <!-- 中间收货人信息 -->
+			    <view class="contact-info">
+			      {{listData.address.name}}
+			      {{listData.address.telephone}}
+			    </view>
+			    
+			    <!-- 右侧图标 -->
+			    <up-icon name="arrow-right" class="arrow-icon"></up-icon>
+			  </view>
+			  
+			  <!-- 下方地址信息 -->
+			  <view class="address-detail">
+			    {{listData.address.address}}
+			  </view>
 			</view>
-		</view>
+
 		<view>
 			<up-card title="志愿者介绍" :head-style="{ height: '80rpx', padding: '20rpx',}">
 				<template #body>
@@ -36,7 +42,7 @@
 			</up-card>
 			<up-card title="技能介绍" :head-style="{ height: '80rpx', padding: '20rpx',}">
 				<template #body>
-					{{listData.volunteerInfo.remark}}
+					{{listData.volunteerInfo.skillDescribe}}
 				</template>
 			</up-card>
 			<up-card title="证书" :head-style="{ height: '80rpx', padding: '20rpx',}">
@@ -103,6 +109,33 @@
 </script>
 
 <style scoped>
+	.address-container {
+	  padding: 20rpx;
+	  border: 1rpx solid #eee;
+	  border-radius: 10rpx;
+	}
+	
+	.address-header {
+	  display: flex;
+	  align-items: center;
+	  margin-bottom: 10rpx;
+	}
+	
+	.contact-info {
+	  flex: 1;  /* 占据剩余空间 */
+	  font-size: 28rpx;
+	  margin-left: 25rpx;
+	}
+	
+	.arrow-icon {
+	  margin-left: auto;  /* 将图标推到最右侧 */
+	}
+	
+	.address-detail {
+	  font-size: 26rpx;
+	  color: #666;
+	}
+	
 	.card-container {
 		display: flex;
 		position: relative;

+ 125 - 128
pages_home/pages/client/details.vue

@@ -13,60 +13,59 @@
 				<view class="tabs-wrapper">
 					<!-- 可滑动的 tabs 区域 -->
 					<scroll-view scroll-x class="tabs-scroll">
-						<up-tabs :list="list1" @click="handlTabs" class="tabs-content"></up-tabs>
+						<up-tabs :list="list1" @change="handlTabs" keyName="businessName"
+							class="tabs-content"></up-tabs>
 					</scroll-view>
 					<!-- 固定不动的图标 -->
 					<image ref="iconRef" src="/static/img/分类or广场or其他.png" class="fixed-icon" @click="toggleDropdown" />
 				</view>
 
 				<view v-if="showDropdown" class="custom-dropdown">
-					<up-tabs :list="list2" @click="click" class="tabs-content" />
-					<up-tabs :list="list3" @click="click" class="tabs-content" />
+					<up-tabs :list="list2" @change="clickList2" class="tabs-content" :current="currentTabs2"
+						keyName="businessName" />
+					<!-- <up-tabs :list="list3" @click="click" class="tabs-content"  keyName="businessName" /> -->
 				</view>
 			</view>
 
 
 			<!-- 瀑布流 -->
-			<view>
+			<view v-if="userType == '1'">
 				<up-waterfall v-model="flowList">
 					<template #left :listData="listData">
-						<view class="demo-warter" v-for="(item, index) in listData" :key="index"
-							@click="goToDetail(item)">
-							<up-lazy-load threshold="-450" border-radius="10" :image="item.image"
+						<view class="demo-warter" v-for="(item, index) in listData" :key="index" @click="goToDetail(item)">
+							<up-lazy-load threshold="-450" border-radius="10" :image="item.volunteerPicture"
 								:index="index"></up-lazy-load>
 							<view class="demo-title">
+								{{item.businessTierName}}
+							</view>
+							<view class="demo-skillDescribe">
 								{{item.skillDescribe}}
 							</view>
 							<view class="demo-PriceDome">
 								<view class="demo-price">
-									<image src="/static/用户.png" class="name-image"></image>
+									<image :src="item.volunteerPicture" class="name-image"></image>
 									{{item.name}}
 								</view>
-								<view class="dome-Like">
-									<text style="font-size: 25rpx; color: red;">¥</text>
-									<text style="font-size: 35rpx; color: red;">1.4w</text>
-								</view>
+			
 							</view>
-
 						</view>
 					</template>
 					<template #right :rightList="rightList">
-						<view class="demo-warter" v-for="(item, index) in rightList" :key="index"
-							@click="goToDetail(item)">
-							<up-lazy-load threshold="-450" border-radius="10" :image="item.image"
+						<view class="demo-warter" v-for="(item, index) in rightList" :key="index" @click="goToDetail(item)">
+							<up-lazy-load threshold="-450" border-radius="10" :image="item.volunteerPicture"
 								:index="index"></up-lazy-load>
 							<view class="demo-title">
+								{{item.businessTierName}}
+							</view>
+							<view class="demo-skillDescribe">
 								{{item.skillDescribe}}
 							</view>
 							<view class="demo-PriceDome">
 								<view class="demo-price">
-									<image src="/static/用户.png" class="name-image"></image>
+									<image :src="item.volunteerPicture" class="name-image"></image>
 									{{item.name}}
 								</view>
-								<view class="dome-Like">
-									<text style="font-size: 25rpx; color: red;">¥</text>
-									<text style="font-size: 35rpx; color: red;">1.4w</text>
-								</view>
+			
 							</view>
 						</view>
 					</template>
@@ -82,32 +81,49 @@
 	import {
 		ref,
 		onMounted,
-		reactive
+		reactive,
+		nextTick
 	} from 'vue';
+	import {
+		onLoad
+	} from '@dcloudio/uni-app';
 	import volunteerSide from "@/pages/Volunteerside/Side_index.vue"
 	import {
 		typeOptionSelect,
 		volunteerInfoList,
 		getDetailsvolunteerId,
 		dictListlrRstudy,
-		dictListlrData
+		dictListlrData,
+		volunteerSeachgetTreeList,
+		volunteerinfolist
 	} from "@/api/volunteerDetailsApi/details.js"
 	import {
 		useRoute
 	} from 'vue-router';
+	import {
+		func
+	} from 'uview-plus/libs/function/test';
+
 
 	const value1 = ref(1)
 	const value2 = ref(2)
 	const list1 = ref([])
 	const list2 = ref([])
-	const list3 = ref([])
 	const flowList = ref([]); //list数据
 	const listData = ref([])
 	const rightList = ref([])
 	const defaultTab = ref({
 		dictValue: 1
 	});
-
+	const currentTabs2 = ref(0)
+	const total = ref(0)
+	
+	
+	const userType = uni.getStorageSync('userType') //读取本地存储
+	
+	// 用户/志愿者 识别标识
+	const userOrWorker = uni.getStorageSync('storage_data').vuex_userOrWorker //读取本地存储
+	
 	// 获取当前路由对象
 	const route = useRoute();
 
@@ -116,92 +132,26 @@
 
 	const showDropdown = ref(false)
 
-	function toggleDropdown() {
-		console.log("点击了")
-		showDropdown.value = !showDropdown.value
-	}
-
-	const getListData = async (dictSort = null) => {
-		try {
-
-			const params = {
-				pageNum: 1,
-				pageSize: 10,
-				dictType: 'lrr_service_category',
-				dictSort
-			}
-			const res = await typeOptionSelect(params)
-			console.log((res, '获取健值成功'))
-			if (res.code == 200 && res.rows) {
-				list1.value = res.rows.map(item => ({
-					...item,
-					name: item.dictLabel,
-				}))
-			}
-		} catch (e) {
-			console.log('获取失败')
-		}
-	}
-
-	const getListData2 = async () => {
-		try {
+	function handlTabs(item, index) {
+		console.log(index, typeof index, '>>>>index');
+		console.log(item, '>>>>item');
+		currentTabs2.value = 0
+		list2.value = item.children
 
-			const params = {
-				dictType: 'lrr_service_subject',
-			}
-			const res = await dictListlrRstudy(params)
-			if (res.code == 200 && res.rows) {
-				list2.value = res.rows.map(item => ({
-					...item,
-					name: item.dictLabel,
-				}))
-			}
-		} catch (e) {
-			console.log('获取失败')
-		}
 	}
 
-	const getListData3 = async () => {
-		try {
-
-			const params = {
-				dictType: 'lrr_study',
-			}
-			const res = await dictListlrData(params)
-			if (res.code == 200 && res.rows) {
-				list3.value = res.rows.map(item => ({
-					...item,
-					name: item.dictLabel,
-				}))
-			}
-		} catch (e) {
-			console.log('获取失败')
-		}
+	function clickList2(item, index) {
+		console.log(index, typeof index, '>>>>index99999');
+		console.log(item, '>>>>item9999');
+		// list2.value = item.children
+		currentTabs2.value = index
 	}
 
-
-	// tabs选择服务类型1
-	const handlTabs = async (tab) => {
-		const params = {
-			serviceCategory: tab.dictValue
-		}
-		const res = await volunteerInfoList(params)
-
-		// 处理左右数据展示
-		let leftArr = []
-		let rightArr = []
-
-		console.log(res.data, '>>>res.data');
-
-		(res.data || []).forEach((item, index) => {
-			index % 2 != 0 ? leftArr.push(item) : rightArr.push(item)
-		})
-
-		listData.value = leftArr
-		rightList.value = rightArr
+	function toggleDropdown() {
+		console.log("点击了")
+		showDropdown.value = !showDropdown.value
 	}
 
-
 	const goToDetail = async (item) => {
 		const volunteerId = item.volunteerId;
 		uni.navigateTo({
@@ -217,16 +167,43 @@
 		width: '600rpx',
 	}
 
-	onMounted(() => {
-		if (route && route.query && route.query.name) {
-			serviceName.value = decodeURIComponent(route.query.name); // 解码参数
-			 console.log(serviceName.value, '111112333');
+	onLoad((options) => {
+		const dataList = JSON.parse(decodeURIComponent(options.dataList));
+		// businessName
+		// console.log(option, '>>>>>option');
+		// data.value = option;
+
+		list1.value = dataList
+		list2.value = dataList[0].children
+
+	})
+	
+	const getList = async () => {
+		try {
+			const res = await volunteerinfolist();
+			if (!res || !res.rows) {
+				console.error('No data returned from API');
+				return;
+			}
+
+			let leftArr = [];
+			let rightArr = [];
+
+			(res.rows || []).forEach((item, index) => {
+				index % 2 !== 0 ? leftArr.push(item) : rightArr.push(item);
+			});
+
+			listData.value = leftArr;
+			rightList.value = rightArr;
+			total.value = res.rows;
+		} catch (error) {
+			console.error('Error fetching data:', error);
 		}
+	};
+
 
-		getListData()
-		getListData2()
-		getListData3()
-		handlTabs(defaultTab.value)
+	onMounted(() => {
+		getList()
 	})
 </script>
 
@@ -293,6 +270,7 @@
 	}
 
 
+
 	.demo-warter {
 		border-radius: 8px;
 		margin: 5px;
@@ -312,21 +290,30 @@
 	}
 
 	.demo-title {
-		font-size: 30rpx;
+		font-size: 25rpx;
 		margin-top: 5px;
-		color: $up-main-color;
-		margin-left: 15rpx;
+		color: #ccc;
+		/* margin-left: 15rpx; */
 		display: -webkit-box;
 		-webkit-box-orient: vertical;
-		-webkit-line-clamp: 2;
-		/* 限制显示两行 */
+		-webkit-line-clamp: 3;
 		overflow: hidden;
 		text-overflow: ellipsis;
-		/* 超出部分显示省略号 */
 		word-break: break-all;
 	}
 
-
+	.demo-skillDescribe {
+		font-size: 30rpx;
+		margin-top: 5px;
+		color: black;
+		/* margin-left: 15rpx; */
+		display: -webkit-box;
+		-webkit-box-orient: vertical;
+		-webkit-line-clamp: 3;
+		overflow: hidden;
+		text-overflow: ellipsis;
+		word-break: break-all;
+	}
 
 	.demo-img {
 		width: 40rpx;
@@ -337,25 +324,35 @@
 
 	.demo-PriceDome {
 		display: flex;
-		font-size: 30rpx;
-		color: $up-type-error;
-		/* margin-top: 5px; */
-		margin-top: 20rpx;
+		justify-content: space-between;
+		align-items: center;
+		width: 100%;
+		margin-top: 15rpx;
 	}
 
 	.demo-price {
 		display: flex;
+		align-items: center;
+		flex: 1;
+		overflow: hidden;
+		/* 防止内容溢出 */
 	}
 
 	.name-image {
 		width: 40rpx;
 		height: 40rpx;
+		margin-right: 10rpx;
+		border-radius: 50%;
 	}
 
-	.dome-Like {
-		margin-left: 140rpx;
-		display: flex;
-		justify-content: center;
-		align-items: center;
+	.name-text {
+		white-space: nowrap;
+		/* 禁止换行 */
+		overflow: hidden;
+		/* 超出部分隐藏 */
+		text-overflow: ellipsis;
+		/* 显示省略号 */
+		max-width: 120rpx;
+		/* 6个中文字符大约占120rpx */
 	}
 </style>

+ 212 - 0
pages_mine/components/setupUser/Add.vue

@@ -0,0 +1,212 @@
+<template>
+	<view>
+		<up-form labelPosition="left" :model="modelForm" :rules="rulesForm" ref="formRef">
+			<up-form-item label="姓名" prop="name" borderBottom>
+				<up-input v-model="modelForm.name" border="none"></up-input>
+			</up-form-item>
+			<up-form-item label="性别" prop="sex" borderBottom @click="() => (sexFlag = true)">
+				<up-input v-model="modelForm.sex" disabled disabledColor="#ffffff" placeholder="请选择性别"
+					border="none"></up-input>
+				<template #right>
+					<up-icon name="arrow-right"></up-icon>
+				</template>
+			</up-form-item>
+			<up-form-item label="关系" prop="label" borderBottom @click="() => labelFlag = true">
+				<up-input v-model="modelForm.label" disabled disabledColor="#ffffff" placeholder="请选择关系"
+					border="none"></up-input>
+				<template #right>
+					<up-icon name="arrow-right"></up-icon>
+				</template>
+			</up-form-item>
+			<up-form-item label="年龄" prop="age" borderBottom>
+				<up-input v-model="modelForm.age" border="none"></up-input>
+			</up-form-item>
+			<up-form-item label="手机号" prop="telephone" borderBottom
+				:style="{ display: 'flex', justifyContent: 'space-between', alignItems: 'center' }">
+				<up-input v-model="modelForm.telephone" border="none"></up-input>
+			</up-form-item>
+
+			<up-form-item label="是否有传染疾病" prop="isContagion" borderBottom>
+				<up-radio-group v-model="modelForm.isContagion" placement="row" @change="groupChange">
+					<up-radio :customStyle="{marginRight: '16px'}" v-for="(item, index) in isContagionOption" :key="index"
+						:label="item.name" :name="item.name" @change="radioChange">
+					</up-radio>
+				</up-radio-group>
+			</up-form-item>
+			<up-form-item label="地区" prop="area" borderBottom @click="()=> addressShow = true">
+				<up-icon name="arrow-right"></up-icon>
+				<pickerAddress @change="addressChange" :selectValue="[ modelForm.area.provinceCode, modelForm.area.cityCode, modelForm.area.areaCode ]">
+					<view class="inp" :class="modelForm.area.province&&modelForm.area.city&&modelForm.area.area?'':'address-inp'">
+						{{modelForm.area.province ? modelForm.area.province:'省'}} / 
+						{{modelForm.area.city ? modelForm.area.city:'市'}} / 
+						{{modelForm.area.area ? modelForm.area.area:'区'}}
+					</view>
+				</pickerAddress>
+			</up-form-item>
+			<up-form-item label="地址" prop="address" borderBottom>
+				<up-input v-model="modelForm.address" border="none"></up-input>
+			</up-form-item>
+		</up-form>
+		<up-action-sheet :show="sexFlag" :actions="sexOptions" @select="sexSelect"
+			@close="sexFlag = false"></up-action-sheet>
+		<up-action-sheet :show="labelFlag" :actions="relaTionsHip" @select="sexSelectsHip"
+			@close="labelFlag = false"></up-action-sheet>
+	</view>
+	
+</template>
+
+<script setup>
+	import {
+		ref,
+		reactive
+	} from 'vue';
+	import pickerAddress from '@/components/pickerAddress/pickerAddress.vue' // 地区选择器组件
+	
+	const formRef = ref(null)
+	const modelForm = ref({
+		name: '',
+		sex: '',
+		label: '',
+		age: '',
+		telephone: '',
+		isContagion: '',
+		area: { // xxxxCode 储存所在数据下标,用来映射回显数据
+			province: '', // 省
+			provinceCode: 0,
+			city: '', // 市
+			cityCode: 0,
+			area: '', // 区
+			areaCode: 0
+		},
+		address: ''
+	})
+	
+	const rulesForm = ref({
+		name: {
+			type: 'string',
+			required: true,
+			message: '请填写姓名',
+			trigger: ['blur', 'change'],
+		},
+		sex: {
+			type: 'string',
+			required: true,
+			message: '请选择性别',
+			trigger: ['change']
+		},
+		label: {
+			type: 'string',
+			required: true,
+			message: '请选择关系',
+			trigger: ['change'],
+		},
+		userInfo: {
+			type: 'string',
+			required: true,
+			message: '请填写年龄',
+			trigger: ['blur', 'change'],
+		},
+		telephone: {
+				type: 'string',
+				required: true,
+				message: '请填写手机号',
+				trigger: ['blur', 'change'],
+			},
+	})
+	
+	let sexFlag = ref(false)
+	let labelFlag = ref(false)
+	let addressShow = ref(false)
+	
+	const sexOptions = ref([
+		{
+			name: '男'
+		}, {
+			name: '女'
+		},
+	]);
+	const isContagionOption = ref([
+		{
+			name: '是',
+			key: 1,
+			disabled: false,
+		},
+		{
+			name: '否',
+			key: 0,
+			disabled: false,
+		}
+	])
+	const relaTionsHip = ref([
+		{
+			name: '父母'
+		}, {
+			name: '子女'
+		},
+		{
+			name: '兄弟'
+		},
+		{
+			name: '朋友'
+		},
+		{
+			name: '同学'
+		},
+		{
+			name: '同事'
+		},
+		{
+			name: '配偶'
+		}
+	]);
+	
+	
+	function groupChange (n) {
+		console.log('groupChange', n);
+		
+	}
+	
+	function radioChange (n) {
+		console.log('radioChange', n);
+	}
+	
+	function sexSelect(e) {
+		modelForm.value.sex = e.name;
+		sexFlag.value = false;
+	}
+	
+	function sexSelectsHip(e) {
+		modelForm.value.label = e.name;
+		labelFlag.value = false;
+	}
+	
+	function addressChange(data) {
+		
+		console.log(data, '>>>>data');
+		
+		let { data:date, index } = data
+		modelForm.value.area.province = date[0]
+		modelForm.value.area.provinceCode = index[0]
+		
+		modelForm.value.area.city = date[1]
+		modelForm.value.area.cityCode = index[1]
+		
+		modelForm.value.area.area = date[2]
+		modelForm.value.area.areaCode = index[2]
+		
+	}
+	
+	// 预留校验函数
+	function handleVerify() {
+		// formRef.value
+	}
+	
+	defineExpose({
+		modelForm: modelForm.value,
+		handleVerify: handleVerify()
+	})
+	
+</script>
+
+<style>
+</style>

+ 9 - 0
pages_mine/pages/income/serviceInforMation/index.vue

@@ -0,0 +1,9 @@
+<template>
+	<view>设置页</view>
+</template>
+
+<script>
+</script>
+
+<style>
+</style>

+ 58 - 0
pages_mine/pages/setupUser/Address.vue

@@ -0,0 +1,58 @@
+<template>
+	<view>
+		<template v-for="(item, index) in addInfoArr" :key="index">
+			<add-component ref="addComponentRef"></add-component>
+		</template>
+		
+	
+		<view>
+			<up-button type="primary" text="添加" @click="handleAdd"></up-button>
+			<up-button type="error" text="确定" @click="handlOk"></up-button>
+		</view>
+	</view>
+</template>
+
+<script setup>
+	import {
+		ref,
+		reactive
+	} from 'vue';
+	import {
+		useraDdressData
+	} from "@/api/userSettings.js"
+	import pickerAddress from '@/components/pickerAddress/pickerAddress.vue' // 地区选择器组件
+	import addComponent from '@/pages_mine/components/setupUser/Add.vue'
+
+
+	const addComponentRef = ref(null)
+	
+	const addInfoArr = ref([
+		{}
+	])
+	
+	function handleAdd() {
+		if(addInfoArr.value.length < 4 ) addInfoArr.value.push({})
+	}
+
+
+	const handlOk = async () => {
+		// const res = await useraDdressData()
+		// console.log(res,'ok')
+		
+		const params = []
+		addInfoArr.value.forEach((item, index) => {
+			params.push(addComponentRef.value[index].modelForm)
+		})
+		
+		console.log(addComponentRef.value, '>>>>>>vaddComponentRef')
+		console.log(params, '>>>>>>params');
+		
+	}
+
+</script>
+<style scoped lang="scss">
+	
+.address-inp {
+	color: #929292;
+}
+</style>

+ 62 - 0
pages_mine/pages/setupUser/index.vue

@@ -0,0 +1,62 @@
+<template>
+	<view>
+		<view class="wrapper">
+			<text class="text">个人信息</text>
+			<up-icon name="arrow-right" class="icon"></up-icon>
+			<up-divider></up-divider>
+		</view>
+		<view class="wrapper">
+			<text class="text">绑定</text>
+			<up-icon name="arrow-right" class="icon"></up-icon>
+			<up-divider></up-divider>
+		</view>
+		<view class="wrapper" @click="handlServiceAddress">
+			<text class="text">被服务地址</text>
+			<up-icon name="arrow-right" class="icon"></up-icon>
+			<up-divider></up-divider>
+		</view>
+	</view>
+</template>
+
+<script setup>
+	import {
+		ref
+	} from 'vue'
+
+	const handlServiceAddress = () => {
+		uni.navigateTo({
+			url: '/pages_mine/pages/setupUser/Address'
+		})
+	}
+</script>
+
+<style scoped>
+	.wrapper {
+		display: flex;
+		justify-content: space-between;
+		align-items: center;
+		padding: 24rpx 32rpx;
+	}
+
+	.text {
+		flex: 1;
+		/* 文字占据剩余空间 */
+		font-size: 28rpx;
+		color: #333;
+	}
+
+	.icon {
+		margin-left: 16rpx;
+		/* 图标与文字的间距 */
+		color: #999;
+		/* 图标颜色 */
+		font-size: 28rpx;
+		/* 与文字大小匹配 */
+	}
+
+	/* 分隔线样式调整 */
+	.up-divider {
+		margin: 0 32rpx;
+		/* 与内容对齐 */
+	}
+</style>

+ 10 - 0
uni.promisify.adaptor.js

@@ -0,0 +1,10 @@
+uni.addInterceptor({
+  returnValue (res) {
+    if (!(!!res && (typeof res === "object" || typeof res === "function") && typeof res.then === "function")) {
+      return res;
+    }
+    return new Promise((resolve, reject) => {
+      res.then((res) => res[0] ? reject(res[0]) : resolve(res[1]));
+    });
+  },
+});