You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
4.8 KiB
4.8 KiB
数据库模型文档
ArticleModel
ArticleModel 是一个功能完整的文章管理模型,提供了丰富的CRUD操作和查询方法。
主要特性
- ✅ 完整的CRUD操作
- ✅ 文章状态管理(草稿、已发布、已归档)
- ✅ 自动生成slug、摘要和阅读时间
- ✅ 标签和分类管理
- ✅ SEO优化支持
- ✅ 浏览量统计
- ✅ 相关文章推荐
- ✅ 全文搜索功能
数据库字段
| 字段名 | 类型 | 说明 |
|---|---|---|
| id | integer | 主键,自增 |
| title | string | 文章标题(必填) |
| content | text | 文章内容(必填) |
| author | string | 作者 |
| category | string | 分类 |
| tags | string | 标签(逗号分隔) |
| keywords | string | SEO关键词 |
| description | string | 文章描述 |
| status | string | 状态:draft/published/archived |
| published_at | timestamp | 发布时间 |
| view_count | integer | 浏览量 |
| featured_image | string | 特色图片 |
| excerpt | text | 文章摘要 |
| reading_time | integer | 阅读时间(分钟) |
| meta_title | string | SEO标题 |
| meta_description | text | SEO描述 |
| slug | string | URL友好的标识符 |
| created_at | timestamp | 创建时间 |
| updated_at | timestamp | 更新时间 |
基本用法
import { ArticleModel } from '../models/ArticleModel.js'
// 创建文章
const article = await ArticleModel.create({
title: "我的第一篇文章",
content: "这是文章内容...",
author: "张三",
category: "技术",
tags: "JavaScript, Node.js, 教程"
})
// 查找所有已发布的文章
const publishedArticles = await ArticleModel.findPublished()
// 根据ID查找文章
const article = await ArticleModel.findById(1)
// 更新文章
await ArticleModel.update(1, {
title: "更新后的标题",
content: "更新后的内容"
})
// 发布文章
await ArticleModel.publish(1)
// 删除文章
await ArticleModel.delete(1)
查询方法
基础查询
findAll()- 查找所有文章findById(id)- 根据ID查找文章findBySlug(slug)- 根据slug查找文章findPublished()- 查找所有已发布的文章findDrafts()- 查找所有草稿文章
分类查询
findByAuthor(author)- 根据作者查找文章findByCategory(category)- 根据分类查找文章findByTags(tags)- 根据标签查找文章
搜索功能
searchByKeyword(keyword)- 关键词搜索(标题、内容、关键词、描述、摘要)
统计功能
getArticleCount()- 获取文章总数getPublishedArticleCount()- 获取已发布文章数量getArticleCountByCategory()- 按分类统计文章数量getArticleCountByStatus()- 按状态统计文章数量
推荐功能
getRecentArticles(limit)- 获取最新文章getPopularArticles(limit)- 获取热门文章getFeaturedArticles(limit)- 获取特色文章getRelatedArticles(articleId, limit)- 获取相关文章
高级查询
findByDateRange(startDate, endDate)- 按日期范围查找文章incrementViewCount(id)- 增加浏览量
状态管理
文章支持三种状态:
draft- 草稿状态published- 已发布状态archived- 已归档状态
// 发布文章
await ArticleModel.publish(articleId)
// 取消发布
await ArticleModel.unpublish(articleId)
自动功能
自动生成slug
如果未提供slug,系统会自动根据标题生成:
// 标题: "我的第一篇文章"
// 自动生成slug: "我的第一篇文章"
自动计算阅读时间
基于内容长度自动计算阅读时间(假设每分钟200个单词)
自动生成摘要
如果未提供摘要,系统会自动从内容中提取前150个字符
标签管理
标签支持逗号分隔的格式,系统会自动处理:
// 输入: "JavaScript, Node.js, 教程"
// 存储: "JavaScript, Node.js, 教程"
// 查询: 支持模糊匹配
SEO优化
支持完整的SEO字段:
meta_title- 页面标题meta_description- 页面描述keywords- 关键词slug- URL友好的标识符
错误处理
所有方法都包含适当的错误处理:
try {
const article = await ArticleModel.create({
title: "", // 空标题会抛出错误
content: "内容"
})
} catch (error) {
console.error("创建文章失败:", error.message)
}
性能优化
- 所有查询都包含适当的索引
- 支持分页查询
- 缓存友好的查询结构
迁移和种子
项目包含完整的数据库迁移和种子文件:
20250830014825_create_articles_table.mjs- 创建articles表20250830020000_add_article_fields.mjs- 添加额外字段20250830020000_articles_seed.mjs- 示例数据
运行迁移和种子
# 运行迁移
npx knex migrate:latest
# 运行种子
npx knex seed:run