diff --git a/marking_app/lib/pages/homework_correction/answer_trajectory.dart b/marking_app/lib/pages/homework_correction/answer_trajectory.dart index 4f3f0e1..cd25e60 100644 --- a/marking_app/lib/pages/homework_correction/answer_trajectory.dart +++ b/marking_app/lib/pages/homework_correction/answer_trajectory.dart @@ -127,7 +127,7 @@ class _AnswerTrajectoryState extends State backgroundColor: Colors.white, title: Text( '答题轨迹', - style: TextStyle(fontSize: 16.sp, color: Color(0xFF333333)), + style: TextStyle(fontSize: 14.sp, color: Color(0xFF333333)), ), centerTitle: true, leading: IconButton( diff --git a/marking_app/lib/pages/homework_correction/answer_trajectory_job_detail.dart b/marking_app/lib/pages/homework_correction/answer_trajectory_job_detail.dart new file mode 100644 index 0000000..967160c --- /dev/null +++ b/marking_app/lib/pages/homework_correction/answer_trajectory_job_detail.dart @@ -0,0 +1,279 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_easyloading/flutter_easyloading.dart'; +import 'package:flutter_easyrefresh/easy_refresh.dart'; +import 'package:flutter_screenutil/flutter_screenutil.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/job/job_concerned_with_student.dart'; +import 'package:marking_app/common/model/job/job_concerned_with_student_params.dart'; +import 'package:marking_app/common/model/job/job_task_item.dart'; +import 'package:marking_app/components/ReturnToHomepage.dart'; +import 'package:marking_app/routes/RouterManager.dart'; +import 'package:marking_app/utils/easy_refresh/MyEmptyWidget.dart'; +import 'package:marking_app/utils/index.dart'; +import 'package:marking_app/utils/request/rest_client.dart'; + +class AnswerTrajectoryJobDetail extends StatefulWidget { + final int jobId; + final String jobName; + final String genderName; + + const AnswerTrajectoryJobDetail( + {Key? key, + required this.jobId, + required this.jobName, + required this.genderName}) + : super(key: key); + + @override + State createState() => + _AnswerTrajectoryJobDetailState(); +} + +class _AnswerTrajectoryJobDetailState extends State + with CommonMixin { + List markList = []; + late MarkingTasks currentClass; + List students = []; + late final EasyRefreshController refreshController; + + @override + void initState() { + super.initState(); + refreshController = EasyRefreshController(); + EasyLoading.show(status: 'loading...'); + getData(); + } + + void getData() async { + RestClient _client = await getClient(); + BaseStructureResult> res = + await _client.getJobListParticipateInClass(widget.jobId); + if (res.success) { + setState(() { + markList = res.data!; + if (markList.length > 0) { + currentClass = markList[0]; + getStudentList(); + } + }); + } + } + + void getStudentList() async { + RestClient _client = await getClient(); + BaseStructureResult> res = + await _client.getJobWithStudents(JobConcernedWithStudentParams([currentClass.id])); + if (res.success) { + setState(() { + students = res.data!; + }); + } + refreshController.finishRefresh(); + EasyLoading.dismiss(); + } + + @override + void dispose() { + super.dispose(); + refreshController.dispose(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: Color(0xFFF5F5F5), + appBar: AppBar( + centerTitle: true, + backgroundColor: Colors.white, + title: Text( + widget.jobName, + style: TextStyle(fontSize: 14.sp, color: Color(0xFF333333)), + overflow: TextOverflow.ellipsis, + ), + leading: IconButton( + icon: Icon(Icons.arrow_back_ios, color: Colors.black), + onPressed: () => Navigator.of(context).pop(), + ), + actions: [ + ReturnToHomepage(), + ], + ), + body: Column( + children: [ + SizedBox( + height: 10.r, + ), + if (markList.length > 0) + Padding( + padding: EdgeInsets.symmetric(horizontal: 14.r), + child: Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + SingleChildScrollView( + scrollDirection: Axis.horizontal, + child: Row( + children: List.generate(markList.length, (index) { + MarkingTasks item = markList[index]; + return InkWell( + onTap: (){ + if(currentClass.id != item.id){ + EasyLoading.show(status: 'loading...'); + setState(() { + currentClass = item; + }); + getStudentList(); + } + + }, + child: Container( + padding: EdgeInsets.symmetric( + vertical: 5.r, horizontal: 10.r), + margin: EdgeInsets.only( + right: index < markList.length ? 8.r : 0), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(4.r), + ), + child: Center( + child: Text( + '${widget.genderName}${item.className}', + style: TextStyle( + fontSize: 10.sp, + color: currentClass.id == item.id + ? Color(0xFF6888FD) + : Color(0xFF686868)), + ), + ), + ), + ); + })), + ), + ], + ), + ), + SizedBox( + height: 10.r, + ), + Container( + height: 1.r, + color: Color(0xFFCCCCCC), + ), + students.length>0? Expanded( + child: Padding( + padding: EdgeInsets.symmetric(vertical: 14.r, horizontal: 14.r), + child: EasyRefresh( + firstRefresh: true, + taskIndependence: true, + controller: refreshController, + header: MaterialHeader(), + footer: TaurusFooter(), + onRefresh: () async { + getStudentList(); + }, + child: students.length > 0 + ? isPad() + ? GridView( + gridDelegate: + SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 2, + mainAxisSpacing: 10.r, + crossAxisSpacing: 10.r, + childAspectRatio: 556 / 112, + ), + children: List.generate(students.length, (index) { + var item = students[index]; + return InkWell( + onTap: (){ + RouterManager.router.navigateTo(context, + '${RouterManager.jobPersonalDetailPath}?studentId=${item.studentId}&studentName=${Uri.encodeComponent(item.studentName)}'); + }, + child: Container( + padding: EdgeInsets.symmetric(horizontal: 10.r), + decoration: BoxDecoration( + borderRadius: + BorderRadius.all(Radius.circular(10.r)), + color: Colors.white, + ), + child: Row( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + Expanded( + child: Text( + item.studentName, + style: TextStyle( + fontSize: 12.sp, + color: Color(0xFF6888FD)), + )), + + Container( + height: 20.r, + width: 70.r, + decoration: BoxDecoration( + border: Border.all(width: 1.r,color: Color(0xFFFFA41E)), + borderRadius: BorderRadius.all(Radius.circular(20.r)), + + ), + child: Center(child: Text('详情',style: TextStyle(fontSize: 10.r,color: Color(0xFFFFA41E))), + )), + ], + ), + ), + ); + }), + ) + : ListView.builder( + itemBuilder: (context, index) { + var item = students[index]; + return InkWell( + onTap: (){ + RouterManager.router.navigateTo(context, + '${RouterManager.jobPersonalDetailPath}?studentId=${item.studentId}&studentName=${Uri.encodeComponent(item.studentName)}'); + }, + child: Container( + padding: EdgeInsets.symmetric( + vertical: 20.r, horizontal: 15.r), + margin: EdgeInsets.only(bottom: 15.r), + decoration: BoxDecoration( + borderRadius: + BorderRadius.all(Radius.circular(10.r)), + color: Colors.white, + ), + child: Row( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + Expanded( + child: Text( + item.studentName, + style: TextStyle( + fontSize: 12.sp, + color: Color(0xFF6888FD)), + )), + Container( + height: 24.r, + width: 72.r, + decoration: BoxDecoration( + border: Border.all(width: 1.r,color: Color(0xFFFFA41E)), + borderRadius: BorderRadius.all(Radius.circular(20.r)), + + ), + child: Center(child: Text('详情',style: TextStyle(fontSize: 10.r,color: Color(0xFFFFA41E))), + )), + ], + ), + ), + ); + }, + itemCount: students.length, + ) + : MyEmptyWidget(), + ), + ), + ):MyEmptyWidget(), + ], + ), + ); + } +} diff --git a/marking_app/lib/pages/homework_correction/widget/answer_trajectory_job.dart b/marking_app/lib/pages/homework_correction/widget/answer_trajectory_job.dart index 7d8bd80..afc5cd9 100644 --- a/marking_app/lib/pages/homework_correction/widget/answer_trajectory_job.dart +++ b/marking_app/lib/pages/homework_correction/widget/answer_trajectory_job.dart @@ -5,6 +5,8 @@ import 'package:marking_app/utils/easy_refresh/MyEmptyWidget.dart'; import 'package:marking_app/utils/index.dart'; import 'package:marking_app/utils/my_text.dart'; +import '../../../routes/RouterManager.dart'; + class AnswerTrajectoryJob extends StatelessWidget { final List jobList; @@ -25,110 +27,117 @@ class AnswerTrajectoryJob extends StatelessWidget { ), children: List.generate(jobList.length, (index) { JobTaskItem item = jobList[index]; - return Container( - padding: EdgeInsets.only(top: 10.h), - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(6.r), - color: Colors.white, - boxShadow: [ - BoxShadow( - color: const Color.fromRGBO(210, 216, 241, 1), - offset: Offset.zero, //阴影y轴偏移量 - blurRadius: 5.8, //阴影模糊程度 - spreadRadius: 0, //阴影扩散程度 - ) - ], - ), - child: Column( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - // 顶部任务名称 - Padding( - padding: EdgeInsets.symmetric(horizontal: 6.w), - child: Row( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Container( - width: 32.w, - height: 18.h, - alignment: Alignment.center, - padding: EdgeInsets.only(left: 2.w), - decoration: BoxDecoration( - color: const Color.fromRGBO(104, 136, 253, 1), - borderRadius: BorderRadius.only( - topLeft: Radius.circular(14.r), - topRight: Radius.circular(3.r), - bottomLeft: Radius.circular(4.r), - bottomRight: Radius.circular(4.r), - ), - ), - margin: EdgeInsets.only(right: 4.w), - child: quickText(item.markingTypeEnum.name, - color: Colors.white, size: 10.sp), - ), - Expanded( - child: quickText(item.title, - size: 12.sp, - color: Color.fromRGBO(70, 70, 70, 1), - maxLines: 2), - ), - SizedBox( - width: 5.r, - ), - Container( - padding: EdgeInsets.symmetric( - vertical: 1.r, horizontal: 5.r), - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(4.r), - border: Border.all( - width: 1.r, color: Color(0xFF4CC793)), - ), - child: Center( - child: Text( - item.subjectName, - style: TextStyle( - fontSize: 8.r, - color: Color(0xFF4CC793)), - ), - ), - ) - ], - ), - ), - - Container( - padding: EdgeInsets.symmetric(vertical: 6.h), - decoration: BoxDecoration( - borderRadius: BorderRadius.only( - bottomLeft: Radius.circular(6.r), - bottomRight: Radius.circular(6.r)), - color: Colors.white, - boxShadow: [ - BoxShadow( - color: const Color.fromRGBO(0, 0, 0, 0.15), - offset: Offset(0, -0.0001), //阴影y轴偏移量 - blurRadius: 4, //阴影模糊程度 - spreadRadius: 0, //阴影扩散程度 - ) - ], - ), - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, + return InkWell( + onTap: (){ + RouterManager.router.navigateTo(context, + '${RouterManager.answerTrajectoryJobDetailPath}?&jobId=${item.id}&jobName=${Uri.encodeComponent(item.title)}&genderName=${Uri.encodeComponent(item.genderName)}', + transition: getTransition()); + }, + child: Container( + padding: EdgeInsets.only(top: 10.h), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(6.r), + color: Colors.white, + boxShadow: [ + BoxShadow( + color: const Color.fromRGBO(210, 216, 241, 1), + offset: Offset.zero, //阴影y轴偏移量 + blurRadius: 5.8, //阴影模糊程度 + spreadRadius: 0, //阴影扩散程度 + ) + ], + ), + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + // 顶部任务名称 + Padding( + padding: EdgeInsets.symmetric(horizontal: 6.w), + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, children: [ Container( + width: 32.w, + height: 18.h, alignment: Alignment.center, - child: quickText('详情', - color: Color(0xFFFFA115), size: 12.sp), + padding: EdgeInsets.only(left: 2.w), + decoration: BoxDecoration( + color: const Color.fromRGBO(104, 136, 253, 1), + borderRadius: BorderRadius.only( + topLeft: Radius.circular(14.r), + topRight: Radius.circular(3.r), + bottomLeft: Radius.circular(4.r), + bottomRight: Radius.circular(4.r), + ), + ), + margin: EdgeInsets.only(right: 4.w), + child: quickText(item.markingTypeEnum.name, + color: Colors.white, size: 10.sp), ), - Image.asset( - 'assets/images/icon_back_orange.png', - width: 8.r, - height: 8.r, + Expanded( + child: quickText(item.title, + size: 12.sp, + color: Color.fromRGBO(70, 70, 70, 1), + maxLines: 2), ), - ]), - ), - ], + SizedBox( + width: 5.r, + ), + Container( + padding: EdgeInsets.symmetric( + vertical: 1.r, horizontal: 5.r), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(4.r), + border: Border.all( + width: 1.r, color: Color(0xFF4CC793)), + ), + child: Center( + child: Text( + item.subjectName, + style: TextStyle( + fontSize: 8.r, + color: Color(0xFF4CC793)), + ), + ), + ) + ], + ), + ), + + Container( + padding: EdgeInsets.symmetric(vertical: 6.h), + decoration: BoxDecoration( + borderRadius: BorderRadius.only( + bottomLeft: Radius.circular(6.r), + bottomRight: Radius.circular(6.r)), + color: Colors.white, + boxShadow: [ + BoxShadow( + color: const Color.fromRGBO(0, 0, 0, 0.15), + offset: Offset(0, -0.0001), //阴影y轴偏移量 + blurRadius: 4, //阴影模糊程度 + spreadRadius: 0, //阴影扩散程度 + ) + ], + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Container( + alignment: Alignment.center, + child: quickText('详情', + color: Color(0xFFFFA115), size: 10.sp), + ), + Image.asset( + 'assets/images/icon_back_orange.png', + width: 8.r, + height: 8.r, + ), + ]), + ), + ], + ), ), ); }), @@ -139,7 +148,11 @@ class AnswerTrajectoryJob extends StatelessWidget { itemBuilder: (context, index) { JobTaskItem item = jobList[index]; return InkWell( - onTap: () {}, + onTap: () { + RouterManager.router.navigateTo(context, + '${RouterManager.answerTrajectoryJobDetailPath}?&jobId=${item.id}&jobName=${Uri.encodeComponent(item.title)}&genderName=${Uri.encodeComponent(item.genderName)}', + transition: getTransition()); + }, child: Container( margin: EdgeInsets.symmetric(vertical: 10.r), padding: EdgeInsets.only(top: 10.h), @@ -240,7 +253,7 @@ class AnswerTrajectoryJob extends StatelessWidget { Container( alignment: Alignment.center, child: quickText('详情', - color: Color(0xFFFFA115), size: 12.sp), + color: Color(0xFFFFA115), size: 10.sp), ), Image.asset( 'assets/images/icon_back_orange.png', diff --git a/marking_app/lib/routes/RouterManager.dart b/marking_app/lib/routes/RouterManager.dart index 0b0a0f0..197370c 100644 --- a/marking_app/lib/routes/RouterManager.dart +++ b/marking_app/lib/routes/RouterManager.dart @@ -14,6 +14,7 @@ import 'package:flutter/material.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/homework_correction/answer_trajectory.dart'; +import 'package:marking_app/pages/homework_correction/answer_trajectory_job_detail.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'; @@ -86,6 +87,7 @@ class RouterManager { static const String jobKnowledgePointsPath = '/homework_correction/job_knowledge_points'; static const String jobKnowledgePointsDetailPath = '/homework_correction/job_knowledge_points_detail'; static const String answerTrajectoryPath = '/homework_correction/answer_trajectory'; + static const String answerTrajectoryJobDetailPath = '/homework_correction/answer_trajectory_job_detail'; // TheMine static final FluroRouter router = FluroRouter(); @@ -404,7 +406,15 @@ class RouterManager { }, ); - +//答题轨迹按作业详情 + static final _answerTrajectoryJobDetailPathHandler = Handler( + handlerFunc: (BuildContext? context, Map> params) { + int jobId = int.parse(params['jobId']![0]); + String jobName = params['jobName']![0]; + String genderName = params['genderName']![0]; + return AnswerTrajectoryJobDetail(jobId:jobId,jobName:jobName,genderName:genderName); + }, + ); // 开始阅卷页面 // static final _doMarkingPapers = Handler(handlerFunc: (BuildContext? context, Map> params) => MarkingPapers()); @@ -455,6 +465,7 @@ class RouterManager { router.define(jobKnowledgePointsPath, handler: _jobKnowledgePointsPathHandler, transitionType: TransitionType.material); router.define(jobKnowledgePointsDetailPath, handler: _jobKnowledgePointsDetailPathHandler, transitionType: TransitionType.material); router.define(answerTrajectoryPath, handler: _answerTrajectoryPathHandler, transitionType: TransitionType.material); + router.define(answerTrajectoryJobDetailPath, handler: _answerTrajectoryJobDetailPathHandler, transitionType: TransitionType.material); // getTransition()