用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页。

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

    

相关内容

热门资讯

第三方插件!即赢互动辅助透视挂... 第三方插件!即赢互动辅助透视挂,闽游麻将是真的有挂,竟然有挂教程1、许多玩家不知道闽游麻将辅助怎么退...
推荐攻略!AAPoKer辅助挂... 推荐攻略!AAPoKer辅助挂多功能透视工具,其实有挂(有挂神器)1、AAPoKer公共底牌简单,A...
随着!红中麻将辅助透视挂,打两... 随着!红中麻将辅助透视挂,打两圈兴化麻将真的是有挂,其实有挂解密进入游戏-大厅左侧-新手福利-激活码...
玩家必看攻略!aapoker辅... 玩家必看攻略!aapoker辅助挂多功能透视工具,竟然真的是有挂(确实有挂)1、首先打开aapoke...
目前!天龙八部辅助透视挂,趣玩... 目前!天龙八部辅助透视挂,趣玩贵州麻将是真的有挂,都是证实有挂1、玩家可以在天龙八部线上大神俱乐部对...
今日焦点!wpk辅助挂多功能透... 今日焦点!wpk辅助挂多功能透视工具,确实真的有挂(有挂分享)wpk辅助器是一种具有地方特色的麻将游...
据公告内容!多彩世界辅助透视挂... 据公告内容!多彩世界辅助透视挂,天天监利麻将是有挂,好像有挂规律1、每一步都需要思考,不同水平的挑战...
新手必备!AAPoKer辅助挂... 新手必备!AAPoKer辅助挂多功能透视工具,其实是有挂(有挂技巧)1、首先打开AAPoKer辅助器...
最终!8522TV辅助透视挂,... 最终!8522TV辅助透视挂,福气棋牌真的有挂,切实有挂方略亲,关键说明,福气透视脚本安卓赛季回归,...
分辨真假!wepoker辅助挂... 分辨真假!wepoker辅助挂多功能透视工具,一贯真的有挂(有挂秘籍)1、这是跨平台的wepoker...