feat: Week 4 收尾 + 架构治理 — 搜索/家长中心/Feature Flag/Docker/环境配置
架构治理: - Feature Flag 落地: Cargo.toml [features] default=["diary"] + main.rs cfg 条件编译 - 环境配置统一: AppConfig 类 + --dart-define 注入 + SSE 端口 8080→3000 修复 搜索替代方案 (无 FTS): - SearchBloc + 标签/心情筛选接入后端 API - JournalRepository 扩展 mood/tag 筛选参数 - 搜索页 UI 接入实际数据(替换占位文本) 家长中心最小集 (PIPL 合规): - 后端: parent_service (绑定/查看/导出/删除/解绑) + parent_handler (6 个 API 端点) - 前端: ParentBloc + ParentPage 功能完整实现 - 绑定孩子、只读查看日记、导出数据、删除数据、解绑 Docker 部署: - verify.sh 健康检查脚本 (Axum/PG/Redis/OpenAPI 四项检查) 测试修复: - home_bloc_test / calendar_bloc_test 适配 JournalRepository 新参数 验证: flutter test 84/84 pass, cargo test 76/76 pass, cargo check pass
This commit is contained in:
@@ -12,6 +12,7 @@ export '../../widgets/responsive_scaffold.dart';
|
||||
import 'dart:async';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:go_router/go_router.dart';
|
||||
|
||||
import '../../widgets/responsive_scaffold.dart';
|
||||
@@ -32,11 +33,15 @@ import '../../features/onboarding/views/onboarding_page.dart';
|
||||
import '../../features/class_/views/class_page.dart';
|
||||
import '../../features/teacher/views/teacher_page.dart';
|
||||
import '../../features/parent/views/parent_page.dart';
|
||||
import '../../features/parent/bloc/parent_bloc.dart';
|
||||
import '../../features/achievement/views/achievement_page.dart';
|
||||
import '../../features/stickers/views/sticker_library_page.dart';
|
||||
import '../../features/templates/views/template_gallery_page.dart';
|
||||
import '../../features/settings/views/settings_page.dart';
|
||||
import '../../features/auth/bloc/auth_bloc.dart';
|
||||
import '../../features/search/bloc/search_bloc.dart';
|
||||
import '../../data/repositories/journal_repository.dart';
|
||||
import '../../data/remote/api_client.dart';
|
||||
|
||||
// Shell 分支键
|
||||
final _rootNavigatorKey = GlobalKey<NavigatorState>();
|
||||
@@ -146,11 +151,17 @@ GoRouter createAppRouter(AuthBloc authBloc) {
|
||||
name: 'calendar',
|
||||
builder: (context, state) => const CalendarPage(),
|
||||
),
|
||||
// 发现页(复用搜索页,后续可替换为独立 DiscoverPage)
|
||||
// 发现页(搜索页 — 标签+心情筛选日记)
|
||||
GoRoute(
|
||||
path: '/discover',
|
||||
name: 'discover',
|
||||
builder: (context, state) => const SearchPage(),
|
||||
builder: (context, state) {
|
||||
final journalRepo = context.read<JournalRepository>();
|
||||
return BlocProvider(
|
||||
create: (_) => SearchBloc(journalRepository: journalRepo),
|
||||
child: const SearchPage(),
|
||||
);
|
||||
},
|
||||
),
|
||||
GoRoute(
|
||||
path: '/profile',
|
||||
@@ -178,6 +189,20 @@ GoRouter createAppRouter(AuthBloc authBloc) {
|
||||
parentNavigatorKey: _rootNavigatorKey,
|
||||
builder: (context, state) => const MoodPage(),
|
||||
),
|
||||
// 周概览(全屏,从日历页进入)
|
||||
GoRoute(
|
||||
path: '/weekly',
|
||||
name: 'weekly',
|
||||
parentNavigatorKey: _rootNavigatorKey,
|
||||
builder: (context, state) => const WeeklyPage(),
|
||||
),
|
||||
// 月度概览(全屏,从日历页进入)
|
||||
GoRoute(
|
||||
path: '/monthly',
|
||||
name: 'monthly',
|
||||
parentNavigatorKey: _rootNavigatorKey,
|
||||
builder: (context, state) => const MonthlyPage(),
|
||||
),
|
||||
GoRoute(
|
||||
path: '/class',
|
||||
name: 'class',
|
||||
@@ -194,7 +219,12 @@ GoRouter createAppRouter(AuthBloc authBloc) {
|
||||
path: '/parent',
|
||||
name: 'parent',
|
||||
parentNavigatorKey: _rootNavigatorKey,
|
||||
builder: (context, state) => const ParentPage(),
|
||||
builder: (context, state) {
|
||||
return BlocProvider(
|
||||
create: (_) => ParentBloc(api: context.read<ApiClient>()),
|
||||
child: const ParentPage(),
|
||||
);
|
||||
},
|
||||
),
|
||||
GoRoute(
|
||||
path: '/achievements',
|
||||
|
||||
Reference in New Issue
Block a user