Skip to content

CodeWolffy/papercheck

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

33 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

抄了吗? / PaperCheck

一个前后端分离的自建库论文查重系统,适合班级、院系或课题组建立私有比对库,检测论文与库内其他文档的相似度,类似高校毕业论文的「校内互检」场景。

Python 3.11+ Node.js 18+ FastAPI Vue 3 License: MIT


界面预览

查重上传 查重报告详情 AI 降重指南
查重上传 查重报告详情 AI 降重指南
  • 查重上传:拖拽或选择 .txt 文件,右侧展示系统采用的 6 项检测规则,点击即可开始与自建库比对。
  • 查重报告详情:左右对照原文与库内来源,红色高亮疑似重复片段,顶部可按「全部/标红/改写/语义」等维度筛选命中类型。
  • AI 降重指南:提供自查清单与一键复制的 AI 降重提示词,帮助学生用 ChatGPT、DeepSeek、Claude 等工具规范化改写。

定位与适用场景

PaperCheck 的核心是自建库查重:先把往届论文、课程作业或参考资料导入系统形成私有文献库,学生/用户上传自己的论文后,系统只与这个库内的文档进行相似度比对。

典型场景:

  • 高校毕业论文校内互检:院系建立本专业往届毕业论文库,检测本届学生之间的互相抄袭或与往届论文的重复。
  • 课程作业查重:教师把历年作业、参考资料入库,批量检测学生提交的作业相似度。
  • 课题组文档比对:研究团队内部检查报告、专利、论文草稿之间的重复或自我抄袭。
  • 公开查重平台私有化部署:学校或机构在内部服务器部署,避免论文外泄。

与公共查重平台不同,PaperCheck 让你拥有自己的比对数据库,数据不出内网,结果只反映库内相似度。


适合谁用

你的情况 是否适合 原因
你需要检测论文与本校/本专业往届论文的重复 ✅ 非常适合 系统就是为「自建库 + 库内互检」设计的
你需要一个班级/课程作业查重工具 ✅ 适合 教师可批量上传历年作业作为比对库
你需要课题组内部文档去重 ✅ 适合 支持多用户、权限隔离、历史记录
你想直接替代知网/维普/万方等公共查重 ❌ 不适合 本系统没有公共互联网数据库,只检测已入库内容
你需要英文论文与全球文献比对 ❌ 不适合 当前针对中文文本优化,且依赖自建库
你希望完全零部署、开箱即用 ⚠️ 需要权衡 需要自行部署 MySQL 与 Python 后端,但可私有化

一句话判断:只要你有「一批自己的文档需要互相比对」的需求,PaperCheck 就比公共查重平台更合适;如果你需要与互联网海量资源比对,请继续使用商业查重服务。


功能特性

文献库

  • 上传 .txt 文献到自建库,支持批量上传。
  • 查看文献列表、字符数、句子数与入库时间。
  • 搜索文献、查看内容、导出选中文献。
  • 管理员可删除单条或批量删除文献。

论文查重

  • 直接上传 .txt 文件查重,或选择已入库文献作为待查文本。
  • 支持限定比对范围,仅与指定文献库内容比对。
  • 输出查重率、引用率、去引用查重率、疑似重复字符数等统计。
  • 生成命中片段、来源分布、类型分布与检测性能数据。

多维度检测算法

  • 连续文本匹配
  • 指纹索引匹配
  • 同义词归一化匹配
  • 编辑距离相似匹配
  • Jaccard 相似度检测
  • 句式结构相似检测
  • 多因子综合检测
  • 段落级相似检测
  • 可选语义向量检测(基于 sentence-transformers
  • 参考文献、引用标记与可排除章节识别

报告与历史

  • 查看单次查重报告。
  • 下载 PDF 报告。
  • 查看查重历史,支持关键词检索。
  • 删除单条或批量删除历史记录。
  • 普通用户只能访问自己的记录,管理员可访问全量数据。

账号与权限

  • JWT 登录鉴权。
  • 登录失败限流与短时锁定。
  • 普通用户每日查重次数限制,管理员不受限制。
  • 管理员可创建、编辑、删除用户及重置密码。
  • 用户可修改密码并查看个人统计。
  • 支持通过 system_config 表开关用户注册。

技术栈

后端

  • Python 3.11+
  • FastAPI
  • SQLAlchemy Async + aiomysql
  • Pydantic Settings
  • jieba、numpy、scikit-learn
  • sentence-transformers(可选语义检测)
  • reportlab(PDF 报告)
  • python-jose + bcrypt(鉴权与密码)
  • loguru

前端

  • Vue 3
  • Vite 6
  • Vue Router
  • Pinia
  • Element Plus
  • Axios
  • Tailwind CSS 4
  • SCSS
  • GSAP
  • lucide-vue-next

目录结构

papercheck/
├── backend/                 # 后端服务
│   ├── core/                # 文本处理、相似度检测、语义检测、章节与引用识别
│   ├── data/                # 停用词、同义词表、上传目录与字体目录(仅保留骨架)
│   ├── scripts/             # 辅助脚本(如补齐语义向量)
│   ├── services/            # 文献库、查重流程、PDF 导出、指纹索引
│   ├── tests/               # 后端单元测试
│   ├── auth.py              # 登录鉴权、权限、配额
│   ├── config.py            # 环境变量配置
│   ├── database.py          # MySQL 异步连接
│   ├── main.py              # FastAPI 入口与路由
│   ├── models.py            # 数据表模型与接口模型
│   ├── .env.example         # 环境变量示例
│   └── requirements.txt     # Python 依赖
├── frontend/                # 前端应用
│   ├── src/
│   │   ├── components/      # 公共组件、查重组件、报告组件
│   │   ├── composables/     # 上传进度、分页、搜索、报告数据等组合逻辑
│   │   ├── layout/          # 登录布局与主布局
│   │   ├── stores/          # 登录状态
│   │   ├── styles/          # 样式变量与动画
│   │   ├── utils/           # 报告常量
│   │   └── views/           # 页面:文献库、查重、报告、历史、用户管理等
│   ├── .env.production      # 生产环境示例
│   ├── package.json
│   └── vite.config.js
├── papercheck.sql           # MySQL 表结构与默认账号
├── .gitignore
└── README.md

环境要求

  • Python 3.11 或 3.12(3.13 可编译运行,但深度学习依赖推荐 3.11/3.12)
  • Node.js 18+
  • MySQL 5.7 或 8.0
  • 如需语义检测,首次加载模型会消耗较多时间与磁盘空间;CPU 可运行但较慢

快速开始

1. 克隆仓库

git clone https://github.com/CodeWolffy/papercheck.git
cd papercheck

2. 初始化数据库

创建数据库:

CREATE DATABASE IF NOT EXISTS papercheck
  CHARACTER SET utf8mb4
  COLLATE utf8mb4_unicode_ci;

导入表结构与默认账号:

mysql -u root -p papercheck < papercheck.sql

papercheck.sql 包含以下核心表:

  • users:用户、角色、每日配额
  • documents:入库文献元信息
  • document_sentences:文献句子切分结果
  • fingerprints:文本指纹索引
  • semantic_vectors:语义向量缓存
  • check_histories:查重历史与报告 JSON
  • system_config:系统开关(如是否开放注册)

默认管理员账号:

  • 用户名:admin
  • 密码:123456

首次登录后请立即修改管理员密码。

3. 启动后端

cd backend
python -m venv .venv
source .venv/bin/activate  # Windows: .\.venv\Scripts\Activate.ps1
pip install -r requirements.txt
cp .env.example .env       # Windows: Copy-Item .env.example .env

编辑 .env,至少配置以下三项:

DATABASE_URL=mysql+aiomysql://papercheck:your-password@localhost:3306/papercheck?charset=utf8mb4
JWT_SECRET=change-me-to-a-random-string-at-least-32-chars-long
ADMIN_DEFAULT_PASSWORD=change-me-admin-password-at-least-12-chars

常用可选配置:

CORS_ORIGINS=http://127.0.0.1:5173,http://localhost:5173
SEMANTIC_ENABLED=false
SYNONYM_ENABLED=true
DAILY_CHECK_QUOTA=5
LOGIN_FAILURE_LIMIT=5
LOGIN_LOCKOUT_SECONDS=300
REPORT_CACHE_MAX_ENTRIES=200
REPORT_CACHE_TTL_SECONDS=3600
NUM_WORKERS=1

启动服务:

uvicorn main:app --reload --host 127.0.0.1 --port 8000

验证:

  • 健康检查:http://127.0.0.1:8000/health
  • 接口文档:http://127.0.0.1:8000/docs

4. 启动前端

cd frontend
npm install

开发环境如需直连后端,创建 frontend/.env

VITE_API_BASE_URL=http://127.0.0.1:8000

不配置时前端默认请求 /api,更适合配合反向代理使用。vite.config.js 已内置开发代理,将 /api 转发到 http://127.0.0.1:8000

npm run dev

默认访问:http://127.0.0.1:5173


前端路由

路由 页面 权限
/login 登录 公开
/library 文献库 登录
/check 论文查重 登录
/history 查重历史 登录
/report/:taskId 查重报告 登录
/guide 使用指南 登录
/profile 个人中心 登录
/admin/users 用户管理 管理员

主要接口

所有业务接口除登录、注册和健康检查外,默认需要携带 Bearer Token

认证

方法 路径 说明
POST /auth/login 登录
POST /auth/register 注册(受 registration_enabled 开关控制)
GET /auth/me 当前用户信息
PUT /auth/password 修改密码
GET /auth/stats 用户查重统计

文献库

方法 路径 说明
POST /library/upload 上传单个 .txt 文献
POST /library/upload/bulk 批量上传 .txt 文献
GET /library 文献列表
GET /library/filenames 文献文件名列表
GET /library/search 搜索文献
GET /library/{doc_id}/content 查看文献内容
POST /library/export 导出文献
DELETE /library/{doc_id} 删除文献(管理员)
POST /library/batch-delete 批量删除文献(管理员)

查重与报告

方法 路径 说明
POST /check 发起查重,支持上传文件或指定 target_doc_id
GET /check/{task_id} 查看查重报告
GET /check/{task_id}/pdf 下载 PDF 报告
GET /checks 查重历史
GET /checks/stats 查重历史统计
DELETE /checks/{task_id} 删除查重历史
POST /checks/batch-delete 批量删除查重历史

管理员

方法 路径 说明
GET /admin/users 用户列表
POST /admin/users 创建用户
PUT /admin/users/{user_id} 修改用户
DELETE /admin/users/{user_id} 删除用户
PUT /admin/users/{user_id}/reset-password 重置用户密码

文件限制

  • 文献库上传仅支持 .txt
  • 查重上传仅支持 .txt
  • 单文件大小限制 10MB。
  • 文本建议使用 UTF-8 编码。

语义检测

语义检测默认关闭。启用方式:

SEMANTIC_ENABLED=true
SEMANTIC_MODEL_NAME=BAAI/bge-m3

也可指定本地模型路径:

SEMANTIC_MODEL_PATH=/path/to/bge-m3

启用后:

  • 后端启动时会尝试在后台预热语义模型。
  • 新入库文献会生成语义向量。
  • 可使用 backend/scripts/backfill_semantic_vectors.py 为历史文献补齐语义向量。
  • 首次下载模型可能较慢,生产环境建议提前准备本地模型路径。

测试与检查

后端

cd backend
python -m unittest discover -s tests -p "test_*.py" -v
python -m compileall -q .

前端

cd frontend
npm run build

生产部署建议

  • 前端执行 npm run build,由 Nginx 托管 frontend/dist
  • 后端使用 uvicorn main:app --host 127.0.0.1 --port 8000 运行在本机端口。
  • Nginx 将 /api/ 反向代理到后端。
  • frontend/.env.production 推荐配置为:
VITE_API_BASE_URL=/api

示例 Nginx 配置:

server {
    listen 80;
    server_name your-domain.com;
    root /path/to/papercheck/frontend/dist;
    index index.html;

    location / {
        try_files $uri $uri/ /index.html;
    }

    location /api/ {
        rewrite ^/api/(.*)$ /$1 break;
        proxy_pass http://127.0.0.1:8000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_read_timeout 600s;
    }

    client_max_body_size 50m;
}

常见问题

1. 前端请求接口 404

检查 VITE_API_BASE_URL 是否正确:

  • 开发环境直连后端:http://127.0.0.1:8000
  • 生产环境使用 Nginx 反向代理:/api

2. 后端启动后数据库报错

确认已创建数据库并导入 papercheck.sql,同时检查 .env 中的 DATABASE_URL 是否与 MySQL 账号、密码、端口一致。

3. 登录后立即跳回登录页

通常是 Token 无效、后端 401、前端接口地址错误或 JWT_SECRET 变更导致。清理浏览器 localStorage 中的 token,检查接口地址和后端日志。

4. 上传文件失败

确认文件后缀为 .txt,大小不超过 10MB,编码优先使用 UTF-8。

5. 查重结果为空或很低

确认文献库已上传可比对文献,待查文本为 .txt,且数据库 fingerprints 表中有入库文献的指纹数据。

6. 语义检测不可用

确认 SEMANTIC_ENABLED=true,模型名称或本地路径有效,并且运行环境可以加载 sentence-transformers 相关依赖。

7. PDF 导出无中文字体

backend/data/fonts/ 目录下放置一个中文字体文件(如 NotoSansSC-Regular.ttf 或 Windows 的 simsun.ttc),后端会自动检测并使用。

8. 部署后刷新页面 404

Nginx 需要把未知路径回退到 index.html

location / {
    try_files $uri $uri/ /index.html;
}

贡献

欢迎 Issue 与 PR。提交前请确保:

  1. 后端代码可通过 python -m compileall -q . 语法检查。
  2. 新增逻辑补充对应单元测试。
  3. 前端构建通过 npm run build

安全说明

  • 生产环境请务必修改 JWT_SECRET 为至少 32 位的随机字符串。
  • 首次登录后请立即修改默认管理员密码。
  • 不要将真实的 .env、数据库密码或服务器密钥提交到仓库。
  • 项目已配置 .gitignore 忽略 .env、虚拟环境、node_modulesdist 与上传数据目录。

许可证

MIT

About

前后端分离的自建库论文查重系统:支持班级/院系/课题组建立私有比对库,检测论文与库内其他文档的相似度,提供左右对照报告与 AI 降重指南,适用于高校毕业论文校内互检场景。

Topics

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors