diff --git a/making_school_asignment_app/assets/images/icon_back_orange.png b/making_school_asignment_app/assets/images/icon_back_orange.png new file mode 100644 index 0000000..ea7f871 Binary files /dev/null and b/making_school_asignment_app/assets/images/icon_back_orange.png differ diff --git a/making_school_asignment_app/lib/page/home_page/children/answer_trajectory/answer_trajectory_binding.dart b/making_school_asignment_app/lib/page/home_page/children/answer_trajectory/answer_trajectory_binding.dart new file mode 100644 index 0000000..014d7c6 --- /dev/null +++ b/making_school_asignment_app/lib/page/home_page/children/answer_trajectory/answer_trajectory_binding.dart @@ -0,0 +1,10 @@ +import 'package:get/get.dart'; + +import 'answer_trajectory_logic.dart'; + +class AnswerTrajectoryBinding extends Bindings { + @override + void dependencies() { + Get.lazyPut(() => AnswerTrajectoryLogic()); + } +} diff --git a/making_school_asignment_app/lib/page/home_page/children/answer_trajectory/answer_trajectory_logic.dart b/making_school_asignment_app/lib/page/home_page/children/answer_trajectory/answer_trajectory_logic.dart new file mode 100644 index 0000000..e97dd17 --- /dev/null +++ b/making_school_asignment_app/lib/page/home_page/children/answer_trajectory/answer_trajectory_logic.dart @@ -0,0 +1,59 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_easyloading/flutter_easyloading.dart'; +import 'package:flutter_easyrefresh/easy_refresh.dart'; +import 'package:get/get.dart'; +import 'package:making_school_asignment_app/common/job/class_item.dart'; +import 'package:making_school_asignment_app/common/job/work_student.dart'; +import 'package:making_school_asignment_app/common/job/work_student_params.dart'; +import 'package:making_school_asignment_app/common/mixins/request_tool_mixin.dart'; +import 'package:making_school_asignment_app/routes/app_pages.dart'; + +import 'answer_trajectory_state.dart'; + +class AnswerTrajectoryLogic extends GetxController with RequestToolMixin, GetTickerProviderStateMixin{ + final AnswerTrajectoryState state = AnswerTrajectoryState(); + late TabController tabController; + late final EasyRefreshController refreshController; + late final EasyRefreshController refreshController2; + @override + void onInit(){ + super.onInit(); + refreshController = EasyRefreshController(); + refreshController2 = EasyRefreshController(); + tabController = + TabController(initialIndex: state.tabIndex.value, length: 2, vsync: this); + getStudentGroups(); + getWorkList(); + } + + goNextPage(id, title,subject) { + Get.toNamed(Routes.classStudentPage,arguments: {'title':title,'classId':id,'page':'answerTrajectory','subject':subject}); + } + + void getStudentGroups() async{ + List data = await getClient().getStudentClass(); + state.studentGroups.value = data; + EasyLoading.dismiss(); + refreshController.finishRefresh(); + } + + void getWorkList() async{ + WorkStudentParams params = WorkStudentParams( + assessType: 0, + pageSize: 10, + ); + params.pageNumber = state.page; + WorkStudent data = await getClient().getAnnotatedList(params); + state.jobList.value = data.items; + EasyLoading.dismiss(); + refreshController2.finishRefresh(); + } + + @override + void dispose(){ + super.dispose(); + tabController.dispose(); + refreshController.dispose(); + refreshController2.dispose(); + } +} diff --git a/making_school_asignment_app/lib/page/home_page/children/answer_trajectory/answer_trajectory_state.dart b/making_school_asignment_app/lib/page/home_page/children/answer_trajectory/answer_trajectory_state.dart new file mode 100644 index 0000000..c8e7c1f --- /dev/null +++ b/making_school_asignment_app/lib/page/home_page/children/answer_trajectory/answer_trajectory_state.dart @@ -0,0 +1,15 @@ +import 'package:get/get.dart'; +import 'package:making_school_asignment_app/common/job/class_item.dart'; +import 'package:making_school_asignment_app/common/job/work_student.dart'; + +class AnswerTrajectoryState { + AnswerTrajectoryState() { + ///Initialize variables + } + + late RxInt tabIndex = 0.obs; + late RxList studentGroups = RxList(); + late RxList jobList = RxList(); + late int page = 1; + late int total = 0; +} diff --git a/making_school_asignment_app/lib/page/home_page/children/answer_trajectory/answer_trajectory_view.dart b/making_school_asignment_app/lib/page/home_page/children/answer_trajectory/answer_trajectory_view.dart new file mode 100644 index 0000000..e6742b2 --- /dev/null +++ b/making_school_asignment_app/lib/page/home_page/children/answer_trajectory/answer_trajectory_view.dart @@ -0,0 +1,167 @@ +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:get/get.dart'; +import 'package:making_school_asignment_app/page/global_widget/ReturnToHomepage.dart'; +import 'package:making_school_asignment_app/page/home_page/children/answer_trajectory/widget/answer_trajectory_job.dart'; +import 'package:making_school_asignment_app/page/home_page/widget/student_group_list.dart'; + +import 'answer_trajectory_logic.dart'; + +class AnswerTrajectoryPage extends StatefulWidget { + const AnswerTrajectoryPage({Key? key}) : super(key: key); + + @override + State createState() => _AnswerTrajectoryPageState(); +} + +class _AnswerTrajectoryPageState extends State { + final logic = Get.find(); + final state = Get + .find() + .state; + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: Color.fromRGBO(245, 245, 245, 1), + appBar: AppBar( + backgroundColor: Colors.white, + title: Text( + '答题轨迹', + style: TextStyle(fontSize: 14.sp, color: Color(0xFF333333)), + ), + centerTitle: true, + leading: IconButton( + icon: Icon(Icons.arrow_back_ios, color: Colors.black), + onPressed: () => Navigator.of(context).pop(), + ), + actions: const [ + ReturnToHomepage(), + ], + ), + body: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox( + height: 10.r, + ), + Container( + padding: EdgeInsets.symmetric(horizontal: 14.r), + decoration: BoxDecoration( + border: Border( + bottom: BorderSide(width: 1.r, color: Color(0xFFCCCCCC)))), + child: TabBar( + onTap: (int val) { + state.tabIndex.value = val; + // EasyLoading.show(status: 'loading...'); + /* if(val == 0){ + logic.getStudentGroups(); + }else{ + logic.getWorkList(); + }*/ + }, + tabs: [ + SizedBox( + width: (MediaQuery + .of(context) + .size + .width - 28.r) / 2, + child: const Tab( + text: '按学生', + ), + ), + SizedBox( + width: (MediaQuery + .of(context) + .size + .width - 28.r) / 2, + child: const Tab( + text: '按作业', + ), + ) + ], + controller: logic.tabController, + unselectedLabelStyle: + TextStyle(fontSize: 14.sp, color: Color(0xFF666666)), + labelStyle: TextStyle( + fontSize: 14.sp, + color: Color(0xFF6888FD), + ), + isScrollable: true, + labelColor: Color(0xFF6888FD), + unselectedLabelColor: Color(0xFF666666), + indicatorSize: TabBarIndicatorSize.label, + labelPadding: const EdgeInsets.all(0), + ), + ), + Obx(() { + return Expanded( + child: Padding( + padding: + EdgeInsets.only(top: 15.r, left: 14.r, right: 14.r), + child: + state.tabIndex.value == 0 + ? + EasyRefresh( + firstRefresh: false, + taskIndependence: true, + controller: logic.refreshController, + header: MaterialHeader(), + footer: TaurusFooter(), + onRefresh: () async { + logic.getStudentGroups(); + }, + child: StudentGroupList( + state.studentGroups, logic.goNextPage, + rightBtn: Container( + margin: EdgeInsets.only(left: 5.r), + height: 20.r, + width: 55.r, + decoration: BoxDecoration( + borderRadius: + BorderRadius.all(Radius.circular(20.r)), + border: Border.all( + width: 1.r, color: Color(0xFFFF9800)), + ), + child: Center( + child: Text( + '详情', + style: TextStyle( + fontSize: 10.sp, color: Color(0xFFFF9800)), + ), + ), + )), + ) : EasyRefresh( + firstRefresh: false, + taskIndependence: true, + controller: logic.refreshController2, + header: MaterialHeader(), + footer: TaurusFooter(), + onRefresh: () async { + state.page = 1; + logic.getWorkList(); + }, + onLoad: () async { + if (state.jobList.length < state.total) { + EasyLoading.show(status: 'loading...'); + state.page = state.page + 1; + logic.getWorkList(); + } + }, + child: AnswerTrajectoryJob(state.jobList.value)), + ), + ); + }) + ], + ), + ); + } + + @override + void dispose() { + Get.delete(); + super.dispose(); + } +} \ No newline at end of file diff --git a/making_school_asignment_app/lib/page/home_page/children/answer_trajectory/widget/answer_trajectory_job.dart b/making_school_asignment_app/lib/page/home_page/children/answer_trajectory/widget/answer_trajectory_job.dart new file mode 100644 index 0000000..1a99ba8 --- /dev/null +++ b/making_school_asignment_app/lib/page/home_page/children/answer_trajectory/widget/answer_trajectory_job.dart @@ -0,0 +1,299 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:making_school_asignment_app/common/job/work_student.dart'; +import 'package:making_school_asignment_app/common/utils/enum_untils.dart'; +import 'package:making_school_asignment_app/common/utils/utils.dart'; +import 'package:making_school_asignment_app/page/global_widget/MyEmptyWidget.dart'; +import 'package:making_school_asignment_app/page/global_widget/my_text.dart'; + +class AnswerTrajectoryJob extends StatelessWidget { + final List jobList; + + const AnswerTrajectoryJob(this.jobList, {Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return jobList != null && jobList.isNotEmpty + ? Utils.isPad() + ? GridView( + shrinkWrap: true, + physics: const ClampingScrollPhysics(), + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 2, //横轴三个子widget + mainAxisSpacing: 10.h, + crossAxisSpacing: 6.w, + childAspectRatio: 2.4 //宽高比为1时,子widget + ), + children: List.generate(jobList.length, (index) { + Items item = jobList[index]; + 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: const [ + BoxShadow( + color: Color.fromRGBO(210, 216, 241, 1), + offset: Offset.zero, //阴影y轴偏移量 + blurRadius: 5.8, //阴影模糊程度 + spreadRadius: 0, //阴影扩散程度 + ) + ], + ), + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.start, + 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.assessType == 0 ? '作业' : '考试', + color: Colors.white, + size: 10.sp), + ), + Expanded( + child: quickText(item.name, + 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( + EnumUtils.formatSubject(item.subject), + style: TextStyle( + fontSize: 8.r, + color: Color(0xFF4CC793)), + ), + ), + ) + ], + ), + ), + Padding( + padding: EdgeInsets.symmetric(horizontal: 6.r), + child: Text( + '时间:${item.publishTime.substring(0, 10)}', + style: TextStyle(fontSize: 10.sp), + ), + ), + 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: const [ + BoxShadow( + color: 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, + ), + ]), + ), + ], + ), + ), + ); + }), + ) + : ListView.builder( + shrinkWrap: true, + physics: ClampingScrollPhysics(), + itemBuilder: (context, index) { + Items item = jobList[index]; + 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( + margin: EdgeInsets.symmetric(vertical: 10.r), + padding: EdgeInsets.only(top: 10.h), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(6.r), + color: Colors.white, + boxShadow: const [ + BoxShadow( + color: Color.fromRGBO(210, 216, 241, 1), + offset: Offset.zero, //阴影y轴偏移量 + blurRadius: 5.8, //阴影模糊程度 + spreadRadius: 0, //阴影扩散程度 + ) + ], + ), + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // 顶部任务名称 + Padding( + padding: EdgeInsets.symmetric( + vertical: 14.r, horizontal: 14.r), + 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.assessType == 0 ? '作业' : '考试', + color: Colors.white, + size: 10.sp), + ), + Expanded( + child: quickText(item.name, + size: 14.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( + EnumUtils.formatSubject(item.subject), + style: TextStyle( + fontSize: 12.r, + color: Color(0xFF4CC793)), + ), + ), + ) + ], + ), + ), + SizedBox( + height: 5.r, + ), + Padding( + padding: EdgeInsets.symmetric(horizontal: 14.r), + child: Text( + '时间:${item.publishTime.substring(0, 10)}', + style: TextStyle(fontSize: 10.sp), + ), + ), + SizedBox( + height: 10.r, + ), + Container( + height: 1.r, + color: Color(0xFFF5F5F5), + ), + Container( + padding: EdgeInsets.symmetric(vertical: 10.r), + 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, + ), + ]), + ), + ], + ), + ), + ); + }, + itemCount: jobList.length, + ) + : const MyEmptyWidget(); + } +} diff --git a/making_school_asignment_app/lib/page/home_page/home_view.dart b/making_school_asignment_app/lib/page/home_page/home_view.dart index 254238b..3d63e3d 100644 --- a/making_school_asignment_app/lib/page/home_page/home_view.dart +++ b/making_school_asignment_app/lib/page/home_page/home_view.dart @@ -71,7 +71,7 @@ class _HomePageState extends State with AutomaticKeepAliveClientMixin }), spaceWidth, $TermRow([ - EntranceModel(title: '答题轨迹', image: 'assets/images/job_home_answer_record.png', navigationUrl: ''), + EntranceModel(title: '答题轨迹', image: 'assets/images/job_home_answer_record.png', navigationUrl: Routes.answerTrajectoryPage), EntranceModel( title: '优先批阅设定', image: 'assets/images/job_home_youxian.png', diff --git a/making_school_asignment_app/lib/routes/app_pages.dart b/making_school_asignment_app/lib/routes/app_pages.dart index bc12ce3..5259946 100644 --- a/making_school_asignment_app/lib/routes/app_pages.dart +++ b/making_school_asignment_app/lib/routes/app_pages.dart @@ -3,6 +3,8 @@ import 'package:making_school_asignment_app/page/global_widget/other_page.dart'; import 'package:making_school_asignment_app/page/global_widget/start_page.dart'; import 'package:making_school_asignment_app/page/home_page/children/annotate_class/annotate_class_binding.dart'; import 'package:making_school_asignment_app/page/home_page/children/annotate_class/annotate_class_view.dart'; +import 'package:making_school_asignment_app/page/home_page/children/answer_trajectory/answer_trajectory_binding.dart'; +import 'package:making_school_asignment_app/page/home_page/children/answer_trajectory/answer_trajectory_view.dart'; import 'package:making_school_asignment_app/page/home_page/children/class_student/class_student_binding.dart'; import 'package:making_school_asignment_app/page/home_page/children/class_student/class_student_view.dart'; import 'package:making_school_asignment_app/page/home_page/children/job_report/job_report_binding.dart'; @@ -75,5 +77,7 @@ abstract class AppPages { page: () => const KnowledgePointsGraspDetailPage(), binding: KnowledgePointsGraspDetailBinding(), transition: Transition.noTransition), + GetPage(name: Routes.answerTrajectoryPage, page: () => const AnswerTrajectoryPage(), binding: AnswerTrajectoryBinding(), transition: Transition.noTransition), + ]; } diff --git a/making_school_asignment_app/lib/routes/app_routes.dart b/making_school_asignment_app/lib/routes/app_routes.dart index d83db38..fd766b0 100644 --- a/making_school_asignment_app/lib/routes/app_routes.dart +++ b/making_school_asignment_app/lib/routes/app_routes.dart @@ -18,4 +18,5 @@ abstract class Routes { static const studentWorkDetailPage = '/studentWorkDetailPage'; static const knowledgePointsGraspPage = '/knowledgePointsGraspPage'; static const knowledgePointsGraspDetailPage = '/knowledgePointsGraspDetailPage'; + static const answerTrajectoryPage = '/answerTrajectoryPage'; } \ No newline at end of file