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
创建 Django 项目:
- 安装 Django:
pip install django
- 创建项目:
django-admin startproject blog_project
- 进入项目目录:
cd blog_project
- 安装 Django:
创建应用:
- 创建应用:
python manage.py startapp blog_app
- 创建应用:
配置应用:
在
blog_project/settings.py
中添加应用:INSTALLED_APPS = [ ... 'rest_framework', 'blog_app', ]
配置数据库:
在
blog_project/settings.py
中配置数据库(默认使用 SQLite):DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': BASE_DIR / 'db.sqlite3', } }
创建模型:
在
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
迁移数据库:
- 生成迁移文件:
python manage.py makemigrations
- 应用迁移:
python manage.py migrate
- 生成迁移文件:
创建序列化器:
在
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']
创建视图:
在
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
配置 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')), ]
运行开发服务器:
- 运行 Django 开发服务器:
python manage.py runserver
- 运行 Django 开发服务器:
2.2 前端:Vue 3
创建 Vue 3 项目:
- 安装 Vue CLI:
npm install -g @vue/cli
- 创建项目:
vue create blog_frontend
- 进入项目目录:
cd blog_frontend
- 安装 Vue CLI:
安装必要的依赖:
- 安装 Axios:
npm install axios
- 安装 Vuex:
npm install vuex
- 安装 Vue Router:
npm install vue-router
- 安装 Element Plus:
npm install element-plus
- 安装 Axios:
配置项目:
在
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');
创建组件:
- 创建
Login.vue
、Register.vue
、PostList.vue
、PostDetail.vue
等组件。
- 创建
配置路由:
在
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;
状态管理:
在
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, }, });
API 调用:
- 在组件中使用 Axios 发送 HTTP 请求,与后端进行数据交互。
运行开发服务器:
- 运行 Vue 开发服务器:
npm run serve
- 运行 Vue 开发服务器:
3. 核心功能实现
3.1 用户管理
注册:
- 前端:在
Register.vue
中实现表单提交,发送 POST 请求到后端。 - 后端:在
blog_app/views.py
中处理注册请求,保存用户信息。
- 前端:在
登录:
- 前端:在
Login.vue
中实现表单提交,发送 POST 请求到后端。 - 后端:在
blog_app/views.py
中处理登录请求,验证用户信息,返回 JWT 令牌。
- 前端:在
权限管理:
- 使用 Django REST framework 的权限类(如
IsAuthenticated
)来保护 API 端点。
- 使用 Django REST framework 的权限类(如
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 的
TokenAuthentication
或JWTAuthentication
进行用户认证。 - 使用
IsAuthenticated
权限类保护 API 端点。
- 使用 Django REST framework 的
数据加密:
- 使用 Django 的
User
模型和bcrypt
加密用户密码。
- 使用 Django 的
防止 CSRF 攻击:
- 在 Vue 项目中使用
axios
的withCredentials
选项,确保 CSRF 令牌的传递。
- 在 Vue 项目中使用
4.2 性能优化
缓存:
- 使用 Django 的缓存框架(如
LocMemCache
或Redis
)缓存频繁访问的数据。 - 在前端使用 Vuex 的
state
缓存数据,减少不必要的 API 请求。
- 使用 Django 的缓存框架(如
异步处理:
- 使用 Django 的
async
支持,实现异步任务处理。 - 在前端使用
async
和await
处理异步请求。
- 使用 Django 的
负载均衡:
- 使用 Nginx 进行负载均衡,提高系统的可用性和性能。
数据库优化:
- 使用索引优化查询性能。
- 使用分页查询减少数据传输量。
5. 部署与运维
5.1 容器化
Docker:
- 使用 Docker 容器化应用,编写
Dockerfile
和docker-compose.yml
文件,实现一键部署。 - 为后端和前端分别创建 Docker 镜像。
- 使用 Docker 容器化应用,编写
5.2 持续集成/持续部署(CI/CD)
Jenkins:
- 使用 Jenkins 实现自动化构建、测试和部署。
- 配置 Jenkins 任务,自动拉取代码、构建镜像并部署到生产环境。
GitLab CI/CD:
- 使用 GitLab CI/CD 进行持续集成和持续部署。
- 配置
.gitlab-ci.yml
文件,定义构建和部署流程。
5.3 监控与日志
Prometheus 和 Grafana:
- 使用 Prometheus 和 Grafana 进行应用监控。
- 配置监控指标,实时监控系统性能和健康状况。
ELK 或 Loki:
- 使用 ELK(Elasticsearch, Logstash, Kibana)或 Loki 进行日志管理。
- 配置日志收集和分析,帮助排查问题和优化系统。
总结
通过以上步骤,你可以使用 Vue 3 和 Django 4 打造一个高效、可靠的全栈项目。这个项目不仅具备强大的功能,还能确保安全性和性能。希望本文对你有所帮助,如果你有任何问题或建议,欢迎留言交流!
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。