一个前后端分离的自建库论文查重系统,适合班级、院系或课题组建立私有比对库,检测论文与库内其他文档的相似度,类似高校毕业论文的「校内互检」场景。
| 查重上传 | 查重报告详情 | 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 可运行但较慢
git clone https://github.com/CodeWolffy/papercheck.git
cd papercheck创建数据库:
CREATE DATABASE IF NOT EXISTS papercheck
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;导入表结构与默认账号:
mysql -u root -p papercheck < papercheck.sqlpapercheck.sql 包含以下核心表:
users:用户、角色、每日配额documents:入库文献元信息document_sentences:文献句子切分结果fingerprints:文本指纹索引semantic_vectors:语义向量缓存check_histories:查重历史与报告 JSONsystem_config:系统开关(如是否开放注册)
默认管理员账号:
- 用户名:
admin - 密码:
123456
首次登录后请立即修改管理员密码。
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
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;
}检查 VITE_API_BASE_URL 是否正确:
- 开发环境直连后端:
http://127.0.0.1:8000 - 生产环境使用 Nginx 反向代理:
/api
确认已创建数据库并导入 papercheck.sql,同时检查 .env 中的 DATABASE_URL 是否与 MySQL 账号、密码、端口一致。
通常是 Token 无效、后端 401、前端接口地址错误或 JWT_SECRET 变更导致。清理浏览器 localStorage 中的 token,检查接口地址和后端日志。
确认文件后缀为 .txt,大小不超过 10MB,编码优先使用 UTF-8。
确认文献库已上传可比对文献,待查文本为 .txt,且数据库 fingerprints 表中有入库文献的指纹数据。
确认 SEMANTIC_ENABLED=true,模型名称或本地路径有效,并且运行环境可以加载 sentence-transformers 相关依赖。
在 backend/data/fonts/ 目录下放置一个中文字体文件(如 NotoSansSC-Regular.ttf 或 Windows 的 simsun.ttc),后端会自动检测并使用。
Nginx 需要把未知路径回退到 index.html:
location / {
try_files $uri $uri/ /index.html;
}欢迎 Issue 与 PR。提交前请确保:
- 后端代码可通过
python -m compileall -q .语法检查。 - 新增逻辑补充对应单元测试。
- 前端构建通过
npm run build。
- 生产环境请务必修改
JWT_SECRET为至少 32 位的随机字符串。 - 首次登录后请立即修改默认管理员密码。
- 不要将真实的
.env、数据库密码或服务器密钥提交到仓库。 - 项目已配置
.gitignore忽略.env、虚拟环境、node_modules、dist与上传数据目录。


