项目练习-小说阅读平台

目录

    • 一、项目概述
    • 二、数据库设计(PlantUML)
        • [模块一:用户体系(2 张表)](#模块一:用户体系(2 张表))
        • [模块二:小说内容(3 张表)](#模块二:小说内容(3 张表))
        • [模块三:用户交互(4 张表)](#模块三:用户交互(4 张表))
        • [模块四:创作系统(2 张表)](#模块四:创作系统(2 张表))
        • [模块五:系统运营(4 张表)](#模块五:系统运营(4 张表))
        • 核心外键关系速查
    • 三、核心功能实现
      • [3.1 用户认证(注册 / 登录 / JWT 鉴权)](#3.1 用户认证(注册 / 登录 / JWT 鉴权))
      • [3.2 小说浏览与分类展示](#3.2 小说浏览与分类展示)
      • [3.3 小说搜索](#3.3 小说搜索)
      • [3.4 阅读器与阅读进度追踪](#3.4 阅读器与阅读进度追踪)
      • [3.5 作者申请与审批](#3.5 作者申请与审批)
      • [3.6 草稿创作与发布](#3.6 草稿创作与发布)
      • [3.7 AI 自动审核系统](#3.7 AI 自动审核系统)
      • [3.8 AI 写作助手](#3.8 AI 写作助手)
      • [3.9 TXT 文件上传与章节解析](#3.9 TXT 文件上传与章节解析)
      • [3.10 前端 SPA 页面切换](#3.10 前端 SPA 页面切换)
    • 四、功能架构总览
    • 五、总结与未来展望
      • 未来可用哪些技术完善
        • [1. 前端工程化](#1. 前端工程化)
        • [2. 后端架构升级](#2. 后端架构升级)
        • [3. 搜索和推荐能力](#3. 搜索和推荐能力)
        • [4. AI 能力深化](#4. AI 能力深化)
        • [5. 运维与部署](#5. 运维与部署)
        • 优化优先级建议

这是一个基于 FastAPI + MySQL + 纯前端的网络小说阅读与创作平台,集成 AI 写作助手与自动审核系统。


一、项目概述

通阅小说是一个功能完整的网络小说平台,支持读者阅读 和作者创作两条核心业务线。项目采用前后端分离架构,后端提供 RESTful API,前端通过 Axios 调用接口完成交互。

技术栈:

层级 技术 作用
后端框架 Python FastAPI 异步 API 框架
数据库 MySQL 8.0 + SQLAlchemy (async) 数据持久化
认证 JWT + bcrypt 用户登录鉴权
前端 HTML + CSS + JavaScript + Axios 页面展示与交互
AI 能力 Dify(聊天 API + 工作流 API) 写作助手 + 自动审核
文件存储 本地文件系统 封面、头像、TXT 上传

二、数据库设计(PlantUML)

以下是核心数据表的关系图。

模块一:用户体系(2 张表)
复制代码
users(用户表)                    author_applications(作者申请表)
┌──────────────────────┐          ┌──────────────────────────┐
│ id            (PK)   │──┐       │ id               (PK)   │
│ username              │  │       │ user_id           (FK)   │──→ users.id
│ email                 │  └──────│ pen_name                 │
│ password_hash         │          │ real_name / id_number    │
│ role                  │          │ genre / experience       │
│ nickname / avatar_url │          │ sample(试读样本)        │
│ level / exp           │          │ status(pending/approved/rejected)
│ created_at / updated_at│         │ created_at               │
└──────────────────────┘          └──────────────────────────┘

关系说明:

  • users.role 有四个级别:user → author → admin → super_admin,控制不同权限
  • author_applications.user_id → users.id,一个用户只能有一条被批准的申请
  • 审批通过时,后端同时更新 author_applications.status = approved 和 users.role = author
模块二:小说内容(3 张表)
复制代码
books(书籍表)                    chapters(章节表)
┌────────────────────────┐        ┌──────────────────────────┐
│ id             (PK)    │──┐     │ id               (PK)    │
│ title / author / intro │  │     │ book_id           (FK)   │──→ books.id
│ author_id      (FK)    │──┘     │ title / content          │
│ category_id    (FK)    │──┐     │ chapter_index(排序用)   │
│ status(连载中/已完结)  │  │     │ word_count               │
│ review_status(审核状态) │  │     │ created_at               │
│ word_count / rating    │  │     └──────────────────────────┘
│ view_count / collect   │  │
│ is_featured / is_daily  │  │     categories(分类表)
│ draft_id        (FK)   │  │     ┌──────────────────────────┐
│ created_at / updated_at│  │     │ id               (PK)    │
└────────────────────────┘  │     │ name(玄幻/仙侠/都市...)   │
                             │     │ icon / color / sort_order│
                             └─────│ category_id      (FK)    │
                                   └──────────────────────────┘

关系说明:

  • books.author_id → users.id:一本书只有一个作者,一个作者可以写多本书
  • books.category_id → categories.id:一本书属于一个分类
  • chapters.book_id → books.id:一章属于一本书,CASCADE 删除(书删了所有章节自动删)
  • chapter_index 决定章节顺序,不是依赖 id
  • review_status 控制作品可见性:只有 approved 的书才会出现在读者端
  • is_featured 和 is_daily 用于首页推荐位控制
模块三:用户交互(4 张表)
复制代码
bookshelf(书架)            reading_history(阅读历史)
┌──────────────────┐        ┌──────────────────────────┐
│ id       (PK)    │        │ id               (PK)    │
│ user_id  (FK)    │──→ users│ user_id           (FK)   │──→ users.id
│ book_id  (FK)    │──→ books│ book_id           (FK)   │──→ books.id
│ progress(阅读进度)│      │ chapter_id(当前章节)    │
│ last_read_at      │        │ progress / hours_read    │
│ added_at          │        │ last_read_at             │
└──────────────────┘        └──────────────────────────┘

comments(评论)              user_ratings(评分)
┌──────────────────┐        ┌──────────────────────────┐
│ id       (PK)    │        │ id               (PK)    │
│ book_id  (FK)    │──→ books│ book_id           (FK)   │──→ books.id
│ user_id  (FK)    │──→ users│ user_id           (FK)   │──→ users.id
│ content(TEXT)   │        │ rating(1-5 分)          │
│ created_at       │        │ created_at               │
└──────────────────┘        │ UNIQUE(book_id, user_id)  │
                             └──────────────────────────┘

关系说明:

  • 这四张表都通过外键关联到 users 和 books,构成用户和书籍之间的多对多关系
  • user_ratings 有联合唯一约束 (book_id, user_id),确保一人一评
  • bookshelf 和 reading_history 的区别:书架是"收藏列表",阅读历史是"阅读轨迹"
  • books.collect_count 和 books.rating 是反范式设计的冗余字段,避免每次 COUNT 查询
模块四:创作系统(2 张表)
复制代码
drafts(草稿)                 draft_chapters(草稿章节)
┌──────────────────────┐     ┌──────────────────────────┐
│ id           (PK)    │──┐  │ id               (PK)    │
│ author_id    (FK)    │──┘  │ draft_id          (FK)   │──→ drafts.id
│ title / intro        │     │ title                     │
│ cover_url            │     │ chapter_index             │
│ category_id  (FK)    │     │ content(TEXT)            │
│ status(draft/published)│  │ word_count                │
│ word_count           │     │ status(draft/published)   │
│ created_at/updated_at│     │ created_at / updated_at    │
└──────────────────────┘     └──────────────────────────┘

关系说明:

  • 草稿表和正式表结构镜像------drafts ≈ books,draft_chapters ≈ chapters
  • 作者发布作品时,后端将草稿数据复制到正式表,而不是移动(保留草稿副本)
  • 发布后 books.draft_id 指向草稿,便于追溯
  • 作者在草稿阶段可自由增删改章节,不影响正式内容
模块五:系统运营(4 张表)
复制代码
messages(消息通知)           events(活动管理)
┌──────────────────────┐     ┌──────────────────────────┐
│ id           (PK)    │     │ id               (PK)    │
│ user_id      (FK)    │     │ title / description      │
│ sender / type        │     │ icon / color / bg        │
│ preview / notif_title │     │ tag(ongoing/ended)     │
│ notif_desc / unread  │     │ event_date / sort_order  │
│ created_at           │     │ created_at               │
└──────────────────────┘     └──────────────────────────┘

review_records(审核记录)     system_settings(系统设置)
┌──────────────────────┐     ┌──────────────────────────┐
│ id           (PK)    │     │ id               (PK)    │
│ book_id              │     │ key(唯一键)             │
│ book_title           │     │ value(TEXT 存储值)       │
│ reviewer(auto/manual)│     │                          │
│ suggestion(PASS/REVIEW/REJECT)│                      │
│ reason / safety_score│     │ 键值对结构,如:          │
│ is_violation         │     │ auto_review → true/false │
│ reviewed_at          │     │ site_name → 通阅小说      │
└──────────────────────┘     └──────────────────────────┘

关系说明:

  • messages.user_id → users.id:通知定向推送给用户
  • review_records 不设外键(因为审核时要记录已删除的书籍信息),book_id 是普通索引
  • system_settings 使用键值对设计,灵活存储配置项,不需要改表结构就能加新配置

核心外键关系速查
外键 源表 目标表 级联策略 含义
author_id books users SET NULL 作者被删,书籍保留但 author_id 置空
book_id chapters books CASCADE 书被删,所有章节自动删除
book_id comments books CASCADE 书被删,所有评论自动删除
book_id bookshelf books CASCADE 书被删,书架项自动删除
user_id bookshelf users CASCADE 用户注销,书架项自动删除
draft_id draft_chapters drafts CASCADE 草稿删,草稿章节自动删
category_id books categories SET NULL 分类删,书籍的 category_id 置空

所有外键中,CASCADE 用于"附属数据"(章节、评论),SET NULL 用于"可选关联"(作者、分类)。


三、核心功能实现


3.1 用户认证(注册 / 登录 / JWT 鉴权)

功能描述: 用户注册时校验用户名合法性、邮箱格式、密码强度,密码加密后存库。登录时验证密码,发放 JWT Token。前端将 Token 存入 sessionStorage,后续请求通过 Axios 拦截器自动携带。

核心实现: 密码使用 hash_password 和 verify_password 处理,JWT 用 python-jose 库生成和解析。

python 复制代码
# app/utils/security.py
from passlib.context import CryptContext
from jose import jwt
from datetime import datetime, timedelta

pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")

def hash_password(password: str) -> str:
    return pwd_context.hash(password)

def verify_password(plain: str, hashed: str) -> bool:
    return pwd_context.verify(plain, hashed)

def create_access_token(data: dict) -> str:
    to_encode = data.copy()
    expire = datetime.utcnow() + timedelta(days=7)
    to_encode.update({"exp": expire})
    return jwt.encode(to_encode, SECRET_KEY, algorithm=ALGORITHM)

登录接口(后端):

python 复制代码
# app/routers/auth.py
@router.post("/login")
async def login(req: LoginRequest, db: AsyncSession = Depends(get_db)):
    result = await db.execute(
        select(User).where((User.username == req.username) | (User.email == req.username))
    )
    user = result.scalars().first()
    if not user or not verify_password(req.password, user.password_hash):
        raise HTTPException(status_code=401, detail="用户名或密码错误")

    token = create_access_token({"user_id": user.id, "username": user.username})
    return TokenResponse(token=token, user={...})

前端 Axios 拦截器(自动携带 Token):

javascript 复制代码
// forward/js/api.js
const api = axios.create({
  baseURL: 'http://127.0.0.1:8000/api',
  timeout: 10000,
  headers: { 'Content-Type': 'application/json' }
});

api.interceptors.request.use(config => {
  const token = sessionStorage.getItem('token');
  if (token) {
    config.headers.Authorization = 'Bearer ' + token;
  }
  return config;
});

涉及到 users 表------注册时 INSERT,登录时 SELECT,密码以 bcrypt 哈希形式存储,不存明文。


3.2 小说浏览与分类展示

功能描述: 首页展示推荐作品和每日精选,支持按分类筛选、按热度/评分/时间排序。

核心实现: 后端根据查询参数动态构建 SQL 查询,返回书籍列表。前端渲染卡片式展示。

python 复制代码
# app/routers/books.py
@router.get("/books")
async def get_books(
    featured: bool | None = None,
    daily: bool | None = None,
    sort: str = "hot",
    limit: int = 10,
    db: AsyncSession = Depends(get_db),
):
    q = select(Book).where(Book.review_status == "approved")
    if featured:
        q = q.where(Book.is_featured == 1)
    if daily:
        q = q.where(Book.is_daily == 1)
    if sort == "new":
        q = q.order_by(Book.created_at.desc())
    elif sort == "rating":
        q = q.order_by(Book.rating.desc())
    else:
        q = q.order_by(Book.view_count.desc())
    result = await db.execute(q.limit(limit))
    return [BookOut.from_orm(b) for b in result.scalars().all()]

涉及到 books 和 categories 表。category_id 作为外键关联分类名称。


3.3 小说搜索

功能描述: 按书名或作者名模糊搜索已审核通过的小说。

python 复制代码
# app/routers/search.py
@router.get("/search")
async def search(q: str = Query(..., min_length=1), db: AsyncSession = Depends(get_db)):
    keyword = f"%{q}%"
    result = await db.execute(
        select(Book)
        .where(Book.review_status == "approved",
               (Book.title.like(keyword)) | (Book.author.like(keyword)))
        .limit(20)
    )
    return [{"id": b.id, "title": b.title, "author": b.author, ...} for b in result.scalars().all()]

核心是 SQL 的 LIKE %keyword% 模糊匹配,在 books 表的 title 和 author 字段上做搜索。


3.4 阅读器与阅读进度追踪

功能描述: 点击书籍进入详情页,查看章节列表,点击章节进入阅读器。阅读时自动记录当前章节和进度。

python 复制代码
# app/routers/user.py(阅读历史)
@router.post("/user/history")
async def save_history(data: ..., user: User = Depends(get_current_user), db: AsyncSession = Depends(get_db)):
    record = ReadingHistory(
        user_id=user.id,
        book_id=data.book_id,
        chapter_id=data.chapter_id,
        progress=data.progress,
        hours_read=data.hours_read,
    )
    db.add(record)
    await db.commit()

书架管理:

python 复制代码
@router.post("/user/bookshelf")
async def add_to_bookshelf(data: ..., user: User = Depends(get_current_user), db: AsyncSession = Depends(get_db)):
    item = Bookshelf(user_id=user.id, book_id=data.book_id)
    db.add(item)
    await db.commit()
    # 同时增加 books 表的 collect_count
    book = await db.get(Book, data.book_id)
    book.collect_count = (book.collect_count or 0) + 1
    await db.commit()

涉及到 reading_history、bookshelf、comments、user_ratings 四张表,均通过外键关联到 users 和 books。user_ratings 设置了联合唯一约束 (book_id, user_id),确保一个用户对一本书只能评一次分。


3.5 作者申请与审批

功能描述: 普通用户提交作者申请,填写笔名、真实姓名、试读样本等。管理员审核通过后,用户的角色从 user 升级为 author。

提交申请:

python 复制代码
# app/routers/author.py
@router.post("/author/apply")
async def submit_application(req: ..., user: User = Depends(get_current_user), db: AsyncSession = Depends(get_db)):
    app = AuthorApplication(
        user_id=user.id,
        pen_name=req.pen_name,
        real_name=req.real_name,
        sample=req.sample,
        genre=req.genre,
    )
    db.add(app)
    await db.commit()
    return {"message": "申请已提交"}

管理员审批(核心代码):

python 复制代码
@router.post("/admin/applications/{app_id}/approve")
async def approve_application(app_id: int, admin: User = Depends(require_admin), db: AsyncSession = Depends(get_db)):
    app = await db.get(AuthorApplication, app_id)
    app.status = "approved"

    # 关键:同时更新用户角色
    user = await db.get(User, app.user_id)
    user.role = "author"

    await db.commit()
    return {"message": "已批准"}

涉及到 author_applications 和 users 两张表。审批的本质是事务性地更新两条记录------application 的状态和 user 的角色。


3.6 草稿创作与发布

功能描述: 作者在创作中心创建草稿作品,分章节写作,支持新增、编辑、删除、排序章节。完成后提交审核发布。

草稿数据结构: 作品发布前,数据存在 drafts 和 draft_chapters 两张表,结构与 books + chapters 一致但相互独立。

前端新建章节:

javascript 复制代码
// forward/js/api.js
function apiAuthorAddWorkChapter(bookId, title) {
  return api.post(`/author/works/${bookId}/chapters`, { title });
}
function apiAuthorUpdateWorkChapter(bookId, chapterId, data) {
  return api.put(`/author/works/${bookId}/chapters/${chapterId}`, data);
}

发布流程(后端核心逻辑):

python 复制代码
@router.post("/author/publish-draft")
async def publish_draft(draft_id: int, user: User = Depends(...), db: AsyncSession = Depends(get_db)):
    draft = await db.get(Draft, draft_id)
    draft.status = "published"

    # 创建正式书籍记录
    book = Book(
        title=draft.title, intro=draft.intro, author_id=user.id,
        category_id=draft.category_id, draft_id=draft.id,
        review_status="pending",  # 待审核
    )
    db.add(book)
    await db.flush()

    # 复制草稿章节到正式章节表
    chapters = await db.execute(select(DraftChapter).where(...).order_by(DraftChapter.chapter_index))
    for dc in chapters.scalars().all():
        db.add(Chapter(book_id=book.id, title=dc.title,
                       chapter_index=dc.chapter_index, content=dc.content))
    await db.commit()

发布后,books.review_status 设为 pending,触发下一节的自动审核流程。


3.7 AI 自动审核系统

功能描述: 后台定时任务每 30 秒扫描待审核作品,调用 Dify 工作流 API 进行内容安全检测,根据结果自动更新审核状态并通知作者。

核心代码(后台定时任务):

python 复制代码
# app/services/auto_review.py
async def _review_single_book(db, book: Book):
    # 1. 取前 5000 字
    chapters = await db.execute(select(Chapter).where(Chapter.book_id == book.id).order_by(Chapter.chapter_index))
    content = "\n".join(ch.content for ch in chapters.scalars().all() if ch.content)[:5000]

    # 2. 调用 Dify 工作流
    async with httpx.AsyncClient() as client:
        resp = await client.post(
            f"{DIFY_API_URL}/workflows/run",
            json={
                "inputs": {"book_title": book.title, "book_genre": genre, "book_content": content},
                "response_mode": "blocking",
                "user": "auto-review-system",
            },
            headers={"Authorization": f"Bearer {DIFY_REVIEW_API_KEY}"},
        )
        outputs = resp.json()["data"]["outputs"]

    # 3. 根据结果更新状态
    if outputs.get("suggestion") == "PASS":
        book.review_status = "approved"
    elif outputs.get("suggestion") == "REJECT":
        book.review_status = "rejected"
        if book.draft_id:
            draft = await db.get(Draft, book.draft_id)
            draft.status = "draft"

    # 4. 记录审核结果 + 发送通知
    db.add(ReviewRecord(book_id=book.id, suggestion=suggestion, ...))
    db.add(Message(user_id=book.author_id, ...))
python 复制代码
# app/main.py ------ 启动时创建后台任务
@app.on_event("startup")
async def startup():
    from app.services.auto_review import auto_review_loop
    asyncio.create_task(auto_review_loop())

涉及 books、review_records、messages、system_settings 四张表。system_settings 用键值对存储"是否开启自动审核"的开关,审核任务每次循环都会检查。


3.8 AI 写作助手

功能描述: 作者在写作页面打开 AI 助手对话框,发送消息给 Dify 聊天 API,AI 实时回复创作建议。

python 复制代码
# app/routers/assistant.py ------ 纯代理转发
@router.post("/assistant/chat")
async def assistant_chat(body: dict):
    async with httpx.AsyncClient(timeout=httpx.Timeout(120.0)) as client:
        try:
            resp = await client.post(
                f"{DIFY_API_URL}/chat-messages",
                json=body,
                headers={"Authorization": f"Bearer {DIFY_API_KEY}"},
            )
            return resp.json()
        except httpx.ConnectError:
            raise HTTPException(status_code=503, detail="Dify 服务不可用")

这个功能技术上极轻量------后端只是一个代理层,不涉及数据库,不存储对话记录,只负责转发请求和响应。好处是前端不需要直接暴露 API 密钥。


3.9 TXT 文件上传与章节解析

功能描述: 管理员上传 TXT 小说文件,后端自动识别编码,按章节标题正则拆分,批量入库。

python 复制代码
# app/utils/chapter_parser.py
def parse_chapters_from_txt(file_path: str) -> list[dict]:
    # 1. 自动检测编码(utf-8 / gbk / gb2312 / gb18030)
    for enc in ["utf-8", "gbk", "gb2312", "gb18030"]:
        try:
            with open(file_path, "r", encoding=enc) as f:
                f.read(500)
            encoding = enc
            break
        except (UnicodeDecodeError, UnicodeError):
            continue

    with open(file_path, "r", encoding=encoding) as f:
        full_text = f.read()

    # 2. 多模式正则匹配章节标题
    # 模式1:"第X章" 或 "第X卷" 或 "第X集"
    # 模式2:"第X章 标题"(行内任意位置)
    # 模式3:遇到无法识别时,按连续空行分割
    matches = _find_chapter_matches(full_text)
    if len(matches) < 2:
        return _fallback_split(full_text)

    chapters = []
    for i, match in enumerate(matches):
        title = match.group(0).strip()
        start = match.end()
        end = matches[i + 1].start() if i + 1 < len(matches) else len(full_text)
        content = full_text[start:end].strip()
        if len(content) >= 50:
            chapters.append({"title": title, "content": content, "chapter_index": len(chapters)})

    return chapters

这个解析器的核心挑战是不同 TXT 文件的章节格式不统一。项目用了多模式正则匹配 + 降级策略来兼容:

模式 正则 示例匹配
标准章节 第[一二三四五六七八九十百千\d]+[卷章集節] "第一章 觉醒"
斗罗大陆风格 第X集 卷名 (N) 标题 "第一集 斗罗世界  (1) 觉醒"
降级策略 按 \n{4,}(连续4个换行) 分割 无章节标题的纯文本

3.10 前端 SPA 页面切换

功能描述: 项目没有使用 Vue / React 等框架,而是通过 JavaScript 操作 DOM 实现单页应用效果------点击导航栏时切换显示不同的视图区域,不刷新页面。

javascript 复制代码
// forward/js/index.js(核心视图切换)
function switchView(viewFn) {
  // 隐藏所有视图
  document.querySelectorAll('.view-section').forEach(el => el.style.display = 'none');
  document.querySelectorAll('.view-section-creator').forEach(el => el.style.display = 'none');

  // 显示目标视图
  viewFn();
}

// 导航点击绑定
document.querySelectorAll('.nav-menu a').forEach(link => {
  link.addEventListener('click', (e) => {
    e.preventDefault();
    const view = link.dataset.view;
    // 根据 data-view 属性切换到对应的视图函数
    switchView(viewMap[view]);
  });
});

所有 API 请求通过 api.js 中的 Axios 实例统一管理,每个功能模块(登录、书籍、评论、作者等)在单独的 JS 文件中定义对应的 API 函数,保持代码结构清晰。


四、功能架构总览

复制代码
┌─────────────────────────────────────────────────────┐
│                   前端(静态 HTML/JS)                 │
│   index.html / login.html / reader.html / admin.html │
│            └── Axios 请求 → Bearer Token              │
├─────────────────────────────────────────────────────┤
│                FastAPI 后端(15 个路由模块)             │
│                                                      │
│   认证   书籍   章节   分类   搜索   评论   评分         │
│   书架   历史   作者   草稿   消息   活动   管理        │
│                                                      │
│   写作助手(代理 Dify)   自动审核(后台定时任务)         │
├─────────────────────────────────────────────────────┤
│                     MySQL 数据库                       │
│  15 张表:users / books / chapters / categories       │
│  bookshelf / reading_history / comments / ratings     │
│  author_applications / drafts / draft_chapters        │
│  messages / events / review_records / system_settings │
└─────────────────────────────────────────────────────┘

五、总结与未来展望

通阅小说是一个完整度较高的全栈项目,核心设计思路可总结为三点:

  1. 数据库驱动业务:15 张表围绕"读者 - 书籍 - 作者"三条主线展开,外键关系清晰,CASCADE 级联确保数据一致性。

  2. 异步非阻塞 :后端全链路使用 async/await,数据库操作通过 SQLAlchemy 异步引擎执行,后台定时任务也以 asyncio.create_task 启动,不阻塞主线程。

  3. AI 能力集成:通过 Dify 平台的 API 接口,以代理模式在项目中引入了 AI 写作助手和自动内容审核,不依赖额外的大模型部署成本。


未来可用哪些技术完善

当前项目已经实现了完整的功能闭环,但在工程化和性能层面仍有较大的提升空间。以下是从五个维度出发的优化思路:

1. 前端工程化
现状 可升级的方向
纯 HTML + JS 手写 SPA,页面切换手动控制 DOM 显隐 迁移到 Vue3 或 React,利用组件化和虚拟 DOM 提升开发效率和页面性能
代码散落在多个 JS 文件中,无模块化管理 引入 Vite 作为构建工具,使用 TypeScript 重写,实现类型安全和模块化
样式手写 CSS 引入 Tailwind CSS 或 UnoCSS,统一设计规范,减少重复样式代码
无单元测试 引入 Vitest 做组件测试,保证迭代质量
2. 后端架构升级
现状 可升级的方向
FastAPI 单进程运行 引入 Gunicorn + Uvicorn Worker 多进程部署,充分利用多核 CPU
文件存储在本地磁盘 迁移到 阿里云 OSS / 腾讯云 COS 对象存储,封面和头像走 CDN 加速访问
同步的 MySQL 查询 引入 Redis 缓存,热门书籍详情和排行榜数据缓存到内存中,减少数据库压力
验证码用明文返回 升级为 图形验证码 或对接 滑动验证(极验等),防止脚本攻击
3. 搜索和推荐能力
现状 可升级的方向
搜索用 LIKE %keyword%,性能差 引入 Elasticsearch 实现全文搜索,支持分词、高亮、相关性排序
首页推荐靠手动标记 is_featured 接入 推荐算法 (基于用户阅读历史和评分做协同过滤),或接入 DeepSeek 等模型做个性化推荐
4. AI 能力深化
现状 可升级的方向
写作助手只做会话式对话 增加 AI 续写段落 、自动生成章节大纲 、角色关系图生成 等定向功能
自动审核只检查前 5000 字 完整的章节逐章扫描,增加敏感图片检测(NSFW 识别)
审核结果只有 PASS / REJECT 增加 违规类型分类(色情、暴力、涉政等),细分违规等级
5. 运维与部署
现状 可升级的方向
本地手动启动 编写 Docker Compose 编排文件(MySQL + Redis + FastAPI + Nginx),一键部署
无持续集成 接入 GitHub Actions,push 后自动运行测试、构建镜像、部署到服务器
无日志监控 引入 Sentry 做错误监控,Prometheus + Grafana 做性能指标可视化
优化优先级建议
复制代码
第一优先级(投入产出比最高):
  Redis 缓存热门数据 → 减少数据库压力
  Docker 部署 → 环境一致,方便迁移

第二优先级(核心体验提升):
  Elasticsearch 全文搜索 → 搜索体验质的飞跃
  Vue3 重构前端 → 开发效率和可维护性提升

第三优先级(锦上添花):
  AI 深度集成 → 续写、大纲生成
  推荐算法 → 个性化推荐
  CI/CD → 自动化部署
相关推荐
晨曦中的暮雨2 个月前
Virtual Thread 优化 Spring AI 阻塞式 LLM I/O:对照压测报告
java·并发·个人项目
栈溢出的浪漫2 个月前
码界领航:Python拓界-机器学习Web跨平台
python·机器学习·跨平台·web开发·个人项目
清水迎朝阳3 年前
互动直播 之 全屏播放时 鼠标隐藏功能
鼠标·时间戳·互动直播·个人项目·隐藏