Vue3项目中使用Pinia代替TP6 session传递

前后端分离架构下,Vue 无法直接读取 PHP 的 Session,Session 仅适合后端内部使用,推荐使用Pinia代替。具体实现步骤如下:

1. 后端:在登录成功时返回用户名

你的接口已经返回了 $user 数据,确保 data 中包含 username 字段即可:

dart 复制代码
// 登录成功,返回用户信息
return json([
    'code' => 200, 
    'msg' => '登录成功', 
    'data' => [
        'username' => $user->username,
        'id' => $user->id,
        // 其他需要的字段...
    ]
]);

2. 前端:登录页接收并存入 Pinia

安装 Pinia(如未安装):

复制代码
npm install pinia

创建用户 Store (src/stores/user.ts):

javascript 复制代码
import { defineStore } from 'pinia'
import { ref } from 'vue'

export const useUserStore = defineStore('user', () => {
  const username = ref('')

  function setUsername(name: string) {
    username.value = name
    localStorage.setItem('username', name) // 同时持久化,刷新不丢失
  }

  function clearUser() {
    username.value = ''
    localStorage.removeItem('username')
  }

  return { username, setUsername, clearUser }
})

在登录页调用:

javascript 复制代码
import { useUserStore } from '@/stores/user'
import { useRouter } from 'vue-router'

const userStore = useUserStore()
const router = useRouter()

async function handleLogin() {
  const res = await api.post('/login', { username, password })
  if (res.data.code === 200) {
    // 将后端返回的用户名存入 Pinia
    userStore.setUsername(res.data.data.username)
    // 跳转到首页
    router.push('/home')
  }
}

3. Home 页面:读取用户名展示

xml 复制代码
<template>
  <div>
    <p>欢迎回来,{{ userStore.username }}</p>
    <button @click="logout">退出登录</button>
  </div>
</template>

<script setup lang="ts">
import { useUserStore } from '@/stores/user'
import { useRouter } from 'vue-router'

const userStore = useUserStore()
const router = useRouter()

function logout() {
  userStore.clearUser()
  router.push('/login')
}
</script>

4. 路由守卫:防止未登录访问 Home

在 src/router/index.ts 中添加全局前置守卫:

vbnet 复制代码
router.beforeEach((to, from, next) => {
  const token = localStorage.getItem('username') // 或用 token 判断
  if (to.path === '/home' && !token) {
    next('/login')
  } else {
    next()
  }
})

⚠️ 关于 Session 的补充说明

后端代码中的 Session::set('user_name', $username) 依然保留即可,它有以下作用:

  • 后端鉴权 :后续接口可通过 Session::get('user_name') 判断用户是否登录
  • 服务端逻辑:如记录操作日志、权限校验等

但在前后端分离场景下,前端无法直接读取 PHP Session ,所以用户名必须通过 JSON 响应显式返回给前端。如果你需要跨域请求时保持 Session,还需在 axios 中配置 withCredentials: true,并确保后端 CORS 配置允许携带凭证。

相关推荐
仿生狮子4 小时前
OpenAI 攻下千禧年难题之后,开发者似乎无动于衷
前端·数学·vibecoding
Lvan的前端笔记8 小时前
docker:每个前端项目一个 Nginx 容器还是只有一个Nginx容器
前端·nginx·docker
三天不学习8 小时前
Egg.js 4 突然爆火,原因是否归结于AI 原生落地需求爆发?
前端·javascript·全栈·egg.js
xcs194059 小时前
前端 vue 的前端页面debugger 进不去
前端·javascript·vue.js
明月_清风10 小时前
Deno 终局来了:从挑战 Node 到被 Cloudflare 收编
前端·后端·node.js
Csvn11 小时前
框架性能优化
前端
回眸&啤酒鸭12 小时前
【回眸】OpenSwarm 多智能体协作系统实战指南
大数据·前端·人工智能
用户693717500138413 小时前
2026,程序员的时代拐点到了
android·前端·后端
大龄秃头程序员13 小时前
一次 iBeacon + BLE 无感解锁方案的实现记录
前端
小兔子13 小时前
Python 的 GIL 与 free-threading:3.13 之后「去 GIL」走到哪一步了
前端