一个“够漂亮、够稳健、够可读”的待办清单示例项目:极光背景、玻璃拟态卡片、Bento 布局,并提供完整的待办能力(优先级 / 截止日期 / 完成归档 / 搜索 / 编辑 / 持久化)。
| 类别 | 内容 |
|---|---|
| 体验 | 单滚动条、空状态插画、Toast 提示、键盘快捷键(/、Ctrl+K) |
| 领域 | 待办创建/完成/恢复/删除、编辑、搜索、清空已完成 |
| 规则 | 待办列表排序:截止日期优先(越近越靠前)→ 优先级 → 创建时间 |
| 持久化 | H2 文件数据库(默认 ./data),重启不丢数据;测试使用内存数据库 |
| 安全 | 模板输出对用户输入做 HTML 转义,避免 XSS;错误页不裸露堆栈 |
| 工程 | GitHub Actions CI(自动跑 ./mvnw test) |
Windows(PowerShell 7+)
pwsh -NoLogo -NoProfile -Command 'Set-Location "C:\wooK\K"; .\mvnw.cmd test'
pwsh -NoLogo -NoProfile -Command 'Set-Location "C:\wooK\K"; .\mvnw.cmd spring-boot:run'启动后访问:
http://localhost:8080/
说明:当前为纯服务端渲染(FreeMarker)+ 轻量 JS 增强。
GET /:首页(新建 + 待办/已完成列表 + 搜索)GET /?q=xxx:按关键词搜索POST /todos:创建待办POST /todos/{id}/complete:标记完成POST /todos/{id}/undo:恢复为待办POST /todos/{id}/delete:删除POST /todos/clear-done:清空已完成POST /todos/seed:生成示例数据GET /todos/{id}/edit:编辑页POST /todos/{id}/update:保存编辑
配置文件:
src/main/resources/application.properties
关键配置:
app.assets.version- 用于静态资源版本化(Cache Busting)
- 修改
app.css/app.js或模板引用后请同步更新,避免浏览器缓存造成“修改未生效”
spring.datasource.url- 默认:
jdbc:h2:file:./data/todoboard - 测试:
src/test/resources/application.properties会切换到jdbc:h2:mem:...
- 默认:
默认使用 H2 文件数据库,数据文件会落到项目根目录的 ./data/ 下:
- 该目录已加入
.gitignore,不会污染仓库 - 适合本地演示/学习;如需接入 MySQL/PostgreSQL,可以保留 JPA 分层直接替换数据源
flowchart LR
B[Browser] -->|HTTP| C[TodoController]
C -->|Model| V[FreeMarker templates]
V -->|CSS/JS| B
C --> S[TodoService]
S --> R[TodoRepository (JPA)]
R --> D[(H2 DB)]
- Controller:HTTP/视图模型组织(
com.example.todo.controller) - Service:领域规则与排序(
com.example.todo.service) - Repository:数据访问(
com.example.todo.repository) - View:
src/main/resources/templates/*.ftl - Assets:
src/main/resources/static/assets/*(带?v=版本号)
提交/推送前建议按这个清单走一遍:
.\mvnw.cmd test通过.\mvnw.cmd -DskipTests package通过git grep -n "<<<<<<<\\|=======\\|>>>>>>>" -- src必须无输出(无合并冲突残留)- 模板所有“用户可控字段”输出必须
?html转义(例如todo.description/flash.message) - 修改静态资源或模板引用后,
app.assets.version必须递增(避免缓存鬼影)
docs/ARCHITECTURE.md:更详细的结构说明、排序策略、持久化细节CHANGELOG.md:变更记录(按日期/版本追踪)CONTRIBUTING.md:贡献指南(开发约定、审查清单)