- 新增用户资料、偏好设置、自定义字段管理功能 - 实现评论、反应、相册与智能集合的完整业务逻辑 - 添加离线变更记录与数据同步机制支持冲突解决 - 集成 Redis 缓存配置与用户统计数据聚合 - 创建 8 个业务控制器处理用户交互请求 - 新增 Feign 客户端与故事服务集成 - 补充详细的后端实现与 WebSocket 指南文档 - 更新项目依赖配置支持新增功能模块
7.8 KiB
Preferences Backend Implementation Summary
Overview
Task 19.1 (Create Preferences service and API endpoints) has been successfully implemented. This document summarizes the complete implementation for the Theme Customization backend.
Implementation Status: ✅ COMPLETE
All required components for the Preferences backend have been implemented and are ready for use.
Components Implemented
1. Database Schema ✅
File: timeline-sql/V1.4.0__personal_user_enhancements.sql
The user_preferences table includes:
id- Primary keyuser_id- Unique user identifier- Theme settings:
theme_mode- light/dark/auto (default: 'auto')color_scheme- Color scheme name (default: 'default')
- Layout settings:
gallery_layout- grid/list (default: 'grid')timeline_layout- grid/list (default: 'grid')album_layout- grid/list (default: 'grid')card_size- small/medium/large (default: 'medium')
- Timeline display settings:
timeline_display_mode- chronological/grouped/masonry (default: 'chronological')
create_time- Creation timestampupdate_time- Last update timestamp
2. Entity Class ✅
File: src/main/java/com/timeline/user/entity/UserPreferences.java
Java entity class with:
- All database fields mapped
- Lombok annotations for getters/setters
- JSON formatting for timestamps
3. Data Access Layer (Mapper) ✅
Files:
src/main/java/com/timeline/user/dao/PreferencesMapper.java(Interface)src/main/resources/com/timeline/user/dao/PreferencesMapper.xml(MyBatis XML)
Mapper methods:
findByUserId(String userId)- Get user preferencesinsert(UserPreferences)- Create new preferencesupdate(UserPreferences)- Update all preferencesupdateTheme(userId, themeMode, colorScheme)- Update theme onlyupdateLayout(userId, galleryLayout, timelineLayout, albumLayout, cardSize)- Update layout onlyupdateTimelineDisplay(userId, displayMode)- Update timeline display only
4. Service Layer ✅
Files:
src/main/java/com/timeline/user/service/PreferencesService.java(Interface)src/main/java/com/timeline/user/service/impl/PreferencesServiceImpl.java(Implementation)
Service methods:
getUserPreferences(String userId)- Get preferences, creates default if not existsupdateThemePreferences(userId, themeMode, colorScheme)- Update theme settingsupdateLayoutPreferences(userId, galleryLayout, timelineLayout, albumLayout, cardSize)- Update layout settingsupdateTimelineDisplayPreferences(userId, displayMode)- Update timeline displaycreateDefaultPreferences(String userId)- Create default preferences
Validation logic:
- Theme mode: must be "light", "dark", or "auto"
- Layout: must be "grid" or "list"
- Card size: must be "small", "medium", or "large"
- Display mode: must be "chronological", "grouped", or "masonry"
5. DTO Classes ✅
Files:
src/main/java/com/timeline/user/dto/UpdateThemeRequest.javasrc/main/java/com/timeline/user/dto/UpdateLayoutRequest.javasrc/main/java/com/timeline/user/dto/UpdateTimelineDisplayRequest.java
All DTOs include:
- Jakarta validation annotations
- Pattern validation for enum-like fields
- Proper error messages in Chinese
6. REST Controller ✅
File: src/main/java/com/timeline/user/controller/PreferencesController.java
API Endpoints:
GET /api/v1/preferences- Get user preferencesPUT /api/v1/preferences/theme- Update theme preferencesPUT /api/v1/preferences/layout- Update layout preferencesPUT /api/v1/preferences/timeline- Update timeline display preferences
All endpoints:
- Use
@RequestHeader("X-User-Id")for user identification - Include request validation with
@Valid - Return standardized
ResponseEntityresponses - Include logging for debugging
7. Unit Tests ✅
File: src/test/java/com/timeline/user/service/PreferencesServiceTest.java
Test coverage includes:
- ✅ Default preferences creation when user has none
- ✅ Theme updates (light, dark, auto)
- ✅ Layout updates (full and partial)
- ✅ Timeline display updates
- ✅ Validation error handling (invalid theme mode, layout, card size, display mode)
- ✅ Default preferences creation
Test approach: Uses Mockito for unit testing without requiring full Spring context
API Specification
GET /api/v1/preferences
Get user preferences (creates default if not exists)
Headers:
X-User-Id: User identifier (required)
Response (200 OK):
{
"code": 200,
"message": "success",
"data": {
"id": 1,
"userId": "user123",
"themeMode": "auto",
"colorScheme": "default",
"galleryLayout": "grid",
"timelineLayout": "grid",
"albumLayout": "grid",
"cardSize": "medium",
"timelineDisplayMode": "chronological",
"createTime": "2024-01-01 10:00:00",
"updateTime": "2024-01-01 10:00:00"
}
}
PUT /api/v1/preferences/theme
Update theme preferences
Headers:
X-User-Id: User identifier (required)
Request Body:
{
"themeMode": "dark",
"colorScheme": "purple"
}
Validation:
themeMode: Required, must be "light", "dark", or "auto"colorScheme: Optional, must be "default", "blue", "green", "purple", "orange", or "red"
Response (200 OK):
{
"code": 200,
"message": "success",
"data": null
}
PUT /api/v1/preferences/layout
Update layout preferences
Headers:
X-User-Id: User identifier (required)
Request Body:
{
"galleryLayout": "list",
"timelineLayout": "grid",
"albumLayout": "list",
"cardSize": "large"
}
Validation:
- All fields optional
galleryLayout,timelineLayout,albumLayout: must be "grid" or "list"cardSize: must be "small", "medium", or "large"
Response (200 OK):
{
"code": 200,
"message": "success",
"data": null
}
PUT /api/v1/preferences/timeline
Update timeline display preferences
Headers:
X-User-Id: User identifier (required)
Request Body:
{
"displayMode": "masonry"
}
Validation:
displayMode: Required, must be "chronological", "grouped", or "masonry"
Response (200 OK):
{
"code": 200,
"message": "success",
"data": null
}
Requirements Validation
Requirement 7.5: Theme preferences persist across sessions ✅
- Preferences are stored in the database
- GET endpoint retrieves persisted preferences
- PUT endpoint updates preferences in database
Requirement 7.6: Theme preferences apply on both web and desktop clients ✅
- Backend API is client-agnostic
- Both web and desktop clients can call the same endpoints
- Preferences are stored per user, not per client
Default Values
When a user has no preferences, the system creates defaults:
- Theme mode:
auto(respects system theme) - Color scheme:
default - Gallery layout:
grid - Timeline layout:
grid - Album layout:
grid - Card size:
medium - Timeline display mode:
chronological
Error Handling
The service includes comprehensive validation:
- Invalid theme mode →
IllegalArgumentException - Invalid layout →
IllegalArgumentException - Invalid card size →
IllegalArgumentException - Invalid display mode →
IllegalArgumentException
All validation errors are caught by the controller and returned as appropriate HTTP error responses.
Next Steps
Task 19.1 is COMPLETE. The backend implementation is ready for:
- Frontend integration (Task 20: Theme Customization frontend)
- Property-based testing (Task 19.2: Optional)
- Integration testing with the full application stack
Notes
- The implementation follows the existing codebase patterns (similar to ReactionService, CommentService)
- All code includes Chinese and English comments for maintainability
- The service is transactional to ensure data consistency
- Partial updates are supported (e.g., updating only theme without changing layout)