feat(app): 老师点评功能 — CommentCreate事件 + CommentBottomSheet + 日记墙点评按钮

This commit is contained in:
iven
2026-06-01 22:49:56 +08:00
parent 973bb56af6
commit 3eaf83c79a
3 changed files with 271 additions and 7 deletions

View File

@@ -4,11 +4,14 @@ 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/core/theme/app_radius.dart';
import 'package:nuanji_app/data/models/journal_entry.dart';
import 'package:nuanji_app/data/models/school_class.dart';
import 'package:nuanji_app/data/repositories/class_repository.dart';
import 'package:nuanji_app/data/repositories/journal_repository.dart';
import '../../auth/bloc/auth_bloc.dart';
import '../bloc/class_bloc.dart';
import '../widgets/comment_bottom_sheet.dart';
/// 班级主页 — 日记墙 + 班级信息
class ClassPage extends StatelessWidget {
@@ -129,12 +132,12 @@ class _ClassListCard extends StatelessWidget {
margin: const EdgeInsets.only(bottom: 12),
elevation: 0,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(16),
borderRadius: AppRadius.mdBorder,
side: BorderSide(color: colorScheme.outlineVariant),
),
child: InkWell(
onTap: onTap,
borderRadius: BorderRadius.circular(16),
borderRadius: AppRadius.mdBorder,
child: Padding(
padding: const EdgeInsets.all(16),
child: Row(
@@ -292,12 +295,12 @@ class _DiaryWallCard extends StatelessWidget {
margin: const EdgeInsets.only(bottom: 12),
elevation: 0,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(16),
borderRadius: AppRadius.mdBorder,
side: BorderSide(color: colorScheme.outlineVariant),
),
child: InkWell(
onTap: () => context.push('/editor?id=${journal.id}'),
borderRadius: BorderRadius.circular(16),
borderRadius: AppRadius.mdBorder,
child: Padding(
padding: const EdgeInsets.all(16),
child: Column(
@@ -348,7 +351,7 @@ class _DiaryWallCard extends StatelessWidget {
padding: const EdgeInsets.all(8),
decoration: BoxDecoration(
color: colorScheme.primaryContainer.withValues(alpha: 0.3),
borderRadius: BorderRadius.circular(8),
borderRadius: AppRadius.xsBorder,
),
child: Row(
children: [
@@ -366,6 +369,36 @@ class _DiaryWallCard extends StatelessWidget {
),
),
],
// 写评语按钮(仅老师可见)
if (_isTeacher(context)) ...[
const SizedBox(height: 8),
TextButton.icon(
onPressed: () {
showModalBottomSheet(
context: context,
isScrollControlled: true,
builder: (_) => CommentBottomSheet(
journalId: journal.id,
studentName: journal.authorId, // TODO: 替换为真实昵称
onSubmit: (content) {
context.read<ClassBloc>().add(
CommentCreate(
journalId: journal.id,
content: content,
),
);
},
),
);
},
icon: const Icon(Icons.rate_review_outlined, size: 16),
label: const Text('写评语'),
style: TextButton.styleFrom(
padding: const EdgeInsets.symmetric(horizontal: 12),
minimumSize: const Size(0, 36),
),
),
],
],
),
),
@@ -373,6 +406,15 @@ class _DiaryWallCard extends StatelessWidget {
);
}
/// 判断当前用户是否是老师
bool _isTeacher(BuildContext context) {
final authState = context.read<AuthBloc>().state;
if (authState is Authenticated) {
return authState.user.isTeacher;
}
return false;
}
String _moodEmoji(Mood mood) => switch (mood) {
Mood.happy => '😊',
Mood.calm => '😌',
@@ -413,12 +455,12 @@ class _TopicsTab extends StatelessWidget {
margin: const EdgeInsets.only(bottom: 12),
elevation: 0,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(16),
borderRadius: AppRadius.mdBorder,
side: BorderSide(color: colorScheme.outlineVariant),
),
child: InkWell(
onTap: () => context.push('/editor?topic=${topic.id}'),
borderRadius: BorderRadius.circular(16),
borderRadius: AppRadius.mdBorder,
child: Padding(
padding: const EdgeInsets.all(16),
child: Column(