| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 |
- import { STORAGE } from '@/core/constants/storage-keys'
- /**
- * 从登录响应里提炼真正的用户档案。
- * 多种历史形态在这里收敛,保证后续 spread 永远能拿到 token/id 等关键字段。
- */
- function pickUserProfile(payload) {
- if (!payload || typeof payload !== 'object') return {}
- if (payload.userinfo && typeof payload.userinfo === 'object') return payload.userinfo
- if (payload.data && typeof payload.data === 'object' && payload.data.userinfo) return payload.data.userinfo
- if (payload.token || payload.id) return payload
- return {}
- }
- const defaultState = () => ({
- id: 0,
- isLogin: false,
- username: '',
- nickname: '',
- mobile: '',
- avatar: '',
- level: 0,
- gender: 0,
- area_code: '852',
- birthday: '',
- bio: '',
- money: '0.00',
- score: 0,
- token: '',
- pushs: true,
- shock: true,
- voice: true
- })
- export default {
- namespaced: true,
- state: defaultState(),
- mutations: {
- apply(state, payload) {
- if (!payload || typeof payload !== 'object') return
- Object.keys(payload).forEach((key) => {
- if (key === 'token') {
- const next = payload.token
- const text = next != null ? String(next).trim() : ''
- // 仅在有有效 token 时写入;已登录时忽略空值,避免资料接口清空令牌
- if (text) state.token = text
- else if (!state.token) state.token = ''
- return
- }
- if (key === 'isLogin') {
- const on = payload.isLogin === true || payload.isLogin === 1 || payload.isLogin === '1'
- if (on) state.isLogin = true
- else if (!state.isLogin) state.isLogin = false
- return
- }
- state[key] = payload[key]
- })
- uni.setStorageSync(STORAGE.user, state)
- },
- reset(state) {
- Object.assign(state, defaultState())
- }
- },
- actions: {
- hydrateFromCache({ commit }) {
- const cached = uni.getStorageSync(STORAGE.user)
- if (cached) commit('apply', cached)
- },
- /**
- * 写入登录态。允许的 payload 形状:
- * - `{ userinfo: {...}, statistics: {...} }` 推荐形态
- * - `{ data: { userinfo: {...} } }` envelope 没拆干净时
- * - `{ id, token, nickname, ... }` 老接口扁平形态
- *
- * 写完 mutation 之后会再次 `setStorageSync`,确保 isLogin 被持久化
- * (和源项目 store/modules/user.js 行为一致,避免后续 token 拦截器读不到)。
- */
- login({ state, commit, dispatch }, payload = {}) {
- const profile = pickUserProfile(payload)
- commit('apply', {
- ...profile,
- isLogin: true,
- token: profile.token || state.token,
- pushs: true,
- voice: true,
- shock: true
- })
- if (!state.isLogin) state.isLogin = true
- if (profile.token && !state.token) state.token = profile.token
- uni.setStorageSync(STORAGE.user, state)
- const stats = payload && (payload.statistics || (payload.data && payload.data.statistics))
- if (stats) dispatch('stats/merge', stats, { root: true })
- }
- }
- }
|