基于 Golang + Python 的在线 Word 排版
Golang + React + SQLite + Python3
- Glang 使用 Gin + GROM + SQLite 提供 WEB 服务
- SQLite 实现管理员信息以及签发的临时 token 存储
- Python3 使用 re + docx 实现对文档的解析排版
- Gin 提供 Web 服务
- 支持管理员登录(系统只有管理员一个用户)
- 管理员分发 token
- 用户使用 token 上传文件处理
- 初始化管理员用户名密码
- 用户名采用环境变量 ACC_USER_ID
- 密码为随机生成的 8 位 大小写字母+数字 字符
- 密码使用 bcrypt 加密存储
- 首次启动时打印初始密码到日志
- token 为 UUID
- token 有效期:永久有效,直到被管理员禁用或使用后失效
- 输入 token
- 校验 token 是否有效
- token 未绑定:绑定到当前用户的 cookie,返回 Set-Cookie
- token 已绑定:校验当前 cookie 与绑定的 cookie 是否一致
- 一致:返回当前处理状态和处理结果(如有),可继续后续操作
- 不一致:响应"token 已被使用"
- 绑定后 10 分钟内未上传文件则自动释放,token 恢复可用
- 后续请求自动携带 cookie,后端通过 cookie 校验用户身份
- 上传文件(token 进入使用中状态,不再受 10 分钟限制,上传结束重新开始倒计时)
- 文件保存到
./files/{token}/1.{扩展名}(如 ./files/abc123/1.docx)
- 记录原始文件名和存储路径
- 提交处理(token 进入使用中状态,不再受 10 分钟限制)
- go 调用 python 处理文件
- 交叉引用 python3 word-ref.py
- 处理后文件保存到
./files/{token}/1.result.{扩展名}(如 ./files/abc123/1.result.docx)
- SSE 推送处理进度
- 下载处理后的文件(处理过程中及完成后均可访问)
- 下载文件名:
{原始文件名}_已处理-{token}.{扩展名} (如:报告.docx → 报告_已处理-abc123).docx)
- 文件处理完成后 token 标记为已使用,不可再次使用
- 响应文件给前端
- POST /api/admin/login 登录
- POST /api/admin/tokens 生成 token
- GET /api/admin/tokens 查看 token 列表
- PUT /api/admin/tokens/{id}/status 更新 token 状态(禁用/启用)
- POST /api/tokens/verify 验证 token
- 未绑定:绑定并返回 Set-Cookie
- 已绑定且 cookie 一致:返回处理状态/结果
- 已绑定且 cookie 不一致:响应"已被使用"
- POST /api/files/upload 上传文件(通过 Cookie 自动认证)
- POST /api/files/process 处理文件(通过 Cookie 自动认证,token 进入使用中状态)
- GET /api/files/status 获取处理状态/SSE 推送处理进度(通过 Cookie 自动认证)
- 返回处理状态、原始文件名、处理进度等信息
- 支持 SSE 实时推送处理进度
- GET /api/files/download 下载处理后的文件(通过 Cookie 自动认证)
- 响应 Content-Disposition:
attachment; filename="{原始文件名}_已处理-{token}.{扩展名}"
| 字段 | 类型 | 说明 |
|---|
| id | INTEGER | 主键,自增 |
| username | VARCHAR(64) | 用户名,唯一 |
| password | VARCHAR(128) | 密码,bcrypt 加密 |
| created_at | DATETIME | 创建时间 |
| updated_at | DATETIME | 更新时间 |
| 字段 | 类型 | 说明 |
|---|
| id | INTEGER | 主键,自增 |
| token | VARCHAR(36) | UUID,唯一 |
| status | VARCHAR(16) | 状态:available/bound/processing/used/disabled |
| bound_cookie | VARCHAR(128) | 绑定的 cookie 标识 |
| bind_expires_at | DATETIME | 绑定过期时间(10 分钟) |
| original_filename | VARCHAR(256) | 原始文件名 |
| source_file_path | VARCHAR(512) | 源文件存储路径 |
| result_file_path | VARCHAR(512) | 处理后文件路径 |
| created_at | DATETIME | 创建时间 |
| updated_at | DATETIME | 更新时间 |
| used_at | DATETIME | 使用完成时间 |
| 状态 | 说明 |
|---|
| available | 可用,未被绑定 |
| bound | 已绑定,等待上传文件(10 分钟超时) |
| processing | 处理中,文件正在格式化 |
| used | 已使用,处理完成 |
| disabled | 已禁用,管理员手动禁用 |
- 管理员
- 登录
- 生成 token(支持复制)
- 支持查看 token 使用情况
- 普通用户
- 所有 API 使用 HTTPS
- 文件上传限制:仅允许 .docx/.doc 格式,最大 100MB
- Cookie 安全配置:HttpOnly + Secure + SameSite=Strict
- token 绑定时校验 cookie 一致性,防止多用户抢占
- token 绑定后 10 分钟内未上传文件则自动释放
- token 开始处理后保持有效,直到处理完成
- token 使用后永久失效(一次性使用)
- 敏感操作(生成 token、禁用 token)需管理员权限
pip3 freeze > requirements.txt