This commit is contained in:
zhutao
2025-11-20 18:00:34 +08:00
parent 701b99b138
commit b7239292d1
45 changed files with 1499 additions and 354 deletions

View File

@@ -1,5 +1,9 @@
import 'package:app/config/theme/base/app_theme_ext.dart';
import 'package:app/providers/user_store.dart';
import 'package:app/router/route_paths.dart';
import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
import 'package:provider/provider.dart';
import 'package:remixicon/remixicon.dart';
class Header extends StatelessWidget implements PreferredSizeWidget {
@@ -18,6 +22,7 @@ class Header extends StatelessWidget implements PreferredSizeWidget {
children: [
Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
"学光自习室",
@@ -31,9 +36,27 @@ class Header extends StatelessWidget implements PreferredSizeWidget {
),
Row(
children: [
IconButton(
onPressed: () {},
icon: Icon(RemixIcons.user_line),
PopupMenuButton(
color: Colors.white,
padding: EdgeInsets.zero,
position: PopupMenuPosition.under,
onSelected: (value) {
if (value == 1) {
UserStore userStore = context.read<UserStore>();
userStore.logout();
context.go(RoutePaths.login);
}
},
itemBuilder: (context) => [
PopupMenuItem(
value: 1,
child: Text("退出登录", textAlign: TextAlign.center),
),
],
child: IconButton(
onPressed: null,
icon: Icon(RemixIcons.user_line),
),
),
],
),

View File

@@ -1,127 +1,174 @@
import 'package:app/pages/teacher/home/viewmodel/home_view_model.dart';
import 'package:app/request/dto/room/room_info_dto.dart';
import 'package:app/router/route_paths.dart';
import 'package:app/utils/permission.dart';
import 'package:app/widgets/base/button/index.dart';
import 'package:app/widgets/base/card/g_card.dart';
import 'package:app/widgets/base/config/config.dart';
import 'package:app/widgets/base/tag/index.dart';
import 'package:app/widgets/base/empty/index.dart';
import 'package:flutter/material.dart';
import 'package:flutter_easyloading/flutter_easyloading.dart';
import 'package:go_router/go_router.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:provider/provider.dart';
import 'package:remixicon/remixicon.dart';
import 'package:skeletonizer/skeletonizer.dart';
class TodayCard extends StatelessWidget {
class TodayCard extends StatefulWidget {
const TodayCard({super.key});
@override
State<TodayCard> createState() => _TodayCardState();
}
class _TodayCardState extends State<TodayCard> {
///前往会议室
void _goToRoom() {
checkPermission(
permissions: [Permission.microphone, Permission.camera],
onGranted: () {
final vm = context.read<HomeViewModel>();
context.push(
RoutePaths.tRoom,
extra: {
"roomId": vm.roomInfo!.id,
"startTime": vm.roomInfo!.startTime,
},
);
},
onDenied: () {
EasyLoading.showError("请开启权限");
},
onPermanentlyDenied: () {
EasyLoading.showError("请手动开启麦克风和摄像头权限");
},
);
}
@override
Widget build(BuildContext context) {
/// item
Widget item({
required String title,
required String value,
required IconData icon,
required Color color,
}) {
return Expanded(
child: Container(
padding: EdgeInsets.all(10),
decoration: BoxDecoration(
color: color.withValues(alpha: 0.2),
borderRadius: BorderRadius.circular(10),
),
child: Row(
spacing: 10,
children: [
Container(
width: 45,
height: 45,
decoration: BoxDecoration(
color: color,
borderRadius: BorderRadius.circular(10),
),
child: Icon(
icon,
color: Colors.white,
),
),
Column(
return Consumer<HomeViewModel>(
builder: (context, vm, _) {
return GCard(
child: Visibility(
visible: !vm.loading && vm.roomInfo == null,
replacement: Skeletonizer(
enabled: vm.loading,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(title, style: Theme.of(context).textTheme.labelLarge),
Text(value),
],
),
],
),
),
);
}
return GCard(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
children: [
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
spacing: 10,
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
spacing: 10,
children: [
Skeleton.replace(
replacement: Bone.text(),
child: Text(vm.roomInfo?.roomName ?? ""),
),
],
),
Container(
margin: EdgeInsets.only(top: 5),
child: Text(
"和学生们一起专注学习、共同进步",
style: Theme.of(context).textTheme.labelMedium,
),
),
],
),
Container(
margin: EdgeInsets.only(top: 30),
child: Row(
spacing: 15,
children: [
Text("高三数学冲刺班"),
Tag(text: "开始"),
_item(
title: "开始时间",
value: vm.roomInfo?.startTime ?? "",
icon: RemixIcons.time_line,
color: Color(0xff2b7efd),
),
_item(
title: "结束时间",
value: vm.roomInfo?.endTime ?? "",
icon: RemixIcons.group_line,
color: Color(0xff00c74f),
),
_item(
title: "时长",
value: "${vm.roomMinutes} 分钟",
icon: RemixIcons.book_open_line,
color: Color(0xffac45fd),
),
],
),
Container(
margin: EdgeInsets.only(top: 5),
child: Text(
"和学生们一起专注学习、共同进步",
style: Theme.of(context).textTheme.labelMedium,
),
),
Container(
margin: EdgeInsets.only(top: 30),
height: 45,
child: Button(
text: vm.canEnterRoom ? "开始自习室" : "未到开始时间",
type: ThemeType.success,
// disabled: !vm.canEnterRoom,
onPressed: _goToRoom,
),
],
),
),
],
),
Icon(RemixIcons.arrow_right_s_line, size: 30),
],
),
child: SizedBox(
child: Column(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: [
Empty(text: "未分配自习室"),
],
),
),
),
Container(
margin: EdgeInsets.only(top: 30),
child: Row(
spacing: 15,
);
},
);
}
Widget _item({
required String title,
required String value,
required IconData icon,
required Color color,
}) {
return Expanded(
child: Container(
padding: EdgeInsets.all(10),
decoration: BoxDecoration(
color: color.withValues(alpha: 0.2),
borderRadius: BorderRadius.circular(10),
),
child: Row(
spacing: 10,
children: [
Container(
width: 45,
height: 45,
decoration: BoxDecoration(
color: color,
borderRadius: BorderRadius.circular(10),
),
child: Icon(
icon,
color: Colors.white,
),
),
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
item(
title: "开始时间",
value: "14:00",
icon: RemixIcons.time_line,
color: Color(0xff2b7efd),
),
item(
title: "学生人数",
value: "8 名",
icon: RemixIcons.group_line,
color: Color(0xff00c74f),
),
item(
title: "时长",
value: "120 分钟",
icon: RemixIcons.book_open_line,
color: Color(0xffac45fd),
),
Text(title, style: Theme.of(context).textTheme.labelLarge),
Text(value),
],
),
),
Container(
margin: EdgeInsets.only(top: 30),
height: 45,
child: Button(
text: "开始自习室",
type: ThemeType.success,
onPressed: () {
context.push(RoutePaths.tRoom);
},
),
),
],
],
),
),
);
}