# journal **Repository Path**: AS_hqy/journal ## Basic Information - **Project Name**: journal - **Description**: No description available - **Primary Language**: Go - **License**: AGPL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-03-02 - **Last Updated**: 2026-03-03 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # J.U.N.K. Journal 学术稿件管理系统 一个简洁的在线学术稿件投稿、审稿与发布管理系统。 ## 概述 J.U.N.K. Journal 提供完整的稿件管理功能,支持用户投稿、编辑审核、评论评分等操作,适用于学术期刊、论文集或内部文档管理系统。 ## 功能特性 ### 用户功能 - **用户注册与登录** - RSA 加密传输,安全可靠 - **稿件管理** - 创建、编辑、提交、撤回自己的稿件 - **评论系统** - 对稿件发表评论 - **评分系统** - 对稿件进行评分 ### 管理员功能 - **稿件审核** - 审核用户提交的稿件(通过/拒绝) - **用户管理** - 查看用户列表,普通管理员仅可管理普通用户 - **评论管理** - 删除不当评论 - **数据库备份** - 一键备份数据库,支持下载 - **日志查看** - 查看服务器运行日志 ### 权限说明 | 角色 | 权限 | |------|------| | 普通用户 | 注册、投稿、评论、评分 | | 管理员 | 审核稿件、删除评论、管理普通用户 | | 超级管理员 | 所有管理员权限 + 系统统计 + 数据库备份 + 日志查看 | ## 技术栈 - **后端**: Go + Gin 框架 - **数据库**: SQLite 3 - **前端**: 原生 HTML + CSS + JavaScript - **部署**: Docker + Caddy 反向代理 - **加密**: RSA 非对称加密(密码传输) ## 环境要求 - Go 1.21+ - Docker & Docker Compose - Git ## 快速开始 ### 本地开发 #### 1. 克隆项目 ```bash git clone cd junkjournal ``` #### 2. 配置环境变量 ```bash cp .env.example .env ``` 编辑 `.env` 文件: ```env # 服务配置 SERVER_PORT=8080 # 数据库配置 DATABASE_URL=./data/junkjournal.db # JWT 配置 JWT_SECRET=your-secret-key-change-in-production # 超级管理员配置(首次启动时创建) SUPERADMIN_EMAIL=junkjournal@admin.com SUPERADMIN_PASSWORD=admin123 SUPERADMIN_USERNAME=junkjournal ``` #### 3. 运行服务 ```bash # 直接运行 go run ./cmd/server # 或者构建后运行 go build -o server ./cmd/server ./server ``` #### 4. 访问系统 - 前台首页: http://localhost:8080 - 管理员后台: http://localhost:8080/admin-login.html ### Docker 部署 #### 开发环境 ```bash # 启动服务 docker-compose up -d # 查看日志 docker-compose logs -f # 停止服务 docker-compose down ``` #### 生产环境 ```bash # 启动服务 docker-compose -f docker-compose.prod.yml up -d # 查看日志 docker-compose -f docker-compose.prod.yml logs -f # 停止服务 docker-compose -f docker-compose.prod.yml down ``` 生产环境默认开启 HTTPS(使用 Caddy 自动签发 Let's Encrypt 证书)。 ## 默认超级管理员 首次启动服务时,会自动创建超级管理员账户: | 属性 | 值 | |------|-----| | 用户名 | junkjournal | | 密码 | admin123 | | 邮箱 | junkjournal@admin.com | **注意**: 首次登录后请及时修改密码! ## 目录结构 ``` junkjournal/ ├── cmd/ │ └── server/ │ └── main.go # 应用入口点 ├── internal/ │ ├── auth/ │ │ ├── auth.go # JWT 认证 │ │ └── rsa.go # RSA 加密工具 │ ├── config/ │ │ └── config.go # 配置加载 │ ├── database/ │ │ └── database.go # 数据库初始化 │ ├── handlers/ │ │ ├── auth.go # 认证接口 │ │ ├── manuscript.go # 稿件接口 │ │ ├── rating.go # 评分接口 │ │ ├── system.go # 系统管理接口 │ │ └── upload.go # 文件上传 │ ├── middleware/ │ │ └── auth.go # 认证中间件 │ ├── models/ │ │ └── models.go # 数据模型 │ └── utils/ │ └── pagination.go # 分页工具 ├── web/ │ ├── css/ │ │ └── style.css # 全局样式 │ ├── js/ │ │ ├── api.js # API 请求封装 │ │ ├── app.js # 通用 JS │ │ ├── rsa.js # RSA 加密 │ │ └── user-menu.js # 用户菜单 │ ├── index.html # 首页 │ ├── login.html # 登录页 │ ├── register.html # 注册页 │ ├── submit.html # 投稿页 │ ├── paper.html # 稿件详情页 │ ├── my-papers.html # 我的稿件 │ ├── edit.html # 编辑稿件 │ ├── admin.html # 审核管理页 │ ├── admin-login.html # 管理员登录 │ └── admin-dashboard.html # 管理后台 ├── deploy/ │ └── caddy/ │ └── Caddyfile # Caddy 配置 ├── data/ # 数据目录(运行时创建) │ ├── logs/ # 日志文件 │ │ ├── access.log # 访问日志 │ │ ├── error.log # 错误日志 │ │ └── server.log # 服务器日志 │ ├── backups/ # 数据库备份 │ └── junkjournal.db # SQLite 数据库 ├── .env.example # 环境变量示例 ├── .gitignore ├── Dockerfile ├── docker-compose.yml # 开发环境配置 ├── docker-compose.prod.yml # 生产环境配置 └── README.md ``` ## 页面说明 | 页面 | 路径 | 说明 | |------|------|------| | 首页 | / | 展示已发布稿件列表 | | 登录 | /login.html | 用户登录 | | 注册 | /register.html | 用户注册 | | 投稿 | /submit.html | 提交新稿件 | | 稿件详情 | /paper.html?id=xxx | 查看稿件内容 | | 我的稿件 | /my-papers.html | 管理自己的稿件 | | 编辑稿件 | /edit.html?id=xxx | 编辑已有稿件 | | 审核管理 | /admin.html | 管理员审核稿件 | | 管理员登录 | /admin-login.html | 管理员登录 | | 管理后台 | /admin-dashboard.html | 超级管理员后台 | ## API 接口文档 ### 认证接口 #### 获取公钥 ``` GET /api/v1/auth/public-key ``` 返回 RSA 公钥,用于密码加密传输。 #### 用户注册 ``` POST /api/v1/auth/register Content-Type: application/json { "email": "user@example.com", "username": "username", "password": "encrypted_password", "nickname": "昵称" } ``` #### 用户登录 ``` POST /api/v1/auth/login Content-Type: application/json { "email": "user@example.com", "password": "encrypted_password" } 响应: { "token": "jwt_token", "user": { "id": 1, "email": "user@example.com", "username": "username", "nickname": "昵称", "role": "user" } } ``` #### 获取用户资料 ``` GET /api/v1/auth/profile Authorization: Bearer ``` ### 稿件接口 #### 获取稿件列表 ``` GET /api/v1/manuscripts?page=1&limit=10&status=published ``` - `status`: 筛选状态(draft/submitted/published/rejected/withdrawn) - `page`: 页码 - `limit`: 每页数量 #### 获取单个稿件 ``` GET /api/v1/manuscripts/:id ``` #### 创建稿件 ``` POST /api/v1/manuscripts Authorization: Bearer Content-Type: application/json { "title": "稿件标题", "abstract": "摘要内容", "content": "正文内容", "tags": ["tag1", "tag2"] } ``` #### 更新稿件 ``` PUT /api/v1/manuscripts/:id Authorization: Bearer ``` #### 删除稿件 ``` DELETE /api/v1/manuscripts/:id Authorization: Bearer ``` #### 上传稿件附件 ``` POST /api/v1/manuscripts/:id/file Authorization: Bearer Content-Type: multipart/form-data file: <文件> ``` ### 评分接口 #### 获取稿件评分 ``` GET /api/v1/ratings?manuscript_id=1 ``` #### 提交评分 ``` POST /api/v1/ratings Authorization: Bearer Content-Type: application/json { "manuscript_id": 1, "score": 5, "comment": "评语" } ``` ### 管理员接口(仅超级管理员) #### 系统统计 ``` GET /api/v1/system/stats Authorization: Bearer ``` #### 创建数据库备份 ``` POST /api/v1/system/backup Authorization: Bearer ``` #### 获取备份列表 ``` GET /api/v1/system/backup/list Authorization: Bearer 响应: { "backups": [ { "name": "junkjournal_backup_20260303_201138.db", "size": 1024000, "time": "2026-03-03 20:11:38" } ] } ``` #### 下载备份 ``` GET /api/v1/system/backup/download/:filename Authorization: Bearer ``` #### 获取日志 ``` GET /api/v1/system/logs?file=server&lines=100 Authorization: Bearer ``` - `file`: 日志类型(server/error/access) - `lines`: 返回行数 ## 配置说明 ### 环境变量 | 变量名 | 说明 | 默认值 | 必填 | |--------|------|--------|------| | SERVER_PORT | HTTP 服务端口 | 8080 | 否 | | DATABASE_URL | SQLite 数据库路径 | ./data/junkjournal.db | 否 | | JWT_SECRET | JWT 签名密钥 | 自动生成随机密钥 | 否 | | RSA_PRIVATE_KEY_PATH | RSA 私钥路径 | ./data/rsa_private.pem | 否 | | RSA_PUBLIC_KEY_PATH | RSA 公钥路径 | ./data/rsa_public.pem | 否 | | SUPERADMIN_EMAIL | 超级管理员邮箱 | junkjournal@admin.com | 否 | | SUPERADMIN_PASSWORD | 超级管理员密码 | admin123 | 否 | | SUPERADMIN_USERNAME | 超级管理员用户名 | junkjournal | 否 | ### 生产环境建议 1. 修改默认的 JWT_SECRET 为复杂的随机字符串 2. 修改默认的超级管理员密码 3. 使用 HTTPS(Docker 部署时 Caddy 自动配置) 4. 定期进行数据库备份 ## 日志说明 服务运行后会在 `data/logs/` 目录下生成以下日志文件: | 文件 | 说明 | |------|------| | access.log | HTTP 请求访问日志,记录所有 API 请求 | | error.log | 错误日志,记录程序运行中的错误 | | server.log | 服务器日志,记录启动信息和一般日志 | ## 常见问题 ### Q: 如何修改超级管理员密码? A: 登录管理后台后,进入用户管理,找到超级管理员账号进行修改。 ### Q: 数据库文件在哪里? A: 默认位于 `./data/junkjournal.db`,可通过环境变量 DATABASE_URL 修改。 ### Q: 如何查看服务器状态? A: 访问 `/health` 端点返回 `{"status":"ok"}` 表示服务正常运行。 ### Q: 普通管理员和超级管理员有什么区别? A: - 普通管理员:可以审核稿件、删除评论、管理普通用户 - 超级管理员:拥有普通管理员的所有权限,还可以用户管理、管理系统统计、数据库备份和日志查看 ## 项目网址 https://junkjournal.top ## 许可证 AGPL-3.0