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 配置允许携带凭证。

相关推荐
java1234_小锋10 分钟前
【技术专题】CSS3 网页技术 - CSS3 布局进阶
前端·css·css3
zhippt_101431 分钟前
只剩截图没有源文件?图转PPT把图片还原成可编辑幻灯片
前端·人工智能·powerpoint
shmily麻瓜小菜鸡1 小时前
TypeScript 知识点补充(第三部分:工程化与高级类型)
前端·javascript·typescript
10岁的博客1 小时前
Chrome 扩展安全攻防实录:从权限模型到真实漏洞复盘
前端·chrome·安全
QianhangQianping2 小时前
WebSocket实时推送+ HTTP 定时轮询:一块大屏两套取数怎么不打架
前端·websocket·网络协议·http·低代码·架构·数据可视化
Eider19982 小时前
Python基础知识之并发相关-2
开发语言·前端·python
用户69371750013842 小时前
AI 能写代码,但工程架构还是应该由人来定
前端·后端
Hilaku2 小时前
前端的技术判断力是怎么练出来的?
前端·javascript·程序员
悠仁さん2 小时前
【C++】set map 使用
java·前端·c++
用户093671755412 小时前
用 4500 行 TypeScript 复刻了童年方格纸上的海战棋
前端·vue.js