feat: 添加日记(成才之路)功能

- 前端 MemoryModal 添加标签切换(成才之路/工作记忆)
- Dashboard 按钮更名为'日新'(📖)
- 后端添加日记 API:
  * /api/lobsters/<id>/diary/dates/ - 获取日记日期
  * /api/lobsters/<id>/diary/<date>/ - 获取日记内容
- 日记优先显示故事版,其次技术版
- 日历显示本月日记统计
- 优化 UI 样式和加载状态

📖 苟日新,日日新,又日新
This commit is contained in:
2026-04-02 13:27:48 +08:00
parent c39a912456
commit 6a2a5bc469
4 changed files with 202 additions and 28 deletions

View File

@@ -10,5 +10,7 @@ urlpatterns = [
path('lobsters/<int:lobster_id>/memory/', views.lobster_memory, name='lobster-memory'),
path('lobsters/<int:lobster_id>/memory/dates/', views.lobster_memory_dates, name='lobster-memory-dates'),
path('lobsters/<int:lobster_id>/memory/<str:date>/', views.lobster_memory_detail, name='lobster-memory-detail'),
path('lobsters/<int:lobster_id>/diary/dates/', views.lobster_diary_dates, name='lobster-diary-dates'),
path('lobsters/<int:lobster_id>/diary/<str:date>/', views.lobster_diary_detail, name='lobster-diary-detail'),
path('tools/', views.tools_list, name='tools-list'),
]

View File

@@ -113,3 +113,41 @@ def lobster_memory_detail(request, lobster_id, date):
'date': date,
'content': content
})
@api_view(['GET'])
def lobster_diary_dates(request, lobster_id):
"""获取龙虾有日记(成才之路)的日期列表"""
# 日记文件目录
diary_dir = Path(f'/home/node/.openclaw/workspace/flying-hero/memory/成才之路')
# 获取所有日记文件
dates = []
if diary_dir.exists():
for file in diary_dir.glob('*.md'):
# 提取日期 (YYYY-MM-DD.md 或 YYYY-MM-DD-*.md)
match = re.match(r'(\d{4}-\d{2}-\d{2})(?:-.*)?\.md', file.name)
if match:
dates.append(match.group(1))
dates = list(set(dates)) # 去重
dates.sort(reverse=True)
return Response({'dates': dates})
@api_view(['GET'])
def lobster_diary_detail(request, lobster_id, date):
"""获取指定日期的日记内容(成才之路)"""
# 优先查找故事版,其次技术版,再其次普通版
diary_file = Path(f'/home/node/.openclaw/workspace/flying-hero/memory/成才之路/{date}-故事版.md')
if not diary_file.exists():
diary_file = Path(f'/home/node/.openclaw/workspace/flying-hero/memory/成才之路/{date}-技术版.md')
if not diary_file.exists():
diary_file = Path(f'/home/node/.openclaw/workspace/flying-hero/memory/成才之路/{date}.md')
if not diary_file.exists():
return Response({'error': '该日期没有日记'}, status=404)
content = diary_file.read_text(encoding='utf-8')
return Response({
'date': date,
'content': content
})