Nuxt + Pinia + Element Plus 后台管理系统搭建教程(含源码)

🚀 Nuxt + Pinia + Element Plus 后台管理系统搭建教程(含源码)

📌 收藏 + 点赞 + 关注,快速搭建你的 Nuxt 3 后台管理系统!


🧱 一、完整项目结构(直接贴源码)

📦 项目初始化

bash 复制代码
npx nuxi init nuxt-admin
cd nuxt-admin
npm install

⚙️ 安装 Pinia 和 Element Plus

bash 复制代码
npm install @pinia/nuxt element-plus

🧩 编辑 nuxt.config.ts

ts 复制代码
// nuxt.config.ts
export default defineNuxtConfig({
  modules: ['@pinia/nuxt'],
  css: ['element-plus/dist/index.css'],
  app: {
    head: {
      title: 'Nuxt Admin Dashboard',
    },
  },
})

📁 页面结构一览

复制代码
pages/
├── index.vue          # 登录页
├── dashboard.vue      # 控制台页面
layouts/
└── default.vue        # 后台主布局
composables/
└── useAuth.ts         # 权限中间件
stores/
└── user.ts            # 用户信息管理

✅ 1. 登录页 pages/index.vue

vue 复制代码
<template>
  <div class="login">
    <el-card class="login-card">
      <el-input v-model="username" placeholder="用户名" />
      <el-input v-model="password" placeholder="密码" type="password" />
      <el-button type="primary" @click="login">登录</el-button>
    </el-card>
  </div>
</template>

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

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

const username = ref('')
const password = ref('')

const login = () => {
  if (username.value === 'admin' && password.value === '123456') {
    userStore.setUser({ name: '管理员', token: 'abc123' })
    router.push('/dashboard')
  } else {
    ElMessage.error('账号或密码错误')
  }
}
</script>

<style scoped>
.login {
  display: flex;
  height: 100vh;
  justify-content: center;
  align-items: center;
}
.login-card {
  width: 300px;
}
</style>

✅ 2. 控制台页 pages/dashboard.vue

vue 复制代码
<template>
  <el-container>
    <el-aside width="200px">菜单栏</el-aside>
    <el-container>
      <el-header>控制台</el-header>
      <el-main>欢迎你,{{ userStore.user.name }}</el-main>
    </el-container>
  </el-container>
</template>

<script setup>
import { useUserStore } from '@/stores/user'
definePageMeta({ middleware: 'auth' }) // 需登录访问
const userStore = useUserStore()
</script>

✅ 3. 全局布局 layouts/default.vue

vue 复制代码
<template>
  <el-container style="height: 100vh">
    <slot />
  </el-container>
</template>

✅ 4. 用户状态管理 stores/user.ts

ts 复制代码
// stores/user.ts
import { defineStore } from 'pinia'

export const useUserStore = defineStore('user', {
  state: () => ({
    user: {
      name: '',
      token: '',
    },
  }),
  actions: {
    setUser(user) {
      this.user = user
    },
  },
  persist: true,
})

💡 推荐配合 pinia-plugin-persistedstate 实现状态持久化。


✅ 5. 登录校验中间件 middleware/auth.ts

ts 复制代码
// middleware/auth.ts
export default defineNuxtRouteMiddleware((to, from) => {
  const userStore = useUserStore()
  if (!userStore.user.token) {
    return navigateTo('/')
  }
})

📘 二、知识点详解:为何选择 Nuxt + Pinia + Element Plus?

📌 1. Nuxt 的优势

  • ✅ 自动路由
  • ✅ SSR 和 SSG 支持
  • ✅ 支持 API 路由(服务端)
  • ✅ 内置中间件,方便做权限拦截

🧠 2. Pinia 管理状态更清晰

  • ✅ 支持组合式 API
  • ✅ 内建 devtools 支持
  • ✅ 与 Vue 3 完美结合
  • ✅ 支持持久化插件,适合管理用户状态

🎨 3. Element Plus 快速构建 UI

  • 提供大量后台组件(表格、分页、表单验证)
  • 支持按需引入 + 国际化

✅ 三、总结:Nuxt 后台管理系统最佳实践

技术栈 作用
Nuxt 3 页面结构 + SSR + 中间件
Pinia 用户登录信息和状态管理
Element Plus 后台页面 UI 构建
Middleware 登录校验、权限控制

🛠 后续建议扩展模块:

  • ✅ 接入真实后端 API,使用 useFetch
  • ✅ 接入权限系统(按钮级别控制)
  • ✅ 使用 vueuse/head 动态标题设置
  • ✅ 动态菜单 + 动态路由
  • ✅ 配合 Tailwind 或 UnoCSS 做定制样式
相关推荐
小兵张健7 小时前
价值1000的 AI 工作流:Codex 通用前端协作模式
前端·aigc·ai编程
sunny_8 小时前
面试踩大坑!同一段 Node.js 代码,CJS 和 ESM 的执行顺序居然是反的?!99% 的人都答错了
前端·面试·node.js
拉不动的猪8 小时前
移动端调试工具VConsole初始化时的加载阻塞问题
前端·javascript·微信小程序
ayqy贾杰10 小时前
Agent First Engineering
前端·vue.js·面试
IT_陈寒10 小时前
SpringBoot实战:5个让你的API性能翻倍的隐藏技巧
前端·人工智能·后端
iceiceiceice10 小时前
iOS PDF阅读器段评实现:如何从 PDFSelection 精准还原一个自然段
前端·人工智能·ios
大金乄10 小时前
封装一个vue2的elementUI 表格组件(包含表格编辑以及多级表头)
前端·javascript
葡萄城技术团队11 小时前
【性能优化篇】面对万行数据也不卡顿?揭秘协同服务器的“片段机制 (Fragments)”
前端
程序员阿峰12 小时前
2026前端必备:TensorFlow.js,浏览器里的AI引擎,不写Python也能玩转智能
前端
Jans12 小时前
Shipfe — Rust 写的前端静态部署工具:一条命令上线 + 零停机 + 可回滚 + 自动清理
前端