Compare commits

..

6 Commits

Author SHA1 Message Date
machuanyu 7e3c6882e9 合并代码 2024-04-11 17:19:21 +08:00
machuanyu 794e4d6cbe Merge branch 'mcy_revision' into job_new_demand
# Conflicts:
#	marking_app/lib/routes/RouterManager.dart
2024-04-11 17:18:15 +08:00
1147192855@qq.com f63c1ea678 Merge branch 'mcy_revision' of https://gitea.23544.com/marking/Marking.Client.Moblie into job_new_demand 2024-04-11 16:12:27 +08:00
1147192855@qq.com 74c8148305 no message 2024-04-11 15:53:31 +08:00
1147192855@qq.com ee41ad7d1b 添加作业首页 2024-04-11 15:53:04 +08:00
1147192855@qq.com 5a43ccffcf no message 2024-04-11 14:29:27 +08:00
6 changed files with 257 additions and 40 deletions

1
.gitignore vendored
View File

@ -214,3 +214,4 @@ marking_app/lib/pages/homework_correction/job_personal_detail.g.dart
marking_app/lib/common/model/event_bus/jobs/job_do_papers_submit_check_switch_bus.g.dart marking_app/lib/common/model/event_bus/jobs/job_do_papers_submit_check_switch_bus.g.dart
marking_app/lib/common/model/event_bus/jobs/job_do_synchro_tab.g.dart marking_app/lib/common/model/event_bus/jobs/job_do_synchro_tab.g.dart
marking_app/lib/pages/homework_correction/widget/top_count.g.dart marking_app/lib/pages/homework_correction/widget/top_count.g.dart
marking_app/lib/common/model/event_bus/job_home_refresh_bus.g.dart

View File

@ -0,0 +1,12 @@
import 'package:json_annotation/json_annotation.dart';
part 'job_home_refresh_bus.g.dart';
@JsonSerializable()
class JobHomeRefreshBus extends Object {
JobHomeRefreshBus();
factory JobHomeRefreshBus.fromJson(Map<String, dynamic> srcJson) => _$JobHomeRefreshBusFromJson(srcJson);
Map<String, dynamic> toJson() => _$JobHomeRefreshBusToJson(this);
}

View File

@ -7,6 +7,8 @@
* @Description: * @Description:
*/ */
import 'dart:async';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:flutter_hooks/flutter_hooks.dart';
@ -16,7 +18,9 @@ import 'package:flutter_easyrefresh/easy_refresh.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:marking_app/common/config/request_config.dart'; import 'package:marking_app/common/config/request_config.dart';
import 'package:marking_app/common/model/event_bus/job_home_refresh_bus.dart';
import 'package:marking_app/common/model/job/job_task_item.dart'; import 'package:marking_app/common/model/job/job_task_item.dart';
import 'package:marking_app/pages/common/event_bus_mixin.dart';
import 'package:marking_app/pages/homework_correction/components/new_version_of_homework/homework_tasks_view_item.dart'; import 'package:marking_app/pages/homework_correction/components/new_version_of_homework/homework_tasks_view_item.dart';
import 'package:marking_app/provider/review_provider.dart'; import 'package:marking_app/provider/review_provider.dart';
import 'package:marking_app/routes/RouterManager.dart'; import 'package:marking_app/routes/RouterManager.dart';
@ -40,14 +44,7 @@ class HomeworkCorrection extends StatefulHookConsumerWidget {
} }
class _HomeworkCorrectionState extends ConsumerState<HomeworkCorrection> class _HomeworkCorrectionState extends ConsumerState<HomeworkCorrection>
with with CommonMixin, EventBusMixin, TickerProviderStateMixin, RefreshDataHandle<JobTaskItem, MarkingListParams> {
CommonMixin,
TickerProviderStateMixin,
RefreshDataHandle<JobTaskItem, MarkingListParams>,
AutomaticKeepAliveClientMixin {
@override
bool get wantKeepAlive => true;
/* Tab控制器 */ /* Tab控制器 */
late TabController _tabController; late TabController _tabController;
late TabController _tabController2; late TabController _tabController2;
@ -127,6 +124,7 @@ class _HomeworkCorrectionState extends ConsumerState<HomeworkCorrection>
_tabController.dispose(); _tabController.dispose();
_refreshController1.dispose(); _refreshController1.dispose();
_refreshController2.dispose(); _refreshController2.dispose();
eventCancel();
super.dispose(); super.dispose();
} }
@ -152,8 +150,6 @@ class _HomeworkCorrectionState extends ConsumerState<HomeworkCorrection>
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
super.build(context); //super.build(null)
return AnnotatedRegion( return AnnotatedRegion(
value: const SystemUiOverlayStyle( value: const SystemUiOverlayStyle(
systemNavigationBarColor: Color(0xFF000000), systemNavigationBarColor: Color(0xFF000000),
@ -176,7 +172,19 @@ class _HomeworkCorrectionState extends ConsumerState<HomeworkCorrection>
child: Row( child: Row(
crossAxisAlignment: CrossAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center,
children: [ children: [
Expanded(flex: 1, child: SizedBox()), Expanded(
flex: 1,
child: Container(
alignment: Alignment.centerLeft,
padding: EdgeInsets.only(left: 10.w),
child: InkWell(
onTap: () => easyThrottle('BACK_JOB_HOME', () => Navigator.of(context).pop()),
child: Icon(
Icons.arrow_back_ios_sharp,
size: 16.sp,
),
),
)),
Expanded( Expanded(
flex: 4, flex: 4,
child: Container( child: Container(
@ -226,9 +234,7 @@ class _HomeworkCorrectionState extends ConsumerState<HomeworkCorrection>
child: quickText( child: quickText(
'待批阅', '待批阅',
size: 14.sp, size: 14.sp,
color: _tabIndex == 0 color: _tabIndex == 0 ? Theme.of(context).primaryColor : const Color.fromRGBO(80, 94, 110, 1),
? Theme.of(context).primaryColor
: const Color.fromRGBO(80, 94, 110, 1),
fontWeight: _tabIndex == 0 ? FontWeight.bold : null, fontWeight: _tabIndex == 0 ? FontWeight.bold : null,
), ),
), ),
@ -246,9 +252,7 @@ class _HomeworkCorrectionState extends ConsumerState<HomeworkCorrection>
child: quickText( child: quickText(
'已批阅', '已批阅',
size: 14.sp, size: 14.sp,
color: _tabIndex == 1 color: _tabIndex == 1 ? Theme.of(context).primaryColor : const Color.fromRGBO(80, 94, 110, 1),
? Theme.of(context).primaryColor
: const Color.fromRGBO(80, 94, 110, 1),
fontWeight: _tabIndex == 1 ? FontWeight.bold : null, fontWeight: _tabIndex == 1 ? FontWeight.bold : null,
), ),
), ),
@ -261,11 +265,9 @@ class _HomeworkCorrectionState extends ConsumerState<HomeworkCorrection>
flex: 1, flex: 1,
child: InkWell( child: InkWell(
onTap: () { onTap: () {
RouterManager.router RouterManager.router.navigateTo(context, RouterManager.jobStudentGroupPath, transition: getTransition());
.navigateTo(context, RouterManager.jobStudentGroupPath, transition: getTransition());
}, },
child: Icon(IconData(0xe63e, fontFamily: "AlibabaIcon"), child: Icon(IconData(0xe63e, fontFamily: "AlibabaIcon"), color: Color.fromRGBO(44, 48, 63, 1), size: 24.sp),
color: Color.fromRGBO(44, 48, 63, 1), size: 24.sp),
), ),
), ),
], ],
@ -323,6 +325,9 @@ class _HomeworkCorrectionState extends ConsumerState<HomeworkCorrection>
data: markingDatas1, data: markingDatas1,
onLoad: onMyLoad, onLoad: onMyLoad,
onRefresh: onMyRefresh, onRefresh: onMyRefresh,
eventFire: () {
eventFire(model: JobHomeRefreshBus());
},
), ),
$EasyRefresh( $EasyRefresh(
controller: _refreshController2, controller: _refreshController2,
@ -331,6 +336,9 @@ class _HomeworkCorrectionState extends ConsumerState<HomeworkCorrection>
data: markingDatas2, data: markingDatas2,
onLoad: onMyLoad, onLoad: onMyLoad,
onRefresh: onMyRefresh, onRefresh: onMyRefresh,
eventFire: () {
eventFire(model: JobHomeRefreshBus());
},
), ),
], ],
), ),
@ -352,6 +360,7 @@ Widget $easyRefresh({
required EasyRefreshController controller, required EasyRefreshController controller,
required Future<void> Function(EasyRefreshController controller, MarkingListParams params, int tab) onRefresh, required Future<void> Function(EasyRefreshController controller, MarkingListParams params, int tab) onRefresh,
required Future<void> Function(EasyRefreshController controller, MarkingListParams params, int tab) onLoad, required Future<void> Function(EasyRefreshController controller, MarkingListParams params, int tab) onLoad,
required Function eventFire,
required MarkingListParams params, required MarkingListParams params,
required List<JobTaskItem> data, required List<JobTaskItem> data,
required int tab, required int tab,
@ -384,7 +393,10 @@ Widget $easyRefresh({
return HomeworkTasksViewItem( return HomeworkTasksViewItem(
completed: completed, completed: completed,
jobTaskItem: data[index], jobTaskItem: data[index],
call: () => controller.callRefresh(), call: () {
controller.callRefresh();
eventFire();
},
); );
}, },
itemCount: data.length, itemCount: data.length,
@ -432,9 +444,7 @@ Widget $reviewedItem(BuildContext context, {required JobTaskItem jobTaskItem}) {
alignment: Alignment.center, alignment: Alignment.center,
padding: EdgeInsets.only(left: 2.w), padding: EdgeInsets.only(left: 2.w),
decoration: BoxDecoration( decoration: BoxDecoration(
color: jobTaskItem.markingTypeEnum.name == '作业' color: jobTaskItem.markingTypeEnum.name == '作业' ? const Color.fromRGBO(104, 136, 253, 1) : const Color.fromRGBO(255, 175, 56, 1),
? const Color.fromRGBO(104, 136, 253, 1)
: const Color.fromRGBO(255, 175, 56, 1),
borderRadius: BorderRadius.only( borderRadius: BorderRadius.only(
topLeft: Radius.circular(14.r), topLeft: Radius.circular(14.r),
topRight: Radius.circular(3.r), topRight: Radius.circular(3.r),
@ -495,8 +505,7 @@ Widget $reviewedItem(BuildContext context, {required JobTaskItem jobTaskItem}) {
onTap: () => easyThrottle('go_to_homework_report', () { onTap: () => easyThrottle('go_to_homework_report', () {
RouterManager.router.navigateTo( RouterManager.router.navigateTo(
context, context,
RouterManager.jobReportPagePath + RouterManager.jobReportPagePath + '?title=${Uri.encodeComponent(jobTaskItem.title)}&id=${jobTaskItem.id}',
'?title=${Uri.encodeComponent(jobTaskItem.title)}&id=${jobTaskItem.id}',
transition: getTransition(), transition: getTransition(),
); );
}), }),
@ -539,8 +548,7 @@ Widget $theTabBar({required TabController controller, ValueChanged<int>? onTap,
if (customTime.endDate != null) { if (customTime.endDate != null) {
// print(customTime.startDate!.year == customTime.endDate!.year); // print(customTime.startDate!.year == customTime.endDate!.year);
if (!isPad() && customTime.startDate!.year == customTime.endDate!.year) { if (!isPad() && customTime.startDate!.year == customTime.endDate!.year) {
customTimeStr = customTimeStr = customTime.startDate.toString().substring(5, 10) + '~${customTime.endDate.toString().substring(5, 10)}';
customTime.startDate.toString().substring(5, 10) + '~${customTime.endDate.toString().substring(5, 10)}';
} else { } else {
customTimeStr += '~${customTime.endDate?.toString().substring(0, 10)}'; customTimeStr += '~${customTime.endDate?.toString().substring(0, 10)}';
} }

View File

@ -0,0 +1,192 @@
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:marking_app/common/mixin/common.dart';
import 'package:marking_app/common/model/event_bus/job_home_refresh_bus.dart';
import 'package:marking_app/common/model/marking/marking_list_params.dart';
import 'package:marking_app/pages/common/event_bus_mixin.dart';
import 'package:marking_app/routes/RouterManager.dart';
import 'package:marking_app/utils/index.dart';
import 'package:marking_app/utils/my_text.dart';
import 'package:badges/badges.dart' as badges;
import '../../utils/my_future_builder.dart';
class JobHome extends StatefulWidget {
const JobHome({super.key});
@override
State<JobHome> createState() => _JobHomeState();
}
class _JobHomeState extends State<JobHome> with CommonMixin, EventBusMixin, AutomaticKeepAliveClientMixin {
@override
bool get wantKeepAlive => true;
late Future<int> _future;
List<EntranceModel> entrances = [
EntranceModel(
title: '作业批阅',
image: '',
navigationUrl: RouterManager.jobMainListPagePath,
),
EntranceModel(
title: '学生历史作业',
image: '',
navigationUrl: '',
),
EntranceModel(
title: '知识点掌握',
image: '',
navigationUrl: '',
),
EntranceModel(
title: '答题轨迹',
image: '',
navigationUrl: '',
),
EntranceModel(
title: '优先批阅设定',
image: '',
navigationUrl: '',
),
EntranceModel(
title: '批阅设置',
image: '',
navigationUrl: '',
),
];
@override
void initState() {
_future = getData();
eventOn(callback: (JobHomeRefreshBus item) {
_future = getData();
toUpState(setState, () {}, mounted);
});
super.initState();
}
@override
void dispose() {
eventCancel();
super.dispose();
}
Future<int> getData() async {
try {
var _client = await getClient();
var _result = await _client.getJobsByPage(MarkingListParams(
isFinish: false,
page: 1,
limit: 1,
pageType: 0,
));
return _result.data?.total ?? 0;
} catch (e) {
return 0;
}
}
@override
Widget build(BuildContext context) {
super.build(context);
return AnnotatedRegion(
value: const SystemUiOverlayStyle(
systemNavigationBarColor: Color(0xFF000000),
systemNavigationBarDividerColor: null,
statusBarColor: Colors.white,
systemNavigationBarIconBrightness: Brightness.light,
statusBarIconBrightness: Brightness.dark,
statusBarBrightness: Brightness.light,
),
child: Scaffold(
appBar: AppBar(
backgroundColor: Colors.white,
centerTitle: true, //
title: quickText('我的作业管理'),
systemOverlayStyle: SystemUiOverlayStyle.dark,
),
backgroundColor: Color.fromRGBO(244, 244, 244, 1),
body: RefreshIndicator(
onRefresh: () async {
_future = getData();
toUpState(setState, () {}, mounted);
},
child: MyFutureBuilder.buildFutureBuilderOfSingleInstance<int>(context, _future, (data) {
if (data == null)
return Center(
child: Container(
child: TextButton(
onPressed: () {
_future = getData();
toUpState(setState, () {}, mounted);
},
child: quickText('没有获取到数据,点击重试'),
),
),
);
return Container(
padding: EdgeInsets.symmetric(vertical: 40.h, horizontal: 20.w),
child: GridView(
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 2,
mainAxisSpacing: 24.r,
crossAxisSpacing: 24.r,
childAspectRatio: 556 / 200,
),
children: entrances.map((e) {
bool isJob = e.title == '作业批阅';
return InkWell(
onTap: () => easyThrottle('GO_TO_JOB_HOME_NAVIGATION', () {
RouterManager.router.navigateTo(context, e.navigationUrl, transition: getTransition());
}),
child: badges.Badge(
showBadge: isJob && data > 0,
ignorePointer: false,
badgeContent: quickText(data, color: Colors.white),
badgeAnimation: badges.BadgeAnimation.rotation(
animationDuration: Duration(seconds: 1),
colorChangeAnimationDuration: Duration(seconds: 1),
loopAnimation: false,
curve: Curves.fastOutSlowIn,
colorChangeAnimationCurve: Curves.easeInCubic,
),
child: Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.all(Radius.circular(6.r)),
border: Border.all(
width: 0.5.w,
color: Color.fromARGB(255, 219, 226, 250),
),
),
alignment: Alignment.center,
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
// Image(image: e.image),
quickText(e.title, size: 12.sp),
],
),
),
));
}).toList(),
),
);
}),
),
),
);
}
}
class EntranceModel extends Object {
String title;
String image;
String navigationUrl;
EntranceModel({required this.title, required this.image, required this.navigationUrl});
}

View File

@ -16,11 +16,9 @@ import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:marking_app/common/mixin/common.dart'; import 'package:marking_app/common/mixin/common.dart';
import 'package:marking_app/common/model/common/base_structure_result.dart'; import 'package:marking_app/common/model/common/base_structure_result.dart';
import 'package:marking_app/common/model/user/user_info.dart'; import 'package:marking_app/common/model/user/user_info.dart';
import 'package:marking_app/pages/homework_correction/index.dart';
import 'package:marking_app/pages/reports/index.dart'; import 'package:marking_app/pages/reports/index.dart';
import 'package:marking_app/provider/do_marking_provider.dart'; import 'package:marking_app/provider/do_marking_provider.dart';
import 'package:marking_app/provider/upload_file_provider.dart'; import 'package:marking_app/provider/upload_file_provider.dart';
import 'package:marking_app/routes/RouterManager.dart';
import 'package:marking_app/utils/app_upgrade/UpdateDialog.dart'; import 'package:marking_app/utils/app_upgrade/UpdateDialog.dart';
import 'package:marking_app/utils/app_upgrade/model/UpdateAppEvent.dart'; import 'package:marking_app/utils/app_upgrade/model/UpdateAppEvent.dart';
import 'package:marking_app/common/model/sys/system_version.dart'; import 'package:marking_app/common/model/sys/system_version.dart';
@ -31,6 +29,8 @@ import 'package:marking_app/utils/index.dart';
import 'package:marking_app/utils/request/rest_client.dart'; import 'package:marking_app/utils/request/rest_client.dart';
import 'package:package_info/package_info.dart'; import 'package:package_info/package_info.dart';
import 'homework_correction/job_home.dart';
class TheMainPage extends StatefulHookConsumerWidget { class TheMainPage extends StatefulHookConsumerWidget {
const TheMainPage({Key? key}) : super(key: key); const TheMainPage({Key? key}) : super(key: key);
@ -49,7 +49,8 @@ class TheMainPageState extends ConsumerState<TheMainPage> with CommonMixin {
final List<Widget> _bodyList = [ final List<Widget> _bodyList = [
const TheHomePage(), const TheHomePage(),
const TheMarking(), const TheMarking(),
const HomeworkCorrection(), // const HomeworkCorrection(),
const JobHome(),
const TheReport() const TheReport()
]; ];
int tabIndex = 0; int tabIndex = 0;
@ -130,14 +131,8 @@ class TheMainPageState extends ConsumerState<TheMainPage> with CommonMixin {
// String buildNumber = packageInfo.buildNumber; // // String buildNumber = packageInfo.buildNumber; //
SystemVersion data = result.data!; SystemVersion data = result.data!;
Map json = { Map json = {'downloadPath': data.apkUrl, 'version': data.version, 'systemType': deviceType, 'description': data.description};
'downloadPath': data.apkUrl, UpdateAppEvent updateAppEvent = UpdateAppEvent.fromJson(json, localVersion, deviceInfo, appName, packageName, typeName: 'systemType');
'version': data.version,
'systemType': deviceType,
'description': data.description
};
UpdateAppEvent updateAppEvent =
UpdateAppEvent.fromJson(json, localVersion, deviceInfo, appName, packageName, typeName: 'systemType');
if (updateAppEvent.upgrade) { if (updateAppEvent.upgrade) {
await UpdateDialog.showUpdateDialog(context, updateAppEvent); await UpdateDialog.showUpdateDialog(context, updateAppEvent);
} }

View File

@ -14,6 +14,7 @@ import 'package:flutter/material.dart';
import 'package:marking_app/common/model/enum/marking_list_type.dart'; import 'package:marking_app/common/model/enum/marking_list_type.dart';
import 'package:marking_app/pages/common/startUpPage.dart'; import 'package:marking_app/pages/common/startUpPage.dart';
import 'package:marking_app/pages/homework_correction/do_papers_job_exam.dart'; import 'package:marking_app/pages/homework_correction/do_papers_job_exam.dart';
import 'package:marking_app/pages/homework_correction/index.dart';
import 'package:marking_app/pages/homework_correction/job_knowledge_points.dart'; import 'package:marking_app/pages/homework_correction/job_knowledge_points.dart';
import 'package:marking_app/pages/homework_correction/job_knowledge_points_detail.dart'; import 'package:marking_app/pages/homework_correction/job_knowledge_points_detail.dart';
import 'package:marking_app/pages/homework_correction/job_personal_detail.dart'; import 'package:marking_app/pages/homework_correction/job_personal_detail.dart';
@ -66,6 +67,8 @@ class RouterManager {
static const String jobListParticipateInClassPath = '/job/list/participateInClass'; static const String jobListParticipateInClassPath = '/job/list/participateInClass';
// ==> // ==>
static const String jobFavoritePagePath = '/job/favorite/index'; static const String jobFavoritePagePath = '/job/favorite/index';
// ==>
static const String jobMainListPagePath = '/job/mainList/index';
static const String reportClassTeacherPath = 'report/details/reportClassTeacher'; static const String reportClassTeacherPath = 'report/details/reportClassTeacher';
static const String reportSubjectTeacherPath = 'report/details/reportSubjectTeacher'; static const String reportSubjectTeacherPath = 'report/details/reportSubjectTeacher';
@ -351,6 +354,11 @@ class RouterManager {
}, },
); );
//
static final _jobMainListPathHandler = Handler(
handlerFunc: (BuildContext? context, Map<String, List<String>> params) => HomeworkCorrection(),
);
// //
static final _reportCardDialogPathHandler = Handler( static final _reportCardDialogPathHandler = Handler(
handlerFunc: (BuildContext? context, Map<String, List<String>> params) { handlerFunc: (BuildContext? context, Map<String, List<String>> params) {
@ -431,6 +439,7 @@ class RouterManager {
router.define(jobPersonalDetailPath, handler: _jobPersonalDetailPathHandler, transitionType: TransitionType.material); router.define(jobPersonalDetailPath, handler: _jobPersonalDetailPathHandler, transitionType: TransitionType.material);
router.define(reportCardDialogPath, handler: _reportCardDialogPathHandler, transitionType: TransitionType.material); router.define(reportCardDialogPath, handler: _reportCardDialogPathHandler, transitionType: TransitionType.material);
router.define(reportHistoryPath, handler: _reportHistoryPathHandler, transitionType: TransitionType.material); router.define(reportHistoryPath, handler: _reportHistoryPathHandler, transitionType: TransitionType.material);
router.define(jobMainListPagePath, handler: _jobMainListPathHandler, transitionType: TransitionType.material);
router.define(jobKnowledgePointsPath, handler: _jobKnowledgePointsPathHandler, transitionType: TransitionType.material); router.define(jobKnowledgePointsPath, handler: _jobKnowledgePointsPathHandler, transitionType: TransitionType.material);
router.define(jobKnowledgePointsDetailPath, handler: _jobKnowledgePointsDetailPathHandler, transitionType: TransitionType.material); router.define(jobKnowledgePointsDetailPath, handler: _jobKnowledgePointsDetailPathHandler, transitionType: TransitionType.material);