# worklog-poster **Repository Path**: Zero-One/worklog-poster ## Basic Information - **Project Name**: worklog-poster - **Description**: 一个用于定时发工作日报的Web小应用 - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-03-31 - **Last Updated**: 2026-04-01 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Worklog Poster — 工作日报定时发布系统 用于定时将工作日报自动推送到外部 HTTP API 的轻量级 Web 应用。 ## 功能特性 - **用户认证** — 注册/登录,密码 bcrypt 加密,JWT 会话(24小时有效期) - **API 配置管理** — 配置外部 HTTP 端点(URL、请求方法、请求头、载荷模板) - **日报管理** — 创建、编辑、删除日报,设定发布时间 - **定时发布** — 基于 node-cron 的定时任务,到达发布时间自动 POST 到配置的 API - **模板变量** — 支持 `{{content}}` 占位符,发布时自动替换为日报内容 - **状态跟踪** — 日报状态:待发布(pending)、已发布(published)、发布失败(failed) - **日志系统** — JSON 格式结构化日志,支持 info/success/warn/error 四级 - **系统监控** — 监控页面展示任务执行状态和统计 - **错误追踪** — 发布失败时错误信息存储在日报记录中 ## 技术栈 | 组件 | 技术 | |------|------| | 运行时 | Node.js v24.14.1 | | Web 框架 | Express 4.18.2 | | 数据库 | SQLite(Node.js 内置) | | 认证 | bcrypt 5.1.1 + jsonwebtoken 9.0.2 | | 定时器 | node-cron 3.0.3 | | HTTP 客户端 | axios 1.6.7 | | 前端 | 原生 HTML/CSS/JS | ## 项目结构 ```text worklog-poster/ ├── server.js # Express 服务入口 ├── database.js # SQLite 数据库初始化 ├── scheduler.js # node-cron 定时发布调度器 ├── package.json ├── routes/ │ ├── auth.js # 注册/登录接口 │ ├── configs.js # API 配置 CRUD │ └── reports.js # 日报 CRUD + 发布接口 ├── middleware/ │ └── auth.js # JWT 认证中间件 ├── utils/ │ ├── template.js # 模板变量替换工具 │ └── logger.js # 日志工具 └── public/ # 前端静态文件 ├── index.html # 登录/注册页 ├── dashboard.html # 仪表盘 ├── reports.html # 日报管理 ├── configs.html # API 配置管理 ├── monitor.html # 系统监控页面 ├── css/common.css └── js/ ├── app.js └── common.js ``` ## 数据库表结构 - **users** — id, username, passwordHash, createdAt - **api_configs** — id, userId, name, apiUrl, method, headers, payload, createdAt - **reports** — id, userId, content, publishAt, status, apiConfigId, createdAt, errorMessage ## API 接口 ### 认证 | 方法 | 路径 | 说明 | |------|------|------| | POST | /api/auth/register | 注册 | | POST | /api/auth/login | 登录 | ### API 配置 | 方法 | 路径 | 说明 | |------|------|------| | GET | /api/configs | 获取当前用户的配置列表 | | POST | /api/configs | 新建配置 | | GET | /api/configs/:id | 获取单个配置 | | PUT | /api/configs/:id | 更新配置 | | DELETE | /api/configs/:id | 删除配置 | ### 日报 | 方法 | 路径 | 说明 | |------|------|------| | GET | /api/reports | 获取当前用户的日报列表 | | POST | /api/reports | 新建日报 | | GET | /api/reports/:id | 获取单个日报 | | PUT | /api/reports/:id | 更新日报 | | DELETE | /api/reports/:id | 删除日报 | | POST | /api/reports/:id/publish | 立即手动发布 | ### 日志 | 方法 | 路径 | 说明 | |------|------|------| | GET | /api/logs | 获取最近 50 条日志和统计信息 | ## 快速开始 ### 安装依赖 ```bash npm install ``` ### 启动服务 ```bash npm start ``` 服务启动后访问 http://localhost:3000 ### 目录结构说明 - `server.js` — 监听 3000 端口,初始化数据库和定时任务 - `database.js` — 创建 SQLite 数据库文件 `worklog.db`,包含三张表 - `scheduler.js` — 每分钟执行一次,扫描待发布日报并发送 HTTP 请求 ## 配置 API 端点示例 在「API 配置」页面中添加配置: - **名称**:例如「企业微信机器人」 - **URL**:https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=YOUR_KEY - **请求方法**:POST - **请求头**:`Content-Type: application/json` - **载荷模板**: ```json { "msgtype": "text", "text": { "content": "{{content}}" } } ``` 发布时,`{{content}}` 将被替换为日报内容。 ## 安全说明 - 密码使用 bcrypt 加密存储 - 所有数据按用户隔离,API 层强制校验 userId - JWT Token 有效期 24 小时 ## 可观测性 ### 日志系统 日志以 JSON 格式输出到 `logs/app-YYYY-MM-DD.log`,每行一条日志记录: ```json {"level":"info","time":"2026-03-31T10:00:00.000Z","msg":"Scheduler running"} {"level":"success","time":"2026-03-31T10:01:00.000Z","msg":"Report 123 published successfully","reportId":123} {"level":"error","time":"2026-03-31T10:02:00.000Z","msg":"Report 124 failed","reportId":124,"error":"ECONNREFUSED"} ``` 日志级别: - `info` — 调度器执行 - `success` — 发布成功 - `warn` — 警告信息 - `error` — 发布失败 ### 日志保留 - 日志文件按日期分割,每天一个文件 - 3 天前的日志文件在每天 0 点自动清理 - 日志目录:`logs/` ### 监控页面 访问 `/monitor.html` 查看系统监控信息: - 调度器运行状态 - 最后执行时间 - 累计成功/失败次数 - 最近 50 条执行日志 ### 错误追踪 当日报发布失败时: - 错误信息存储在 `reports.errorMessage` 字段 - 日报卡片显示红色错误图标 - 点击错误图标查看详细错误信息