Django+Vue3全栈开发实战:从零搭建博客系统

在这里插入图片描述

文章目录

    • 1. 开发环境准备
    • 2. 创建Django项目与配置
    • 3. 设计数据模型与API
    • 4. 使用DRF创建RESTful API
    • 5. 创建Vue3项目与配置
    • 6. 前端页面开发与组件设计
    • 7. 前后端交互与Axios集成
    • 8. 项目优化与调试
    • 9. 部署上线
    • 10. 总结与扩展
      • 10.1 项目总结
        • 10.1.1 技术栈回顾
        • 10.1.2 项目亮点
      • 10.2 扩展方向
        • 10.2.1 功能扩展
        • 10.2.2 技术扩展
      • 10.3 最佳实践
        • 10.3.1 后端最佳实践
        • 10.3.2 前端最佳实践
      • 10.4 常见问题与解决方案
        • 10.4.1 后端常见问题
        • 10.4.2 前端常见问题
      • 10.5 参考资料与扩展阅读

1. 开发环境准备

# 检查Python版本
python --version  # 要求3.8+# 安装虚拟环境工具
pip install virtualenv# 检查Node.js版本
node -v  # 要求16+

2. 创建Django项目与配置

# 创建项目目录
mkdir blog_project && cd blog_project# 创建虚拟环境
virtualenv venv
source venv/bin/activate  # Linux/Mac
venv\Scripts\activate    # Windows# 安装Django
pip install django# 创建项目
django-admin startproject backend
cd backend# 创建应用
python manage.py startapp blog

配置settings.py:

INSTALLED_APPS = [...'rest_framework','corsheaders','blog.apps.BlogConfig'
]MIDDLEWARE = [...'corsheaders.middleware.CorsMiddleware',
]CORS_ALLOW_ALL_ORIGINS = True

3. 设计数据模型与API

models.py:

from django.db import models
from django.contrib.auth.models import Userclass 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

4. 使用DRF创建RESTful API

serializers.py:

from rest_framework import serializers
from .models import Postclass PostSerializer(serializers.ModelSerializer):author = serializers.ReadOnlyField(source='author.username')class Meta:model = Postfields = '__all__'

views.py:

from rest_framework import viewsets
from .models import Post
from .serializers import PostSerializerclass PostViewSet(viewsets.ModelViewSet):queryset = Post.objects.all()serializer_class = PostSerializerdef perform_create(self, serializer):serializer.save(author=self.request.user)

urls.py:

from django.urls import path, include
from rest_framework.routers import DefaultRouter
from blog import viewsrouter = DefaultRouter()
router.register(r'posts', views.PostViewSet)urlpatterns = [path('api/', include(router.urls)),
]

5. 创建Vue3项目与配置

npm init vue@latest frontend
cd frontend
npm install
npm run dev

安装必要依赖:

npm install axios vue-router@4 pinia

配置main.js:

import { createApp } from 'vue'
import { createPinia } from 'pinia'
import App from './App.vue'
import router from './router'const app = createApp(App)
app.use(createPinia())
app.use(router)
app.mount('#app')

6. 前端页面开发与组件设计

PostList.vue组件示例:

<template><div class="post-list"><div v-for="post in posts" :key="post.id" class="post-card"><h3>{{ post.title }}</h3><p>{{ post.content.substring(0, 100) }}...</p><div class="meta"><span>作者:{{ post.author }}</span><span>发布时间:{{ formatDate(post.created_at) }}</span></div></div></div>
</template><script setup>
import { ref, onMounted } from 'vue'
import axios from 'axios'const posts = ref([])const fetchPosts = async () => {try {const response = await axios.get('http://localhost:8000/api/posts/')posts.value = response.data} catch (error) {console.error('获取文章失败:', error)}
}const formatDate = (dateString) => {return new Date(dateString).toLocaleDateString()
}onMounted(() => {fetchPosts()
})
</script><style scoped>
.post-list {max-width: 800px;margin: 0 auto;
}
.post-card {background: #fff;border-radius: 8px;padding: 20px;margin-bottom: 20px;box-shadow: 0 2px 4px rgba(0,0,0,0.1);
}
</style>

7. 前后端交互与Axios集成

创建axios实例:

// src/utils/http.js
import axios from 'axios'const instance = axios.create({baseURL: 'http://localhost:8000/api',timeout: 5000,headers: {'Content-Type': 'application/json'}
})export default instance

使用Pinia状态管理:

// stores/postStore.js
import { defineStore } from 'pinia'
import http from '@/utils/http'export const usePostStore = defineStore('post', {actions: {async createPost(postData) {try {const response = await http.post('/posts/', postData)return response.data} catch (error) {throw error.response.data}}}
})

8. 项目优化与调试

配置Django静态文件:

# settings.py
STATIC_URL = '/static/'
STATIC_ROOT = BASE_DIR / 'staticfiles'

Vue生产构建:

npm run build

配置WhiteNoise中间件:

MIDDLEWARE = ['whitenoise.middleware.WhiteNoiseMiddleware',...
]STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'

9. 部署上线

使用Gunicorn部署Django:

pip install gunicorn
gunicorn backend.wsgi:application --bind 0.0.0.0:8000

配置Nginx:

server {listen 80;server_name example.com;location /api {proxy_pass http://localhost:8000;proxy_set_header Host $host;}location / {root /path/to/vue/dist;try_files $uri $uri/ /index.html;}
}

10. 总结与扩展

10.1 项目总结

在本项目中,我们通过Django和Vue3实现了一个全栈博客系统,涵盖了从前端到后端的完整开发流程。以下是项目的主要技术点总结:

10.1.1 技术栈回顾
  1. 后端技术栈

    • Django:作为核心框架,提供了强大的ORM、路由管理、模板引擎等功能。
    • Django REST Framework (DRF):用于快速构建RESTful API,支持序列化、视图集、权限控制等功能。
    • 数据库:使用SQLite作为开发数据库,支持无缝迁移到MySQL或PostgreSQL。
    • 身份验证:通过Django内置的User模型和DRF的TokenAuthentication实现用户认证。
    • CORS:通过django-cors-headers解决跨域问题,确保前后端分离架构的正常运行。
  2. 前端技术栈

    • Vue3:作为前端框架,提供了组合式API、响应式数据绑定、组件化开发等特性。
    • Pinia:用于状态管理,替代Vuex,提供更简洁的API和TypeScript支持。
    • Axios:用于发送HTTP请求,与后端API进行数据交互。
    • Vue Router:实现前端路由管理,支持动态路由、嵌套路由等功能。
    • Element Plus:作为UI组件库,提供丰富的组件和样式,加速页面开发。
  3. 开发工具

    • VS Code:作为主要开发工具,配合插件(如Vetur、ESLint、Prettier)提升开发效率。
    • Postman:用于API调试和测试。
    • Git:用于版本控制,支持团队协作开发。
  4. 部署方案

    • Nginx:作为反向代理服务器,处理静态文件请求和负载均衡。
    • Gunicorn:作为WSGI服务器,用于部署Django应用。
    • Docker:通过容器化技术简化部署流程,支持跨平台运行。
10.1.2 项目亮点
  1. 前后端分离架构

    • 前端和后端完全解耦,通过API进行数据交互,提高了开发效率和可维护性。
    • 前端可以独立部署,支持多平台(如Web、移动端)共享同一套API。
  2. 模块化设计

    • 后端通过Django的App机制将功能模块化,便于扩展和维护。
    • 前端通过Vue3的组件化开发,实现了高内聚、低耦合的代码结构。
  3. 响应式设计

    • 前端页面采用响应式布局,适配不同设备(PC、平板、手机)。
    • 使用Element Plus的栅格系统和组件,快速构建美观的UI。
  4. 性能优化

    • 后端通过DRF的分页、缓存、查询优化等技术提升API性能。
    • 前端通过懒加载、代码分割、图片压缩等技术减少页面加载时间。
  5. 安全性

    • 后端通过Django的CSRF保护、XSS防护、SQL注入防护等机制确保数据安全。
    • 前端通过Axios的请求拦截器和响应拦截器处理错误和权限验证。

10.2 扩展方向

10.2.1 功能扩展
  1. 用户认证与权限管理

    • 实现基于JWT(JSON Web Token)的身份验证,支持无状态认证。
    • 添加角色管理功能(如管理员、普通用户),实现细粒度的权限控制。
  2. 文件上传与存储

    • 支持用户上传头像、文章封面等文件。
    • 使用云存储服务(如AWS S3、阿里云OSS)存储静态文件。
  3. 评论与点赞功能

    • 实现文章评论功能,支持嵌套评论和分页加载。
    • 添加点赞功能,记录用户的点赞行为。
  4. 搜索与过滤

    • 实现全文搜索功能,使用Elasticsearch或Django的django-filter库。
    • 支持按标签、分类、时间等条件过滤文章。
  5. 实时通知

    • 使用WebSocket实现实时通知功能(如新评论、点赞提醒)。
    • 集成第三方通知服务(如Firebase Cloud Messaging)。
  6. 国际化与多语言支持

    • 使用Django的django-i18n实现后端多语言支持。
    • 使用Vue3的vue-i18n实现前端多语言切换。
10.2.2 技术扩展
  1. TypeScript支持

    • 将Vue3项目迁移到TypeScript,提升代码的可维护性和类型安全性。
    • 配置ESLint和Prettier,统一代码风格。
  2. GraphQL集成

    • 使用GraphQL替代RESTful API,提供更灵活的数据查询能力。
    • 集成Apollo Client作为前端GraphQL客户端。
  3. 微服务架构

    • 将单体应用拆分为多个微服务(如用户服务、文章服务、评论服务)。
    • 使用Docker和Kubernetes实现容器化部署和动态扩缩容。
  4. Serverless架构

    • 将部分功能(如图片处理、邮件发送)迁移到Serverless平台(如AWS Lambda)。
    • 使用Vercel或Netlify部署前端应用。
  5. 自动化测试

    • 使用Pytest和Django的测试工具编写后端单元测试和集成测试。
    • 使用Jest和Vue Test Utils编写前端单元测试和组件测试。
  6. CI/CD集成

    • 使用GitHub Actions或GitLab CI实现持续集成和持续部署。
    • 配置自动化测试、代码检查和部署流程。

10.3 最佳实践

10.3.1 后端最佳实践
  1. 代码结构优化

    • 使用Django的App机制将功能模块化,避免单个App过于臃肿。
    • 将业务逻辑放在Service层,减少视图函数的复杂度。
  2. API设计规范

    • 遵循RESTful API设计原则,使用合适的HTTP方法和状态码。
    • 使用版本控制(如/api/v1/posts)确保API的兼容性。
  3. 数据库优化

    • 使用索引加速查询,避免全表扫描。
    • 使用select_relatedprefetch_related优化关联查询。
  4. 缓存机制

    • 使用Redis缓存频繁访问的数据(如文章列表、用户信息)。
    • 使用Django的缓存框架实现页面级缓存和片段缓存。
  5. 日志记录

    • 使用Python的logging模块记录关键操作和错误信息。
    • 配置日志轮转和分级存储,便于问题排查。
10.3.2 前端最佳实践
  1. 组件化开发

    • 将页面拆分为多个可复用的组件,提高代码的可维护性。
    • 使用插槽(Slot)和Props实现组件的灵活配置。
  2. 状态管理

    • 使用Pinia集中管理全局状态,避免组件间直接传递数据。
    • 将异步操作(如API请求)放在Store中,减少组件的复杂度。
  3. 性能优化

    • 使用懒加载和代码分割减少首屏加载时间。
    • 使用v-ifv-show优化DOM渲染性能。
  4. 错误处理

    • 使用Axios的拦截器统一处理请求错误和响应错误。
    • 在组件中显示友好的错误提示,提升用户体验。
  5. SEO优化

    • 使用Vue Router的meta标签设置页面标题和描述。
    • 使用SSR(服务器端渲染)或预渲染技术提升SEO效果。

10.4 常见问题与解决方案

10.4.1 后端常见问题
  1. 跨域问题

    • 解决方案:使用django-cors-headers中间件,配置CORS_ALLOW_ALL_ORIGINS或白名单。
  2. 数据库迁移失败

    • 解决方案:检查模型定义是否正确,删除迁移文件并重新生成。
  3. 性能瓶颈

    • 解决方案:使用Django Debug Toolbar分析性能问题,优化查询和缓存。
  4. 安全性问题

    • 解决方案:启用Django的安全中间件,定期更新依赖库。
10.4.2 前端常见问题
  1. 页面加载慢

    • 解决方案:使用懒加载、代码分割、CDN加速等技术优化加载速度。
  2. 组件通信复杂

    • 解决方案:使用Pinia集中管理状态,减少组件间的直接通信。
  3. API请求失败

    • 解决方案:检查网络连接、API地址和请求参数,使用拦截器统一处理错误。
  4. 浏览器兼容性问题

    • 解决方案:使用Babel和PostCSS处理兼容性问题,测试主流浏览器。

10.5 参考资料与扩展阅读

  1. 官方文档

    • Django官方文档
    • Vue3官方文档
    • DRF官方文档
  2. 推荐书籍

    • 《Django for Beginners》
    • 《Vue.js设计与实现》
    • 《RESTful API设计指南》
  3. 在线课程

    • Django全栈开发实战
    • Vue3高级开发技巧
  4. 开源项目

    • Django博客系统
    • Vue3管理后台

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/21559.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【论文笔记】MambaGlue: Fast and Robust Local Feature Matching With Mamba

【引用格式】&#xff1a;Ryoo K, Lim H, Myung H. MambaGlue: Fast and Robust Local Feature Matching With Mamba[J]. arXiv preprint arXiv:2502.00462, 2025. 【网址】&#xff1a;https://arxiv.org/pdf/2502.00462 【开源代码】&#xff1a;https://github.com/uri-Ka…

Office word打开加载比较慢处理方法

1.添加safe参数 ,找到word启动项,右击word,选择属性 , 添加/safe , 应用并确定 2.取消加载项,点击文件,点击选项 ,点击加载项,点击转到,取消所有勾选,确定。

Denoising Diffusion Restoration Models论文解读

论文要点 恢复的线性逆问题可以使用预训练的DDPM完成&#xff1a;1. 将降质矩阵使用SVD&#xff0c;得到分解矩阵&#xff1b;2. 使用分解矩阵将图像投影到降质类型间共享的谱空间&#xff1b;3. 谱空间中执行DDPM。 评价 同Track的方法同样很多&#xff0c;比如后续的DDNM、…

【JMeter使用-2】JMeter中Java Request采样器的使用指南

Apache JMeter 是一款功能强大的性能测试工具&#xff0c;支持多种协议和测试场景。除了内置的采样器&#xff08;如HTTP请求、FTP请求等&#xff09;&#xff0c;JMeter还允许通过 Java Request采样器 调用自定义的Java代码&#xff0c;从而实现更复杂的测试逻辑。本文将详细介…

教学资料档案管理系统

本系统构建 JAVA 体系的后端系统&#xff0c;围绕以安全&#xff0c;可靠&#xff0c;高速&#xff0c;健壮&#xff0c;易于扩展为目标的方向进行开发&#xff0c;在阿里等开源库的基础上实现提供教学资料档案的管理系统的后端接口的微服务架构系统。 功能包含&#xff1a;系…

蓝桥杯(B组)-每日一题(1093字符逆序)

c中函数&#xff1a; reverse(首位置&#xff0c;尾位置&#xff09; reverse(s.begin(),s.end()) 头文件&#xff1a;<algorithm> #include<iostream> #include<algorithm>//运用reverse函数的头文件 using namespace std; int main() {string s;//定义一…

每日一题——矩阵最长递增路径

矩阵最长递增路径问题 题目描述数据范围&#xff1a;进阶要求&#xff1a;示例示例 1示例 2 题解思路算法步骤&#xff1a;代码实现代码解释复杂度分析总结 题目描述 给定一个 n 行 m 列的矩阵 matrix&#xff0c;矩阵内所有数均为非负整数。你需要在矩阵中找到一条最长路径&a…

vscode 配置 Copilot 提示GHE.com连接失败

步骤一&#xff1a;打开设置并进入 settings.json 点击菜单栏中的 “文件” -> “首选项” -> “设置”。 在搜索设置栏中输入 “Copilot: Advanced”。 点击搜索结果下方的 “在 settings.json 中编辑” 链接&#xff0c;这会打开 settings.json 文件。 步骤二&#…

DEX-EE三指灵巧手:扩展AI与机器人研究的边界

DEX-EE三指灵巧手&#xff0c;由Shadow Robot与Google DeepMind合作开发&#xff0c;以其先进技术和设计&#xff0c;正在引领AI与机器人研究的新趋势。其高精度传感器和灵活的机械手指&#xff0c;能够捕捉复杂的环境数据&#xff0c;为强化学习实验提供了可靠支持。 Shadow R…

cornerstone3D学习笔记-MPR

最近在研究如何利用cornerstone3D (v1.70.13) 来实现MPR功能&#xff0c;找到它的一个demo -- volumeBasic, 运行效果如下图 看了下主程序的示例代码&#xff0c;非常简单&#xff0c;可以说corestone3D这个库把很多细节都封装起来了&#xff0c;使得调用者可以很简单的快速实…

基于YOLO11深度学习的果园苹果检测与计数系统设计与实现【python源码+Pyqt5界面+数据集+训练代码】

《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…

数据中心储能蓄电池状态监测管理系统 组成架构介绍

安科瑞刘鸿鹏 摘要 随着数据中心对供电可靠性要求的提高&#xff0c;蓄电池储能系统成为关键的后备电源。本文探讨了蓄电池监测系统在数据中心储能系统中的重要性&#xff0c;分析了ABAT系列蓄电池在线监测系统的功能、技术特点及其应用优势。通过蓄电池监测系统的实施&#…

Ubuntu 安装 OpenCV (C++)

版本详情&#xff1a; Ubuntu: 22.04 5.15.0-133-generic gcc: 11.4.0 g: 11.4.0 OpenCV: 4.7.0 1. 卸载 OpenCV 进入原先编译 opencv 的 build 目录&#xff0c;在该目录下打开终端&#xff0c;执行以下代码&#xff08;如果 build 已经删除了&#xff0c;可以重新编译一…

【AI工具之Deepseek+Kimi一键免费生成PPT】

1.打开Deepseek网页&#xff1a;DeepSeek 2.使用Deepseek获得一份PPT大纲&#xff08;输入背景需求约束条件进行提问&#xff09;如下图&#xff1a; 3.复制Deepseek输出的PPT大纲 4.打开Kimi网页&#xff1a;Kimi.ai - 会推理解析&#xff0c;能深度思考的AI助手 5.在Kimi中…

flutter在安卓模拟器上运行

目录 下载android studio&#xff0c;然后把其中的模拟器设为环境变量&#xff0c;然后在vscode/cursor中使用插件&#xff0c;打开安卓模拟器一、下载android studio网址mac 下载64位 ARM 二、启动android studio三、设置SDK四、打开文件 打开模拟器五、运行程序六、在vscode/…

POI pptx转图片

前言 ppt页面预览一直是个问题&#xff0c;office本身虽然有预览功能但是收费&#xff0c;一些开源的项目的预览又不太好用&#xff0c;例如开源的&#xff1a;kkfileview pptx转图片 1. 引入pom依赖 我这个项目比较老&#xff0c;使用版本较旧 <dependency><gro…

数仓搭建(hive):DWB层(基础数据层)

维度退化: 通过减少表的数量和提高数据的冗余来优化查询性能。 在维度退化中&#xff0c;相关的维度数据被合并到一个宽表中&#xff0c;减少了查询时需要进行的表连接操作。例如&#xff0c;在销售数据仓库中&#xff0c;客户信息、产品信息和时间信息等维度可能会被合并到一…

vue3 在element-plus表格使用render-header

在vue2中 element表格render-header 源码是有返回h()函数的 在vue3 element-plus 表格源码 render-header函数没有返回h函数了 所以需要用render-header方法中创建虚拟DOM节点的话需要引用h方法 <el-table-column header-align"right" align"right" …

前端带样式导出excel表格,html表格生成带样式的excel表格

众所周知&#xff0c;前端生成表格通常是用xlsx、excel.js等js库&#xff0c;但这些库想要生成时增加excel样式会很麻烦。 有这么一个js库把html表格连样式带数据一并导出为excel表格: html-table-to-excel npm install html-table-to-excel 使用 html表格&#xff1a; <…

ASP.NET JWT认证失败响应:从默认到自定义的优雅改造

本文主要介绍如何通过ASP.NET Core的JwtBearerEvents机制&#xff0c;实现JWT认证失败响应的深度定制。 1. 背景 在之前的文章《一个简单的ASP.NET一致性返回工具库》 中&#xff0c;我们介绍了 Sang.AspNetCore.CommonLibraries 这一通用库&#xff0c;它通过统一API响应模型…