全栈项目搭建指南:Nuxt.js + Node.js + MongoDB

全栈项目搭建指南:Nuxt.js + Node.js + MongoDB

一、项目概述

我们将构建一个完整的全栈应用,包含:

  • 前端:Nuxt.js (SSR渲染)
  • 后端:Node.js (Express/Koa框架)
  • 数据库:MongoDB
  • 后台管理系统:集成在同一个项目中

二、环境准备

1. 安装必备工具

bash 复制代码
# 安装Node.js (建议16.x以上)
# 安装MongoDB (社区版即可)
# 安装代码编辑器(VSCode推荐)

2. 创建项目目录结构

bash 复制代码
mkdir fullstack-project
cd fullstack-project

三、后端服务搭建

1. 初始化Node.js项目

bash 复制代码
mkdir server
cd server
npm init -y

2. 安装依赖

bash 复制代码
npm install express mongoose cors dotenv bcryptjs jsonwebtoken
npm install --save-dev nodemon

3. 基础Express服务器 (server/index.js)

javascript 复制代码
require('dotenv').config()
const express = require('express')
const mongoose = require('mongoose')
const cors = require('cors')

const app = express()

// 中间件
app.use(cors())
app.use(express.json())

// 数据库连接
mongoose.connect(process.env.MONGO_URI)
  .then(() => console.log('MongoDB connected'))
  .catch(err => console.error(err))

// 路由
app.use('/api/auth', require('./routes/auth'))
app.use('/api/admin', require('./routes/admin'))

const PORT = process.env.PORT || 5000
app.listen(PORT, () => console.log(`Server running on port ${PORT}`))

4. 创建.env文件

env 复制代码
MONGO_URI=mongodb://localhost:27017/fullstack_db
JWT_SECRET=your_jwt_secret_key
PORT=5000

四、前端Nuxt.js搭建

1. 创建Nuxt项目 (回到项目根目录)

bash 复制代码
npx nuxi init client
cd client
npm install

2. 安装常用依赖

bash 复制代码
npm install axios @nuxtjs/auth-next pinia @element-plus/nuxt

3. 配置nuxt.config.ts

javascript 复制代码
export default defineNuxtConfig({
  modules: [
    '@nuxtjs/auth-next',
    '@element-plus/nuxt',
    '@pinia/nuxt'
  ],
  auth: {
    strategies: {
      local: {
        token: {
          property: 'token',
          global: true,
        },
        user: {
          property: 'user',
        },
        endpoints: {
          login: { url: '/api/auth/login', method: 'post' },
          logout: { url: '/api/auth/logout', method: 'post' },
          user: { url: '/api/auth/user', method: 'get' }
        }
      }
    }
  },
  runtimeConfig: {
    public: {
      apiBase: 'http://localhost:5000'
    }
  }
})

五、后台管理系统集成

1. 创建管理后台布局 (client/layouts/admin.vue)

vue 复制代码
<template>
  <div class="admin-layout">
    <AdminSidebar />
    <div class="admin-content">
      <AdminHeader />
      <slot />
    </div>
  </div>
</template>

<script setup>
// 管理后台的公共布局
</script>

2. 创建管理路由 (client/pages/admin/index.vue)

vue 复制代码
<template>
  <div>
    <h1>管理控制台</h1>
    <!-- 这里添加管理界面内容 -->
  </div>
</template>

<script setup>
definePageMeta({
  middleware: 'auth',
  layout: 'admin'
})
</script>

六、数据库模型设计

1. 用户模型 (server/models/User.js)

javascript 复制代码
const mongoose = require('mongoose')
const bcrypt = require('bcryptjs')

const UserSchema = new mongoose.Schema({
  username: { type: String, required: true, unique: true },
  email: { type: String, required: true, unique: true },
  password: { type: String, required: true },
  role: { type: String, enum: ['user', 'admin'], default: 'user' },
  createdAt: { type: Date, default: Date.now }
})

// 密码加密中间件
UserSchema.pre('save', async function(next) {
  if (!this.isModified('password')) return next()
  this.password = await bcrypt.hash(this.password, 10)
  next()
})

module.exports = mongoose.model('User', UserSchema)

七、API路由示例

1. 认证路由 (server/routes/auth.js)

javascript 复制代码
const router = require('express').Router()
const jwt = require('jsonwebtoken')
const User = require('../models/User')

// 用户注册
router.post('/register', async (req, res) => {
  try {
    const user = new User(req.body)
    await user.save()
    res.status(201).json({ success: true })
  } catch (err) {
    res.status(400).json({ error: err.message })
  }
})

// 用户登录
router.post('/login', async (req, res) => {
  const { username, password } = req.body
  const user = await User.findOne({ username })
  
  if (!user || !(await bcrypt.compare(password, user.password))) {
    return res.status(401).json({ error: 'Invalid credentials' })
  }
  
  const token = jwt.sign({ id: user._id }, process.env.JWT_SECRET, { expiresIn: '1d' })
  res.json({ token, user })
})

module.exports = router

八、项目启动与测试

1. 启动MongoDB服务

bash 复制代码
mongod

2. 启动后端服务 (server目录下)

bash 复制代码
nodemon index.js

3. 启动前端开发服务器 (client目录下)

bash 复制代码
npm run dev

九、项目结构完整树

复制代码
fullstack-project/
├── server/
│   ├── models/          # 数据库模型
│   │   └── User.js
│   ├── routes/          # API路由
│   │   ├── auth.js
│   │   └── admin.js
│   ├── index.js         # 主服务器文件
│   └── .env             # 环境变量
└── client/
    ├── pages/           # 页面组件
    │   ├── index.vue
    │   └── admin/
    │       └── index.vue
    ├── layouts/         # 布局组件
    │   ├── default.vue
    │   └── admin.vue
    ├── components/      # 公共组件
    ├── nuxt.config.ts   # Nuxt配置
    └── package.json

十、后续开发建议

  1. API文档:使用Swagger或Postman创建API文档
  2. 错误处理:添加统一的错误处理中间件
  3. 数据验证:使用Joi或Validator.js进行输入验证
  4. 日志系统:添加Winston或Morgan日志记录
  5. 测试:添加Jest单元测试和Supertest API测试
  6. 部署
    • 后端:部署到Heroku或AWS
    • 前端:部署到Vercel或Netlify
    • 数据库:使用MongoDB Atlas云服务

这个模板项目提供了完整的全栈开发基础架构,您可以根据实际需求进行扩展和修改。

相关推荐
酷爱码23 分钟前
css中的 vertical-align与line-height作用详解
前端·css
沐土Arvin37 分钟前
深入理解 requestIdleCallback:浏览器空闲时段的性能优化利器
开发语言·前端·javascript·设计模式·html
专注VB编程开发20年39 分钟前
VB.NET关于接口实现与简化设计的分析,封装其他类
java·前端·数据库
小妖6661 小时前
css 中 content: “\e6d0“ 怎么变成图标的?
前端·css
L耀早睡2 小时前
mapreduce打包运行
大数据·前端·spark·mapreduce
HouGISer2 小时前
副业小程序YUERGS,从开发到变现
前端·小程序
outstanding木槿2 小时前
react中安装依赖时的问题 【集合】
前端·javascript·react.js·node.js
霸王蟹3 小时前
React中useState中更新是同步的还是异步的?
前端·javascript·笔记·学习·react.js·前端框架
霸王蟹3 小时前
React Hooks 必须在组件最顶层调用的原因解析
前端·javascript·笔记·学习·react.js
专注VB编程开发20年3 小时前
asp.net IHttpHandler 对分块传输编码的支持,IIs web服务器后端技术
服务器·前端·asp.net