用uniapp 及socket.io做一个简单聊天app 4
创始人
2024-11-10 03:12:21
0

界面如下:
在这里插入图片描述

      

注册页:
在这里插入图片描述

      

在store加入index.js:

import Vue from 'vue'; import Vuex from 'vuex'; import config from '@/config/config.js'; Vue.use(Vuex); export default new Vuex.Store({ 	state: { 		token: uni.getStorageSync('token') || '', // 从本地存储中获取 token 		user: null, // 用户信息 		friends: [], // 好友列表 		groups: [], 		lastMessages: {}, // 新增状态,用于存储最后一条消息 		hasMoreFriends: true // 新增状态用于跟踪是否有更多好友 	}, 	mutations: { 		SET_TOKEN(state, token) { 			state.token = token; 			uni.setStorageSync('token', token); // 保存到本地存储 		}, 		CLEAR_TOKEN(state) { 			state.token = ''; 			uni.removeStorageSync('token'); // 从本地存储中删除 		}, 		SET_USER(state, user) { 			state.user = user; 		}, 		SET_FRIENDS(state, { 			friends, 			hasMoreFriends 		}) { 			state.friends = friends; 			state.hasMoreFriends = hasMoreFriends; 		}, 		SET_GROUPS(state, groups) { 			state.groups = groups; 		},  		SET_LAST_MESSAGE(state, { 			id, 			message 		}) { 			Vue.set(state.lastMessages, id, message); // 动态设置最后一条消息 		} 	}, 	actions: { 		async fetchGroups({ 			commit 		}) { 			const token = uni.getStorageSync('token'); 			const [error, response] = await uni.request({ 				url: `${config.apiBaseUrl}/groups`, 				method: 'GET', 				header: { 					'Authorization': `Bearer ${token}` 				} 			}); 			if (!error && response.data.code == 0) { 				commit('SET_GROUPS', response.data.data); 			} 			logoutpub(response, commit); 		}, 		async createGroup({ 			state 		}, { 			name, 			description, 			avatar_url 		}) { 			try { 				const token = uni.getStorageSync('token'); 				const [error, response] = await uni.request({ 					url: `${config.apiBaseUrl}/groups`, 					method: 'POST', 					header: { 						'Authorization': `Bearer ${token}`, 						'Content-Type': 'application/json' 					}, 					data: { 						name, 						description, 						avatar_url 					} 				}); 				logoutpub(response, commit); 				return response.data; 			} catch (error) { 				throw error; 			} 		}, 		async login({ 			commit 		}, { 			username, 			password 		}) { 			try { 				const [error, response] = await uni.request({ 					url: `${config.apiBaseUrl}/login`, 					method: 'POST', 					data: { 						username, 						password 					} 				}); 				if (error) { 					throw new Error(`Request failed with error: ${error}`); 				} 				response.data = response.data.data; 				if (response.data.token) { 					commit('SET_TOKEN', response.data.token); 					uni.redirectTo({ 						url: '/pages/index/friends' 					}); 				} else { 					throw new Error('Invalid credentials'); 				} 			} catch (error) { 				console.error('Login error:', error); 				throw error; 			} 		}, 		async fetchUser({ 			commit 		}) { 			const token = uni.getStorageSync('token'); 			if (!token) return;  			try { 				const [error, response] = await uni.request({ 					url: `${config.apiBaseUrl}/user`, 					method: 'GET', 					header: { 						'Authorization': `Bearer ${token}` 					} 				}); 				logoutpub(response, commit);  				if (error) { 					throw new Error(`Request failed with error: ${error}`); 				}  				if (response.statusCode === 200) { 					const userData = response.data.data || response.data; 					commit('SET_USER', userData); 				} else { 					throw new Error('Failed to fetch user data'); 				} 			} catch (error) { 				console.error('Failed to fetch user:', error); 			} 		}, 		async fetchFriends({ 			commit 		}, { 			page = 1, 			perPage = 20 		}) { 			const token = uni.getStorageSync('token'); 			if (!token) return; 			try { 				const [error, response] = await uni.request({ 					url: `${config.apiBaseUrl}/friends`, 					method: 'GET', 					header: { 						'Authorization': `Bearer ${token}` 					}, 					data: { 						page, 						perPage 					} 				}); 				 				console.log("friends",response) 				 				logoutpub(response, commit); 				if (error) { 					throw new Error(`Request failed with error: ${error}`); 				} 				if (response.data) { 					commit('SET_FRIENDS', { 						friends: response.data.data, 						hasMoreFriends: response.data.hasMoreFriends 					}); 				} 			} catch (error) { 				console.error(error); 			} 		}, 		async handleNewMessage({ 			commit 		}, { 			id, 			message 		}) { 			try { 				// 假设这是接收消息的逻辑 				commit('SET_LAST_MESSAGE', { 					id, 					message 				}); 			} catch (error) { 				console.error('Failed to handle new message:', error); 			} 		}, 		logout({ 			commit 		}) { 			commit('CLEAR_TOKEN'); 			commit('SET_USER', null); 			commit('SET_FRIENDS', { 				friends: [], 				hasMoreFriends: true 			}); 			uni.redirectTo({ 				url: '/pages/index/login' // 跳转到登录页面 			}); 		} 	} });  // Helper function for handling token expiration function logoutpub(response, commit) { 	if (response.data && response.data.code === -1 && response.data.message === 'expire') { 		commit('CLEAR_TOKEN'); 		commit('SET_USER', null); 		commit('SET_FRIENDS', { 			friends: [], 			hasMoreFriends: true 		}); 		uni.redirectTo({ 			url: '/pages/index/login' // 跳转到登录页面 		}); 	} } 

在config创建config.js:

const config = {   apiBaseUrl: 'http://localhost:3000' }; export default config; 

用户登陆后进入到friends页。

在这里插入图片描述
界面代码为:

    

相关内容

热门资讯

一分钟识别!(爱玩麻将)原来有... 您好,爱玩麻将这款游戏可以开挂的,确实是有挂的,需要了解加微【757446909】很多玩家在这款游戏...
两分钟透明挂!(Wepoke黑... 两分钟透明挂!(Wepoke黑科技)软件透明挂,WPK黑科技其实是有猫腻,详细教程(有挂细节)-哔哩...
三分钟盈利!(至尊魔牌)真的是... 三分钟盈利!(至尊魔牌)真的是有挂吗,至尊魔牌2020已更新,详细教程(有挂方法)-哔哩哔哩;1、点...
四分钟插件!(wepoKE)确... 四分钟插件!(wepoKE)确实真的是有挂吗,聚星扑克2022已更新,详细教程(有挂规律)-哔哩哔哩...
二分钟大厅!(wpk插件)其实... 二分钟大厅!(wpk插件)其实是真的有挂的,竞技联盟原来确实是有挂,详细教程(有挂透明挂)-哔哩哔哩...
七分钟分钟!大晋游戏是有挂,友... 七分钟分钟!大晋游戏是有挂,友谊麻将外挂透视辅助挂,详细教程(2020已更新)(哔哩哔哩);一、友谊...
4分钟下载!(pokerbro... 您好,pokerbros这款游戏可以开挂的,确实是有挂的,需要了解加微【841106723】很多玩家...
1分钟测试!(微扑克规律)其实... 《1分钟测试!(微扑克规律)其实是真的有挂,微扑克规律2022已更新,详细教程(有挂方法)-哔哩哔哩...
2分钟工具!(一乐浙江)外挂透... 2分钟工具!(一乐浙江)外挂透视辅助挂,扑克世界原来是有挂详细教程(有挂规律)-哔哩哔哩;亲真的是有...
2分钟自建房!(28圈)其实确... 2分钟自建房!(28圈)其实确实是有挂,28圈2023已更新,详细教程(有挂方略)-哔哩哔哩;28圈...