ReactPress数据库表结构设计全面分析

ReactPress Github项目地址:https://github.com/fecommunity/reactpress 欢迎Star。
ReactPress

ReactPress是一个基于React框架开发的开源发布平台和内容管理系统(CMS)。它不仅支持用户在支持React和MySQL数据库的服务器上搭建自己的博客和网站,还提供了丰富的功能,如文章管理、阅读、评论管理等。为了实现这些功能,ReactPress的数据库表结构设计显得尤为重要。

ReactPress数据库表结构设计全面分析

一、用户与权限管理

  1. 用户表(users)

    • 存储用户的基本信息,如用户名、密码、邮箱、头像、注册时间、最后登录时间等。
    • 关键字段:id, username, password_hash, email, avatar_url, created_at, last_login_at等。
  2. 角色表(roles)

    • 存储用户角色的信息,如管理员、编辑、普通用户等。
    • 关键字段:id, name, description, permissions(权限列表,可以是JSON格式)。
  3. 用户角色关联表(user_roles)

    • 建立用户与角色之间的多对多关系。
    • 关键字段:user_id, role_id

二、文章与内容管理

  1. 文章表(articles)

    • 存储文章的基本信息和内容。
    • 关键字段:id, title, slug(文章的唯一URL路径),content, author_id, created_at, updated_at, status(如发布、草稿、审核中等),views_count(阅读次数)等。
  2. 文章分类表(categories)

    • 存储文章分类信息。
    • 关键字段:id, name, parent_id(用于表示分类层级关系),created_at, updated_at等。
  3. 文章分类关联表(article_categories)

    • 建立文章与分类之间的多对多关系。
    • 关键字段:article_id, category_id
  4. 标签表(tags)

    • 存储文章的标签信息。
    • 关键字段:id, name, created_at, updated_at等。
  5. 文章标签关联表(article_tags)

    • 建立文章与标签之间的多对多关系。
    • 关键字段:article_id, tag_id

三、评论与互动

  1. 评论表(comments)

    • 存储用户对文章的评论信息。
    • 关键字段:id, article_id, user_id(评论者ID,可为空表示匿名评论),content, created_at, status(如已审核、待审核、删除等),parent_id(用于表示回复关系,即子评论的父评论ID)等。
  2. 评论点赞表(comment_likes)

    • 存储用户对评论的点赞信息。
    • 关键字段:id, comment_id, user_id, created_at等。

四、媒体与资源管理

  1. 媒体文件表(media_files)

    • 存储用户上传的媒体文件信息,如图片、视频、音频等。
    • 关键字段:id, file_path, file_name, file_type, upload_user_id, created_at, description(文件描述)等。
  2. 媒体与文章关联表(article_media)

    • 建立媒体文件与文章之间的多对多关系。
    • 关键字段:article_id, media_id

五、系统设置与配置

  1. 设置表(settings)
    • 存储系统的全局设置信息,如站点名称、Logo、域名、SEO设置等。
    • 关键字段:id, key(设置项的唯一标识),value(设置项的值,可以是字符串、数字、JSON等),created_at, updated_at等。

六、日志与审计

  1. 用户操作日志表(user_actions_log)
    • 存储用户的操作日志,如登录、发布文章、删除评论等。
    • 关键字段:id, user_id, action(操作类型),action_details(操作详情,可以是JSON格式),created_at等。

七、ReactPress 数据库表结构设计与代码示例

  1. 用户表(users)
    • 存储用户的基本信息。
CREATE TABLE users (id INT AUTO_INCREMENT PRIMARY KEY,username VARCHAR(50) NOT NULL UNIQUE,password_hash VARCHAR(255) NOT NULL,email VARCHAR(100) NOT NULL UNIQUE,avatar_url VARCHAR(255),created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,role VARCHAR(50) DEFAULT 'user' -- 可以是 'admin', 'editor', 'user' 等
);
  1. 文章表(articles)
    • 存储文章的基本信息和内容。
CREATE TABLE articles (id INT AUTO_INCREMENT PRIMARY KEY,title VARCHAR(255) NOT NULL,slug VARCHAR(255) NOT NULL UNIQUE,content TEXT NOT NULL,author_id INT,created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,status VARCHAR(50) DEFAULT 'draft', -- 可以是 'published', 'draft', 'pending' 等views_count INT DEFAULT 0,FOREIGN KEY (author_id) REFERENCES users(id)
);
  1. 分类表(categories)
    • 存储文章分类信息。
CREATE TABLE categories (id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(100) NOT NULL,parent_id INT DEFAULT NULL,created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,FOREIGN KEY (parent_id) REFERENCES categories(id) -- 用于表示分类层级关系
);
  1. 文章分类关联表(article_categories)
    • 建立文章与分类之间的多对多关系。
CREATE TABLE article_categories (article_id INT,category_id INT,PRIMARY KEY (article_id, category_id),FOREIGN KEY (article_id) REFERENCES articles(id),FOREIGN KEY (category_id) REFERENCES categories(id)
);
  1. 评论表(comments)
    • 存储用户对文章的评论信息。
CREATE TABLE comments (id INT AUTO_INCREMENT PRIMARY KEY,article_id INT,user_id INT,content TEXT NOT NULL,created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,status VARCHAR(50) DEFAULT 'approved', -- 可以是 'approved', 'pending', 'rejected' 等parent_id INT DEFAULT NULL, -- 用于表示回复关系FOREIGN KEY (article_id) REFERENCES articles(id),FOREIGN KEY (user_id) REFERENCES users(id),FOREIGN KEY (parent_id) REFERENCES comments(id) -- 子评论的父评论ID
);
  1. 媒体文件表(media_files)
    • 存储用户上传的媒体文件信息。
CREATE TABLE media_files (id INT AUTO_INCREMENT PRIMARY KEY,file_path VARCHAR(255) NOT NULL,file_name VARCHAR(255) NOT NULL,file_type VARCHAR(50) NOT NULL,upload_user_id INT,created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,FOREIGN KEY (upload_user_id) REFERENCES users(id)
);
  1. 媒体与文章关联表(article_media)
    • 建立媒体文件与文章之间的多对多关系。
CREATE TABLE article_media (article_id INT,media_id INT,PRIMARY KEY (article_id, media_id),FOREIGN KEY (article_id) REFERENCES articles(id),FOREIGN KEY (media_id) REFERENCES media_files(id)
);

代码示例

以下是一个简单的 Node.js(使用 Sequelize ORM)代码示例,用于连接数据库并定义上述表结构中的一个(例如,用户表)。

const { Sequelize, DataTypes, Model } = require('sequelize');
const sequelize = new Sequelize('database_name', 'username', 'password', {host: 'localhost',dialect: 'mysql' // 或者 'postgres', 'sqlite', 'mariadb', 'mssql'
});class User extends Model {}User.init({username: {type: DataTypes.STRING,allowNull: false,unique: true},password_hash: {type: DataTypes.STRING,allowNull: false},email: {type: DataTypes.STRING,allowNull: false,unique: true},avatar_url: {type: DataTypes.STRING,allowNull: true},role: {type: DataTypes.STRING,allowNull: false,defaultValue: 'user'}
}, { sequelize, modelName: 'User' });// 同步模型到数据库
sequelize.sync().then(() => {console.log('Database & tables created!');}).catch(err => {console.error('Unable to create tables:', err);});

Shell 脚本

以下是一个简单的 Shell 脚本,用于在 MySQL 数据库中创建上述表结构。

#!/bin/bashDB_NAME="reactpress_db"
DB_USER="root"
DB_PASS="your_password"TABLES_SQL="
$(cat <<EOF
CREATE TABLE users (id INT AUTO_INCREMENT PRIMARY KEY,username VARCHAR(50) NOT NULL UNIQUE,password_hash VARCHAR(255) NOT NULL,email VARCHAR(100) NOT NULL UNIQUE,avatar_url VARCHAR(255),created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,role VARCHAR(50) DEFAULT 'user'
);-- 其他表的创建语句...EOF
)
"mysql -u $DB_USER -p$DB_PASS -e "CREATE DATABASE IF NOT EXISTS $DB_NAME;"
mysql -u $DB_USER -p$DB_PASS $DB_NAME < <(echo "$TABLES_SQL")echo "Database and tables created successfully!"

总结

ReactPress的数据库表结构设计充分考虑了用户、文章、评论和媒体文件等核心元素,并通过关联表实现了它们之间的复杂关系。这样的设计不仅保证了数据的完整性和一致性,还为ReactPress提供了强大的功能和灵活性。同时,随着ReactPress的不断发展和完善,其数据库表结构也可能会进行相应的调整和优化。

ReactPress 系列文章

ReactPress 是什么?:https://blog.csdn.net/m0_37981569/article/details/143495843
ReactPress—基于React的免费开源博客&CMS内容管理系统:https://blog.csdn.net/m0_37981569/article/details/143455403
ReactPress数据库表结构设计全面分析:https://blog.csdn.net/m0_37981569/article/details/143662572
ReactPress 安装指南:从 MySQL 安装到项目启动:https://blog.csdn.net/m0_37981569/article/details/143662086
ReactPress – An Open-Source Publishing Platform Built with React:https://blog.csdn.net/m0_37981569/article/details/143635836
ReactPress:构建高效、灵活、可扩展的开源发布平台:https://blog.csdn.net/m0_37981569/article/details/143635551
ReactPress技术揭秘:https://blog.csdn.net/m0_37981569/article/details/143634709
ReactPress:深入解析技术方案设计与源:https://blog.csdn.net/m0_37981569/article/details/143610300
ReactPress:重塑内容管理的未来:https://blog.csdn.net/m0_37981569/article/details/143610158
ReactPress系列—NestJS 服务端开发流程简介:https://blog.csdn.net/m0_37981569/article/details/143536219
ReactPress系列—Next.js 的动态路由使用介绍:https://blog.csdn.net/m0_37981569/article/details/143535847

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

无线振动传感器的安装方法

lora无线温振一体传感器即传感器的采集时间&#xff0c;采集方式完全有主机通过命令实现。其主要特点是&#xff1a;传感器平时处在低功耗状态、传感器可以随时响应远程主机控制命令、传感器可采集特征值或者原始加速度数据 lora 技术&#xff0c;提高了传输速率多振动&#xf…

GESP4级考试语法知识(暴力枚举(三))

古堡算式代码&#xff1a; # include <stdio.h> int main(){int a, b, c, d, e;int x;int left, right;left a * 10000 b * 1000 c * 100 d * 10 e * 1;right e * 10000 d * 1000 c * 100 b * 10 a * 1;for(a 0; a < 9; a){for(b 0; b < 9; b){for(c …

CSS学习

目录 一、CSS概述 二、CSS的三种引入方式 (一)直接使用style标签编辑样式(调试样式代码时使用) (二)使用link标签引入CSS文件(上线时使用) (三)内嵌式(尽量不用&#xff0c;后期维护麻烦) 三、CSS常用选择器 (一)标签选择器(通过html标签选择元素) (二)class选择器(通…

数字IC实践项目(10)—基于System Verilog的DDR4 Model/Tb 及基础Verification IP的设计与验证(付费项目)

数字IC实践项目&#xff08;10&#xff09;—基于System Verilog的DDR4 Model/Tb 及基础Verification IP的设计与验证&#xff08;付费项目&#xff09; 前言项目框图1&#xff09;DDR4 Verification IP2&#xff09;DDR4 JEDEC Model & Tb 项目文件1&#xff09;DDR4 Veri…

NLP论文速读|ScPO:自我一致性的偏好优化(Self-Consistency Preference Optimization)

论文速读|Self-Consistency Preference Optimization 论文信息&#xff1a; 简介&#xff1a; 这篇论文试图解决的问题是如何在没有人类标注数据的情况下&#xff0c;提高大型语言模型&#xff08;LLMs&#xff09;在复杂推理任务上的性能。现有的自我对齐技术往往因为难以分配…

Java定时任务

业务场景&#xff1a; 系统凌晨1点数据备份。用户下单半小时未支付订单&#xff0c;需要自动取消订单。每10min动态抓取某网站的数据。博客定时发送文章。每晚定时计算用户当日收益情况并推送给用户最新的数据。 分布式定时任务 Redis Redis过期事件监听。Redisson内置延时…

Data Grouping 数据分组

Goto Data Grid 数据网格 Data Grouping 数据分组 分组功能将具有相同列值的行合并到相同的数据组中。它受 Grid View 和 Banded Grid View 支持。 Apply Grouping 应用分组 数据分组最初在 Data Grid 中启用&#xff08;默认设置&#xff09;。要按列对数据进行分组&#…

对于大根堆的计算时间复杂度的过程

目录 第一步 第二步 第三步 第四步 第一步 首先进行假设 第二步 然后求解出每一层的节点个数这一层节点需要调整的所在高度 第三步 接着每一层节点需要调整的次数 &#xff08;每一层的节点个数 * 这一层节点需要调整的所在高度&#xff09;再全部相加起来 利用*2T&…

ANNOVAR下载

1.官网 https://annovar.openbioinformatics.org/en/latest/user-guide/startup/ 都填英文 要不然会报错 tar -xzvf annovar.latest.tar.gztree . ├── annotate_variation.pl ├── coding_change.pl ├── convert2annovar.pl ├── example │ ├── ex1.avinput…

【电子通识】TINA-TI中怎么用分段线性源做周期性波形

在文章【电子通识】TINA-TI 如何产生动态电流波形?中我们讲到我们可以用piecewise linear分段性线源做一个动态脉冲。 但是这个动态脉冲只能保持一定的时间,那么如何做成周期性的动态脉冲呢? 我们使用以下关键字,来完成周期性动态负载创建 Repeat Forever ....周期…

Llamaindex RAG 实践

大模型支持的最强大的应用程序之一是复杂的问答聊天机器人。这些应用程序可以回答有关特定源信息的问题。这些应用程序使用一种称为检索增强生成 &#xff08;RAG&#xff09; 的技术。 1. 什么是RAG&#xff1f; 当你需要给模型注入新的知识时&#xff0c;有两种方法&#xf…

外包干了2个月,技术明显退步

回望过去&#xff0c;我是一名普通的本科生&#xff0c;于2019年通过校招有幸加入了南京某知名软件公司。那时的我&#xff0c;满怀着对未来的憧憬和热情&#xff0c;投入到了功能测试的岗位中。日复一日&#xff0c;年复一年&#xff0c;转眼间&#xff0c;我已经在这个岗位上…

Sigrity SPEED2000 Power Ground Noise Simulation模式如何进行信号时域仿真操作指导(一)-单个信号

Sigrity SPEED2000 Power Ground Noise Simulation模式如何进行信号时域仿真操作指导(一)-单个信号 Power Ground Noise Simulation模式除了可以对电源进行时域仿真外&#xff0c;同样支持对信号进行时域仿真&#xff0c;以下图为例进行说明 2D视图 3D view 本例中观测信号D2从…

String模拟实现【C++】【STL】

String模拟实现【C】【STL】 构造函数拷贝构造赋值重载析构函数<<赋值重载插入函数reserveappend函数push_back函数 earse函数完整代码string.hstring.cpp STL中有两个属性capacity和size&#xff0c;capacity是真正STL容器的真正内存大小&#xff0c;size是STL容器中数据…

前端CSS3 渐变详解

文章目录 CSS3 渐变详解一、引言二、CSS3 渐变基础1、线性渐变1.1、基本线性渐变1.2、改变渐变方向 2、径向渐变2.1、基本径向渐变2.2、设置径向渐变的中心 三、高级渐变技巧1、重复渐变1.1、重复线性渐变1.2、重复径向渐变 四、总结 CSS3 渐变详解 一、引言 在现代网页设计中…

Ubuntu系统安装minicom软件连接交换机

安装minicom&#xff1a; 电脑主机串口线连接上交换机的console口。开打乌班图系统终端&#xff0c;输入sudo -i切换为root用户 方法一&#xff1a; 输入 sudo apt-get install minicom 命令&#xff0c;安装minicom软件。 minicom 必须带有安装包的完整路径 文件名称 后…

异星工厂_1

经验 首次体验异星工厂这款游戏&#xff0c;得出了以下经验。 1. 基地的构建顺序&#xff1a;煤&#xff0c;电&#xff0c;原料&#xff0c;传送流&#xff0c;组装器&#xff0c;防御武器&#xff0c;其他 2. 永远不要让采集&#xff08;生产者&#xff09;停止&#xff0…

前端面试题每日一学_6

今日一题&#xff1a; 下面的CSS代码中&#xff0c;定义了一个帧动画&#xff0c;请问该帧动画能否正常流畅的执行&#xff1f; keyframes move {50% {/* 改变自定义变量的值 */--x: 100px;/* 改变元素的背景颜色 并使用!important */background: yellow !important;} } .d {…