Parcourir la source

Merge remote-tracking branch 'origin/test_dev' into test_dev

caojp il y a 11 heures
Parent
commit
4c4df11e8e

+ 22 - 13
LiangZhiYUMao/pages/matchmaker-workbench/index.vue

@@ -5,9 +5,10 @@
     <view class="header">
       <text class="header-title">红娘工作台</text>
       <view class="header-right">
-        <!-- 返回用户端按钮 - 修改为与"前往红娘工作台"一致的样式 -->
+        <!-- 返回用户端按钮 -->
         <view class="back-to-user-btn" @click="openExitPopup">
-          <text class="btn-text">返回用户端</text>
+          <text class="btn-icon">←</text>
+          <text class="btn-text">用户端</text>
         </view>
       </view>
     </view>
@@ -389,6 +390,7 @@ export default {
     display: flex;
     align-items: center;
     gap: 20rpx;
+    margin-right: 190rpx; /* 避开微信小程序右上角胶囊按钮 */
 
     .search-icon,
     .settings-icon {
@@ -407,28 +409,35 @@ export default {
       background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="%23999"><path d="M19.14 12.94c.04-.3.06-.61.06-.94 0-.32-.02-.64-.07-.94l2.03-1.58c.18-.14.23-.41.12-.61l-1.92-3.32c-.12-.22-.37-.29-.59-.22l-2.39.96c-.5-.38-1.03-.7-1.62-.94l-.36-2.54c-.04-.24-.24-.41-.48-.41h-3.84c-.24 0-.43.17-.47.41l-.36 2.54c-.59.24-1.13.57-1.62.94l-2.39-.96c-.22-.08-.47 0-.59.22L2.74 8.87c-.12.21-.08.47.12.61l2.03 1.58c-.05.3-.09.63-.09.94s.02.64.07.94l-2.03 1.58c-.18.14-.23.41-.12.61l1.92 3.32c.12.22.37.29.59.22l2.39-.96c.5.38 1.03.7 1.62.94l.36 2.54c.05.24.24.41.48.41h3.84c.24 0 .44-.17.47-.41l.36-2.54c.59-.24 1.13-.56 1.62-.94l2.39.96c.22.08.47 0 .59-.22l1.92-3.32c.12-.22.07-.47-.12-.61l-2.01-1.58zM12 15.6c-1.98 0-3.6-1.62-3.6-3.6s1.62-3.6 3.6-3.6 3.6 1.62 3.6 3.6-1.62 3.6-3.6 3.6z"/></svg>');
     }
 
-    /* 返回用户端按钮 - 与"前往红娘工作台"按钮样式一致 */
+    /* 返回用户端按钮 */
     .back-to-user-btn {
-      height: 60rpx;
-      padding: 0 24rpx;
-      background: linear-gradient(135deg, #FF8A9B 0%, #FF6B8A 100%);
-      border-radius: 30rpx;
+      height: 56rpx;
+      padding: 0 20rpx;
+      background: rgba(255, 255, 255, 0.95);
+      border: 2rpx solid #FF6B8A;
+      border-radius: 28rpx;
       display: flex;
       align-items: center;
       justify-content: center;
-      box-shadow: 0 4rpx 12rpx rgba(255, 107, 138, 0.3);
+      gap: 8rpx;
+      box-shadow: 0 2rpx 8rpx rgba(255, 107, 138, 0.15);
       transition: all 0.3s ease;
-	  margin-right: 80px;
 
       &:active {
         transform: scale(0.95);
-        box-shadow: 0 2rpx 8rpx rgba(255, 107, 138, 0.3);
+        background: #FFF0F3;
       }
 
-      .btn-text {
-        font-size: 26rpx;
-        color: #FFFFFF;
+      .btn-icon {
+        font-size: 28rpx;
+        color: #FF6B8A;
         font-weight: bold;
+      }
+
+      .btn-text {
+        font-size: 24rpx;
+        color: #FF6B8A;
+        font-weight: 500;
         white-space: nowrap;
       }
     }

+ 9 - 23
LiangZhiYUMao/pages/matchmaker-workbench/my-resources.vue

@@ -281,12 +281,9 @@ export default {
 			getUnregisteredDisplayData() {
 				const data = (this.unregisteredResources || []).filter(item => {
 					const isValid = item && item.id !== undefined && item.id !== null
-					if (!isValid) {
-						
-					}
 					return isValid
 				})
-				
+				return data
 			}
 		},
 		onLoad() {
@@ -448,9 +445,7 @@ export default {
 						return
 					}
 					
-					const baseUrl = process.env.NODE_ENV === 'development' 
-						? 'https://api.zhongruanke.cn/api'
-						: 'https://your-domain.com/api'
+					const baseUrl = 'https://api.zhongruanke.cn/api'
 					
 					// 构建查询参数,使用isUser=1参数只获取已注册用户
 					let url = `${baseUrl}/my-resource/list?currentUserId=${currentUserId}&pageNum=${pageNum}&pageSize=${this.registeredPageSize}&isUser=1`
@@ -507,7 +502,9 @@ export default {
 			},
 			// 加载线索指定页数据(从后端加载,使用isUser参数过滤未注册用户)
 			async loadUnregisteredPage(pageNum) {
-				if (this.unregisteredLoading) return
+				if (this.unregisteredLoading) {
+					return
+				}
 				
 				this.unregisteredLoading = true
 				this.unregisteredPageNum = pageNum
@@ -526,15 +523,12 @@ export default {
 					}
 					
 					if (!currentUserId) {
-						
 						this.unregisteredResources = []
 						this.unregisteredLoading = false
 						return
 					}
 					
-					const baseUrl = process.env.NODE_ENV === 'development' 
-						? 'https://api.zhongruanke.cn/api'
-						: 'https://your-domain.com/api'
+					const baseUrl = 'https://api.zhongruanke.cn/api'
 					
 					// 构建查询参数,使用isUser=0参数只获取未注册用户(线索)
 					let url = `${baseUrl}/my-resource/list?currentUserId=${currentUserId}&pageNum=${pageNum}&pageSize=${this.unregisteredPageSize}&isUser=0`
@@ -548,7 +542,6 @@ export default {
 					})
 					
 					if (error) {
-						
 						this.unregisteredResources = []
 						this.unregisteredLoading = false
 						return
@@ -556,6 +549,7 @@ export default {
 					
 					if (res.statusCode === 200 && res.data && res.data.code === 200) {
 						const pageData = res.data.data
+						
 						if (pageData && pageData.records) {
 							// 转换数据格式,并过滤掉无效数据(null值)
 							const resources = this.convertResourceData(pageData.records).filter(item => item !== null && item !== undefined)
@@ -570,18 +564,14 @@ export default {
 							// 更新总数(使用后端返回的total)
 							this.unregisteredTotal = pageData.total || 0
 							
-							
 						} else {
 							if (pageNum === 1) {
 								this.unregisteredResources = []
 								this.unregisteredTotal = 0
 							}
 						}
-					} else {
-						
 					}
 				} catch (e) {
-					
 					if (this.unregisteredPageNum === 1) {
 						this.unregisteredResources = []
 					}
@@ -757,9 +747,7 @@ export default {
 									title: '删除中...'
 								})
 								
-								const baseUrl = process.env.NODE_ENV === 'development' 
-									? 'https://api.zhongruanke.cn/api'  // 开发环境 - 通过网关
-									: 'https://your-domain.com/api'  // 生产环境
+								const baseUrl = 'https://api.zhongruanke.cn/api'
 								
 								const [error, deleteRes] = await uni.request({
 									url: `${baseUrl}/my-resource/delete/${resourceId}`,
@@ -1030,9 +1018,7 @@ export default {
 					return
 				}
 				
-				const baseUrl = process.env.NODE_ENV === 'development' 
-					? 'https://api.zhongruanke.cn/api'  // 开发环境 - 通过网关
-					: 'https://your-domain.com/api'  // 生产环境
+				const baseUrl = 'https://api.zhongruanke.cn/api'
 				
 				
 				

+ 10 - 30
LiangZhiYUMao/pages/mine/index.vue

@@ -307,9 +307,7 @@ export default {
       weekDays: ['日', '一', '二', '三', '四', '五', '六'],
       currentMonth: '',
       calendarDays: [],
-      checkinRewards: [],
-      // 是否为红娘(用于区分签到接口)
-      isMatchmaker: false
+      checkinRewards: []
     }
   },
   computed: {
@@ -705,21 +703,8 @@ export default {
         const year = today.getFullYear()
         const month = today.getMonth() + 1
         
-        // 检查用户是否为红娘
-        const matchmakerStatusRes = await api.user.getMatchmakerStatus(this.userInfo.userId)
-        const isMatchmaker = matchmakerStatusRes && matchmakerStatusRes.isMatchmaker == 1
-        
-        // 保存红娘状态供签到时使用
-        this.isMatchmaker = isMatchmaker
-        
-        let checkinInfoRes
-        if (isMatchmaker) {
-          // 红娘用户,调用红娘签到信息接口
-          checkinInfoRes = await api.matchmaker.checkinInfo(this.userInfo.userId, year, month)
-        } else {
-          // 普通用户,调用用户签到信息接口
-          checkinInfoRes = await api.user.checkinInfo(this.userInfo.userId, year, month)
-        }
+        // 用户端始终使用用户签到接口(与红娘端签到完全分开)
+        const checkinInfoRes = await api.user.checkinInfo(this.userInfo.userId, year, month)
         
         // 更新签到数据
         this.checkinData = {
@@ -827,14 +812,8 @@ export default {
       }
 
       try {
-        let signRes
-        if (this.isMatchmaker) {
-          // 红娘用户,使用红娘签到接口
-          signRes = await api.matchmaker.doCheckin(this.userInfo.userId)
-        } else {
-          // 普通用户,使用用户签到接口
-          signRes = await api.user.doCheckin(this.userInfo.userId)
-        }
+        // 用户端始终使用用户签到接口(与红娘端签到完全分开)
+        const signRes = await api.user.doCheckin(this.userInfo.userId)
         
         // 签到成功后更新状态
         this.checkinData.todayChecked = true
@@ -854,7 +833,7 @@ export default {
         this.generateCalendarFromBackend(this.checkinData.checkedDates)
         
         uni.showToast({
-          title: '签到成功 +5积分',
+          title: '签到成功',
           icon: 'success',
           duration: 2500
         })
@@ -1853,8 +1832,8 @@ export default {
 
 /* 签到弹窗样式 - 优化版 */
 .checkin-popup {
-  width: 680rpx;
-  max-height: 90vh;
+  width: 640rpx;
+  max-height: 85vh;
   background: rgba(255, 255, 255, 0.98);
   backdrop-filter: blur(20rpx);
   border-radius: 25rpx;
@@ -1863,6 +1842,7 @@ export default {
   flex-direction: column;
   box-shadow: 0 10rpx 50rpx rgba(0, 0, 0, 0.15);
   border: none;
+  transform: translateY(-80rpx);
 
   .popup-header {
     display: flex;
@@ -2143,7 +2123,7 @@ export default {
       font-size: 34rpx;
       font-weight: bold;
       border-radius: 35rpx;
-      padding: 25rpx;
+      padding: 20rpx;
       border: none;
       transition: all 0.3s ease;
       box-shadow: 0 6rpx 25rpx rgba(255, 107, 138, 0.3);

+ 28 - 11
LiangZhiYUMao/pages/plaza/index.vue

@@ -7,7 +7,6 @@
 				<view class="feather feather-right">🪶</view>
 			</view>
 			<view class="header-content">
-				<text class="header-subtitle">两只羽毛</text>
 				<text class="header-title">💕 缘分广场</text>
 				<text class="header-desc">两只羽毛相遇,编织爱情故事</text>
 			</view>
@@ -17,6 +16,9 @@
 		<scroll-view
 			class="dynamic-list"
 			scroll-y
+			:scroll-top="scrollTopValue"
+			:scroll-with-animation="false"
+			@scroll="onScroll"
 			@scrolltolower="loadMore"
 			refresher-enabled
 			:refresher-triggered="refreshing"
@@ -180,7 +182,10 @@ export default {
 			currentUserId: uni.getStorageInfoSync("userId"), // 当前用户ID,实际应从存储获取
 			defaultAvatar: 'http://via.placeholder.com/100x100.png?text=头像',
 			likingMap: {},  // 记录正在点赞的动态ID,防止重复点击
-			favoritingMap: {}  // 记录正在收藏的动态ID,防止重复点击
+			favoritingMap: {},  // 记录正在收藏的动态ID,防止重复点击
+			scrollTopValue: 0, // 用于设置滚动位置
+			savedScrollTop: 0, // 保存的滚动位置
+			isFirstLoad: true // 是否首次加载
 		}
 	},
 	computed: {
@@ -238,7 +243,6 @@ export default {
 	},
 	
 	onShow() {
-		// 返回列表页时自动刷新,确保状态一致
 		// 重新获取当前用户ID(可能在其他页面登录/登出)
 		const storedUserId = uni.getStorageSync('userId')
 		if (storedUserId !== null && storedUserId !== undefined && storedUserId !== '') {
@@ -253,13 +257,26 @@ export default {
 				this.currentUserId = null
 			}
 		}
-		this.pageNum = 1
-		this.noMore = false
-		this.dynamicList = []
-		this.loadDynamicList()
+		
+		// 首次加载时不需要恢复滚动位置
+		if (this.isFirstLoad) {
+			this.isFirstLoad = false
+			return
+		}
+		
+		// 从详情页返回时,恢复滚动位置,不重新加载数据
+		if (this.savedScrollTop > 0) {
+			setTimeout(() => {
+				this.scrollTopValue = this.savedScrollTop
+			}, 100)
+		}
 	},
 	
 	methods: {
+		// 监听滚动事件,保存滚动位置
+		onScroll(e) {
+			this.savedScrollTop = e.detail.scrollTop
+		},
         // 兼容WXML:获取头像
         getAvatar(item) {
             if (item && item.user && item.user.avatarUrl) {
@@ -787,10 +804,10 @@ export default {
 	
 	// 发布按钮
 	.publish-btn {
-		position: fixed;
-		bottom: 160rpx;
-		right: 40rpx;
-		z-index: 998;
+	position: fixed;
+	bottom: 200rpx;
+	right: 40rpx;
+	z-index: 998;
 		
 		.publish-bg {
 			width: 140rpx;

+ 29 - 1
LiangZhiYUMao/pages/recommend/user-dynamics.vue

@@ -12,6 +12,9 @@
 		<scroll-view 
 			scroll-y 
 			class="page-content"
+			:scroll-top="scrollTopValue"
+			:scroll-with-animation="false"
+			@scroll="onScroll"
 			@scrolltolower="loadMore"
 			refresher-enabled
 			:refresher-triggered="refreshing"
@@ -85,7 +88,9 @@ export default {
 			refreshing: false,
 			noMore: false,
 			pageNum: 1,
-			pageSize: 10
+			pageSize: 10,
+			scrollTopValue: 0,
+			savedScrollTop: 0
 		}
 	},
 	
@@ -104,7 +109,30 @@ export default {
 		}
 	},
 	
+	onShow() {
+		// 页面显示时恢复滚动位置
+		if (this.savedScrollTop > 0) {
+			// 使用setTimeout确保DOM已更新
+			setTimeout(() => {
+				// 先设置一个不同的值,再设置回保存的值,强制触发更新
+				this.scrollTopValue = this.savedScrollTop + 1
+				setTimeout(() => {
+					this.scrollTopValue = this.savedScrollTop
+				}, 50)
+			}, 100)
+		}
+	},
+	
+	onHide() {
+		// 页面隐藏时保存滚动位置
+		// savedScrollTop 已经在 onScroll 中实时更新
+	},
+	
 	methods: {
+		// 监听滚动事件,记录当前滚动位置
+		onScroll(e) {
+			this.savedScrollTop = e.detail.scrollTop
+		},
 		// 加载动态
 		async loadDynamics(isRefresh = false) {
 			if (this.loading) return

+ 70 - 26
marriageAdmin-vue/src/views/activity/ActivityList.vue

@@ -260,9 +260,35 @@ const parseToMs = (val) => {
   if (typeof val === 'string') {
     const trimmed = val.trim()
     if (!trimmed) return null
-    const normalized = trimmed.replace('T', ' ').replace(/\//g, '-')
-    const ms = Date.parse(normalized)
+    // 处理各种时间格式
+    // 1. ISO格式: 2025-01-18T00:00:00
+    // 2. 标准格式: 2025-01-18 00:00:00
+    // 3. 带时区: 2025-01-18T00:00:00.000+08:00
+    let normalized = trimmed
+      .replace('T', ' ')
+      .replace(/\//g, '-')
+      .replace(/\.\d{3}/, '') // 移除毫秒
+      .replace(/[+-]\d{2}:\d{2}$/, '') // 移除时区
+    
+    // 尝试解析
+    let ms = Date.parse(normalized)
     if (!Number.isNaN(ms)) return ms
+    
+    // 如果还是失败,尝试手动解析 YYYY-MM-DD HH:mm:ss 格式
+    const match = normalized.match(/^(\d{4})-(\d{2})-(\d{2})\s+(\d{2}):(\d{2}):(\d{2})/)
+    if (match) {
+      const [, year, month, day, hour, minute, second] = match
+      const date = new Date(parseInt(year), parseInt(month) - 1, parseInt(day), parseInt(hour), parseInt(minute), parseInt(second))
+      return date.getTime()
+    }
+    
+    // 尝试只有日期的格式 YYYY-MM-DD
+    const dateMatch = normalized.match(/^(\d{4})-(\d{2})-(\d{2})/)
+    if (dateMatch) {
+      const [, year, month, day] = dateMatch
+      const date = new Date(parseInt(year), parseInt(month) - 1, parseInt(day))
+      return date.getTime()
+    }
   }
   return null
 }
@@ -272,13 +298,25 @@ const getComputedStatus = (row) => {
   const endMs = parseToMs(row?.endTime)
   const now = nowTs.value
 
-  if (!startMs || !endMs) {
+  // 如果没有开始时间,返回数据库状态
+  if (!startMs) {
     return row?.status
   }
 
+  // 当前时间小于开始时间,未开始
   if (now < startMs) return 1
-  if (now >= endMs) return 3
-  if (now >= startMs && now < endMs) return 2
+
+  // 如果有结束时间
+  if (endMs) {
+    // 当前时间大于等于结束时间,已结束
+    if (now >= endMs) return 3
+    // 当前时间在开始和结束之间,进行中
+    if (now >= startMs && now < endMs) return 2
+  } else {
+    // 没有结束时间,只要已开始就是进行中
+    if (now >= startMs) return 2
+  }
+
   return row?.status
 }
 
@@ -321,27 +359,33 @@ const loadActivityList = async () => {
     if (response.code === 200) {
       const list = response.data.list || response.data || []
       // 字段兼容与转换:确保 isHot 为布尔,并兼容不同时间字段命名
-      activityList.value = list.map(item => ({
-        ...item,
-        isHot:
-          item.isHot === true ||
-          item.isHot === 1 ||
-          item.isHot === '1' ||
-          item.is_hot === true ||
-          item.is_hot === 1,
-        isDeleted: Number(item.isDeleted ?? item.is_deleted ?? 0),
-        // 兼容下划线命名与不同字段名
-        startTime: item.startTime || item.start_time || item.start_at || '',
-        endTime: item.endTime || item.end_time || item.end_at || '',
-        registrationEndTime:
-          item.registrationEndTime ||
-          item.registration_end_time ||
-          item.signup_end_time ||
-          '',
-        // 兼容报名人数字段
-        actualParticipants: item.actualParticipants ?? item.actual_participants ?? 0,
-        maxParticipants: item.maxParticipants ?? item.max_participants
-      }))
+      activityList.value = list.map(item => {
+        // 优先使用下划线命名(后端SQL返回的格式)
+        const startTime = item.start_time || item.startTime || item.start_at || ''
+        const endTime = item.end_time || item.endTime || item.end_at || ''
+        
+        return {
+          ...item,
+          isHot:
+            item.isHot === true ||
+            item.isHot === 1 ||
+            item.isHot === '1' ||
+            item.is_hot === true ||
+            item.is_hot === 1,
+          isDeleted: Number(item.isDeleted ?? item.is_deleted ?? 0),
+          // 兼容下划线命名与不同字段名
+          startTime: startTime,
+          endTime: endTime,
+          registrationEndTime:
+            item.registration_end_time ||
+            item.registrationEndTime ||
+            item.signup_end_time ||
+            '',
+          // 兼容报名人数字段
+          actualParticipants: item.actualParticipants ?? item.actual_participants ?? 0,
+          maxParticipants: item.maxParticipants ?? item.max_participants
+        }
+      })
       total.value = response.data.total || activityList.value.length
     }
   } catch (error) {

+ 2 - 2
service/homePage/src/main/java/com/zhentao/controller/MatchmakerController.java

@@ -183,11 +183,11 @@ public class MatchmakerController {
             }
 
             if (matchmaker.getGender()== 1){
-                matchmaker.setAvatarUrl("http://115.190.125.125:9000/dynamic-comments/dynamics/5c645152-9940-41d3-83a9-69ee6e0c0aaa.png");
+                matchmaker.setAvatarUrl("https://api.zhongruanke.cn/minio/dynamic-comments/dynamics/5c645152-9940-41d3-83a9-69ee6e0c0aaa.png");
             }
 
             if (matchmaker.getGender()== 2){
-                matchmaker.setAvatarUrl("http://115.190.125.125:9000/dynamic-comments/dynamics/c7fb04d7-ee4d-4b3d-bcef-f246da9c841f.png");
+                matchmaker.setAvatarUrl("https://api.zhongruanke.cn/minio/dynamic-comments/dynamics/c7fb04d7-ee4d-4b3d-bcef-f246da9c841f.png");
             }
             
             // 保存红娘到数据库

+ 10 - 11
service/randomMatch/src/main/java/com/zhentao/service/MatchService.java

@@ -122,8 +122,8 @@ public class MatchService {
                 continue;
             }
             
-            // 根据匹配模式进行额外筛选
-            if (!shouldMatchByMode(userData, od, matchMode)) {
+            // 精准模式下进行额外筛选,智能模式不筛选
+            if ("precise".equalsIgnoreCase(matchMode) && !shouldMatchByMode(userData, od, matchMode)) {
                 continue;
             }
             
@@ -209,16 +209,15 @@ public class MatchService {
                 // 计算匹配分数
                 double score = MatchingAlgorithmUtils.calculateMatchScore(userData, otherData);
                 
-                // 根据匹配模式进行额外筛选(但不阻断匹配)
-                boolean matchesModeRequirements = shouldMatchByMode(userData, otherData, matchMode);
-                // 精准模式下,如果不符合条件,降低分数但不完全排除
-                if (!matchesModeRequirements && "precise".equalsIgnoreCase(matchMode)) {
-                    // 精准模式下不符合条件的用户,分数打折
-                    score = score * 0.7;
-                } else if (!matchesModeRequirements) {
-                    // 其他模式下不符合条件直接跳过
-                    continue;
+                // 精准模式下进行额外筛选
+                if ("precise".equalsIgnoreCase(matchMode)) {
+                    boolean matchesModeRequirements = shouldMatchByMode(userData, otherData, matchMode);
+                    // 如果不符合精准模式条件,降低分数但不完全排除
+                    if (!matchesModeRequirements) {
+                        score = score * 0.7;
+                    }
                 }
+                // 智能模式和其他模式不进行额外筛选,接受所有用户
                 
                 scores.put(otherUserId, score);