import Vue from 'vue' import Vuex from 'vuex' Vue.use(Vuex) const store = new Vuex.Store({ state: { token: '', userId: '', role: 'student', alumniVerify: 'pending', classId: '', name: '', nickname: '', phone: '', newUser: false }, getters: { // 单一可信源:优先 store,store 空时兜底读 storage(热启动/HBuilderX 热更新场景 store 可能未恢复) isLoggedIn: function(state) { if (state.token) return true return !!uni.getStorageSync('token') }, isVerified: function(state) { return state.alumniVerify === 'accepted' }, hasClass: function(state) { return state.classId !== '' && state.classId !== null } }, mutations: { setToken(state, token) { state.token = token uni.setStorageSync('token', token) }, setUserInfo(state, userInfo) { state.userId = userInfo.userId state.role = userInfo.role || 'student' state.alumniVerify = userInfo.alumniVerify || 'pending' state.classId = userInfo.classId || '' state.name = userInfo.name || '' state.nickname = userInfo.nickname || '' state.phone = userInfo.phone || '' state.newUser = userInfo.newUser || false uni.setStorageSync('userId', userInfo.userId) uni.setStorageSync('role', state.role) uni.setStorageSync('alumniVerify', state.alumniVerify) uni.setStorageSync('classId', state.classId) uni.setStorageSync('userInfo', { userId: userInfo.userId, role: state.role, alumniVerify: state.alumniVerify, classId: state.classId, name: state.name, nickname: state.nickname, phone: state.phone }) }, setClassId(state, classId) { state.classId = classId uni.setStorageSync('classId', classId) }, setAlumniVerify(state, status) { state.alumniVerify = status uni.setStorageSync('alumniVerify', status) var userInfo = uni.getStorageSync('userInfo') || {} userInfo.alumniVerify = status uni.setStorageSync('userInfo', userInfo) }, logout(state) { state.token = '' state.userId = '' state.role = 'student' state.alumniVerify = 'pending' state.classId = '' state.name = '' state.nickname = '' state.phone = '' state.newUser = false uni.removeStorageSync('token') uni.removeStorageSync('userId') uni.removeStorageSync('role') uni.removeStorageSync('alumniVerify') uni.removeStorageSync('classId') uni.removeStorageSync('userInfo') } }, actions: { login({ commit }, data) { commit('setToken', data.token) commit('setUserInfo', { userId: data.userId, role: data.role, alumniVerify: data.alumniVerify, classId: data.classId, name: data.name, nickname: data.nickname, phone: data.phone, newUser: data.newUser }) }, // 冷启动/热更新后从 storage 恢复登录态到 store,保证 state 与 storage 一致 restore({ commit }) { var token = uni.getStorageSync('token') if (!token) return commit('setToken', token) var userInfo = uni.getStorageSync('userInfo') if (userInfo) { commit('setUserInfo', userInfo) } var classId = uni.getStorageSync('classId') if (classId) { commit('setClassId', classId) } } } }) export default store