Files
MyAfterProject/README_API.md
qingfeng1121 5803080352 feat(security): 重构安全配置并添加用户认证功能
refactor: 将ResponseMessage移动到config包并增强功能
feat: 添加用户管理相关功能及密码加密配置
fix: 修复HelpController中README文件路径问题
docs: 更新application.properties配置注释
style: 清理无用导入和日志文件
2025-10-28 12:47:02 +08:00

24 KiB
Raw Permalink Blame History

MyAfterProject 开发文档(前端使用)

项目概述

MyAfterProject是一个基于Spring Boot的后端博客系统提供文章管理、留言板、用户管理等功能的RESTful API接口。系统集成了Spring Security提供安全的HTTP访问机制。本文档旨在帮助前端开发者理解和使用这些API接口包括接口规范、请求/响应格式、数据模型及最佳实践。

技术栈

  • 后端框架: Spring Boot 2.x
  • ORM框架: Spring Data JPA
  • 数据库: MySQL
  • 安全框架: Spring Security
  • API风格: RESTful API
  • 错误处理: 全局异常处理机制

项目结构

src/main/java/com/qf/myafterprojecy/
├── controller/           # 控制器层处理HTTP请求
│   ├── ArticleController.java       # 文章相关API
│   ├── MessageController.java       # 留言相关API
│   ├── UserController.java          # 用户相关API
│   ├── CategoryController.java      # 分类相关API
│   ├── CategoryAttributeController.java # 分类属性相关API
│   ├── MarkdownController.java      # Markdown相关API
│   └── HelpController.java          # 帮助文档相关API
├── pojo/                 # 实体类和数据传输对象
│   ├── Article.java                 # 文章实体
│   ├── Message.java                 # 留言实体
│   ├── Users.java                   # 用户实体
│   ├── Category.java                # 分类实体
│   ├── Category_attribute.java      # 分类属性实体
│   ├── Markdown.java                # Markdown实体
│   └── dto/                         # 数据传输对象
│       ├── ArticleDto.java          # 文章DTO
│       ├── MessageDto.java          # 留言DTO
│       ├── UserDto.java             # 用户DTO
│       ├── CategoryDto.java         # 分类DTO
│       ├── CategoryAttributeDto.java # 分类属性DTO
│       └── MarkdownDto.java         # Markdown DTO
├── repository/           # 数据访问层
│   ├── ArticleRepository.java       # 文章数据访问
│   ├── MessageRepository.java       # 留言数据访问
│   ├── UserRepository.java          # 用户数据访问
│   ├── CategoryRepository.java      # 分类数据访问
│   ├── CategoryAttributeRepository.java # 分类属性数据访问
│   └── MarkdownRepository.java      # Markdown数据访问
├── service/              # 业务逻辑层
│   ├── ArticleService.java          # 文章服务实现
│   ├── IArticleService.java         # 文章服务接口
│   ├── MessageService.java          # 留言服务实现
│   ├── IMessageService.java         # 留言服务接口
│   ├── UserService.java             # 用户服务实现
│   └── IUserService.java            # 用户服务接口
├── config/               # 配置类
│   ├── SecurityConfig.java          # Spring Security配置
│   └── ResponseMessage.java         # 统一响应消息格式
├── GlobalExceptionHandler.java      # 全局异常处理器
└── MyAfterProjecyApplication.java   # 应用入口

配置信息

  • 服务地址: http://localhost:8080
  • API基础路径: /api
  • 安全配置: 当前配置允许所有请求通过,不需要认证

API接口详细说明

统一响应格式

所有API接口都返回统一的响应格式 ResponseMessage<T>

{
  "code": 200,              // HTTP状态码
  "message": "成功",        // 响应消息
  "success": true,          // 是否成功
  "data": {}                // 响应数据(具体类型根据接口而定)
}

1. 文章管理API

1.1 获取所有文章

GET /api/articles

功能: 获取所有已发布的文章列表

请求参数: 无

返回数据:

{
  "code": 200,
  "message": "查询成功",
  "success": true,
  "data": [
    {
      "articleid": 1,
      "title": "文章标题",
      "content": "文章内容...",
      "attributeid": 1,
      "img": "图片URL",
      "createdAt": "2023-01-01T10:00:00",
      "updatedAt": "2023-01-01T10:00:00",
      "viewCount": 100,
      "likes": 0,
      "status": 1,
      "markdownid": 0
    },
    // 更多文章...
  ]
}

1.2 获取单篇文章

GET /api/articles/{id}

功能: 根据ID获取单篇文章详情会自动增加浏览量

请求参数:

  • id: 文章ID路径参数

返回数据:

{
  "code": 200,
  "message": "查询成功",
  "success": true,
  "data": {
    "articleid": 1,
    "title": "文章标题",
    "content": "文章内容...",
    "attributeid": 1,
    "img": "图片URL",
    "createdAt": "2023-01-01T10:00:00",
    "updatedAt": "2023-01-01T10:00:00",
    "viewCount": 101,
    "likes": 0,
    "status": 1,
    "markdownid": 0
  }
}

1.3 根据属性获取文章

GET /api/articles/attribute/{attributeId}

功能: 获取指定属性下的所有文章

请求参数:

  • attributeId: 属性ID路径参数

返回数据:

{
  "code": 200,
  "message": "查询成功",
  "success": true,
  "data": [
    // 文章列表(结构同获取所有文章)
  ]
}

1.4 增加文章浏览量

POST /api/articles/view/{id}

功能: 增加指定文章的浏览量

请求参数:

  • id: 文章ID路径参数

返回数据:

{
  "code": 200,
  "message": "更新成功",
  "success": true,
  "data": {
    // 更新后的文章信息
  }
}

1.5 获取热门文章

GET /api/articles/popular

功能: 获取浏览量最高的文章列表

请求参数: 无

返回数据:

{
  "code": 200,
  "message": "查询成功",
  "success": true,
  "data": [
    // 热门文章列表(结构同获取所有文章)
  ]
}

1.6 创建文章

POST /api/articles

功能: 创建新文章

请求体:

{
  "title": "新文章标题",
  "content": "新文章内容",
  "attributeid": 1,
  "img": "图片URL",
  "status": 1  // 0-草稿1-已发布
}

返回数据:

{
  "code": 200,
  "message": "保存成功",
  "success": true,
  "data": {
    "articleid": 2,
    "title": "新文章标题",
    "content": "新文章内容",
    // 其他文章字段
  }
}

1.7 更新文章

PUT /api/articles/{id}

功能: 更新现有文章

请求参数:

  • id: 文章ID路径参数

请求体:

{
  "title": "更新后的标题",
  "content": "更新后的内容",
  "attributeid": 1,
  "img": "更新后的图片URL",
  "status": 1
}

返回数据:

{
  "code": 200,
  "message": "更新成功",
  "success": true,
  "data": {
    // 更新后的文章信息
  }
}

1.8 删除文章

DELETE /api/articles/{id}

功能: 删除指定文章实际为软删除将状态标记为2

请求参数:

  • id: 文章ID路径参数

返回数据:

{
  "code": 200,
  "message": "删除成功",
  "success": true,
  "data": null
}

2. 留言管理API

2.1 获取所有留言

GET /api/messages

功能: 获取所有留言列表

请求参数: 无

返回数据:

{
  "code": 200,
  "message": "查询成功",
  "success": true,
  "data": [
    {
      "messageid": 1,
      "nickname": "用户名",
      "email": "user@example.com",
      "content": "留言内容",
      "createdAt": "2023-01-01T10:00:00",
      "parentid": null, // 父留言IDnull表示主留言
      "replyid": null, // 回复留言IDnull表示无回复
      "articleid": null, // 关联的文章IDnull表示无关联
      "likes": 0 // 点赞数
    },
    // 更多留言...
  ]
}

2.2 获取单条留言

GET /api/messages/{id}

功能: 根据ID获取单条留言详情

请求参数:

  • id: 留言ID路径参数

返回数据:

{
  "code": 200,
  "message": "查询成功",
  "success": true,
  "data": {
    // 留言详细信息(结构同上)
  }
}

2.3 根据文章ID获取留言

GET /api/messages/article/{articleId}

功能: 获取指定文章下的所有留言

请求参数:

  • articleId: 文章ID路径参数

返回数据:

{
  "code": 200,
  "message": "查询成功",
  "success": true,
  "data": [
    // 留言列表
  ]
}

2.4 获取根留言

GET /api/messages/root

功能: 获取所有根留言(非回复的留言)

请求参数: 无

返回数据:

{
  "code": 200,
  "message": "查询成功",
  "success": true,
  "data": [
    // 根留言列表
  ]
}

2.5 获取回复列表

GET /api/messages/{parentId}/replies

功能: 根据父留言ID获取回复列表

请求参数:

  • parentId: 父留言ID路径参数

返回数据:

{
  "code": 200,
  "message": "查询成功",
  "success": true,
  "data": [
    // 回复列表
  ]
}

2.6 搜索留言

GET /api/messages/search?nickname={nickname}

功能: 根据昵称搜索留言

请求参数:

  • nickname: 昵称(查询参数)

返回数据:

{
  "code": 200,
  "message": "查询成功",
  "success": true,
  "data": [
    // 匹配的留言列表
  ]
}

2.7 获取文章评论数量

GET /api/messages/count/article/{articleId}

功能: 获取指定文章的评论数量

请求参数:

  • articleId: 文章ID路径参数

返回数据:

{
  "code": 200,
  "message": "查询成功",
  "success": true,
  "data": 10 // 评论数量
}

2.8 创建留言

POST /api/messages

功能: 发布新留言

请求体:

{
  "nickname": "用户名",
  "email": "user@example.com",
  "content": "新留言内容",
  "parentid": null,  // 可选回复时设置为被回复留言的ID
  "articleid": null  // 可选关联文章时设置为文章ID
}

返回数据:

{
  "code": 200,
  "message": "保存成功",
  "success": true,
  "data": {
    // 保存后的留言信息
  }
}

2.9 点赞留言

POST /api/messages/{id}/like

功能: 增加留言的点赞数

请求参数:

  • id: 留言ID路径参数

返回数据:

{
  "code": 200,
  "message": "操作成功",
  "success": true,
  "data": {
    // 更新后的留言信息
  }
}

2.10 删除留言

DELETE /api/messages/{id}

功能: 删除指定留言及其所有回复

请求参数:

  • id: 留言ID路径参数

返回数据:

{
  "code": 200,
  "message": "删除成功",
  "success": true,
  "data": null
}

2.11 删除所有留言

DELETE /api/messages/all

功能: 删除所有留言

请求参数: 无

返回数据:

{
  "code": 200,
  "message": "删除成功",
  "success": true,
  "data": null
}

3. 用户管理API

3.1 获取所有用户

GET /api/users

功能: 获取所有用户列表

请求参数: 无

返回数据:

{
  "code": 200,
  "message": "查询成功",
  "success": true,
  "data": [
    // 用户列表
  ]
}

3.2 根据ID获取用户

GET /api/users/{id}

功能: 根据ID获取用户信息

请求参数:

  • id: 用户ID路径参数

返回数据:

{
  "code": 200,
  "message": "查询成功",
  "success": true,
  "data": {
    // 用户信息
  }
}

3.3 根据用户名获取用户

GET /api/users/username/{username}

功能: 根据用户名获取用户信息

请求参数:

  • username: 用户名(路径参数)

返回数据:

{
  "code": 200,
  "message": "查询成功",
  "success": true,
  "data": {
    // 用户信息
  }
}

3.4 根据角色获取用户

GET /api/users/role/{role}

功能: 根据角色获取用户列表

请求参数:

  • role: 角色ID路径参数

返回数据:

{
  "code": 200,
  "message": "查询成功",
  "success": true,
  "data": [
    // 用户列表
  ]
}

3.5 创建用户

POST /api/users

功能: 创建新用户

请求体:

{
  "username": "新用户名",
  "password": "密码",
  "email": "email@example.com",
  "phone": "13800138000",
  "role": 1
}

返回数据:

{
  "code": 200,
  "message": "保存成功",
  "success": true,
  "data": {
    // 创建的用户信息
  }
}

3.6 更新用户

PUT /api/users/{id}

功能: 更新用户信息

请求参数:

  • id: 用户ID路径参数

请求体:

{
  "username": "更新后的用户名",
  "password": "新密码",
  "email": "newemail@example.com",
  "phone": "13900139000",
  "role": 2
}

返回数据:

{
  "code": 200,
  "message": "更新成功",
  "success": true,
  "data": {
    // 更新后的用户信息
  }
}

3.7 删除用户

DELETE /api/users/{id}

功能: 删除指定用户

请求参数:

  • id: 用户ID路径参数

返回数据:

{
  "code": 200,
  "message": "删除成功",
  "success": true,
  "data": true
}

3.8 检查用户名是否存在

GET /api/users/check/username/{username}

功能: 检查指定用户名是否已存在

请求参数:

  • username: 用户名(路径参数)

返回数据:

{
  "code": 200,
  "message": "查询成功",
  "success": true,
  "data": true // true表示存在false表示不存在
}

3.9 检查邮箱是否存在

GET /api/users/check/email/{email}

功能: 检查指定邮箱是否已存在

请求参数:

  • email: 邮箱(路径参数)

返回数据:

{
  "code": 200,
  "message": "查询成功",
  "success": true,
  "data": true // true表示存在false表示不存在
}

4. 分类管理API

4.1 获取所有分类

GET /api/categories

功能: 获取所有分类列表

请求参数: 无

返回数据:

{
  "code": 200,
  "message": "查询成功",
  "success": true,
  "data": [
    // 分类列表
  ]
}

5. 分类属性管理API

5.1 根据ID获取分类属性

GET /api/category-attributes/{id}

功能: 根据ID获取分类属性详情

请求参数:

  • id: 属性ID路径参数

返回数据:

{
  "code": 200,
  "message": "查询成功",
  "success": true,
  "data": {
    // 分类属性信息
  }
}

6. Markdown管理API

6.1 根据ID获取Markdown内容

GET /api/markdowns/{id}

功能: 根据ID获取Markdown内容

请求参数:

  • id: Markdown ID路径参数

返回数据:

{
  "code": 200,
  "message": "查询成功",
  "success": true,
  "data": {
    // Markdown内容
  }
}

7. 帮助文档API

7.1 获取API文档

GET /api/help

功能: 获取README_API.md文档内容

请求参数: 无

返回数据:

{
  "code": 200,
  "message": "获取API文档成功",
  "success": true,
  "data": "# MyAfterProject 开发文档(前端使用)\n..."
}

数据模型详解

1. 文章模型 (Article)

字段名 类型 描述 是否可为空
articleid Integer 文章ID主键
title String 文章标题
content String 文章内容
attributeid Integer 属性ID
img String 文章图片URL
createdAt LocalDateTime 创建时间
updatedAt LocalDateTime 更新时间
viewCount Integer 浏览次数
likes Integer 点赞数
status Integer 状态0-草稿1-已发布2-已删除)
markdownid Integer markdown文档ID0表示普通文章

2. 留言模型 (Message)

字段名 类型 描述 是否可为空
messageid Integer 留言ID主键
nickname String 昵称
email String 邮箱
content String 留言内容
createdAt Date 创建时间
parentid Integer 父留言ID用于回复功能
replyid Integer 回复留言ID
articleid Integer 关联的文章ID
likes Integer 点赞数

3. 用户模型 (Users)

字段名 类型 描述 是否可为空
id Long 用户ID主键
username String 用户名
password String 密码
email String 邮箱
phone String 手机号
role Integer 角色ID

前端调用示例

以下是使用Axios调用后端API的示例代码

1. 安装Axios

npm install axios

2. 创建API服务文件

创建一个 api.js 文件来封装所有的API调用

import axios from 'axios';

// 创建axios实例
const api = axios.create({
  baseURL: 'http://localhost:8080/api', // 后端API基础URL
  timeout: 10000, // 请求超时时间
  headers: {
    'Content-Type': 'application/json'
  }
});

// 响应拦截器 - 统一处理响应
api.interceptors.response.use(
  response => {
    // 检查响应是否成功
    if (response.data && response.data.success) {
      return response.data;
    } else {
      // 处理业务错误
      return Promise.reject(new Error(response.data?.message || '请求失败'));
    }
  },
  error => {
    // 处理HTTP错误
    console.error('API请求错误:', error);
    // 可以在这里添加全局错误处理,如显示错误提示
    return Promise.reject(error);
  }
);

// 文章相关API
export const articleAPI = {
  // 获取所有文章
  getAllArticles: () => api.get('/articles'),
  // 获取单篇文章
  getArticleById: (id) => api.get(`/articles/${id}`),
  // 根据属性获取文章
  getArticlesByAttribute: (attributeId) => api.get(`/articles/attribute/${attributeId}`),
  // 增加文章浏览量
  incrementViewCount: (id) => api.post(`/articles/view/${id}`),
  // 获取热门文章
  getPopularArticles: () => api.get('/articles/popular'),
  // 创建文章
  createArticle: (articleData) => api.post('/articles', articleData),
  // 更新文章
  updateArticle: (id, articleData) => api.put(`/articles/${id}`, articleData),
  // 删除文章
  deleteArticle: (id) => api.delete(`/articles/${id}`)
};

// 留言相关API
export const messageAPI = {
  // 获取所有留言
  getAllMessages: () => api.get('/messages'),
  // 获取单条留言
  getMessageById: (id) => api.get(`/messages/${id}`),
  // 根据文章ID获取留言
  getMessagesByArticleId: (articleId) => api.get(`/messages/article/${articleId}`),
  // 获取根留言
  getRootMessages: () => api.get('/messages/root'),
  // 获取回复列表
  getRepliesByParentId: (parentId) => api.get(`/messages/${parentId}/replies`),
  // 搜索留言
  searchMessagesByNickname: (nickname) => api.get(`/messages/search?nickname=${nickname}`),
  // 获取文章评论数量
  getMessageCountByArticleId: (articleId) => api.get(`/messages/count/article/${articleId}`),
  // 创建留言
  saveMessage: (messageData) => api.post('/messages', messageData),
  // 点赞留言
  likeMessage: (id) => api.post(`/messages/${id}/like`),
  // 删除留言
  deleteMessage: (id) => api.delete(`/messages/${id}`),
  // 删除所有留言
  deleteAllMessages: () => api.delete('/messages/all')
};

// 用户相关API
export const userAPI = {
  // 获取所有用户
  getAllUsers: () => api.get('/users'),
  // 根据ID获取用户
  getUserById: (id) => api.get(`/users/${id}`),
  // 根据用户名获取用户
  getUserByUsername: (username) => api.get(`/users/username/${username}`),
  // 根据角色获取用户
  getUsersByRole: (role) => api.get(`/users/role/${role}`),
  // 创建用户
  createUser: (userData) => api.post('/users', userData),
  // 更新用户
  updateUser: (id, userData) => api.put(`/users/${id}`, userData),
  // 删除用户
  deleteUser: (id) => api.delete(`/users/${id}`),
  // 检查用户名是否存在
  checkUsernameExists: (username) => api.get(`/users/check/username/${username}`),
  // 检查邮箱是否存在
  checkEmailExists: (email) => api.get(`/users/check/email/${email}`)
};

// 分类相关API
export const categoryAPI = {
  // 获取所有分类
  getAllCategories: () => api.get('/categories')
};

// 分类属性相关API
export const categoryAttributeAPI = {
  // 根据ID获取分类属性
  getAttributeById: (id) => api.get(`/category-attributes/${id}`)
};

// Markdown相关API
export const markdownAPI = {
  // 根据ID获取Markdown内容
  getMarkdownById: (id) => api.get(`/markdowns/${id}`)
};

// 帮助文档API
export const helpAPI = {
  // 获取API文档
  getApiDocumentation: () => api.get('/help')
};

export default api;

3. 在组件中使用API

import { articleAPI, messageAPI, userAPI } from './api';

// 获取文章列表
async function fetchArticles() {
  try {
    const response = await articleAPI.getAllArticles();
    // 处理获取到的文章数据
    console.log('文章列表:', response.data);
  } catch (error) {
    console.error('获取文章列表失败:', error);
  }
}

// 发布留言
async function postMessage(messageData) {
  try {
    const response = await messageAPI.saveMessage(messageData);
    console.log('留言发布成功:', response.data);
    return response.data;
  } catch (error) {
    console.error('发布留言失败:', error);
    throw error;
  }
}

// 创建用户
async function registerUser(userData) {
  try {
    const response = await userAPI.createUser(userData);
    console.log('用户创建成功:', response.data);
    return response.data;
  } catch (error) {
    console.error('用户创建失败:', error);
    throw error;
  }
}

错误处理指南

常见错误码及处理方式

HTTP状态码 错误描述 可能原因 处理方式
400 Bad Request 请求参数错误或缺失 检查请求参数是否正确
404 Not Found 请求资源不存在 检查请求URL或资源ID是否正确
500 Internal Server Error 服务器内部错误 查看服务器日志,联系后端开发人员

全局错误处理建议

  1. 在前端实现全局响应拦截器统一处理API返回的错误
  2. 为不同类型的错误显示相应的提示信息
  3. 添加请求超时处理和重试机制

开发环境配置

跨域配置

后端已配置CORS支持允许前端应用访问API接口。

性能优化建议

  1. 请求防抖和节流在频繁触发的操作中使用防抖和节流减少不必要的API调用
  2. 数据缓存:对于不经常变动的数据,可在前端进行缓存
  3. 分页加载:对于大量数据,使用分页加载而不是一次性获取全部数据
  4. 图片懒加载:对文章中的图片实现懒加载,提高页面加载速度
  5. 错误重试对非关键API添加自动重试机制提高用户体验

附录:完整实体关系图

+-------------+       +-------------+
|   Article   |       |   Message   |
+-------------+       +-------------+
| articleid   |<--+   | messageid   |
| title       |   |   | nickname    |
| content     |   |   | email       |
| attributeid |   |   | content     |
| img         |   |   | createdAt   |
| createdAt   |   |   | parentid    |-->|
| updatedAt   |   |   | articleid   |-->+
| viewCount   |   |   | likes       |
| likes       |   |   +-------------+
| status      |   |
| markdownid  |   |
+-------------+   |
                  |
+-------------+   |
|   Users     |   |
+-------------+   |
| id          |   |
| username    |   |
| password    |   |
| email       |   |
| phone       |   |
| role        |   |
+-------------+   |
                  |
+---------------+ |
| CategoryAttribute|<-+
+---------------+ |
| id            | |
| attribute_name| |
| category_id   | |
+---------------+ |
                  |
+-------------+   |
|  Category   |---+
+-------------+
| id          |
| name        |
+-------------+