Эх сурвалжийг харах

Merge branch 'cjp' into test_dev

caojp 1 сар өмнө
parent
commit
4d2cabc54f

+ 37 - 14
LiangZhiYUMao/pages/plaza/detail.vue

@@ -255,10 +255,19 @@ export default {
 	onLoad(options) {
 		if (options.id) {
 			this.dynamicId = options.id
-			// 获取当前登录用户ID
-			const userInfo = uni.getStorageSync('userInfo')
-			if (userInfo && userInfo.userId) {
-				this.currentUserId = userInfo.userId
+			// 从存储中获取当前用户ID
+			const storedUserId = uni.getStorageSync('userId')
+			if (storedUserId !== null && storedUserId !== undefined && storedUserId !== '') {
+				this.currentUserId = parseInt(storedUserId)
+			} else {
+				// 尝试从 userInfo 中获取
+				const userInfo = uni.getStorageSync('userInfo')
+				if (userInfo && (userInfo.userId || userInfo.id || userInfo.user_id)) {
+					this.currentUserId = parseInt(userInfo.userId || userInfo.id || userInfo.user_id)
+				} else {
+					// 未登录,设置为 null
+					this.currentUserId = null
+				}
 			}
             this.loadDynamicDetail()
             this.loadComments()
@@ -357,7 +366,13 @@ export default {
 			try {
 				const res = await api.dynamic.getDetail(this.dynamicId, this.currentUserId)
 				if (res) {
-					this.dynamic = res
+					// 处理数据,确保布尔值正确转换(与列表页保持一致)
+					// 根据 dynamic_likes 和 dynamic_favorites 表判断:有记录显示 ❤️/⭐,无记录显示 🤍/☆
+					this.dynamic = {
+						...res,
+						isLiked: res.isLiked === true || res.isLiked === 1 || res.isLiked === 'true' || res.isLiked === '1',
+						isFavorited: res.isFavorited === true || res.isFavorited === 1 || res.isFavorited === 'true' || res.isFavorited === '1'
+					}
 				}
 			} catch (error) {
 				console.error('加载详情失败:', error)
@@ -379,7 +394,8 @@ export default {
 			try {
 				this.isLiking = true
 				
-				const isLiked = this.dynamic.isLiked
+				// 根据 dynamic_likes 表判断是否点赞(有记录显示 ❤️,无记录显示 🤍)
+				const isLiked = this.dynamic.isLiked === true || this.dynamic.isLiked === 1 || this.dynamic.isLiked === 'true' || this.dynamic.isLiked === '1'
 				const originalCount = this.dynamic.likeCount || 0
 				
 				// 立即更新UI(乐观更新)
@@ -393,17 +409,20 @@ export default {
 					await api.dynamic.like(this.dynamic.dynamicId)
 				}
 				
-                // 通知列表页同步状态
+                // 通知列表页同步状态(同时发送两个字段,确保状态完整同步)
                 uni.$emit('dynamic-updated', {
                     dynamicId: this.dynamic.dynamicId,
                     isLiked: this.dynamic.isLiked,
-                    likeCount: this.dynamic.likeCount
+                    likeCount: this.dynamic.likeCount,
+                    isFavorited: this.dynamic.isFavorited,
+                    favoriteCount: this.dynamic.favoriteCount
                 })
 			} catch (error) {
 				console.error('点赞失败:', error)
 				// 请求失败,恢复原状态
-				this.dynamic.isLiked = !this.dynamic.isLiked
-				this.dynamic.likeCount = this.dynamic.isLiked ? (this.dynamic.likeCount || 0) + 1 : Math.max(0, (this.dynamic.likeCount || 0) - 1)
+				const currentIsLiked = Boolean(this.dynamic.isLiked === true || this.dynamic.isLiked === 1 || this.dynamic.isLiked === 'true')
+				this.dynamic.isLiked = !currentIsLiked
+				this.dynamic.likeCount = !currentIsLiked ? (this.dynamic.likeCount || 0) + 1 : Math.max(0, (this.dynamic.likeCount || 0) - 1)
 				uni.showToast({
 					title: '操作失败,请重试',
 					icon: 'none'
@@ -425,7 +444,8 @@ export default {
 			try {
 				this.isFavoriting = true
 				
-				const isFavorited = this.dynamic.isFavorited
+				// 根据 dynamic_favorites 表判断是否收藏(有记录显示 ⭐,无记录显示 ☆)
+				const isFavorited = this.dynamic.isFavorited === true || this.dynamic.isFavorited === 1 || this.dynamic.isFavorited === 'true' || this.dynamic.isFavorited === '1'
 				const originalCount = this.dynamic.favoriteCount || 0
 				
 				// 立即更新UI(乐观更新)
@@ -442,17 +462,20 @@ export default {
 					})
 				}
 				
-                // 通知列表页同步状态
+                // 通知列表页同步状态(同时发送两个字段,确保状态完整同步)
                 uni.$emit('dynamic-updated', {
                     dynamicId: this.dynamic.dynamicId,
+                    isLiked: this.dynamic.isLiked,
+                    likeCount: this.dynamic.likeCount,
                     isFavorited: this.dynamic.isFavorited,
                     favoriteCount: this.dynamic.favoriteCount
                 })
 			} catch (error) {
 				console.error('收藏失败:', error)
 				// 请求失败,恢复原状态
-				this.dynamic.isFavorited = !this.dynamic.isFavorited
-				this.dynamic.favoriteCount = this.dynamic.isFavorited ? (this.dynamic.favoriteCount || 0) + 1 : Math.max(0, (this.dynamic.favoriteCount || 0) - 1)
+				const currentIsFavorited = this.dynamic.isFavorited === true || this.dynamic.isFavorited === 1 || this.dynamic.isFavorited === 'true' || this.dynamic.isFavorited === '1'
+				this.dynamic.isFavorited = !currentIsFavorited
+				this.dynamic.favoriteCount = !currentIsFavorited ? (this.dynamic.favoriteCount || 0) + 1 : Math.max(0, (this.dynamic.favoriteCount || 0) - 1)
 				uni.showToast({
 					title: '操作失败,请重试',
 					icon: 'none'

+ 48 - 13
LiangZhiYUMao/pages/plaza/index.vue

@@ -69,8 +69,8 @@
 					<!-- 互动栏 -->
 					<view class="action-bar">
 						<view class="action-item" @click.stop="handleLike(item)">
-							<text :class="['icon', (item.isLiked === true) ? 'icon-liked' : '']">
-								{{ (item.isLiked === true) ? '❤️' : '🤍' }}
+							<text :class="['icon', !!item.isLiked ? 'icon-liked' : '']">
+								{{ !!item.isLiked ? '❤️' : '🤍' }}
 							</text>
 							<text class="action-text">{{ item.likeCount || 0 }}</text>
 						</view>
@@ -81,8 +81,8 @@
 						</view>
 						
 						<view class="action-item" @click.stop="handleFavorite(item)">
-							<text :class="['icon', (item.isFavorited === true) ? 'icon-favorited' : '']">
-								{{ (item.isFavorited === true) ? '⭐' : '☆' }}
+							<text :class="['icon', !!item.isFavorited ? 'icon-favorited' : '']">
+								{{ !!item.isFavorited ? '⭐' : '☆' }}
 							</text>
 							<text class="action-text">{{ item.favoriteCount || 0 }}</text>
 						</view>
@@ -189,6 +189,20 @@ export default {
     }
   },
 	onLoad() {
+		// 从存储中获取当前用户ID
+		const storedUserId = uni.getStorageSync('userId')
+		if (storedUserId !== null && storedUserId !== undefined && storedUserId !== '') {
+			this.currentUserId = parseInt(storedUserId)
+		} else {
+			// 尝试从 userInfo 中获取
+			const userInfo = uni.getStorageSync('userInfo')
+			if (userInfo && (userInfo.userId || userInfo.id || userInfo.user_id)) {
+				this.currentUserId = parseInt(userInfo.userId || userInfo.id || userInfo.user_id)
+			} else {
+				// 未登录,设置为 null
+				this.currentUserId = null
+			}
+		}
 		this.loadDynamicList()
 		// 监听详情页更新事件,实时同步点赞/收藏状态
 		uni.$on('dynamic-updated', (payload) => {
@@ -198,15 +212,17 @@ export default {
 				const item = this.dynamicList[idx]
 				// 使用 hasOwnProperty 严格检查属性是否存在,只更新事件中明确包含的字段
 				// 这样可以避免误更新不相关的字段(如点赞时误更新收藏状态)
+				// 根据 dynamic_likes 表判断:有记录显示 ❤️,无记录显示 🤍
 				if (payload.hasOwnProperty('isLiked') && payload.isLiked !== undefined && payload.isLiked !== null) {
-					this.$set(item, 'isLiked', Boolean(payload.isLiked === true || payload.isLiked === 1 || payload.isLiked === 'true'))
+					this.$set(item, 'isLiked', payload.isLiked === true || payload.isLiked === 1 || payload.isLiked === 'true' || payload.isLiked === '1')
 				}
 				if (payload.hasOwnProperty('likeCount') && payload.likeCount !== undefined && payload.likeCount !== null) {
 					this.$set(item, 'likeCount', Number(payload.likeCount) || 0)
 				}
 				// 只有当 isFavorited 明确存在于 payload 中时才更新(避免误更新)
+				// 根据 dynamic_favorites 表判断:有记录显示 ⭐,无记录显示 ☆
 				if (payload.hasOwnProperty('isFavorited') && payload.isFavorited !== undefined && payload.isFavorited !== null) {
-					this.$set(item, 'isFavorited', Boolean(payload.isFavorited === true || payload.isFavorited === 1 || payload.isFavorited === 'true'))
+					this.$set(item, 'isFavorited', payload.isFavorited === true || payload.isFavorited === 1 || payload.isFavorited === 'true' || payload.isFavorited === '1')
 				}
 				if (payload.hasOwnProperty('favoriteCount') && payload.favoriteCount !== undefined && payload.favoriteCount !== null) {
 					this.$set(item, 'favoriteCount', Number(payload.favoriteCount) || 0)
@@ -223,6 +239,20 @@ export default {
 	
 	onShow() {
 		// 返回列表页时自动刷新,确保状态一致
+		// 重新获取当前用户ID(可能在其他页面登录/登出)
+		const storedUserId = uni.getStorageSync('userId')
+		if (storedUserId !== null && storedUserId !== undefined && storedUserId !== '') {
+			this.currentUserId = parseInt(storedUserId)
+		} else {
+			// 尝试从 userInfo 中获取
+			const userInfo = uni.getStorageSync('userInfo')
+			if (userInfo && (userInfo.userId || userInfo.id || userInfo.user_id)) {
+				this.currentUserId = parseInt(userInfo.userId || userInfo.id || userInfo.user_id)
+			} else {
+				// 未登录,设置为 null
+				this.currentUserId = null
+			}
+		}
 		this.pageNum = 1
 		this.noMore = false
 		this.dynamicList = []
@@ -264,11 +294,14 @@ export default {
 				})
 				
 				if (res && res.records) {
-					// 处理数据,确保布尔值正确转换
+					// 处理数据,确保布尔值正确转换(根据 dynamic_likes 和 dynamic_favorites 表判断)
+					// 后端返回的 isLiked 和 isFavorited 应该已经是 Boolean,但为了兼容性,确保正确转换
 					const newData = res.records.map(item => ({
 						...item,
-						isLiked: Boolean(item.isLiked === true || item.isLiked === 1 || item.isLiked === 'true'),
-						isFavorited: Boolean(item.isFavorited === true || item.isFavorited === 1 || item.isFavorited === 'true')
+						// 如果 dynamic_likes 表中有记录,显示 ❤️,否则显示 🤍
+						isLiked: item.isLiked === true || item.isLiked === 1 || item.isLiked === 'true' || item.isLiked === '1',
+						// 如果 dynamic_favorites 表中有记录,显示 ⭐,否则显示 ☆
+						isFavorited: item.isFavorited === true || item.isFavorited === 1 || item.isFavorited === 'true' || item.isFavorited === '1'
 					}))
 					
 					if (this.pageNum === 1) {
@@ -323,7 +356,8 @@ export default {
 				// 标记为正在处理
 				this.$set(this.likingMap, item.dynamicId, true)
 				
-				const isLiked = item.isLiked === true
+				// 根据 dynamic_likes 表判断是否点赞(有记录显示 ❤️,无记录显示 🤍)
+				const isLiked = item.isLiked === true || item.isLiked === 1 || item.isLiked === 'true' || item.isLiked === '1'
 				const originalCount = item.likeCount || 0
 				const newIsLiked = !isLiked
 				const newLikeCount = isLiked ? Math.max(0, originalCount - 1) : originalCount + 1
@@ -343,7 +377,7 @@ export default {
 			} catch (error) {
 				console.error('点赞操作失败:', error)
 				// 请求失败,恢复原状态
-				const currentIsLiked = item.isLiked === true
+				const currentIsLiked = item.isLiked === true || item.isLiked === 1 || item.isLiked === 'true' || item.isLiked === '1'
 				this.$set(item, 'isLiked', !currentIsLiked)
 				this.$set(item, 'likeCount', !currentIsLiked ? (item.likeCount || 0) + 1 : Math.max(0, (item.likeCount || 0) - 1))
 				uni.showToast({
@@ -369,7 +403,8 @@ export default {
 				// 标记为正在处理
 				this.$set(this.favoritingMap, item.dynamicId, true)
 				
-				const isFavorited = item.isFavorited === true
+				// 根据 dynamic_favorites 表判断是否收藏(有记录显示 ⭐,无记录显示 ☆)
+				const isFavorited = item.isFavorited === true || item.isFavorited === 1 || item.isFavorited === 'true' || item.isFavorited === '1'
 				const originalCount = item.favoriteCount || 0
 				const newIsFavorited = !isFavorited
 				const newFavoriteCount = isFavorited ? Math.max(0, originalCount - 1) : originalCount + 1
@@ -392,7 +427,7 @@ export default {
 			} catch (error) {
 				console.error('收藏操作失败:', error)
 				// 请求失败,恢复原状态
-				const currentIsFavorited = item.isFavorited === true
+				const currentIsFavorited = item.isFavorited === true || item.isFavorited === 1 || item.isFavorited === 'true' || item.isFavorited === '1'
 				this.$set(item, 'isFavorited', !currentIsFavorited)
 				this.$set(item, 'favoriteCount', !currentIsFavorited ? (item.favoriteCount || 0) + 1 : Math.max(0, (item.favoriteCount || 0) - 1))
 				uni.showToast({

+ 32 - 0
service/dynamic/src/main/java/com/zhentao/service/impl/BrowseHistoryServiceImpl.java

@@ -113,6 +113,38 @@ public class BrowseHistoryServiceImpl implements BrowseHistoryService {
             vo.setMediaUrls(new ArrayList<>());
         }
 
+        // 确保 isLiked 和 isFavorited 正确转换为 Boolean(根据 dynamic_likes 和 dynamic_favorites 表判断)
+        // SQL 返回 1/0,MyBatis 会映射为 Boolean,但为了安全起见,确保正确转换
+        Object isLikedObj = dynamic.getIsLiked();
+        if (isLikedObj != null) {
+            if (isLikedObj instanceof Boolean) {
+                vo.setIsLiked((Boolean) isLikedObj);
+            } else if (isLikedObj instanceof Integer) {
+                vo.setIsLiked(((Integer) isLikedObj) == 1);
+            } else if (isLikedObj instanceof Number) {
+                vo.setIsLiked(((Number) isLikedObj).intValue() == 1);
+            } else {
+                vo.setIsLiked(Boolean.TRUE.equals(isLikedObj));
+            }
+        } else {
+            vo.setIsLiked(false);
+        }
+
+        Object isFavoritedObj = dynamic.getIsFavorited();
+        if (isFavoritedObj != null) {
+            if (isFavoritedObj instanceof Boolean) {
+                vo.setIsFavorited((Boolean) isFavoritedObj);
+            } else if (isFavoritedObj instanceof Integer) {
+                vo.setIsFavorited(((Integer) isFavoritedObj) == 1);
+            } else if (isFavoritedObj instanceof Number) {
+                vo.setIsFavorited(((Number) isFavoritedObj).intValue() == 1);
+            } else {
+                vo.setIsFavorited(Boolean.TRUE.equals(isFavoritedObj));
+            }
+        } else {
+            vo.setIsFavorited(false);
+        }
+
         // 转换用户信息
         if (dynamic.getUser() != null) {
             UserSimpleVO userVO = new UserSimpleVO();

+ 32 - 0
service/dynamic/src/main/java/com/zhentao/service/impl/InteractionServiceImpl.java

@@ -215,6 +215,38 @@ public class InteractionServiceImpl implements InteractionService {
             vo.setMediaUrls(new ArrayList<>());
         }
 
+        // 确保 isLiked 和 isFavorited 正确转换为 Boolean(根据 dynamic_likes 和 dynamic_favorites 表判断)
+        // SQL 返回 1/0,MyBatis 会映射为 Boolean,但为了安全起见,确保正确转换
+        Object isLikedObj = dynamic.getIsLiked();
+        if (isLikedObj != null) {
+            if (isLikedObj instanceof Boolean) {
+                vo.setIsLiked((Boolean) isLikedObj);
+            } else if (isLikedObj instanceof Integer) {
+                vo.setIsLiked(((Integer) isLikedObj) == 1);
+            } else if (isLikedObj instanceof Number) {
+                vo.setIsLiked(((Number) isLikedObj).intValue() == 1);
+            } else {
+                vo.setIsLiked(Boolean.TRUE.equals(isLikedObj));
+            }
+        } else {
+            vo.setIsLiked(false);
+        }
+
+        Object isFavoritedObj = dynamic.getIsFavorited();
+        if (isFavoritedObj != null) {
+            if (isFavoritedObj instanceof Boolean) {
+                vo.setIsFavorited((Boolean) isFavoritedObj);
+            } else if (isFavoritedObj instanceof Integer) {
+                vo.setIsFavorited(((Integer) isFavoritedObj) == 1);
+            } else if (isFavoritedObj instanceof Number) {
+                vo.setIsFavorited(((Number) isFavoritedObj).intValue() == 1);
+            } else {
+                vo.setIsFavorited(Boolean.TRUE.equals(isFavoritedObj));
+            }
+        } else {
+            vo.setIsFavorited(false);
+        }
+
         // 转换用户信息
         if (dynamic.getUser() != null) {
             UserSimpleVO userVO = new UserSimpleVO();

+ 32 - 0
service/dynamic/src/main/java/com/zhentao/service/impl/UserDynamicsServiceImpl.java

@@ -227,6 +227,38 @@ public class UserDynamicsServiceImpl implements UserDynamicsService {
             vo.setMediaUrls(new ArrayList<>());
         }
 
+        // 确保 isLiked 和 isFavorited 正确转换为 Boolean(根据 dynamic_likes 和 dynamic_favorites 表判断)
+        // SQL 返回 1/0,MyBatis 会映射为 Boolean,但为了安全起见,确保正确转换
+        Object isLikedObj = dynamic.getIsLiked();
+        if (isLikedObj != null) {
+            if (isLikedObj instanceof Boolean) {
+                vo.setIsLiked((Boolean) isLikedObj);
+            } else if (isLikedObj instanceof Integer) {
+                vo.setIsLiked(((Integer) isLikedObj) == 1);
+            } else if (isLikedObj instanceof Number) {
+                vo.setIsLiked(((Number) isLikedObj).intValue() == 1);
+            } else {
+                vo.setIsLiked(Boolean.TRUE.equals(isLikedObj));
+            }
+        } else {
+            vo.setIsLiked(false);
+        }
+
+        Object isFavoritedObj = dynamic.getIsFavorited();
+        if (isFavoritedObj != null) {
+            if (isFavoritedObj instanceof Boolean) {
+                vo.setIsFavorited((Boolean) isFavoritedObj);
+            } else if (isFavoritedObj instanceof Integer) {
+                vo.setIsFavorited(((Integer) isFavoritedObj) == 1);
+            } else if (isFavoritedObj instanceof Number) {
+                vo.setIsFavorited(((Number) isFavoritedObj).intValue() == 1);
+            } else {
+                vo.setIsFavorited(Boolean.TRUE.equals(isFavoritedObj));
+            }
+        } else {
+            vo.setIsFavorited(false);
+        }
+
         // 转换用户信息
         if (dynamic.getUser() != null) {
             UserSimpleVO userVO = new UserSimpleVO();