Vue 3 + Django 4 全新技术全栈项目

学习资料

在现代全栈开发中,Vue 3 和 Django 4 是非常受欢迎的技术组合。Vue 3 以其高效的响应式系统和组件化开发模式受到前端开发者的青睐,而 Django 4 则以其强大的 ORM 和安全性受到后端开发者的喜爱。本文将详细介绍如何使用 Vue 3 和 Django 4 打造一个全新的全栈项目,涵盖从项目搭建到核心功能实现的全过程。

1. 项目概述

假设我们要开发一个简单的博客系统,该系统包含用户注册、登录、文章发布、文章列表展示、文章详情查看等功能。我们将使用 Vue 3 作为前端框架,Django 4 作为后端框架,并使用 Django REST framework 来构建 RESTful API。

2. 项目搭建

2.1 后端:Django 4
  1. 创建 Django 项目

    • 安装 Django:pip install django
    • 创建项目:django-admin startproject blog_project
    • 进入项目目录:cd blog_project
  2. 创建应用

    • 创建应用:python manage.py startapp blog_app
  3. 配置应用

    • blog_project/settings.py 中添加应用:

      INSTALLED_APPS = [
          ...
          'rest_framework',
          'blog_app',
      ]
  4. 配置数据库

    • blog_project/settings.py 中配置数据库(默认使用 SQLite):

      DATABASES = {
          'default': {
              'ENGINE': 'django.db.backends.sqlite3',
              'NAME': BASE_DIR / 'db.sqlite3',
          }
      }
  5. 创建模型

    • blog_app/models.py 中定义模型:

      from django.contrib.auth.models import User
      from django.db import models
      
      class Post(models.Model):
          title = models.CharField(max_length=200)
          content = models.TextField()
          author = models.ForeignKey(User, on_delete=models.CASCADE)
          created_at = models.DateTimeField(auto_now_add=True)
          updated_at = models.DateTimeField(auto_now=True)
      
          def __str__(self):
              return self.title
  6. 迁移数据库

    • 生成迁移文件:python manage.py makemigrations
    • 应用迁移:python manage.py migrate
  7. 创建序列化器

    • blog_app/serializers.py 中创建序列化器:

      from rest_framework import serializers
      from .models import Post
      
      class PostSerializer(serializers.ModelSerializer):
          class Meta:
              model = Post
              fields = ['id', 'title', 'content', 'author', 'created_at', 'updated_at']
  8. 创建视图

    • blog_app/views.py 中创建视图:

      from rest_framework import viewsets
      from .models import Post
      from .serializers import PostSerializer
      
      class PostViewSet(viewsets.ModelViewSet):
          queryset = Post.objects.all()
          serializer_class = PostSerializer
  9. 配置 URL

    • blog_app/urls.py 中配置 URL:

      from django.urls import path, include
      from rest_framework.routers import DefaultRouter
      from .views import PostViewSet
      
      router = DefaultRouter()
      router.register(r'posts', PostViewSet)
      
      urlpatterns = [
          path('', include(router.urls)),
      ]
    • blog_project/urls.py 中包含应用的 URL:

      from django.contrib import admin
      from django.urls import path, include
      
      urlpatterns = [
          path('admin/', admin.site.urls),
          path('api/', include('blog_app.urls')),
      ]
  10. 运行开发服务器

    • 运行 Django 开发服务器:python manage.py runserver
2.2 前端:Vue 3
  1. 创建 Vue 3 项目

    • 安装 Vue CLI:npm install -g @vue/cli
    • 创建项目:vue create blog_frontend
    • 进入项目目录:cd blog_frontend
  2. 安装必要的依赖

    • 安装 Axios:npm install axios
    • 安装 Vuex:npm install vuex
    • 安装 Vue Router:npm install vue-router
    • 安装 Element Plus:npm install element-plus
  3. 配置项目

    • main.js 中导入并初始化 Vuex 和 Vue Router:

      import { createApp } from 'vue';
      import App from './App.vue';
      import store from './store';
      import router from './router';
      import ElementPlus from 'element-plus';
      import 'element-plus/lib/theme-chalk/index.css';
      
      const app = createApp(App);
      app.use(store);
      app.use(router);
      app.use(ElementPlus);
      app.mount('#app');
  4. 创建组件

    • 创建 Login.vueRegister.vuePostList.vuePostDetail.vue 等组件。
  5. 配置路由

    • router/index.js 中配置路由:

      import { createRouter, createWebHistory } from 'vue-router';
      import Login from '../components/Login.vue';
      import Register from '../components/Register.vue';
      import PostList from '../components/PostList.vue';
      import PostDetail from '../components/PostDetail.vue';
      
      const routes = [
          { path: '/', component: PostList },
          { path: '/login', component: Login },
          { path: '/register', component: Register },
          { path: '/post/:id', component: PostDetail },
      ];
      
      const router = createRouter({
          history: createWebHistory(),
          routes,
      });
      
      export default router;
  6. 状态管理

    • store/index.js 中配置 Vuex:

      import { createStore } from 'vuex';
      
      export default createStore({
          state: {
              user: null,
              posts: [],
          },
          mutations: {
              setUser(state, user) {
                  state.user = user;
              },
              setPosts(state, posts) {
                  state.posts = posts;
              },
          },
          actions: {
              async fetchPosts({ commit }) {
                  const response = await axios.get('http://127.0.0.1:8000/api/posts/');
                  commit('setPosts', response.data);
              },
          },
          getters: {
              getUser: state => state.user,
              getPosts: state => state.posts,
          },
      });
  7. API 调用

    • 在组件中使用 Axios 发送 HTTP 请求,与后端进行数据交互。
  8. 运行开发服务器

    • 运行 Vue 开发服务器:npm run serve

3. 核心功能实现

3.1 用户管理
  • 注册

    • 前端:在 Register.vue 中实现表单提交,发送 POST 请求到后端。
    • 后端:在 blog_app/views.py 中处理注册请求,保存用户信息。
  • 登录

    • 前端:在 Login.vue 中实现表单提交,发送 POST 请求到后端。
    • 后端:在 blog_app/views.py 中处理登录请求,验证用户信息,返回 JWT 令牌。
  • 权限管理

    • 使用 Django REST framework 的权限类(如 IsAuthenticated)来保护 API 端点。
3.2 文章管理
  • 文章列表

    • 前端:在 PostList.vue 中调用 Vuex 的 fetchPosts 动作,获取文章列表。
    • 后端:在 PostViewSet 中处理 GET 请求,返回文章列表。
  • 文章详情

    • 前端:在 PostDetail.vue 中根据文章 ID 获取文章详情。
    • 后端:在 PostViewSet 中处理 GET 请求,返回指定文章的详细信息。
  • 文章发布

    • 前端:在 PostForm.vue 中实现表单提交,发送 POST 请求到后端。
    • 后端:在 PostViewSet 中处理 POST 请求,保存文章信息。
  • 文章编辑

    • 前端:在 PostForm.vue 中实现表单提交,发送 PUT 请求到后端。
    • 后端:在 PostViewSet 中处理 PUT 请求,更新文章信息。
  • 文章删除

    • 前端:在 PostList.vue 中实现删除按钮,发送 DELETE 请求到后端。
    • 后端:在 PostViewSet 中处理 DELETE 请求,删除文章。

4. 安全性与性能优化

4.1 安全性
  • 认证与授权

    • 使用 Django REST framework 的 TokenAuthenticationJWTAuthentication 进行用户认证。
    • 使用 IsAuthenticated 权限类保护 API 端点。
  • 数据加密

    • 使用 Django 的 User 模型和 bcrypt 加密用户密码。
  • 防止 CSRF 攻击

    • 在 Vue 项目中使用 axioswithCredentials 选项,确保 CSRF 令牌的传递。
4.2 性能优化
  • 缓存

    • 使用 Django 的缓存框架(如 LocMemCacheRedis)缓存频繁访问的数据。
    • 在前端使用 Vuex 的 state 缓存数据,减少不必要的 API 请求。
  • 异步处理

    • 使用 Django 的 async 支持,实现异步任务处理。
    • 在前端使用 asyncawait 处理异步请求。
  • 负载均衡

    • 使用 Nginx 进行负载均衡,提高系统的可用性和性能。
  • 数据库优化

    • 使用索引优化查询性能。
    • 使用分页查询减少数据传输量。

5. 部署与运维

5.1 容器化
  • Docker

    • 使用 Docker 容器化应用,编写 Dockerfiledocker-compose.yml 文件,实现一键部署。
    • 为后端和前端分别创建 Docker 镜像。
5.2 持续集成/持续部署(CI/CD)
  • Jenkins

    • 使用 Jenkins 实现自动化构建、测试和部署。
    • 配置 Jenkins 任务,自动拉取代码、构建镜像并部署到生产环境。
  • GitLab CI/CD

    • 使用 GitLab CI/CD 进行持续集成和持续部署。
    • 配置 .gitlab-ci.yml 文件,定义构建和部署流程。
5.3 监控与日志
  • PrometheusGrafana

    • 使用 Prometheus 和 Grafana 进行应用监控。
    • 配置监控指标,实时监控系统性能和健康状况。
  • ELKLoki

    • 使用 ELK(Elasticsearch, Logstash, Kibana)或 Loki 进行日志管理。
    • 配置日志收集和分析,帮助排查问题和优化系统。

总结

通过以上步骤,你可以使用 Vue 3 和 Django 4 打造一个高效、可靠的全栈项目。这个项目不仅具备强大的功能,还能确保安全性和性能。希望本文对你有所帮助,如果你有任何问题或建议,欢迎留言交流!


稳重的山寨机
1 声望0 粉丝