# Home4j 产品设计文档（PDD）

> **文档版本**：v1.1  
> **创建日期**：2026年1月30日  
> **最后更新**：2026年2月3日  
> **文档状态**：修订版

---

## 1. 概述与愿景

### 1.1 项目一句话介绍

**Home4j** 是一款基于 Java 技术栈的极简、高性能、可自托管的 Home 仪表盘和导航工具，专为独立开发者、内容创作者和小型团队打造。

### 1.2 核心价值主张

> 市面上鲜有基于 Java 的 Home 仪表盘解决方案。Home4j 填补这一空白，为 Java 生态用户提供**轻量级、高度可定制、开箱即用**的首页导航工具，让用户在熟悉的技术栈中获得一流的自托管体验。

### 1.3 与竞品的差异化定位

| 差异化维度 | Home4j 定位 |
|-----------|------------|
| **技术栈** | 基于 **Quarkus** 的轻量级 Java 方案，对 Java 开发者友好 |
| **配置方式** | **Web UI 为主**，数据库存储配置，支持导出备份 |
| **资源占用** | 目标内存 < 128MB，启动时间 < 3秒（JVM 模式） |
| **扩展性** | 预留 Widget 插件机制，支持企业级二次开发 |
| **部署体验** | 单 JAR 文件 / Docker 一键部署，零外部依赖 |
| **离线友好** | 所有资源本地化（图标、CSS），支持内网离线部署 |

### 1.4 从参考项目中学到的最关键启发

| 参考项目 | 核心启发 | 应用到 Home4j |
|---------|---------|--------------|
| **Flame** | 极简至上，专注核心功能；书签+应用分类清晰 | 采用相似的简洁 UI 哲学，MVP 聚焦书签管理 |
| **Homer** | YAML 配置驱动，声明式管理；图标系统完善 | 支持 YAML 配置文件，内置图标库 |
| **Glance** | Widget 化设计，信息聚合能力强 | 预留 Widget 扩展架构 |
| **Homepage** | 服务状态监控集成，实用性强 | v1.0 加入服务健康检查 |
| **Dashy** | 高度可定制，主题丰富 | 基于 DaisyUI 实现多主题切换 |
| **Heimdall** | 应用启动器思维，增强型书签概念 | 支持应用分组和快捷访问 |

---

## 2. 用户与市场分析

### 2.1 目标用户画像

#### Persona 1：独立开发者「小明」

| 属性 | 描述 |
|-----|------|
| **背景** | 全栈开发者，自建 NAS 和多个服务（GitLab、Jenkins、Portainer等） |
| **典型场景** | 需要统一入口管理 10+ 个自托管服务，希望一目了然 |
| **痛点** | 现有工具要么太重（Dashy），要么不熟悉技术栈（Node.js） |
| **期望** | 轻量、快速、能用 Java 二次开发、Docker 部署简单 |

#### Persona 2：小型团队技术负责人「阿杰」

| 属性 | 描述 |
|-----|------|
| **背景** | 5人创业团队 CTO，管理内部工具和文档入口 |
| **典型场景** | 为团队搭建内部 Portal，整合 Notion、飞书、内部系统 |
| **痛点** | 需要简单的权限控制，但不想引入复杂系统 |
| **期望** | 支持多用户、可配置访问权限、界面专业美观 |

#### Persona 3：内容创作者「小美」

| 属性 | 描述 |
|-----|------|
| **背景** | 技术博主，自建博客、图床、评论系统等 |
| **典型场景** | 希望有一个美观的个人主页展示所有项目入口 |
| **痛点** | 设计能力有限，希望开箱即用且美观 |
| **期望** | 多主题可选、支持自定义背景、移动端适配好 |

### 2.2 竞品分析

| 维度 | Flame | Homer | Dashy | Heimdall | **Home4j** |
|-----|-------|-------|-------|----------|------------|
| **技术栈** | Node.js | Vue/静态 | Vue | PHP/Laravel | **Java/Solon** |
| **配置方式** | Web UI | YAML | YAML + UI | Web UI | **YAML + Web UI** |
| **资源占用** | 低 | 极低 | 中等 | 中等 | **低** |
| **学习曲线** | 低 | 中 | 高 | 低 | **低** |
| **Widget 支持** | 有限 | 无 | 丰富 | 无 | **可扩展** |
| **服务状态监控** | ✅ | ❌ | ✅ | ❌ | **✅ (v1.0)** |
| **多用户** | ❌ | ❌ | ✅ | ❌ | **✅ (v1.0)** |
| **中文支持** | 一般 | 一般 | 良好 | 一般 | **原生支持** |

### 2.3 用户核心痛点与机会点

| 痛点 | 机会点 |
|-----|-------|
| Java 生态缺乏优质 Dashboard 工具 | 填补市场空白，吸引 Java 开发者群体 |
| 现有工具配置复杂或资源占用高 | 主打"极简 + 轻量"差异化 |
| 纯 YAML 配置对非技术用户不友好 | 提供 Web UI 可视化配置 |
| 大多数工具不支持中文优先 | 原生中文支持，国际化架构 |
| 企业内部使用缺乏基础权限控制 | 提供简单实用的多用户机制 |

---

## 3. 核心功能设计（MVP）

### 3.1 MVP 范围界定说明

MVP 目标：**让用户在 5 分钟内完成部署，10 分钟内配置出可用的个人导航页**。

**MVP 边界原则**：
- ✅ 必须有：书签管理、分组分类、主题切换、Docker 部署、管理员登录
- ⏳ 延后：Widget 系统、服务监控、多用户权限
- ❌ 不做：复杂的仪表盘编辑器、第三方集成、竞品数据导入

**MVP 权限模式**：
- **只读访问**：普通访客可浏览所有书签
- **管理员编辑**：需登录后才能添加/编辑/删除书签和配置

### 3.2 核心功能列表

| 功能名称 | 用户价值 | 优先级 | 参考来源 |
|---------|---------|--------|---------|
| **书签管理** | 快速访问常用服务和网站 | P0 | Flame, Homer |
| **分组分类** | 按场景/类型组织书签，提升查找效率 | P0 | Flame, Heimdall |
| **搜索功能** | 快速定位目标书签 | P0 | Dashy |
| **主题切换** | 满足个性化需求，适应不同场景 | P0 | Dashy |
| **管理员登录** | 保护编辑权限，防止误操作 | P0 | 通用需求 |
| **Web UI 配置** | 可视化管理所有设置 | P0 | Flame |
| **响应式布局** | 多设备访问体验一致 | P0 | 通用需求 |
| **图标系统** | 提升视觉识别效率（本地化） | P0 | Homer, Dashy |
| **Docker 部署** | 一键启动，环境隔离 | P0 | 所有参考项目 |

### 3.3 核心功能详细描述

#### 3.3.1 书签管理

**用户故事**：
> 作为一名独立开发者，我希望能够添加、编辑、删除我的服务书签，以便快速访问我的各种自托管服务。

**关键交互流程**：
```
[首页] → [点击添加按钮] → [填写书签信息表单] 
      → [选择分组和图标] → [保存] → [首页显示新书签]
```

**书签数据结构**：
```yaml
bookmarks:
  - name: "GitLab"
    url: "https://gitlab.example.com"
    icon: "gitlab"  # 支持：内置图标名 / URL / base64
    group: "开发工具"
    description: "代码仓库"
    tags: ["开发", "Git"]
```

**验收标准**：
- [ ] 支持添加书签（名称、URL、图标、分组、描述）
- [ ] 支持编辑和删除书签
- [ ] 书签点击在新标签页打开
- [ ] 支持拖拽排序
- [ ] 数据持久化到数据库

#### 3.3.2 分组分类

**用户故事**：
> 作为用户，我希望将书签按照用途分组（如：开发工具、监控系统、文档资料），以便快速找到目标。

**分组数据结构**：
```yaml
groups:
  - name: "开发工具"
    icon: "code"
    order: 1
    collapsed: false  # 是否默认折叠
  - name: "监控系统"
    icon: "monitor"
    order: 2
```

**验收标准**：
- [ ] 支持创建、编辑、删除分组
- [ ] 支持分组排序
- [ ] 支持分组折叠/展开
- [ ] 未分组书签显示在"默认"分组

#### 3.3.3 搜索功能

**用户故事**：
> 当我有大量书签时，我希望通过关键词快速搜索定位，而不是逐个查找。

**交互设计**：
- 快捷键 `/` 或 `Ctrl+K` 激活搜索框
- 支持搜索：书签名称、URL、描述、标签
- 实时过滤，高亮匹配内容
- 支持键盘导航（↑↓选择，Enter打开）

**验收标准**：
- [ ] 搜索响应时间 < 100ms
- [ ] 支持模糊匹配
- [ ] 搜索结果高亮显示
- [ ] 空结果友好提示

#### 3.3.4 主题切换

**用户故事**：
> 我希望根据个人喜好和使用场景切换界面主题，比如夜间使用深色模式。

**主题方案（基于 DaisyUI）**：

| 主题名称 | 适用场景 |
|---------|---------|
| light | 日间默认 |
| dark | 夜间模式 |
| cyberpunk | 科技风格 |
| nord | 护眼柔和 |
| dracula | 开发者偏好 |

**验收标准**：
- [ ] 支持至少 5 个预设主题
- [ ] 主题切换即时生效，无刷新
- [ ] 记住用户主题偏好
- [ ] 支持跟随系统深色模式

#### 3.3.5 数据存储策略

**设计理念**：
- **所有数据统一存储在数据库**：书签、分组、应用配置、用户偏好
- **Web UI 为主要配置入口**：用户通过界面管理所有设置
- **支持数据导出**：可导出为 JSON/YAML 格式用于备份和迁移

**数据分类**：

| 数据类型 | 存储位置 | 说明 |
|---------|---------|------|
| 书签数据 | 数据库 | 书签、分组的增删改查 |
| 应用配置 | 数据库 | 标题、副标题、主题、布局等全局设置 |
| 用户账号 | 数据库 | 管理员账号信息 |
| 用户偏好 | 数据库 + LocalStorage | 主题选择、语言偏好（支持游客记忆） |

**配置页面功能**：
- 常规设置：网站标题、副标题、Logo
- 外观设置：主题、布局、背景
- 数据管理：导入、导出、备份
- 账号管理：修改密码

---

#### 3.3.6 管理员登录

**用户故事**：
> 作为网站管理员，我希望通过登录验证后才能编辑内容，防止他人误操作或恶意修改。

**交互流程**：
```
[首页] → [点击设置/编辑按钮] → [跳转登录页] 
      → [输入用户名密码] → [登录成功] → [进入管理模式]
```

**首次启动流程**：
```
[首次访问] → [初始化向导] → [设置管理员账号密码] → [完成] → [进入首页]
```

**验收标准**：
- [ ] 首次启动强制设置管理员账号
- [ ] 未登录用户只能浏览，不能编辑
- [ ] 登录状态支持 Session 保持
- [ ] 支持退出登录
- [ ] 支持修改密码

---

## 4. 功能路线图（MVP → v1.0 → 未来方向）

### 4.1 分阶段功能规划

```
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  MVP (v0.1)          v0.5              v1.0            未来
   2个月               2个月             2个月           持续
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
[书签管理]        [图标库增强]      [简单状态监控]    [插件市场]
[分组分类]        [数据导入导出]    [多用户支持]      [移动端APP]
[搜索功能]        [自定义CSS]       [访问统计]        [团队协作]
[主题切换]        [背景自定义]      [API开放]         [AI推荐]
[管理员登录]      [快捷键系统]      [基础Widget]      [公开分享]
[Web UI配置]      [PWA支持]         [数据备份恢复]
[Docker部署]
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
```

### 4.2 关键里程碑

| 版本 | 时间节点 | 关键目标 | 成功指标 |
|-----|---------|---------|---------|
| **MVP (v0.1)** | M+2 | 核心功能可用，Docker 可部署 | 完成冒烟测试，GitHub 发布首个 Release |
| **v0.5** | M+4 | 体验优化，功能完善 | 收集 50+ 用户反馈，GitHub Star > 100 |
| **v1.0** | M+6 | 生产可用，企业特性 | 稳定运行 30 天无重大 Bug，Star > 500 |

---

## 5. 用户体验与交互设计原则

### 5.1 整体设计语言与调性

| 维度 | 设计原则 |
|-----|---------|
| **视觉风格** | 简洁克制、呼吸感强、信息层次清晰 |
| **交互理念** | 减少点击、键盘友好、即时反馈 |
| **色彩运用** | 主色调由主题决定，强调色用于交互元素 |
| **动效策略** | 轻量过渡动画，提升流畅感但不干扰 |
| **信息密度** | 可配置，支持紧凑/标准/宽松三种模式 |

### 5.2 核心用户旅程

#### 首次使用旅程

```
┌─────────────────────────────────────────────────────────────┐
│ 1. 部署启动                                                  │
│    docker run -p 8080:8080 home4j/home4j                    │
│                              ↓                               │
│ 2. 访问首页                                                  │
│    浏览器打开 http://localhost:8080                          │
│                              ↓                               │
│ 3. 初始化向导（首次，可跳过部分步骤）                          │
│    [设置管理员账号] → [选择主题] → [添加第一个书签] → [完成]   │
│                              ↓                               │
│ 4. 日常使用                                                  │
│    游客：查看书签 → 点击访问 / 搜索定位                       │
│    管理员：登录 → 管理编辑 → 退出登录                         │
└─────────────────────────────────────────────────────────────┘
```

**说明**：初始化向导由前端驱动，除「设置管理员账号」为必填外，其他步骤可跳过。

### 5.3 关键页面交互逻辑

#### 首页（Dashboard）

```
┌────────────────────────────────────────────────────────────┐
│  🏠 Home4j            [搜索框 Ctrl+K]        [设置⚙️]      │
├────────────────────────────────────────────────────────────┤
│                                                            │
│  📁 开发工具                                         [+]   │
│  ┌──────┐  ┌──────┐  ┌──────┐  ┌──────┐                   │
│  │GitHub│  │GitLab│  │Jenkins│ │Notion│                   │
│  └──────┘  └──────┘  └──────┘  └──────┘                   │
│                                                            │
│  📁 监控系统                                         [+]   │
│  ┌──────┐  ┌──────┐  ┌──────┐                              │
│  │Grafana│ │Portainer│ │Uptime│                           │
│  └──────┘  └──────┘  └──────┘                              │
│                                                            │
├────────────────────────────────────────────────────────────┤
│  Powered by Home4j                    [主题切换🌙]          │
└────────────────────────────────────────────────────────────┘
```

#### 设置页面（Settings）

- **Tab 式导航**：常规 | 外观 | 数据 | 关于
- **实时预览**：修改即可看到效果
- **导入导出**：支持 JSON/YAML 格式

---

## 6. 技术架构与实现约束（产品视角）

### 6.1 推荐技术栈

| 层级 | 技术选型 | 选型理由 |
|-----|---------|---------|
| **后端框架** | Quarkus | 轻量级 Java 框架，启动快、内存占用低，生态完善 |
| **模板引擎** | Qute | Quarkus 原生模板引擎，类型安全，性能优秀 |
| **前端样式** | DaisyUI + Tailwind（本地） | 开箱即用的组件库，主题切换方便，**本地引用无 CDN 依赖** |
| **数据库** | H2（默认，文件模式）/ MySQL（可选） | H2 零配置，MySQL 满足企业需求 |
| **ORM** | Panache（Hibernate） | Quarkus 原生 ORM，简化数据库操作 |
| **容器化** | Docker | 标准化部署，环境一致性 |

### 6.2 部署方式

#### Docker 一键部署（推荐）

```bash
docker run -d \
  --name home4j \
  -p 8080:8080 \
  -v /path/to/data:/app/data \
  home4j/home4j:latest
```

#### Docker Compose

```yaml
version: '3'
services:
  home4j:
    image: home4j/home4j:latest
    ports:
      - "8080:8080"
    volumes:
      - ./data:/app/data
    environment:
      - TZ=Asia/Shanghai
    restart: unless-stopped
```

#### JAR 直接运行

```bash
java -jar home4j-runner.jar
```

### 6.3 数据目录规划

```
/app/                              # 应用根目录（Docker 内）
├── home4j-runner.jar              # 应用主程序
├── resources/                     # 资源目录
│   ├── static/                    # 静态资源
│   │   ├── css/                   # DaisyUI/Tailwind 本地文件
│   │   ├── js/                    # JavaScript 文件
│   │   └── icons/                 # 内置图标库
│   └── templates/                 # Qute 模板文件
├── data/                          # 数据目录（**需挂载**）
│   ├── home4j.mv.db              # H2 数据库文件
│   ├── home4j.trace.db           # H2 跟踪文件（可选）
│   └── uploads/                   # 用户上传文件
│       └── icons/                 # 用户上传的自定义图标
└── logs/                          # 日志目录（可选挂载）
    └── home4j.log
```

**挂载说明**：
- `/app/data` **必须挂载**：包含数据库和用户上传文件，确保数据持久化
- `/app/logs` 可选挂载：便于查看日志

### 6.4 图标系统实现

| 图标类型 | 存储位置 | 说明 |
|---------|---------|------|
| **内置图标** | `/resources/static/icons/` | 打包在 JAR 中，500+ 常用图标 |
| **URL 图标** | 外部 URL | 用户填写的图片 URL |
| **上传图标** | `/data/uploads/icons/` | 用户上传的自定义图标 |
| **默认图标** | `/resources/static/icons/default.svg` | URL 不可访问时的降级显示 |

**URL 图标处理逻辑**：
1. 前端尝试加载用户填写的 URL 图标
2. 如果加载失败（超时/404/跨域），自动降级显示默认图标
3. 默认图标为一个灰色的「问号」或「链接断裂」样式

### 6.5 扩展性与插件机制

**Widget 插件架构（v1.0+）**：

```
┌─────────────────────────────────────────┐
│              Home4j Core                │
├─────────────────────────────────────────┤
│           Widget API (SPI)              │
├──────────┬──────────┬──────────┬────────┤
│ 时钟组件 │ 搜索组件 │ 待办组件 │ 自定义 │
└──────────┴──────────┴──────────┴────────┘
```

- 基于 Quarkus 扩展机制或 Java SPI 加载插件
- 插件独立 JAR 包，放入 `/plugins` 目录自动加载
- v1.0 提供简单的内置 Widget，复杂插件延后到 v1.x

### 6.6 性能与安全底线要求

| 指标 | 目标值 |
|-----|-------|
| 冷启动时间 | < 3 秒（JVM 模式） |
| 内存占用 | < 128 MB（默认配置） |
| 首页加载时间 | < 500 ms |
| 并发支持 | > 100 QPS（单实例） |
| Docker 镜像大小 | < 200 MB |

---

## 7. 非功能性需求

### 7.1 性能目标

| 场景 | 指标 | 目标 |
|-----|-----|------|
| 首页渲染 | TTFB | < 100ms |
| 书签搜索 | 响应时间 | < 50ms（1000条书签内） |
| 配置保存 | 响应时间 | < 200ms |
| 主题切换 | 生效时间 | < 100ms，无闪烁 |

### 7.2 安全性与隐私保护

| 安全措施 | 说明 |
|---------|------|
| **数据本地化** | 所有数据存储在用户自己的服务器，不上传云端 |
| **HTTPS 支持** | 支持反向代理 SSL 终结 |
| **XSS 防护** | 输入输出转义，CSP 策略 |
| **CSRF 防护** | Token 验证机制 |
| **认证机制（v1.0）** | 支持基础认证，可选 OAuth2 |

### 7.3 可观测性

| 维度 | 实现方案 |
|-----|---------|
| **日志** | SLF4J + Logback，支持日志级别动态调整 |
| **健康检查** | `/actuator/health` 端点 |
| **指标暴露** | Prometheus 格式 `/metrics`（可选） |

### 7.4 国际化与可访问性

- **语言支持**：中文（默认）、英文
- **i18n 机制**：基于 `messages.properties` 资源文件
- **可访问性**：
  - 语义化 HTML 结构
  - 键盘完整可操作
  - 支持屏幕阅读器
  - 颜色对比度符合 WCAG 2.1 AA

---

## 8. 风险、挑战与应对

| 风险 | 等级 | 描述 | 缓解措施 |
|-----|------|------|---------|
| **市场认知度低** | 高 | Java Dashboard 类工具用户认知少 | 1. 发布技术博客分享<br>2. 提交到 awesome-selfhosted 列表<br>3. 录制视频教程 |
| **与成熟竞品竞争** | 高 | Flame/Homer 已有稳定用户群 | 1. 差异化定位 Java 用户<br>2. 功能上做精不做多<br>3. 强调离线部署优势 |
| **Quarkus 学习曲线** | 中 | 团队对 Quarkus 熟悉度 | 1. 使用 JVM 模式降低复杂度<br>2. 参考官方示例<br>3. 保持核心依赖简单 |
| **单人维护精力有限** | 中 | 开源项目持续维护挑战 | 1. MVP 功能精简<br>2. 代码质量优先<br>3. 积极培养社区贡献者 |
| **用户需求分散** | 中 | 不同用户对功能期望差异大 | 1. 坚持「导航工具」核心定位<br>2. 通过插件满足扩展需求<br>3. 建立 RFC 机制收集反馈 |

---

## 9. 附录

### 9.1 名词表 / 术语定义

| 术语 | 定义 |
|-----|------|
| **书签（Bookmark）** | 用户添加的链接条目，包含名称、URL、图标等属性 |
| **分组（Group）** | 书签的逻辑分类容器 |
| **Widget** | 可嵌入仪表盘的小组件，如时钟、天气等 |
| **主题（Theme）** | 预定义的视觉风格配置，包含颜色、字体等 |
| **YAML 配置** | 使用 YAML 格式定义应用配置的文件 |

### 9.2 参考资料与灵感来源

| 项目 | 地址 | 主要参考点 |
|-----|------|-----------|
| Flame | https://github.com/pawelmalak/flame | 极简设计、书签管理 |
| Homer | https://github.com/bastienwirtz/homer | YAML 配置、图标系统 |
| Glance | https://github.com/glanceapp/glance | Widget 架构 |
| Homepage | https://github.com/gethomepage/homepage | 服务状态集成 |
| Dashy | https://github.com/Lissy93/dashy | 主题系统、高级功能 |
| Heimdall | https://github.com/linuxserver/Heimdall | 应用启动器概念 |

### 9.3 其他补充说明

#### 项目目录结构（建议）

```
home4j/
├── src/
│   ├── main/
│   │   ├── java/com/home4j/
│   │   │   ├── resource/          # REST 资源（Controller）
│   │   │   ├── service/           # 业务逻辑
│   │   │   ├── repository/        # 数据访问（Panache）
│   │   │   ├── entity/            # 数据实体
│   │   │   ├── dto/               # 数据传输对象
│   │   │   ├── config/            # 配置类
│   │   │   └── plugin/            # 插件机制
│   │   ├── resources/
│   │   │   ├── templates/         # Qute 模板
│   │   │   ├── META-INF/
│   │   │   │   └── resources/     # 静态资源
│   │   │   │       ├── css/       # DaisyUI/Tailwind 本地文件
│   │   │   │       ├── js/        # JavaScript 文件
│   │   │   │       └── icons/     # 内置图标库
│   │   │   └── application.properties
├── docker/
│   └── Dockerfile
├── docs/                          # 文档
└── README.md
```

#### 开源协议建议

推荐使用 **MIT License**，便于企业用户采用和二次开发。

---

> **文档结束**  
> 本文档将随项目进展持续更新，欢迎提出反馈和建议。
