Vue CLI全栈开发实战:从零构建用户管理系统
创作时间:
作者:
@小白创作中心
Vue CLI全栈开发实战:从零构建用户管理系统
在当今的Web开发领域,Vue.js以其简洁的API和强大的功能赢得了广大开发者的青睐。然而,一个完整的Web应用不仅仅需要前端界面,还需要后端服务、数据库支持以及用户认证等全栈功能。本文将介绍如何使用Vue CLI快速搭建一个包含前端路由、状态管理、后端API、数据库操作和权限控制的全栈应用。
项目概述
本项目将实现一个简单的用户管理系统,包含以下功能:
- 用户注册和登录
- 管理员和普通用户的权限区分
- 后台管理页面,允许管理员查看和管理用户列表
技术栈
- 前端:Vue CLI + Vue Router + Pinia
- 后端:Node.js + Express
- 数据库:MySQL
- ORM:Sequelize
- 认证:JWT
- 密码加密:bcrypt
前端开发
项目初始化
使用Vue CLI创建项目:
npm create vue@latest
选择Vue 3版本,并安装Vue Router和Pinia:
npm install vue-router pinia axios
路由配置
在router/index.js
中配置路由:
import { createRouter, createWebHistory } from 'vue-router'
import Login from '../views/Login.vue'
import Admin from '../views/Admin.vue'
const routes = [
{ path: '/', redirect: '/login' },
{ path: '/login', component: Login },
{ path: '/admin', component: Admin, meta: { requiresAuth: true, requiresAdmin: true } }
]
const router = createRouter({
history: createWebHistory(),
routes
})
router.beforeEach((to, from) => {
const isAuthenticated = localStorage.getItem('token')
const isAdmin = localStorage.getItem('role') === 'admin'
if (to.meta.requiresAuth && !isAuthenticated) return '/login'
if (to.meta.requiresAdmin && !isAdmin) return '/login'
})
export default router
状态管理
使用Pinia进行状态管理:
// store/index.js
import { defineStore } from 'pinia'
export const useUserStore = defineStore('user', {
state: () => ({
token: localStorage.getItem('token') || '',
role: localStorage.getItem('role') || ''
}),
actions: {
setToken(token) {
this.token = token
localStorage.setItem('token', token)
},
setRole(role) {
this.role = role
localStorage.setItem('role', role)
}
}
})
后端开发
环境搭建
安装必要的依赖:
npm install express sequelize mysql2 bcryptjs jsonwebtoken
数据库连接
在server.js
中配置数据库连接:
const express = require('express')
const { Sequelize } = require('sequelize')
const bcrypt = require('bcryptjs')
const jwt = require('jsonwebtoken')
const app = express()
app.use(express.json())
const sequelize = new Sequelize('your_db', 'user', 'password', {
host: 'localhost',
dialect: 'mysql'
})
用户模型
定义用户模型:
const User = sequelize.define('User', {
username: { type: Sequelize.STRING, unique: true },
password: Sequelize.STRING,
role: { type: Sequelize.ENUM('admin', 'user'), defaultValue: 'user' }
})
初始化管理员
确保数据库中存在管理员账户:
async function initializeAdmin() {
const admin = await User.findOne({ where: { username: 'admin' } })
if (!admin) {
const hashedPassword = await bcrypt.hash('admin123', 10)
await User.create({ username: 'admin', password: hashedPassword, role: 'admin' })
}
}
API路由
实现注册和登录接口:
app.post('/api/register', async (req, res) => {
try {
const hashedPassword = await bcrypt.hash(req.body.password, 10)
const user = await User.create({
username: req.body.username,
password: hashedPassword
})
res.status(201).json(user)
} catch (error) {
res.status(400).json({ error: 'Registration failed' })
}
})
app.post('/api/login', async (req, res) => {
const user = await User.findOne({ where: { username: req.body.username } })
if (user && await bcrypt.compare(req.body.password, user.password)) {
const token = jwt.sign(
{ id: user.id, role: user.role },
'your_secret_key',
{ expiresIn: '1h' }
)
res.json({ token, role: user.role })
} else {
res.status(401).json({ error: 'Invalid credentials' })
}
})
权限控制
JWT认证
在前端,使用JWT进行身份验证:
// api.js
import axios from 'axios'
import { useUserStore } from '@/store'
const api = axios.create({
baseURL: 'http://localhost:3000/api'
})
api.interceptors.request.use(config => {
const store = useUserStore()
if (store.token) {
config.headers.Authorization = `Bearer ${store.token}`
}
return config
})
export default api
路由守卫
在前端路由中添加权限验证:
router.beforeEach((to, from) => {
const store = useUserStore()
const isAuthenticated = store.token
const isAdmin = store.role === 'admin'
if (to.meta.requiresAuth && !isAuthenticated) return '/login'
if (to.meta.requiresAdmin && !isAdmin) return '/login'
})
部署和测试
测试步骤
- 注册普通用户
- 使用admin/admin123登录管理员账户
- 验证不同角色的页面访问权限
- 测试用户管理功能(编辑/删除)
部署注意事项
- 配置环境变量(数据库密码、JWT密钥等)
- 添加错误处理机制
- 配置HTTPS(生产环境必备)
- 优化数据库连接池配置
通过以上步骤,我们完成了一个基于Vue CLI的全栈应用开发。这个项目不仅展示了前端路由和状态管理的实现,还深入介绍了后端API开发、数据库设计和权限控制等关键环节。希望这个实践案例能为你的Vue全栈开发提供有价值的参考。
热门推荐
2025年煤气罐使用新规定:从生产到报废的全方位安全指南
汽油有什么区别?哪种更好?
儿童睡觉打呼噜:原因、影响与应对策略
八级工伤赔偿标准都有哪些
工伤8级怎么申领赔偿
华为手机怎么辨别是不是新机?购买时需注意哪些细节?
三元锂电池也曾力压磷酸铁锂电池
布鲁日与阿斯顿维拉赛事:3.4前瞻了解
影响商业贷款的关键因素解析
仓库管理流程详解(附作业流程图)
多国研制、新型概念、智能空战…未来战斗机如何发展?
USB3.0 vs USB2.0:技术对比与适用场景选择
三相电机用两相电接法,讨论三相电机使用两相电的可能性
漫威终极逆转夜魔侠玩法攻略:换边流战术详解
如何测试晶振是否工作正常?
吃高蛋白食物能减肥吗
2024人工智能(AI)十大前沿技术趋势展望
军队文职体检标准详解:从身高、体重到视力的全方位解读
运动性低血糖症的原因及治疗方法
摇骰子游戏的规则详解
郁金香:探寻其文化内涵与历史传承
韩国为什么喜欢三国文化?12位中韩专家畅谈三国文化的国际传播
成都武侯祠:赓续历史文脉 三国文化“活”起来
目前主流的量化CTA策略有哪些?
2025 年人们将尝试在这个水下栖息地生活
冬春交替,谨防心脑血管病找上门!
城市户口买了农村房屋该怎么过户
脚踝扭伤怎么看有没有弄到骨头
如何设置数据库连接池
2元一杯绿豆沙冰配方视频