feat(app): F8 班级系统 + F9/F10 占位页面
F8 班级系统: - ClassBloc 状态管理 (班级列表/日记墙/成员/主题/评语) - 班级主页: 日记墙 + 主题布置 Tab + 成员列表 - 老师管理页: 创建班级 + 布置主题 + 点评入口 - 班级码展示 + 评语卡片 F9 家长功能 (占位): - 家长中心页面框架: 日记查看/心情统计/使用时间/数据管理 - PIPL 合规提示卡片 F10 搜索/设置 (部分): - 个人中心: 用户信息 + 角色展示 + 功能入口 + 退出登录 - 搜索页: 标签筛选 + 心情过滤 + 搜索框 验证: flutter analyze 0 error
This commit is contained in:
@@ -1,14 +1,175 @@
|
||||
import 'package:flutter/material.dart';
|
||||
// 个人中心页面 — 用户信息 + 功能入口 + 设置
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:go_router/go_router.dart';
|
||||
import 'package:nuanji_app/core/theme/app_colors.dart';
|
||||
import 'package:nuanji_app/features/auth/bloc/auth_bloc.dart';
|
||||
|
||||
/// 个人中心页面
|
||||
class ProfilePage extends StatelessWidget {
|
||||
const ProfilePage({super.key});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return const Scaffold(
|
||||
body: Center(
|
||||
child: Text('我的 - 占位页面'),
|
||||
final theme = Theme.of(context);
|
||||
final colorScheme = theme.colorScheme;
|
||||
final authState = context.watch<AuthBloc>().state;
|
||||
final displayName = authState is Authenticated ? authState.user.displayLabel : '用户';
|
||||
final role = authState is Authenticated ? authState.user.primaryRoleType : null;
|
||||
|
||||
return SingleChildScrollView(
|
||||
padding: const EdgeInsets.all(16),
|
||||
child: Column(
|
||||
children: [
|
||||
// 用户头像卡片
|
||||
Card(
|
||||
elevation: 0,
|
||||
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(22)),
|
||||
color: colorScheme.primaryContainer,
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.all(24),
|
||||
child: Row(
|
||||
children: [
|
||||
CircleAvatar(
|
||||
radius: 32,
|
||||
backgroundColor: colorScheme.primary.withValues(alpha: 0.2),
|
||||
child: Text(
|
||||
displayName.characters.first,
|
||||
style: theme.textTheme.headlineSmall?.copyWith(color: colorScheme.primary),
|
||||
),
|
||||
),
|
||||
const SizedBox(width: 16),
|
||||
Expanded(
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Text(displayName, style: theme.textTheme.titleMedium?.copyWith(fontWeight: FontWeight.bold)),
|
||||
const SizedBox(height: 4),
|
||||
Text(
|
||||
_roleLabel(role),
|
||||
style: theme.textTheme.bodySmall?.copyWith(
|
||||
color: colorScheme.onSurface.withValues(alpha: 0.6),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
const SizedBox(height: 20),
|
||||
|
||||
// 功能入口
|
||||
_ProfileMenuItem(
|
||||
icon: Icons.auto_awesome_outlined,
|
||||
iconColor: AppColors.accent,
|
||||
title: '我的成就',
|
||||
onTap: () => context.go('/achievements'),
|
||||
),
|
||||
_ProfileMenuItem(
|
||||
icon: Icons.emoji_emotions_outlined,
|
||||
iconColor: AppColors.secondary,
|
||||
title: '贴纸收藏',
|
||||
onTap: () => context.go('/stickers'),
|
||||
),
|
||||
_ProfileMenuItem(
|
||||
icon: Icons.dashboard_customize_outlined,
|
||||
iconColor: AppColors.tertiary,
|
||||
title: '日记模板',
|
||||
onTap: () => context.go('/templates'),
|
||||
),
|
||||
_ProfileMenuItem(
|
||||
icon: Icons.groups_outlined,
|
||||
iconColor: colorScheme.primary,
|
||||
title: '我的班级',
|
||||
onTap: () => context.go('/class'),
|
||||
),
|
||||
if (role != null && role.name == 'teacher')
|
||||
_ProfileMenuItem(
|
||||
icon: Icons.school_outlined,
|
||||
iconColor: AppColors.accent,
|
||||
title: '教师管理',
|
||||
onTap: () => context.go('/teacher'),
|
||||
),
|
||||
if (role != null && role.name == 'parent')
|
||||
_ProfileMenuItem(
|
||||
icon: Icons.family_restroom_outlined,
|
||||
iconColor: AppColors.rose,
|
||||
title: '家长中心',
|
||||
onTap: () => context.go('/parent'),
|
||||
),
|
||||
const Divider(height: 32),
|
||||
_ProfileMenuItem(
|
||||
icon: Icons.bar_chart_outlined,
|
||||
iconColor: colorScheme.primary,
|
||||
title: '心情统计',
|
||||
onTap: () => context.go('/mood'),
|
||||
),
|
||||
_ProfileMenuItem(
|
||||
icon: Icons.settings_outlined,
|
||||
iconColor: colorScheme.onSurface.withValues(alpha: 0.5),
|
||||
title: '设置',
|
||||
onTap: () {
|
||||
ScaffoldMessenger.of(context).showSnackBar(
|
||||
const SnackBar(content: Text('设置页面开发中')),
|
||||
);
|
||||
},
|
||||
),
|
||||
const SizedBox(height: 16),
|
||||
|
||||
// 退出登录
|
||||
SizedBox(
|
||||
width: double.infinity,
|
||||
child: OutlinedButton(
|
||||
onPressed: () {
|
||||
context.read<AuthBloc>().add(const LogoutRequested());
|
||||
context.go('/login');
|
||||
},
|
||||
style: OutlinedButton.styleFrom(foregroundColor: colorScheme.error),
|
||||
child: const Text('退出登录'),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
String _roleLabel(dynamic role) {
|
||||
if (role == null) return '未选择角色';
|
||||
return switch (role.name) {
|
||||
'teacher' => '老师',
|
||||
'student' => '学生',
|
||||
'parent' => '家长',
|
||||
'independent' => '独立用户',
|
||||
_ => '用户',
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
class _ProfileMenuItem extends StatelessWidget {
|
||||
const _ProfileMenuItem({
|
||||
required this.icon,
|
||||
required this.iconColor,
|
||||
required this.title,
|
||||
required this.onTap,
|
||||
});
|
||||
|
||||
final IconData icon;
|
||||
final Color iconColor;
|
||||
final String title;
|
||||
final VoidCallback onTap;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final theme = Theme.of(context);
|
||||
return ListTile(
|
||||
leading: Icon(icon, color: iconColor),
|
||||
title: Text(title, style: theme.textTheme.bodyMedium),
|
||||
trailing: const Icon(Icons.chevron_right, size: 20),
|
||||
onTap: onTap,
|
||||
contentPadding: const EdgeInsets.symmetric(horizontal: 4),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user