# lingblog **Repository Path**: zhuoling-forest/lingblog ## Basic Information - **Project Name**: lingblog - **Description**: 一个开源博客web 基于Spring Boot + VUE3 后续会更新 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 0 - **Created**: 2026-05-18 - **Last Updated**: 2026-05-30 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README JDK 1.8 --- ### 👥 角色定义 | 角色 | 英文标识 | 说明 | | --------------- | ----------- | ------------------------------------------------------------ | | **游客** | `ANONYMOUS` | 所有未登录的访问者,可以浏览文章、分类、标签、评论,也可以发表评论(需提供昵称和邮箱)。 | | **读者** | `READER` | (**本次MVP暂不引入**)注册后的普通用户,未来可能支持点赞、收藏、订阅等。为了避免复杂度,目前**不强制注册**,评论者通过昵称+邮箱即可参与。 | | **作者** | `AUTHOR` | 可登录后台,**只能管理自己创建的文章**(增、删、改、查),不能触碰系统设置、分类、标签、文件等。 | | **博主/管理员** | `ADMIN` | 最高权限,管理所有文章、分类、标签、文件、评论、系统配置,查看数据看板。 | **当前落地的角色只有三种**:游客、作者、管理员。 “游客登录”不是账号体系的登录,而是**无需认证直接使用**,这符合你“允许用户游客登录”的初衷。 --- ### 🔐 权限矩阵(接口 × 角色) 这里只列出关键资源访问,`√`为有权,`×`为无。 | 资源/操作 | 游客 | 作者 (AUTHOR) | 管理员 (ADMIN) | | --------------- | ---------------- | -------------- | -------------- | | 浏览已发布文章 | √ | √ | √ | | 按 slug 看详情 | √ | √ | √ | | 搜索文章 | √ | √ | √ | | 文章归档 | √ | √ | √ | | 获取分类/标签 | √ | √ | √ | | 发表评论 | √ (需填昵称邮箱) | √ | √ | | 查看评论 | √ | √ | √ | | 登录后台 | × | √ | √ | | 创建/编辑文章 | × | √ (仅自己) | √ (全部) | | 删除文章 | × | √ (仅自己) | √ (全部) | | 管理自己的文章 | × | √ | √ | | 管理所有文章 | × | × | √ | | 文章置顶 | × | × | √ | | 分类/标签增删改 | × | × | √ | | 删除任意评论 | × | × | √ | | 上传文件/图片 | × | √ (自己的附件) | √ (全部) | | 管理文件库 | × | × | √ | | 系统配置修改 | × | × | √ | | 数据看板 | × | × | √ | | 个人资料修改 | × | √ (自己) | √ | --- ### 📦 最终确定的接口清单 基于你的筛选(无评论审核、无导出、无独立页面、无友链,保留三大看板指标),并融入了角色控制。 #### 🔓 公开接口(游客可访问) | 方法 | 路径 | 说明 | | ---- | ---------------------------- | -------------------------------- | | POST | `/api/auth/login` | 管理员/作者登录,返回JWT | | GET | `/api/posts` | 分页获取已发布文章 | | GET | `/api/posts/{slug}` | 文章详情(含分类、标签、阅读量) | | GET | `/api/posts/search` | 搜索文章 | | GET | `/api/posts/archive` | 按年月归档 | | GET | `/api/categories` | 所有分类(含文章数) | | GET | `/api/tags` | 所有标签(含文章数) | | GET | `/api/posts/{slug}/comments` | 文章的评论列表(树形) | | POST | `/api/posts/{slug}/comments` | 发表评论(需昵称、邮箱、内容) | #### 🔒 后台接口(需 AUTHOR/ADMIN 角色) **文章管理** | 方法 | 路径 | 说明 | 权限 | | ------ | ------------------------------ | ------------------ | --------------------------------- | | POST | `/api/admin/posts` | 创建文章 | `AUTHOR` | | PUT | `/api/admin/posts/{id}` | 编辑文章 | `AUTHOR`(自己) or `ADMIN` | | DELETE | `/api/admin/posts/{id}` | 软删除 | `AUTHOR`(自己) or `ADMIN` | | GET | `/api/admin/posts` | 文章管理列表 | `AUTHOR`(只看自己), `ADMIN`(全部) | | GET | `/api/admin/posts/{id}` | 获取文章详情(编辑) | `AUTHOR`(自己) or `ADMIN` | | PATCH | `/api/admin/posts/{id}/status` | 发布/变草稿 | `AUTHOR`(自己) or `ADMIN` | | PATCH | `/api/admin/posts/{id}/top` | 置顶 | `ADMIN` | **分类 & 标签** | 方法 | 路径 | 说明 | 权限 | | --------------- | ------------------------- | -------------- | ------- | | GET | `/api/admin/categories` | 分类列表(管理) | `ADMIN` | | POST/PUT/DELETE | `/api/admin/categories/*` | 增/改/删 | `ADMIN` | | GET | `/api/admin/tags` | 标签列表 | `ADMIN` | | POST/PUT/DELETE | `/api/admin/tags/*` | 增/改/删 | `ADMIN` | **评论管理** | 方法 | 路径 | 说明 | 权限 | | ------ | -------------------------- | ---------------- | ------- | | GET | `/api/admin/comments` | 所有评论(分页) | `ADMIN` | | DELETE | `/api/admin/comments/{id}` | 删除评论 | `ADMIN` | **文件管理(阿里云OSS)** | 方法 | 路径 | 说明 | 权限 | | ------ | ------------------------- | ---------------------- | ---------------- | | POST | `/api/admin/files/upload` | 上传图片/文件,返回URL | `AUTHOR`/`ADMIN` | | GET | `/api/admin/files` | 文件列表 | `ADMIN` | | DELETE | `/api/admin/files/{id}` | 删除文件 | `ADMIN` | **统计看板(仅管理员)** | 方法 | 路径 | 说明 | | ---- | -------------------------- | -------------------------------- | | GET | `/api/admin/dashboard` | 仪表盘:文章数、评论数、总访问量 | | GET | `/api/admin/stats/pv` | PV/UV 趋势(按天或按周) | | GET | `/api/admin/stats/popular` | 热门文章 Top N | **系统 & 用户** | 方法 | 路径 | 说明 | 权限 | | ---- | ------------------------- | ---------------- | ---------------- | | GET | `/api/auth/me` | 当前登录用户信息 | 已登录 | | PUT | `/api/admin/user/profile` | 修改个人信息 | `AUTHOR`/`ADMIN` | | GET | `/api/admin/config` | 获取系统配置 | `ADMIN` | | PUT | `/api/admin/config` | 修改系统配置 | `ADMIN` | | GET | `/api/health` | 健康检查 | 公开 | --- ### ✍️ 关于“一段文字,一张图片”这种主流程式 后端完全不限制。接口中文章内容的字段(`content`)会存**HTML格式的富文本**。无论你用任何编辑器(如 ByteMD、Quill、TinyMCE),最终产出的都是带有`

`、``、`

`等标签的字符串,后端原样存储并输出即可。你看到的“一段文字配一张图”只是编辑时的排版,技术上就是一段 HTML。

---



---

```sql
-- 创建数据库
CREATE DATABASE IF NOT EXISTS `ling_blog` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
USE `ling_blog`;

-- ============================================================
-- 1. 用户表(作者 & 管理员)
-- ============================================================
CREATE TABLE `user` (
    `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '用户ID',
    `username` VARCHAR(50) NOT NULL COMMENT '登录用户名',
    `password` VARCHAR(255) NOT NULL COMMENT 'BCrypt加密密码',
    `nickname` VARCHAR(50) NOT NULL COMMENT '显示昵称',
    `email` VARCHAR(100) DEFAULT NULL COMMENT '邮箱',
    `avatar` VARCHAR(255) DEFAULT NULL COMMENT '头像URL',
    `role` VARCHAR(20) NOT NULL DEFAULT 'AUTHOR' COMMENT '角色:ADMIN / AUTHOR',
    `bio` VARCHAR(500) DEFAULT NULL COMMENT '个人简介',
    `status` TINYINT NOT NULL DEFAULT 1 COMMENT '状态:1启用 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_username` (`username`),
    KEY `idx_role` (`role`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表(管理员和作者)';

-- 默认插入一个管理员账号(密码需程序BCrypt加密,此处仅示例)
INSERT INTO `user` (`username`, `password`, `nickname`, `role`, `bio`) 
VALUES ('admin', '$2a$10$placeholder', '博主', 'ADMIN', '这是个人博客的主人');

-- ============================================================
-- 2. 文章分类表(支持多级树形)
-- ============================================================
CREATE TABLE `category` (
    `id` BIGINT NOT NULL AUTO_INCREMENT,
    `name` VARCHAR(50) NOT NULL COMMENT '分类名称',
    `slug` VARCHAR(100) NOT NULL COMMENT 'URL别名',
    `parent_id` BIGINT DEFAULT 0 COMMENT '父分类ID,0为顶级',
    `sort_order` INT DEFAULT 0 COMMENT '排序权重',
    `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_slug` (`slug`),
    KEY `idx_parent` (`parent_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='文章分类(支持多级)';

-- ============================================================
-- 3. 标签表
-- ============================================================
CREATE TABLE `tag` (
    `id` BIGINT NOT NULL AUTO_INCREMENT,
    `name` VARCHAR(50) NOT NULL COMMENT '标签名',
    `slug` VARCHAR(100) NOT NULL,
    `created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (`id`),
    UNIQUE KEY `uk_slug` (`slug`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='标签';

-- ============================================================
-- 4. 文章表
-- ============================================================
CREATE TABLE `post` (
    `id` BIGINT NOT NULL AUTO_INCREMENT,
    `title` VARCHAR(255) NOT NULL COMMENT '文章标题',
    `slug` VARCHAR(255) NOT NULL COMMENT 'URL别名,唯一',
    `content` LONGTEXT NOT NULL COMMENT '文章正文(HTML富文本)',
    `summary` VARCHAR(500) DEFAULT NULL COMMENT '文章摘要',
    `cover_image` VARCHAR(255) DEFAULT NULL COMMENT '封面图URL',
    `status` TINYINT NOT NULL DEFAULT 0 COMMENT '状态:0草稿 1已发布 2回收站',
    `is_top` TINYINT NOT NULL DEFAULT 0 COMMENT '是否置顶:1是 0否',
    `views` BIGINT NOT NULL DEFAULT 0 COMMENT '阅读量',
    `author_id` BIGINT NOT NULL COMMENT '作者ID',
    `category_id` BIGINT DEFAULT NULL COMMENT '所属分类ID',
    `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_slug` (`slug`),
    KEY `idx_status` (`status`),
    KEY `idx_created` (`created_at`),
    KEY `idx_author` (`author_id`),
    KEY `idx_category` (`category_id`),
    CONSTRAINT `fk_post_author` FOREIGN KEY (`author_id`) REFERENCES `user` (`id`) ON DELETE CASCADE,
    CONSTRAINT `fk_post_category` FOREIGN KEY (`category_id`) REFERENCES `category` (`id`) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='文章';

-- ============================================================
-- 5. 文章与标签关联表
-- ============================================================
CREATE TABLE `post_tag` (
    `post_id` BIGINT NOT NULL,
    `tag_id` BIGINT NOT NULL,
    PRIMARY KEY (`post_id`, `tag_id`),
    KEY `idx_tag` (`tag_id`),
    CONSTRAINT `fk_post_tag_post` FOREIGN KEY (`post_id`) REFERENCES `post` (`id`) ON DELETE CASCADE,
    CONSTRAINT `fk_post_tag_tag` FOREIGN KEY (`tag_id`) REFERENCES `tag` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='文章-标签关联';

-- ============================================================
-- 6. 评论表(游客可评论,无审核,支持嵌套)
-- ============================================================
CREATE TABLE `comment` (
    `id` BIGINT NOT NULL AUTO_INCREMENT,
    `post_id` BIGINT NOT NULL COMMENT '所属文章ID',
    `parent_id` BIGINT DEFAULT NULL COMMENT '父评论ID,支持多层回复',
    `nickname` VARCHAR(50) NOT NULL COMMENT '评论者昵称',
    `email` VARCHAR(100) NOT NULL COMMENT '评论者邮箱',
    `website` VARCHAR(255) DEFAULT NULL COMMENT '评论者网站(可选)',
    `content` TEXT NOT NULL COMMENT '评论内容(支持纯文本或简单HTML)',
    `ip` VARCHAR(45) DEFAULT NULL COMMENT '评论者IP',
    `user_agent` VARCHAR(500) DEFAULT NULL COMMENT '浏览器UA',
    `is_author_reply` TINYINT NOT NULL DEFAULT 0 COMMENT '是否为作者回复:1是 0否',
    `created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (`id`),
    KEY `idx_post` (`post_id`),
    KEY `idx_parent` (`parent_id`),
    KEY `idx_created` (`created_at`),
    CONSTRAINT `fk_comment_post` FOREIGN KEY (`post_id`) REFERENCES `post` (`id`) ON DELETE CASCADE,
    CONSTRAINT `fk_comment_parent` FOREIGN KEY (`parent_id`) REFERENCES `comment` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='评论(无需审核,嵌套结构)';

-- ============================================================
-- 7. 文件资源表(记录上传到OSS的文件)
-- ============================================================
CREATE TABLE `file` (
    `id` BIGINT NOT NULL AUTO_INCREMENT,
    `original_name` VARCHAR(255) NOT NULL COMMENT '原始文件名',
    `oss_url` VARCHAR(500) NOT NULL COMMENT 'OSS访问URL',
    `file_size` BIGINT NOT NULL DEFAULT 0 COMMENT '文件大小(字节)',
    `mime_type` VARCHAR(100) DEFAULT NULL COMMENT 'MIME类型',
    `uploader_id` BIGINT NOT NULL COMMENT '上传者ID',
    `created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (`id`),
    KEY `idx_uploader` (`uploader_id`),
    CONSTRAINT `fk_file_uploader` FOREIGN KEY (`uploader_id`) REFERENCES `user` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='上传文件记录(OSS)';

-- ============================================================
-- 8. 系统配置表(键值对)
-- ============================================================
CREATE TABLE `setting` (
    `key_name` VARCHAR(100) NOT NULL COMMENT '配置键',
    `value` TEXT NOT NULL COMMENT '配置值',
    `updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    PRIMARY KEY (`key_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='系统配置(站点名、开关等)';

-- 默认配置示例
INSERT INTO `setting` (`key_name`, `value`) VALUES 
('site_name', 'My Blog'),
('site_description', '分享技术与生活'),
('comment_enabled', 'true'),
('posts_per_page', '10');

-- ============================================================
-- 9. 访问日志表(用于PV/UV统计)
-- ============================================================
CREATE TABLE `access_log` (
    `id` BIGINT NOT NULL AUTO_INCREMENT,
    `path` VARCHAR(255) NOT NULL COMMENT '访问路径',
    `ip` VARCHAR(45) NOT NULL COMMENT '客户端IP',
    `user_agent` VARCHAR(500) DEFAULT NULL,
    `referer` VARCHAR(500) DEFAULT NULL,
    `session_id` VARCHAR(100) DEFAULT NULL COMMENT '可选的会话标识,辅助UV计算',
    `created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (`id`),
    KEY `idx_path` (`path`),
    KEY `idx_ip` (`ip`),
    KEY `idx_created` (`created_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='访问日志(PV/UV数据源)';

-- ============================================================
-- 完成
-- ============================================================
```

---

### 核心说明

- **用户角色**:`user.role` 字段直接区分 `ADMIN` 和 `AUTHOR`,权限在 Controller 层通过 `@PreAuthorize` 控制。
- **游客评论**:无需登录,评论表存储昵称和邮箱,`parent_id` 可自关联实现嵌套评论。
- **文章内容**:`content` 字段存储 HTML 富文本,完美支持“一段文字一张图片”的任意排版。
- **统计看板**:`access_log` 表记录每一次页面访问,可通过 `SELECT COUNT(*) ... GROUP BY DATE(created_at)` 实现趋势,`COUNT(DISTINCT ip)` 计算 UV,热门文章根据 `post.views` 排序。
- **OSS 文件**:`file` 表只做记录,不存物理文件,`oss_url` 即为阿里云返回的永久访问地址。
- **分类多级**:`category` 表通过 `parent_id` 形成树,`slug` 唯一,文章通过 `category_id` 关联。



目前已经建立好数据库。我需要你先根据项目框架生成后端。并且确保没有问题。中间我同意你所有的读操作。同意你所有在当前项目下的所有的写操作。你必须确保代码的编写没有问题。

所有代码编写完成后。回头检查代码逻辑是否正确。



服务器
	SSH :   
					118.145.107.25
					zhuoling1.