基于 Vue + Django + MySQL 实现个人博客/CMS系统

目录

1. 环境搭建与项目初始化

后端 (Django)

2. 数据库模型设计

用户认证模型 (Django Auth)

文章模型 (models.py)

全文索引优化

3. 后端API开发 (Django REST Framework)

用户注册/登录

文章发布与搜索

4. 前端实现 (Vue 3)

项目初始化

核心功能实现

5. 访问统计实现

后端中间件记录PV/UV

6. 部署与优化

关键问题解决


1. 环境搭建与项目初始化

后端 (Django)

  1. 创建Django项目

    django-admin startproject blog_backend
    cd blog_backend
    python manage.py startapp blog
  2. 安装依赖

    pip install django djangorestframework django-cors-headers djangorestframework-simplejwt mysqlclient
  3. 配置MySQL数据库
    修改 settings.py

    DATABASES = {'default': {'ENGINE': 'django.db.backends.mysql','NAME': 'blog_db','USER': 'root','PASSWORD': 'your_password','HOST': 'localhost','PORT': '3306',}
    }
  4. 配置DRF和JWT
    修改 settings.py

INSTALLED_APPS = [# ...'rest_framework','corsheaders','blog',
]MIDDLEWARE = ['corsheaders.middleware.CorsMiddleware',# ...
]CORS_ALLOW_ALL_ORIGINS = True  # 开发阶段允许所有跨域REST_FRAMEWORK = {'DEFAULT_AUTHENTICATION_CLASSES': ('rest_framework_simplejwt.authentication.JWTAuthentication',)
}

    2. 数据库模型设计

    用户认证模型 (Django Auth)

    直接使用Django内置的 User 模型,无需额外设计。

    文章模型 (models.py)

    from django.db import models
    from django.contrib.auth.models import Userclass Article(models.Model):title = models.CharField(max_length=200)content = models.TextField()  # 存储Markdown或HTML内容author = models.ForeignKey(User, on_delete=models.CASCADE)category = models.CharField(max_length=50)tags = models.CharField(max_length=100)  # 逗号分隔的标签,如 "Python,Web"created_at = models.DateTimeField(auto_now_add=True)updated_at = models.DateTimeField(auto_now=True)def __str__(self):return self.titleclass Comment(models.Model):article = models.ForeignKey(Article, on_delete=models.CASCADE)user = models.ForeignKey(User, on_delete=models.CASCADE)content = models.TextField()parent_comment = models.ForeignKey('self', on_delete=models.CASCADE, null=True, blank=True)  # 树形评论created_at = models.DateTimeField(auto_now_add=True)

    全文索引优化

    在MySQL中为 Article 表添加全文索引:

    ALTER TABLE blog_article ADD FULLTEXT(title, content);

    3. 后端API开发 (Django REST Framework)

    用户注册/登录

    1. 序列化器 (serializers.py)

      from rest_framework import serializers
      from django.contrib.auth.models import Userclass UserSerializer(serializers.ModelSerializer):class Meta:model = Userfields = ('id', 'username', 'email', 'password')extra_kwargs = {'password': {'write_only': True}}def create(self, validated_data):user = User.objects.create_user(**validated_data)return user
    2. 视图 (views.py)

      from rest_framework.views import APIView
      from rest_framework.response import Response
      from rest_framework_simplejwt.tokens import RefreshTokenclass RegisterView(APIView):def post(self, request):serializer = UserSerializer(data=request.data)if serializer.is_valid():user = serializer.save()refresh = RefreshToken.for_user(user)return Response({'refresh': str(refresh),'access': str(refresh.access_token),})return Response(serializer.errors, status=400)

    文章发布与搜索

    1. 文章序列化器

      class ArticleSerializer(serializers.ModelSerializer):class Meta:model = Articlefields = '__all__'
    2. 文章搜索接口
      使用Django ORM的全文搜索:

      class ArticleSearchView(APIView):def get(self, request):query = request.query_params.get('q', '')# MySQL全文搜索语法articles = Article.objects.raw("SELECT * FROM blog_article WHERE MATCH(title, content) AGAINST (%s)",[query])serializer = ArticleSerializer(articles, many=True)return Response(serializer.data)

    4. 前端实现 (Vue 3)

    项目初始化

    npm create vue@latest blog_frontend
    cd blog_frontend
    npm install axios vue-router vuex quill @vueuse/core

    核心功能实现

    1. Markdown渲染
      使用 marked 或 vue-markdown 库:

      <template><div v-html="compiledMarkdown"></div>
      </template><script setup>
      import { marked } from 'marked'
      const compiledMarkdown = marked(props.content)
      </script>
    2. 富文本编辑器集成 (Quill)

      <template><div ref="editor"></div>
      </template><script setup>
      import Quill from 'quill'
      import 'quill/dist/quill.snow.css'const editor = ref(null)
      onMounted(() => {const quill = new Quill(editor.value, {theme: 'snow',modules: { toolbar: true }})
      })
      </script>
    3. 动态路由SEO优化
      使用 vue-router 和预渲染插件 prerender-spa-plugin

      // vue.config.js
      const PrerenderSPAPlugin = require('prerender-spa-plugin')module.exports = {configureWebpack: {plugins: [new PrerenderSPAPlugin({staticDir: path.join(__dirname, 'dist'),routes: ['/', '/articles', '/about'],  // 预渲染的路由})]}
      }

    5. 访问统计实现

    后端中间件记录PV/UV

    1. 创建访问记录模型

      class AccessLog(models.Model):ip = models.CharField(max_length=50)path = models.CharField(max_length=200)user = models.ForeignKey(User, null=True, on_delete=models.SET_NULL)created_at = models.DateTimeField(auto_now_add=True)
    2. 中间件统计访问量

      class AccessLogMiddleware:def __init__(self, get_response):self.get_response = get_responsedef __call__(self, request):response = self.get_response(request)AccessLog.objects.create(ip=request.META.get('REMOTE_ADDR'),path=request.path,user=request.user if request.user.is_authenticated else None)return response

    6. 部署与优化

    1. MySQL全文索引查询优化
      确保MySQL版本 >= 5.6,并配置索引:

      CREATE FULLTEXT INDEX ft_idx ON blog_article(title, content);
    2. Nginx配置反向代理

      server {listen 80;server_name your_domain.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;}
      }
    3. 性能优化

      • 使用 django-debug-toolbar 分析查询

      • Vue路由懒加载:

        const routes = [{ path: '/article/:id', component: () => import('./views/ArticleDetail.vue') }
        ]

    关键问题解决

    1. 跨域配置
      使用 django-cors-headers,确保前端能访问后端API。

    2. 树形评论渲染
      前端递归组件实现:

      <template><div v-for="comment in comments" :key="comment.id"><div>{{ comment.content }}</div><CommentTree v-if="comment.replies" :comments="comment.replies"/></div>
      </template>
    3. JWT Token自动刷新
      使用Axios拦截器:

      axios.interceptors.response.use(response => response, error => {if (error.response.status === 401) {return refreshToken().then(() => {return axios(error.config)})}return Promise.reject(error)
      })

    通过以上步骤,你可以逐步搭建一个功能完整的博客系统。建议先从基础功能(如文章发布)开始,逐步迭代添加评论、搜索等模块。

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

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

    相关文章

    从全球首发到独家量产,远峰科技持续领跑数字钥匙赛道

    数字车钥匙「新纪元」即将开启&#xff0c;星闪数字钥匙正式进入量产周期。 随着汽车智能化快速普及&#xff0c;数字钥匙的搭载量正在快速提升。根据高工智能汽车研究院的数据&#xff0c;2024年中国市场乘用车前装标配搭载数字钥匙的新车交付量超过1000万辆&#xff0c;同比…

    C#高级:利用LINQ进行实体列表的集合运算

    问题引入&#xff1a; Teacher实体的唯一标识符是Name和Classes字段&#xff08;或者说这两个字段唯一确定一条数据&#xff09;&#xff0c;如何对两个实体列表做交集、差集运算呢&#xff1f;&#xff08;并集直接调用AddRange方法即可&#xff09; 一、重写方法实现 1.原…

    C++\MFC锁lock从专家到小白

    C mutex # include <mutex> std::mutex m_lock; void CMainWnd::function() {std::lock_guard<std::mutex> lock(m_lock);... }仅限同一进程内。阻塞等待&#xff1a;当线程 A 持有锁时&#xff0c;线程 B 尝试获取同一互斥锁时&#xff0c;会进入阻塞状态&#x…

    COBOL语言的数据库交互

    COBOL语言的数据库交互 引言 随着信息技术的不断发展&#xff0c;数据库管理系统&#xff08;DBMS&#xff09;已经成为现代应用程序中不可或缺的组成部分。在众多编程语言中&#xff0c;COBOL&#xff08;Common Business-Oriented Language&#xff09;以其在商业应用中的稳…

    黑马点评_知识点

    将手机验证码保存到HttpSession中进行验证&#xff08;感觉已经过时&#xff09; Controller中的参数有HttpSession&#xff0c;存验证码session.setAttribute(SystemConstants.VERIFY_CODE, code); 其他的都是逻辑代码 Cookie的缺点 什么是Session集群共享问题&#xff1f; …

    CSS语言的硬件驱动

    CSS语言的硬件驱动探讨 引言 随着信息技术的迅猛发展&#xff0c;硬件和软件之间的交互愈发复杂&#xff0c;特别是在嵌入式系统、物联网设备等领域&#xff0c;硬件驱动程序的开发变得至关重要。而在众多编程语言中&#xff0c;CSS&#xff08;层叠样式表&#xff09;作为一…

    K8s中CPU和Memory的资源管理

    资源类型 在 Kubernetes 中&#xff0c;Pod 作为最小的原子调度单位&#xff0c;所有跟调度和资源管理相关的属性都属于 Pod。其中最常用的资源就是 CPU 和 Memory。 CPU 资源 在 Kubernetes 中&#xff0c;一个 CPU 等于 1 个物理 CPU 核或者一个虚拟核&#xff0c;取决于节…

    解锁 DeepSeek 与 Matlab:攻克科研难题的技术利刃

    技术点目录 第一章、MATLAB 2024b深度学习工具箱新特性简介第二章、卷积神经网络&#xff08;Convolutional Neural Network, CNN&#xff09;第三章、模型可解释性与特征可视化Model Explanation and Feature Visualization第四章、迁移学习算法&#xff08;Transfer Learning…

    蓝桥杯_PCF8591

    目录 一 前言 二 引言 三 PCF8591介绍 &#xff08;1&#xff09;I2C通信 &#xff08;2&#xff09;原理图中的8591 四 代码层面 &#xff08;1&#xff09;根据题目所给的示范代码&#xff0c;实现ADC 1 为什么需要返回值&#xff0c;同时返回值是unsigned char&#x…

    Dify案例-接入飞书云文档实现需求质量评估

    dify接入飞书云文档实现需求质量评估 1. 背景与目标2. 系统架构与流程2.1 整体架构图2.2 核心流程2.3 dify工作流概览 3. 实现细节3.1 文档提取3.2 需求评估3.3 参数提取3.4 创建飞书云文档 4. 难点总结4.1 提示词编写4.2 关联飞书云文档4.2.1 安装飞书云文档插件并关联到飞书自…

    机器视觉工程师的专业精度决定职业高度,而专注密度决定成长速度。低质量的合群,不如高质量独处

    在机器视觉行业&#xff0c;真正的技术突破往往诞生于深度思考与有效碰撞的辩证统一。建议采用「70%高质量独处30%精准社交」的钻石结构&#xff0c;构建可验证的技术能力护城河。记住&#xff1a;你的专业精度决定职业高度&#xff0c;而专注密度决定成长速度。 作为机器视觉工…

    字符串移位包含问题

    字符串移位包含问题 #include <iostream> #include <algorithm> using namespace std; int main(){string a,b;cin>>a>>b;//谁长遍历谁if(a.size()<b.size()) swap(a,b);//1-对整个字符串进行移位for(int i0; i<a.size(); i){//每次循环都将第一…

    SQL 查询执行顺序

    SQL 查询的逻辑处理顺序&#xff08;即 SQL 引擎解析和执行查询的顺序&#xff09;与书写顺序不同。以下是 SQL 查询的完整执行顺序&#xff1a; 1. 逻辑执行顺序 FROM 和 JOIN - 确定数据来源表并执行连接操作 WHERE - 对行进行筛选 GROUP BY - 将数据分组 HAVING - 对分组…

    核心知识——Spark核心数据结构:RDD

    引入 通过前面的学习&#xff0c;我们对于Spark已经有一个基本的认识&#xff0c;并且搭建了一个本地的练习环境&#xff0c;因为本专栏的主要对象是数仓和数分&#xff0c;所以就不花大篇幅去写环境搭建等内容&#xff0c;当然&#xff0c;如果感兴趣的小伙伴可以留言&#x…

    Spring Boot 嵌入式容器性能对决:Tomcat vs Undertow!

    文章目录 引言理论基础嵌入式容器TomcatUndertow 实战性能测试配置 Tomcat 和 Undertow创建测试控制器使用Jmeter压测 总结 引言 在现代应用开发中&#xff0c;选择合适的嵌入式容器对于提升应用的性能和响应性至关重要。Spring Boot 提供了多种嵌入式容器选项&#xff0c;其中…

    计算机系统---GPU

    硬件架构 核心处理器&#xff1a; 流处理器&#xff08;SP&#xff09;&#xff1a;是GPU进行计算的核心单元&#xff0c;数量众多。例如&#xff0c;NVIDIA的高端GPU可能拥有数千个流处理器。它们可以并行执行大量的计算任务&#xff0c;如在图形渲染中对每个顶点或像素进行独…

    【GPT写代码】动作视频切截图研究器

    目录 背景源代码 end 背景 用python写一个windows环境运行的动作视频切截图研究器&#xff0c;用路径浏览的方式指定待处理的视频文件&#xff0c;然后点击分析按钮&#xff0c;再预览区域显示视频预览画面&#xff0c;然后拖动时间轴&#xff0c;可以在预览区域刷新显示相应的…

    在 .NET 8 中使用自定义令牌身份验证掌握 SignalR Hub 安全性

    最近在练习做一个 Web 开发项目&#xff0c;需要使用 WebSockets 传输数据&#xff0c;实现实时通信。这是一个 React.js 项目&#xff0c;后端是 .NET。 虽然 MSDN 提供了出色的顶级文档&#xff0c;但它通常缺少高级用例所需的低级细节。 一种这样的场景是使用自定义令牌对…

    [2018][note]用于超快偏振开关和动态光束分裂的all-optical有源THz超表——

    前言 类型 太赫兹 + 超表面 太赫兹 + 超表面 太赫兹+超表面 期刊 O p e n A c c e s s Open Access Open

    家里网络访问Github有时候打不开,解决办法

    1、修改Hosts文件修改法 通过DNS查询工具&#xff08;如&#xff09;获取最新GitHub域名解析IP修改系统hosts文件&#xff08;路径&#xff1a;C:\Windows\System32\drivers\etc\hosts&#xff09;&#xff0c;添加&#xff1a;20.205.243.166 github.com 20.27.177.113 github…