# WorkHub **Repository Path**: known/WorkHub ## Basic Information - **Project Name**: WorkHub - **Description**: 独立开发者的个人工作空间:工作台、笔记文章、收藏与 RSS、代码片段、客户项目、发票收支和万能工具台,集中在同一个可离线运行的单机应用里。业务数据保存在本机 SQLite,外部同步与翻译只在用到时访问对应服务。 - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 4 - **Forks**: 0 - **Created**: 2026-11-11 - **Last Updated**: 2026-11-11 ## Categories & Tags **Categories**: Uncategorized **Tags**: blazor, dotNET ## README # WorkHub 独立开发者的个人工作空间:工作台、笔记文章、收藏与 RSS、代码片段、客户项目、发票收支和万能工具台,集中在同一个可离线运行的单机应用里。业务数据保存在本机 SQLite,外部同步与翻译只在用到时访问对应服务。 ## 架构 解决方案 `WorkHub.slnx` 由四个工程组成,业务代码只写一份: | 工程 | 目标框架 | 职责 | |---|---|---| | `WorkHub` | `net10.0` | 共享业务层(Razor 类库):页面、菜单、`[WebApi]` 契约、`[Service]` 实现、模型与纯函数,浏览器、Web 与桌面共用 | | `WorkHubWasm` | `net10.0` | 浏览器前端:注册路由,把 `[WebApi]` 契约接到 HTTP 代理,产物是由宿主托管的静态站 | | `WorkHubWeb` | `net10.0-windows` | ASP.NET Core 宿主:SQLite、Cookie 认证、定时任务与访问控制,同源提供 `/api/*` 和 Wasm 静态文件 | | `WorkHubWin` | `net10.0-windows` | 桌面宿主:WinForms + BlazorWebView,全栈单进程,离线运行 | | `WorkHub.Tests` | `net10.0-windows` | xUnit 单元测试 | `WorkHub` 本身不依赖 Windows API。DPAPI、Windows OCR、附件落盘与 SQLite 在线备份由两个宿主实现 `WorkHub/Platforms` 下的 `ISecretProtector`、`IOcrEngine`、`IFileStorage`、`IDatabaseBackup` 后注入。框架能力来自同仓的 Known(`..\Known`),解决方案已一并引用。 ## 快速开始 需要 .NET 10 SDK 与 Windows(两个服务端宿主使用 Windows 目标框架)。 ```powershell dotnet build WorkHub.slnx dotnet run --project WorkHubWeb # 浏览器打开 http://127.0.0.1:5277 dotnet run --project WorkHubWin # 打开桌面窗口 dotnet test WorkHub.Tests/WorkHub.Tests.csproj ``` 首次登录使用 `admin / admin123`,登录后请立刻在「偏好设置」修改口令。 浏览器版由 `WorkHubWeb` 托管,单独运行 `WorkHubWasm` 只有前端、没有接口和数据库。 ## 功能 - **工作台**:待办、项目、回款与最近内容的汇总入口。 - **万能工具台**:编解码、JSON / YAML、哈希、ULID、单位与颜色换算等离线工具。 - **资料库**:全文检索(SQLite FTS5)、链接收藏与网页快照、RSS 订阅。 - **创作**:笔记、文章、代码片段、发布记录。 - **客户与项目**:客户档案、项目列表、任务看板、开源仓库同步。 - **财务**:发票台账(支持 PDF / OFD / 图片识别)、回款计划、收支统计。 - **偏好设置**:账号与角色、外部服务密钥、定时同步、备份与恢复。 ## 界面预览 以下截图取自本机运行实例,数据为演示数据。 | 工作台 | 万能工具台 | |---|---| | ![工作台](Document/screenshots/home.png) | ![万能工具台](Document/screenshots/toolbox.png) | | 今日待办、本月开票与回款、最近笔记和收藏一屏汇总。 | Base64、JSON、哈希等离线小工具,输入即算。 | | 全文检索 | 发票台账 | |---|---| | ![全文检索](Document/screenshots/search.png) | ![发票台账](Document/screenshots/finance.png) | | SQLite FTS5 覆盖笔记、文章、收藏、代码片段与订阅。 | 开票、回款与逾期状态在同一张表里跟踪。 | | 偏好设置 | 登录 | |---|---| | ![偏好设置](Document/screenshots/settings.png) | ![登录](Document/screenshots/login.png) | | 账号角色、外部服务密钥、备份与定时任务。 | 同源 Cookie 登录,会话只保存在本机。 | ## 数据落点 | 内容 | 说明 | |---|---| | `WorkHub.db` | SQLite 主库,业务表都在这一文件里。Web 的连接串在 `WorkHubWeb/appsettings.json`,开发时落在仓库根;桌面开发时落在仓库根,发布后落在 exe 目录 | | 附件 | Web 走 Known 附件根 `WorkHubWeb/data/uploads`,桌面落在 exe 旁的 `wwwroot/uploads`;库里只存 `/uploads/…` 站内地址 | | `backups/` | 一键与自动备份的 zip,位于各宿主的 ContentRoot | | `Logs/` | 运行日志,按天与单文件大小滚动,位于各宿主的 ContentRoot | | `SysConfig` 表 | 口令散列(PBKDF2)、调度设置、schema 版本、加密后的外部服务密钥 | ## 安全边界 - 默认只监听回环地址 `127.0.0.1:5277`,不对局域网或公网暴露。 - 绑定到非回环地址且仍是明文 HTTP 时,应用会在启动期直接拒绝启动;TLS、TLS 反代或人工覆盖三选一。 - `Security:AllowedNetworks` 是访问白名单(IP 或 IPv4 CIDR,逗号/分号分隔),留空不做来源限制,本机回环始终放行。 - 百度翻译、GitHub 等外部服务的密钥用 Windows DPAPI(当前用户范围)加密;换机器或换 Windows 账户后需重新录入。 - 附件读取走登录态校验;网页快照额外带 CSP `sandbox`,快照里的脚本不会在 WorkHub 域内执行。 ## 备份与恢复 - 设置页支持一键备份,备份包含数据库在线快照、附件、配置与恢复说明,可另配一个第二备份目录。 - 备份保留份数可设置(默认 10 份),超出后自动轮转删除最旧的包。 - 从备份恢复前,会先为当前数据打一份新备份;恢复完成后需重启 WorkHub 才会读到恢复后的数据库。 ## 账号与角色 - **Owner**:全部页面与系统设置,包括账号管理和备份恢复。 - **Editor**:全部业务目录,可增删改查业务数据。 - **Viewer**:只能查看只读页(工作台、万能工具台、全文检索、收支统计)。 ## 发布 ```powershell dotnet publish WorkHubWeb -c Release -o dist/web dotnet publish WorkHubWin -c Release -o dist/desktop ``` Web 产物包含 Wasm 静态站与接口服务;桌面产物必须把 `wwwroot/` 一起带走,否则只有窗口没有界面。目标机器未装 .NET 10 桌面运行时时,请改用 `--self-contained -r win-x64` 发布。 ## 已知限制 - 宿主与平台适配器目前只支持 Windows,发票 OCR 依赖 `Windows.Media.Ocr`;共享业务层本身是跨平台的。 - 没有 CI,构建与测试需要在本机执行。 - 权限按页面角色控制,尚未实现按数据归属(OwnerId)隔离的资源级权限。 - 浏览器版本必须由提供 `/api/*` 的宿主托管,不能单独部署 `WorkHubWasm`。