# 简易博客系统

URL: https://caijiao.org/koa/case/blog
Source: docs/koa/case/blog.md
Description: 本文介绍了如何构建一个简易的博客系统，涵盖从用户系统、文章管理到前端展示的完整流程。

在现代 Web 开发中，博客系统是一个常见的项目类型。通过构建一个简易的博客系统，您可以学习到如何进行用户管理、文章发布、评论功能、权限控制等操作。本文将展示如何搭建一个简单的博客系统，涵盖以下几个部分：

## 1. 用户系统：注册与登录

简易博客系统需要支持用户的注册和登录。可以通过 JWT（JSON Web Token）来实现安全的认证与授权。

- **用户注册**：用户提供用户名和密码进行注册，注册信息存入数据库。
- **用户登录**：用户输入用户名和密码进行登录，系统生成 JWT token 作为用户的认证凭证。

### 示例代码：

```javascript
// 用户注册接口
app.post('/register', async (ctx) => {
  const { username, password } = ctx.request.body;
  // 验证用户数据
  const user = await UserModel.create({ username, password });
  ctx.body = { message: '注册成功' };
});
````

## 2. 文章管理

文章管理是博客系统的核心功能之一。每篇文章通常包含标题、内容、分类、标签、发布时间等字段。

* **发布文章**：用户发布新文章，文章保存到数据库中，并分配唯一的 ID。
* **查看文章**：用户可以浏览已发布的文章，可以根据分类或标签进行筛选。

### 示例代码：

```javascript
// 发布文章接口
app.post('/articles', async (ctx) => {
  const { title, content, tags } = ctx.request.body;
  const article = await ArticleModel.create({ title, content, tags, createdAt: new Date() });
  ctx.body = { message: '文章发布成功', articleId: article.id };
});

// 获取文章接口
app.get('/articles', async (ctx) => {
  const articles = await ArticleModel.findAll();
  ctx.body = { articles };
});
```

## 3. 评论功能

用户可以对文章进行评论。每个评论包含评论内容、评论者、文章 ID 等信息。

* **发布评论**：用户可以在文章下方发布评论，评论保存到数据库，并与对应的文章建立关系。
* **查看评论**：每篇文章可以查看所有评论。

### 示例代码：

```javascript
// 发布评论接口
app.post('/comments', async (ctx) => {
  const { articleId, content } = ctx.request.body;
  const comment = await CommentModel.create({ articleId, content });
  ctx.body = { message: '评论成功', commentId: comment.id };
});

// 获取文章评论接口
app.get('/comments/:articleId', async (ctx) => {
  const { articleId } = ctx.params;
  const comments = await CommentModel.findAll({ where: { articleId } });
  ctx.body = { comments };
});
```

## 4. 权限控制

为了避免未授权的用户访问或编辑敏感内容，博客系统通常需要实现权限控制。

* **用户身份验证**：通过 JWT token 进行身份验证，确保只有已登录的用户能够发布文章或评论。
* **权限管理**：可以根据用户角色（如管理员、普通用户）来控制权限。

### 示例代码：

```javascript
// 中间件：验证用户是否已登录
app.use(async (ctx, next) => {
  const token = ctx.headers['authorization'];
  if (!token) {
    ctx.status = 401;
    ctx.body = { message: '未登录' };
    return;
  }
  const user = await verifyToken(token); // 校验 JWT
  ctx.state.user = user;
  await next();
});

// 发布文章（仅管理员可访问）
app.post('/articles', async (ctx) => {
  if (ctx.state.user.role !== 'admin') {
    ctx.status = 403;
    ctx.body = { message: '无权限发布文章' };
    return;
  }
  // 发布文章逻辑
});
```

## 5. 前端展示

前端部分可以通过 Vue 或 React 等现代框架来实现。博客系统的前端通常包括以下几个部分：

* **首页**：展示所有文章的摘要列表，可以分页显示。
* **文章详情页**：展示单篇文章的内容以及评论。
* **用户登录/注册页**：允许用户登录和注册。

### 示例代码（Vue）：

```vue
<template>
  <div>
    <h1>{{ article.title }}</h1>
    <p>{{ article.content }}</p>
    <div v-for="comment in comments" :key="comment.id">
      <p>{{ comment.content }}</p>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      article: {},
      comments: [],
    };
  },
  async created() {
    const res = await fetch('/articles/1');
    this.article = await res.json();
    const commentsRes = await fetch('/comments/1');
    this.comments = await commentsRes.json();
  },
};
</script>
```

## 6. 总结

通过上述步骤，我们可以快速构建一个简易的博客系统。该系统具备基本的用户认证、文章管理、评论功能和权限控制。对于初学者来说，构建这样一个博客系统是一个很好的练习，能够帮助深入理解 Web 开发中的关键概念和技术。

在实际开发中，您可以根据需求进一步扩展功能，如搜索、标签管理、文章分类等。
