docs: 整理仓库结构——新增根 README(当前架构)、客户端 README 与部署手册更新至服务器权威模型,文档归位 docs/,清理误提交的打包产物

This commit is contained in:
root
2026-10-16 22:35:55 +08:00
parent aa773062fe
commit 344e70bf50
10 changed files with 151 additions and 78471 deletions
+1
View File
@@ -1 +1,2 @@
server/data/ server/data/
tmp/
+91
View File
@@ -0,0 +1,91 @@
# 实习工作日志(daywork)
面向实习生的个人工作管理工具:考勤打卡、工作记录、周报总结、备忘录、加密密码库、差旅记账。多端(桌面 / 网页 / 安卓)使用同一云端账号,数据实时互通。
- 在线实例:https://daywk.linyux.cn (网页版即应用本体,可安装为 PWA)
- 代码仓库:https://gitea.linyux.cn/root/daywork
- 设计方案:[docs/实习工作日志系统-设计方案.md](docs/实习工作日志系统-设计方案.md)
- 发布记录:[docs/release-notes-v0.2.0.md](docs/release-notes-v0.2.0.md)
## 架构
**服务器是唯一数据权威,各端只保留实时缓存。**
```
桌面(Electron) ─┐
网页(PWA) ─┼─ 写:立即推送差异 → 服务器确认 → 返回权威快照 → 本地缓存重建
安卓(Capacitor)─┘ 读:启动 / SSE 通知 / 60s 兜底 → 全量刷新缓存
│
▼
同步服务器(零依赖 Node,JSON 文件存储,每日自动备份)
· 注册表:用户名 + PBKDF2 哈希(角色:xionglin 为管理员)
· 业务数据:按用户隔离的九张表(project / work_log / log_item /
attendance / weekly_note / setting / memo / credential / transaction)
```
要点:
- **无合并逻辑**:本地缓存永远等于服务器快照,从结构上消灭双端分歧
- **密码库端到端加密**:主密码 PBKDF2 派生 AES-256-GCM 密钥在本机加解密,服务器只见密文
- **登录密码不上传明文**:服务端仅存 PBKDF2 哈希;本机存自动登录凭据(可清除)
- **用户管理**:管理员账号 xionglin 可在应用内新建 / 重置密码 / 删除用户(服务端鉴权)
## 功能
打卡(上下班、自动改时、补卡、休假、地点预设)· 工作日志(结构化条目、里程碑、待跟进)· 日历视图 · 统计 · 周报与 AI 润色(可选配置)· 周记提醒 · 备忘录 · 加密密码库 · 记账(报销跟踪)· 全局搜索 · JSON/CSV 备份导入导出 · 用户管理(管理员)
## 仓库结构
```
├─ intern-log/ 客户端(Vue 3 + TS + Vite + Dexie)
│ ├─ src/ 业务源码(views / components / db / sync / domain / lib)
│ ├─ electron/ 桌面壳(Electron 主进程 + 预加载)
│ ├─ android/ Capacitor 安卓工程
│ ├─ dist/ 网页构建产物(服务端容器直接托管,故随仓库提交)
│ ├─ release/ 打包产物(不入库,见 .gitignore)
│ └─ repro/ 开发验证脚本(同步引擎回归、协议审计、单测)
├─ server/ 同步服务端(零依赖 node:http + JSON 存储)
│ ├─ index.js 全部服务端逻辑(认证 / 同步 / SSE / 用户管理 / 备份)
│ ├─ Dockerfile / docker-compose.yml
│ └─ DEPLOY.md 部署手册(域名 / Caddy / 运维)
└─ docs/ 设计方案与发布记录
```
## 开发
```bash
cd intern-log
pnpm install
pnpm dev # http://localhost:5173
pnpm build # 产出 dist/(服务端容器托管的就是它)
```
桌面打包:`pnpm dist`(产物 release/InternLog-Setup-*.exe)
安卓打包:`pnpm build && npx cap sync android`,然后 `android/gradlew.bat assembleDebug`
## 测试(本地验证脚本,位于 intern-log/repro/)
```bash
# 起本地同步服务后运行:
node repro/protocol-audit.mjs # 服务端协议审计(认证/九表/LWW/墓碑/SSE/备份)
node repro/admin-audit.mjs # 用户管理审计
# 引擎级测试需先 esbuild 打包(详见脚本头部注释):
# two-device.ts 双设备端到端回归
# engine-realtime.ts 实时链路(写入自动推送 + SSE 自动拉取)
# unit-tests.ts 纯函数单测(日期/考勤/加密)
```
## 部署
见 [server/DEPLOY.md](server/DEPLOY.md)。更新流程:
```bash
cd /opt/daywork && git pull && cd server && docker compose up -d --build
```
## 安全与隐私
- 登录密码、云端密码:仅 PBKDF2(15 万次迭代)哈希,任何一端不存明文
- 密码库:AES-256-GCM,主密钥仅存在于解锁后的内存,主密码永不出机
- 服务端每日自动备份到 server/data/backups/(保留 14 天),注册表变更即触发备份
- 界面无表情符号,图标全部自绘 SVG
+1
View File
@@ -1,5 +1,6 @@
node_modules/ node_modules/
release/ release/
repro/*.cjs
*.local *.local
android/.gradle/ android/.gradle/
android/build/ android/build/
+32 -23
View File
@@ -1,33 +1,42 @@
# 实习工作日志 # intern-log 客户端
本地优先的实习工作记录工具:考勤打卡、月历、随手记、周记、一键生成总结。 实习工作日志的多端客户端(网页 / Electron 桌面 / Capacitor 安卓共用同一套源码)。
对应设计方案文档:实习工作日志系统-设计方案.md 整体架构、部署与安全设计见仓库根目录 [README](../README.md);设计方案见 [docs/实习工作日志系统-设计方案.md](../docs/实习工作日志系统-设计方案.md)。
## 运行 ## 运行
pnpm install pnpm install
pnpm dev # 开发模式,默认 http://localhost:5173 pnpm dev # 开发模式,默认 http://localhost:5173
pnpm build # 构建产物到 dist/ pnpm build # 构建产物到 dist/(服务端容器托管的就是它)
pnpm preview # 预览构建产物,默认 http://localhost:4173 pnpm preview # 预览构建产物,默认 http://localhost:4173
## 说明 ## 数据模型(重要)
- 技术栈:Vue 3 + TypeScript + Vite + Dexie(IndexedDB),无后端、无外部图标库 - **服务器是唯一数据权威**,本地 Dexie(IndexedDB)只是实时缓存:
- 数据保存在浏览器 IndexedDB(数据库名 intern_worklog) 每次写操作立即推送差异到服务器,并以服务器返回的快照全量重建缓存
- 「设置」页可导出/导入 JSON 全量备份;「总结」页可导出 Markdown - 同步引擎:`src/sync/engine.ts`(差异推送 + 快照重建 + SSE 实时通知 + 60s 兜底)
- 支持上班地点记录(公司、客户现场、出差等),可直接输入自定义地点并自动记住,统计与总结含地点分布 - 本地库按云端用户隔离:`intern_worklog_<云端userId>`
- 打卡时间支持行内直接修改(含补录下班时间),考勤状态自动重算
- 表单带标签与必填校验;删除与备份覆盖导入使用统一确认弹窗;操作结果轻提示反馈 ## 目录速览
- 工作记录支持弹窗完整信息编辑(全部字段),点击条目或编辑图标打开
- 备忘录:双栏列表与编辑,未保存修改有守卫 src/
- 密码库:企业账号密码管理,主密码 PBKDF2 派生 AES-256-GCM 加密,支持解锁、锁定、搜索、复制、随机密码生成、修改主密码;备份文件中密码保持密文 ├─ views/ 页面(日历/详情/统计/总结/记账/备忘录/密码库/设置/用户管理)
- 用户系统:每位用户独立 IndexedDB 数据库隔离存储;登录密码仅存 PBKDF2 哈希;30 分钟无操作自动退出;创建用户时可迁移升级前数据 ├─ components/ 通用组件与自绘 SVG 图标(icons.ts)
- 记账系统:支出/收入记录、报销跟踪(面向出差垫付)、月度汇总与分类分布 ├─ db/ schema(Dexie)/ repo(数据仓库,写后即推)/ auth(云端登录)/ vault(加密密码库)
- 多端同步:自建同步服务端(server 目录,Docker 部署见 server/DEPLOY.md),设置页配置后桌面、网页、手机 PWA 数据互通;密码库以密文同步 ├─ sync/ 同步引擎
- 安卓应用:Capacitor 脚手架已就绪,本机构建 APK 需 Android Studio:pnpm build && npx cap sync android,进入 android 目录执行 gradlew assembleDebug ├─ domain/ 考勤计算 / AI 润色
- PWA:在 Edge/Chrome 中打开后,地址栏右侧点「安装」或菜单选择「将此站点作为应用安装」,即可获得独立窗口与桌面图标,离线可用 └─ lib/ 日期、加密、下载、toast、错误浮层、服务器基址
- Electron 桌面版:pnpm dist 产出 release/InternLog-Setup-<版本>.exe(NSIS 安装包)与 release/win-unpacked/InternLog.exe(免安装版);数据存于系统用户目录,与浏览器数据互不影响
- 全局搜索:Ctrl+K 唤起,覆盖工作记录与备忘录,点击结果跳转定位 ## 打包
- 考勤支持休假标记;支持导出工作记录与考勤 CSV;总结草稿可复制、可 AI 润色(设置页配置 OpenAI 兼容接口);密码库 5 分钟无操作自动锁定
- 图标为自绘 SVG(src/components/icons.ts),界面不含表情与特殊符号 - 桌面:`pnpm dist` → release/InternLog-Setup-*.exe(NSIS)与 win-unpacked/
- 安卓:`pnpm build && npx cap sync android` → android/gradlew.bat assembleDebug
(需 JDK 17:set JAVA_HOME=C:\Program Files\Java\jdk-17)
## 验证脚本(repro/)
开发期回归工具,不参与构建:
- `protocol-audit.mjs` / `admin-audit.mjs`:对本地同步服务(127.0.0.1:3780)的协议级审计
- `two-device.ts` / `engine-realtime.ts` / `unit-tests.ts`:引擎级与单元测试(用 esbuild 打包后 node 运行,命令见文件头注释)
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+26 -7
View File
@@ -1,5 +1,8 @@
# 同步服务端部署(daywk.linyux.cn 子域名方案) # 同步服务端部署(daywk.linyux.cn 子域名方案)
服务端是整个系统的**唯一数据权威**:认证、九张业务表、用户管理、每日自动备份都在这里。
客户端(桌面 / 网页 / 安卓)只是实时缓存,详见仓库根 README。
## 一、DNS 解析(先做) ## 一、DNS 解析(先做)
在域名服务商处添加 A 记录: 在域名服务商处添加 A 记录:
@@ -40,16 +43,32 @@ Caddy 会自动为 daywk.linyux.cn 申请并续期 HTTPS 证书(需 DNS 已生
## 重要:该域名同时是应用入口 ## 重要:该域名同时是应用入口
同步服务容器同时托管了网页应用本体(daywork 仓库中的构建产物)。手机与电脑浏览器直接打开 同步服务容器同时托管了网页应用本体(daywork 仓库 intern-log/dist 的构建产物,随仓库提交以便容器直接 COPY)。
https://daywk.linyux.cn 就是应用(可添加到主屏幕作为 PWA),无需另外部署前端;/api 路径为数据接口。 手机与电脑浏览器直接打开 https://daywk.linyux.cn 就是应用(可添加到主屏幕作为 PWA);/api 路径为数据接口。
## 五、客户端 ## 五、账号体系
应用 → 设置 → 多端数据同步:地址填 https://daywk.linyux.cn,注册云端账号后同步。 - 注册 / 登录全部经由服务端(POST /api/auth/register、/api/auth/login),密码仅存 PBKDF2 哈希
手机浏览器打开同一地址登录,添加到主屏幕后即为手机端应用。 - **管理员:用户名 xionglin**(服务启动时自动赋予 role=admin,存量注册表也会自动迁移)
- 管理员专用接口(客户端「用户管理」页使用,非管理员一律 403):
- GET /api/admin/users 用户列表(含数据量)
- POST /api/admin/users/create 新建账号
- POST /api/admin/users/password 重置任意用户密码
- POST /api/admin/users/delete 删除账号及其全部数据(不能删自己)
- 客户端"登录密码修改"对应 POST /api/auth/password;"删除此用户"对应 POST /api/auth/delete
## 六、数据与运维 ## 六、数据与运维
- 数据目录:/opt/daywork/server/data(用户注册表 + 每用户数据),打包即备份 - 数据目录:/opt/daywork/server/data
- registry.json 用户注册表(用户名 / 角色 / PBKDF2 哈希)
- users/<id>.json 每用户九张表数据 + 墓碑
- backups/<日期>/ **每日自动备份**(启动与每次注册表变更也会触发,保留最近 14 天)
- 更新版本:cd /opt/daywork && git pull && cd server && docker compose up -d --build - 更新版本:cd /opt/daywork && git pull && cd server && docker compose up -d --build
- 接口:POST /api/auth/register、POST /api/auth/login、POST /api/sync、GET /api/health - 同步协议:POST /api/sync(Bearer token;推送差异并返回权威全量快照)
- 实时通知:GET /api/events?token=...(SSE,同账号任意端有变更即广播 change)
- 手工备份:直接打包 server/data 目录即可(纯 JSON 文件)
## 七、客户端
应用 → 设置 → 多端数据同步:地址填 https://daywk.linyux.cn(默认即是)。
登录即自动绑定云端并全量拉取;本机仅存加密的自动登录凭据,退出登录后需重新输入密码。