Files
Linux-book/03.数据库/03.数据库开发项目代码示例/01.笔记网站/spec.md
T
2026-08-12 14:20:36 +08:00

11 KiB
Raw Blame History

  • 技术栈

    • 原生HTML+CSS+JS
    • php8.0
    • Mysql5.7
  • 界面设计

    • 站点主页无需登录,就可以进行内容的浏览
    • 点击登录,出现登录页面,管理员登录后进入后台管理,普通用户继续浏览主页
  • 用户管理

    • 需要支持用户登录,用户分为管理员和普通用户
    • 管理员支持对笔记、分类、评论、用户有完整的权限
    • 普通用户只有查看笔记、分类、评论和发表评论的权限
  • 分类管理

  • 笔记管理

  • 评论管理


数据库设计

数据库信息

  • 数据库名: site03
  • 字符集: utf8mb4
  • 排序规则: utf8mb4_unicode_ci
CREATE DATABASE IF NOT EXISTS `site03`
  DEFAULT CHARACTER SET utf8mb4
  COLLATE utf8mb4_unicode_ci;

USE `site03`;

表结构

1. users — 用户表

字段 类型 必填 说明
id INT UNSIGNED 主键,自增
username VARCHAR(50) 用户名,唯一
password VARCHAR(255) 密码哈希(password_hash
role ENUM('admin','user') 角色:管理员 / 普通用户,默认 user
email VARCHAR(100) 邮箱
avatar VARCHAR(255) 头像路径
status TINYINT(1) 状态:0=禁用, 1=启用,默认 1
created_at DATETIME 创建时间
updated_at DATETIME 更新时间
CREATE TABLE `users` (
  `id`         INT UNSIGNED    NOT NULL AUTO_INCREMENT,
  `username`   VARCHAR(50)     NOT NULL,
  `password`   VARCHAR(255)    NOT NULL,
  `role`       ENUM('admin','user') NOT NULL DEFAULT 'user',
  `email`      VARCHAR(100)    DEFAULT NULL,
  `avatar`     VARCHAR(255)    DEFAULT NULL,
  `status`     TINYINT(1)      NOT NULL DEFAULT 1 COMMENT '0=禁用 1=启用',
  `created_at` DATETIME        NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `updated_at` DATETIME        NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_username` (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

2. categories — 分类表

字段 类型 必填 说明
id INT UNSIGNED 主键,自增
name VARCHAR(50) 分类名称,唯一
slug VARCHAR(50) URL 别名,唯一
description TEXT 分类描述
sort_order INT UNSIGNED 排序权重,默认 0
created_at DATETIME 创建时间
updated_at DATETIME 更新时间
CREATE TABLE `categories` (
  `id`          INT UNSIGNED  NOT NULL AUTO_INCREMENT,
  `name`        VARCHAR(50)   NOT NULL,
  `slug`        VARCHAR(50)   NOT NULL,
  `description` TEXT          DEFAULT NULL,
  `sort_order`  INT UNSIGNED  NOT NULL DEFAULT 0,
  `created_at`  DATETIME      NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `updated_at`  DATETIME      NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_name` (`name`),
  UNIQUE KEY `uk_slug` (`slug`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

3. notes — 笔记表

字段 类型 必填 说明
id INT UNSIGNED 主键,自增
title VARCHAR(255) 笔记标题
content LONGTEXT 笔记正文
summary VARCHAR(500) 摘要
category_id INT UNSIGNED 所属分类,外键
user_id INT UNSIGNED 作者,外键
status ENUM('draft','published') 状态:草稿 / 已发布,默认 draft
view_count INT UNSIGNED 浏览次数,默认 0
created_at DATETIME 创建时间
updated_at DATETIME 更新时间
CREATE TABLE `notes` (
  `id`          INT UNSIGNED                NOT NULL AUTO_INCREMENT,
  `title`       VARCHAR(255)                NOT NULL,
  `content`     LONGTEXT                    NOT NULL,
  `summary`     VARCHAR(500)                DEFAULT NULL,
  `category_id` INT UNSIGNED                NOT NULL,
  `user_id`     INT UNSIGNED                NOT NULL,
  `status`      ENUM('draft','published')   NOT NULL DEFAULT 'draft',
  `view_count`  INT UNSIGNED                NOT NULL DEFAULT 0,
  `created_at`  DATETIME                    NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `updated_at`  DATETIME                    NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  KEY `idx_category_id` (`category_id`),
  KEY `idx_user_id`     (`user_id`),
  KEY `idx_status`      (`status`),
  CONSTRAINT `fk_notes_category` FOREIGN KEY (`category_id`) REFERENCES `categories`(`id`) ON DELETE RESTRICT,
  CONSTRAINT `fk_notes_user`     FOREIGN KEY (`user_id`)     REFERENCES `users`(`id`)      ON DELETE RESTRICT
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

4. comments — 评论表

字段 类型 必填 说明
id INT UNSIGNED 主键,自增
note_id INT UNSIGNED 所属笔记,外键
user_id INT UNSIGNED 评论人,外键
parent_id INT UNSIGNED 父评论 ID(支持回复),外键
content TEXT 评论内容
status ENUM('pending','approved','rejected') 审核状态,默认 pending
created_at DATETIME 创建时间
updated_at DATETIME 更新时间
CREATE TABLE `comments` (
  `id`         INT UNSIGNED                                NOT NULL AUTO_INCREMENT,
  `note_id`    INT UNSIGNED                                NOT NULL,
  `user_id`    INT UNSIGNED                                NOT NULL,
  `parent_id`  INT UNSIGNED                                DEFAULT NULL,
  `content`    TEXT                                        NOT NULL,
  `status`     ENUM('pending','approved','rejected')       NOT NULL DEFAULT 'pending',
  `created_at` DATETIME                                    NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `updated_at` DATETIME                                    NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  KEY `idx_note_id`   (`note_id`),
  KEY `idx_user_id`   (`user_id`),
  KEY `idx_parent_id` (`parent_id`),
  CONSTRAINT `fk_comments_note`   FOREIGN KEY (`note_id`)   REFERENCES `notes`(`id`) ON DELETE CASCADE,
  CONSTRAINT `fk_comments_user`   FOREIGN KEY (`user_id`)   REFERENCES `users`(`id`) ON DELETE RESTRICT,
  CONSTRAINT `fk_comments_parent` FOREIGN KEY (`parent_id`) REFERENCES `comments`(`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

索引说明

索引名 字段 类型 用途
users PRIMARY id 主键 用户唯一标识
users uk_username username 唯一 用户名唯一约束
categories PRIMARY id 主键 分类唯一标识
categories uk_name name 唯一 分类名唯一约束
categories uk_slug slug 唯一 URL 别名唯一约束
notes PRIMARY id 主键 笔记唯一标识
notes idx_category_id category_id 普通 按分类查询笔记
notes idx_user_id user_id 普通 按作者查询笔记
notes idx_status status 普通 按发布状态筛选
comments PRIMARY id 主键 评论唯一标识
comments idx_note_id note_id 普通 按笔记查询评论
comments idx_user_id user_id 普通 按用户查询评论
comments idx_parent_id parent_id 普通 查询回复链

外键约束说明

  • notes.category_idcategories.id: RESTRICT,存在笔记时不可删除分类
  • notes.user_idusers.id: RESTRICT,存在笔记时不可删除用户
  • comments.note_idnotes.id: CASCADE,删除笔记时级联删除评论
  • comments.user_idusers.id: RESTRICT,存在评论时不可删除用户
  • comments.parent_idcomments.id: CASCADE,删除父评论时级联删除子回复

种子数据

-- 默认管理员: admin / admin123
INSERT INTO `users` (`username`, `password`, `role`) VALUES
('admin', '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', 'admin');

-- 示例分类
INSERT INTO `categories` (`name`, `slug`, `description`, `sort_order`) VALUES
('技术笔记', 'tech',     '编程与技术相关笔记',   1),
('生活随笔', 'life',     '日常生活与感悟',       2),
('读书笔记', 'reading',  '书籍阅读与书评',       3);

密码 admin123 使用 PHP password_hash('admin123', PASSWORD_DEFAULT) 生成,实际部署时请更换。 详细搭建说明参见 spec.md 附录。