From 3dcbf121aa4a01baf10f667763c6796a67fbc344 Mon Sep 17 00:00:00 2001 From: machuanyu <840649825@qq.com> Date: Mon, 27 May 2024 17:48:49 +0800 Subject: [PATCH] =?UTF-8?q?=E7=9F=A5=E8=AF=86=E7=82=B9=E6=8E=8C=E6=8F=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../knowledge_points_grasp_binding.dart | 10 + .../knowledge_points_grasp_logic.dart | 40 +++ .../knowledge_points_grasp_state.dart | 16 + .../knowledge_points_grasp_view.dart | 265 ++++++++++++++++ ...knowledge_points_grasp_detail_binding.dart | 10 + .../knowledge_points_grasp_detail_logic.dart | 42 +++ .../knowledge_points_grasp_detail_state.dart | 16 + .../knowledge_points_grasp_detail_view.dart | 282 ++++++++++++++++++ 8 files changed, 681 insertions(+) create mode 100644 lib/page/home_page/children/knowledge_points_grasp/knowledge_points_grasp_binding.dart create mode 100644 lib/page/home_page/children/knowledge_points_grasp/knowledge_points_grasp_logic.dart create mode 100644 lib/page/home_page/children/knowledge_points_grasp/knowledge_points_grasp_state.dart create mode 100644 lib/page/home_page/children/knowledge_points_grasp/knowledge_points_grasp_view.dart create mode 100644 lib/page/home_page/children/knowledge_points_grasp_detail/knowledge_points_grasp_detail_binding.dart create mode 100644 lib/page/home_page/children/knowledge_points_grasp_detail/knowledge_points_grasp_detail_logic.dart create mode 100644 lib/page/home_page/children/knowledge_points_grasp_detail/knowledge_points_grasp_detail_state.dart create mode 100644 lib/page/home_page/children/knowledge_points_grasp_detail/knowledge_points_grasp_detail_view.dart diff --git a/lib/page/home_page/children/knowledge_points_grasp/knowledge_points_grasp_binding.dart b/lib/page/home_page/children/knowledge_points_grasp/knowledge_points_grasp_binding.dart new file mode 100644 index 0000000..30336e8 --- /dev/null +++ b/lib/page/home_page/children/knowledge_points_grasp/knowledge_points_grasp_binding.dart @@ -0,0 +1,10 @@ +import 'package:get/get.dart'; + +import 'knowledge_points_grasp_logic.dart'; + +class KnowledgePointsGraspBinding extends Bindings { + @override + void dependencies() { + Get.lazyPut(() => KnowledgePointsGraspLogic()); + } +} diff --git a/lib/page/home_page/children/knowledge_points_grasp/knowledge_points_grasp_logic.dart b/lib/page/home_page/children/knowledge_points_grasp/knowledge_points_grasp_logic.dart new file mode 100644 index 0000000..a7e810c --- /dev/null +++ b/lib/page/home_page/children/knowledge_points_grasp/knowledge_points_grasp_logic.dart @@ -0,0 +1,40 @@ +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:school_asignment_app/common/job/knowledge_points_grasp.dart'; +import 'package:school_asignment_app/common/mixins/request_tool_mixin.dart'; + +import 'knowledge_points_grasp_state.dart'; + +class KnowledgePointsGraspLogic extends GetxController with RequestToolMixin,GetSingleTickerProviderStateMixin { + final KnowledgePointsGraspState state = KnowledgePointsGraspState(); + //文本输入框控制器 + late final TextEditingController textController; + late final EasyRefreshController refreshController; + late TabController tabController; + + @override + void onInit(){ + super.onInit(); + textController = TextEditingController(); + refreshController = EasyRefreshController(); + tabController = TabController(length: 3, vsync: this); + EasyLoading.show(status: 'loading...'); + getList(); + } + + void getList() async{ + List data = await getClient().getKnowledgeReport(state.dateStart,state.dateEnd,textController.text); + state.dataList.value = data; + EasyLoading.dismiss(); + } + + @override + void dispose(){ + super.dispose(); + textController.dispose(); + refreshController.dispose(); + tabController.dispose(); + } +} diff --git a/lib/page/home_page/children/knowledge_points_grasp/knowledge_points_grasp_state.dart b/lib/page/home_page/children/knowledge_points_grasp/knowledge_points_grasp_state.dart new file mode 100644 index 0000000..a614247 --- /dev/null +++ b/lib/page/home_page/children/knowledge_points_grasp/knowledge_points_grasp_state.dart @@ -0,0 +1,16 @@ +import 'package:get/get.dart'; +import 'package:school_asignment_app/common/job/knowledge_points_grasp.dart'; +import 'package:school_asignment_app/common/utils/utils.dart'; + +class KnowledgePointsGraspState { + KnowledgePointsGraspState() { + ///Initialize variables + } + + late int page = 1; + late int totalPages = 0; + late RxList dataList=RxList(); + late String dateStart = Utils.getWeekStartDate().toString().substring(0, 10); + late String dateEnd = Utils.getWeekEndDate().toString().substring(0, 10); + late RxString customTimeStr = '自定义'.obs; +} diff --git a/lib/page/home_page/children/knowledge_points_grasp/knowledge_points_grasp_view.dart b/lib/page/home_page/children/knowledge_points_grasp/knowledge_points_grasp_view.dart new file mode 100644 index 0000000..691f6b1 --- /dev/null +++ b/lib/page/home_page/children/knowledge_points_grasp/knowledge_points_grasp_view.dart @@ -0,0 +1,265 @@ +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:school_asignment_app/common/job/knowledge_points_grasp.dart'; +import 'package:school_asignment_app/common/utils/utils.dart'; +import 'package:school_asignment_app/page/global_widget/MyEmptyWidget.dart'; +import 'package:school_asignment_app/page/global_widget/ReturnToHomepage.dart'; +import 'package:school_asignment_app/page/home_page/children/student_work_detail/widget/job_condition_filter.dart'; +import 'package:school_asignment_app/page/home_page/widget/progress_bar.dart'; +import 'package:school_asignment_app/routes/app_pages.dart'; +import 'package:syncfusion_flutter_datepicker/datepicker.dart'; + +import 'knowledge_points_grasp_logic.dart'; + +class KnowledgePointsGraspPage extends StatefulWidget { + const KnowledgePointsGraspPage({Key? key}) : super(key: key); + + @override + State createState() => + _KnowledgePointsGraspPageState(); +} + +class _KnowledgePointsGraspPageState 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(), + ], + elevation: 0, + ), + body: Column( + children: [ + Container( + margin: EdgeInsets.all(15.r), + height: 30.r, + child: Row( + children: [ + Expanded( + child: Container( + padding: EdgeInsets.only(left: 10.r, right: 10.r), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(6.r), + border: Border.all(width: 1.r, color: Color(0xFFDDDDDD)), + color: Colors.white, + ), + child: TextField( + controller: logic.textController, + textInputAction: TextInputAction.next, + style: TextStyle( + color: const Color.fromRGBO(80, 87, 103, 1), + fontSize: 10.sp, + ), + decoration: InputDecoration( + hintText: "请输入知识点名称", + hintStyle: TextStyle(fontSize: 10.sp, + color: const Color.fromRGBO(153, 153, 153, 1)), + labelStyle: TextStyle(fontSize: 10.sp, + color: const Color.fromRGBO(148, 163, 182, 1)), + border: InputBorder.none, + ), + ), + ), + ), + SizedBox(width: 10.r,), + InkWell( + onTap: () { + state.page = 1; + logic.getList(); + }, + child: Container( + width: 50.r, + height: 30.r, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(4.r), + color: Color(0xFF6888FD), + ), + child: Center( + child: Text('查询', style: TextStyle( + fontSize: 12.sp, color: Colors.white),), + ), + ), + ) + ], + ), + ), + + + Obx(() { + return JobConditionFilter( + jobType: 1, + controller: logic.tabController, + customTimeStr: state.customTimeStr.value, + customTime: logic.tabController.index != 2 || + ((state.dateEnd == null || state.dateEnd == '') && + (state.dateStart == null || state.dateStart == '')) + ? null + : PickerDateRange( + state.dateStart == null || state.dateStart == '' + ? null + : DateTime + .parse(state.dateStart!), + state.dateEnd == null || state.dateEnd == '' ? null : DateTime + .parse(state.dateEnd!), + ), + onTimeFilter: (String? startTime, String? endTime) { + EasyLoading.show(status: 'loading...'); + if (startTime == null && endTime == null) { + if (logic.tabController.index == 2) { + logic.tabController.animateTo(0); + } + state.dateStart = Utils.getWeekStartDate().toString().substring(0, 10); + state.dateEnd = Utils.getWeekEndDate().toString().substring(0, 10); + state.customTimeStr.value = '自定义'; + } else { + state.dateStart = startTime ?? ''; + state.dateEnd = endTime ?? ''; + } + state.page = 1; + logic.getList(); + // _refreshController2.callRefresh(); + }, + refreshTime: (value) { + if (value != null && value.startDate != null) { + state.customTimeStr.value = + value.startDate?.toString().substring(0, 10) ?? ''; + if (value.endDate != null) { + if (!Utils.isPad() && + value.startDate!.year == value.endDate!.year) { + state.customTimeStr.value = + '${value.startDate.toString().substring(5, 10)}~${value + .endDate.toString().substring(5, 10)}'; + } else { + state.customTimeStr.value = + '${state.customTimeStr.value}~${value.endDate?.toString() + .substring(0, 10)}'; + } + } + } + },); + }), + Expanded( + child: Padding( + padding: EdgeInsets.symmetric(vertical: 10.r), + child: Obx(() { + return EasyRefresh( + firstRefresh: false, + taskIndependence: true, + controller: logic.refreshController, + header: MaterialHeader(), + footer: TaurusFooter(), + onRefresh: () async { + state.page = 1; + logic.getList(); + }, + onLoad: () async { + if (state.page < state.totalPages) { + state.page += 1; + logic.getList(); + } + }, + child: state.dataList.isNotEmpty + ? ListView.builder( + itemCount: state.dataList.value.length, + itemBuilder: (context, index) { + KnowledgePointsGrasp item = state.dataList[index]; + return InkWell( + onTap: () { + Get.toNamed(Routes.knowledgePointsGraspDetailPage,arguments: {'dateStart':state.dateStart,'dateEnd':state.dateEnd,'knowledgeId':item.knowledgeId,'knowledgeName':item.knowledgeName}); + }, + child: Container( + margin: EdgeInsets.symmetric( + vertical: 5.r, horizontal: 14.r), + padding: EdgeInsets.symmetric( + vertical: 14.r, horizontal: 10.r), + decoration: BoxDecoration( + borderRadius: BorderRadius.all( + Radius.circular(10.r)), + color: Colors.white), + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + Expanded( + child: Text( + item.knowledgeName, + style: TextStyle(fontSize: 14.sp, + color: Color(0xFF505050)), + )), + + Container( + width: 49.r, + height: 22.r, + decoration: BoxDecoration( + borderRadius: BorderRadius.all( + Radius.circular(20.r)), + border: Border.all(width: 1.r, + color: Color(0xFF6888FD)), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment + .center, + children: [ + Text( + '${item.count}次', + style: TextStyle(fontSize: 10.sp, + color: Color(0xFF6888FD)), + ), + Image.asset( + 'assets/images/right_icon_blue.png', + width: 8.r, height: 8.r,), + ], + ), + ), + ], + ), + SizedBox(height: 10.r,), + ProgressBar( + title: '正确率:', + color: Color(0xFF90E0BE), + percent: item.correctRate / 100, + padingEdg: EdgeInsets.zero, + marginEdg: EdgeInsets.only(top: 8.h)), + ], + ), + ), + ); + }) + : const MyEmptyWidget(), + ); + }), + ), + ), + ], + ), + ); + } + + @override + void dispose() { + Get.delete(); + super.dispose(); + } +} \ No newline at end of file diff --git a/lib/page/home_page/children/knowledge_points_grasp_detail/knowledge_points_grasp_detail_binding.dart b/lib/page/home_page/children/knowledge_points_grasp_detail/knowledge_points_grasp_detail_binding.dart new file mode 100644 index 0000000..d7cf072 --- /dev/null +++ b/lib/page/home_page/children/knowledge_points_grasp_detail/knowledge_points_grasp_detail_binding.dart @@ -0,0 +1,10 @@ +import 'package:get/get.dart'; + +import 'knowledge_points_grasp_detail_logic.dart'; + +class KnowledgePointsGraspDetailBinding extends Bindings { + @override + void dependencies() { + Get.lazyPut(() => KnowledgePointsGraspDetailLogic()); + } +} diff --git a/lib/page/home_page/children/knowledge_points_grasp_detail/knowledge_points_grasp_detail_logic.dart b/lib/page/home_page/children/knowledge_points_grasp_detail/knowledge_points_grasp_detail_logic.dart new file mode 100644 index 0000000..4e116e1 --- /dev/null +++ b/lib/page/home_page/children/knowledge_points_grasp_detail/knowledge_points_grasp_detail_logic.dart @@ -0,0 +1,42 @@ +import 'package:flutter_easyloading/flutter_easyloading.dart'; +import 'package:flutter_easyrefresh/easy_refresh.dart'; +import 'package:get/get.dart'; +import 'package:school_asignment_app/common/job/homework_details.dart'; +import 'package:school_asignment_app/common/job/knowledge_report_detail.dart'; +import 'package:school_asignment_app/common/mixins/request_tool_mixin.dart'; + +import 'knowledge_points_grasp_detail_state.dart'; + +class KnowledgePointsGraspDetailLogic extends GetxController with RequestToolMixin{ + final KnowledgePointsGraspDetailState state = KnowledgePointsGraspDetailState(); + late final EasyRefreshController refreshController; + + + @override + void onInit(){ + super.onInit(); + state.dateStart = Get.arguments['dateStart']; + state.dateEnd = Get.arguments['dateEnd']; + state.knowledgeId = Get.arguments['knowledgeId']; + state.knowledgeName.value = Get.arguments['knowledgeName']; + refreshController = EasyRefreshController(); + EasyLoading.show(status: 'loading...'); + getList(); + } + + void getList() async{ + List data = await getClient().getKnowledgeReportDetail(state.dateStart,state.dateEnd,state.knowledgeId); + state.dataList.value = data; + EasyLoading.dismiss(); + } + + getStudents(homeworkId,templateId,questionNo) async{ + List data = await getClient().getQuestionStudentState(homeworkId,templateId,questionNo); + state.studentList.value = data; + } + @override + void dispose(){ + super.dispose(); + refreshController.dispose(); + } +} diff --git a/lib/page/home_page/children/knowledge_points_grasp_detail/knowledge_points_grasp_detail_state.dart b/lib/page/home_page/children/knowledge_points_grasp_detail/knowledge_points_grasp_detail_state.dart new file mode 100644 index 0000000..4406b97 --- /dev/null +++ b/lib/page/home_page/children/knowledge_points_grasp_detail/knowledge_points_grasp_detail_state.dart @@ -0,0 +1,16 @@ +import 'package:get/get.dart'; +import 'package:school_asignment_app/common/job/homework_details.dart'; +import 'package:school_asignment_app/common/job/knowledge_report_detail.dart'; + +class KnowledgePointsGraspDetailState { + KnowledgePointsGraspDetailState() { + ///Initialize variables + } + + late String dateStart = ''; + late String dateEnd = ''; + late int knowledgeId = 0; + late RxList dataList=RxList(); + late RxList studentList=RxList(); + late RxString knowledgeName=''.obs; +} diff --git a/lib/page/home_page/children/knowledge_points_grasp_detail/knowledge_points_grasp_detail_view.dart b/lib/page/home_page/children/knowledge_points_grasp_detail/knowledge_points_grasp_detail_view.dart new file mode 100644 index 0000000..9d96913 --- /dev/null +++ b/lib/page/home_page/children/knowledge_points_grasp_detail/knowledge_points_grasp_detail_view.dart @@ -0,0 +1,282 @@ +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:percent_indicator/percent_indicator.dart'; +import 'package:school_asignment_app/common/job/knowledge_report_detail.dart'; +import 'package:school_asignment_app/common/utils/toast_utils.dart'; +import 'package:school_asignment_app/page/global_widget/MyEmptyWidget.dart'; +import 'package:school_asignment_app/page/global_widget/ReturnToHomepage.dart'; +import 'package:school_asignment_app/page/global_widget/my_text.dart'; +import 'package:school_asignment_app/page/global_widget/show_student_list.dart'; + +import 'knowledge_points_grasp_detail_logic.dart'; + +class KnowledgePointsGraspDetailPage extends StatefulWidget { + const KnowledgePointsGraspDetailPage({Key? key}) : super(key: key); + + @override + State createState() => + _KnowledgePointsGraspDetailPageState(); +} + +class _KnowledgePointsGraspDetailPageState + extends State { + final logic = Get.find(); + final state = Get.find().state; + + @override + Widget build(BuildContext context) { + void showImg(imgUrl, context) { + if (imgUrl != null && imgUrl != '') { + showDialog( + context: context, + builder: (BuildContext context) { + return AlertDialog( + insetPadding: + EdgeInsets.symmetric(vertical: 55.r, horizontal: 45.r), + contentPadding: EdgeInsets.all(0), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.all(Radius.circular(15.r))), + content: Container( + width: MediaQuery.of(context).size.width, + // height: MediaQuery.of(context).size.height, + child: Image.network(imgUrl), + ), + ); + }, + ); + } else { + ToastUtils.showError('暂无图片'); + } + + EasyLoading.dismiss(); + } + + void showStudent(homeworkId,templateId,questionNo, title) async { + await logic.getStudents(homeworkId,templateId,questionNo); + + showDialog( + context: context, + builder: (BuildContext context) { + return ShowStudentList(title:title,studentList:state.studentList.value,homeworkId: homeworkId,); + }, + ); + EasyLoading.dismiss(); + } + + return Scaffold( + backgroundColor: Color.fromRGBO(245, 245, 245, 1), + appBar: AppBar( + backgroundColor: Colors.white, + title: Obx(() { + return Text(state.knowledgeName.value, + 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(), + ], + elevation: 0, + ), + body: Padding( + padding: EdgeInsets.symmetric(vertical: 10.r), + child: Obx(() { + return EasyRefresh( + firstRefresh: false, + taskIndependence: true, + controller: logic.refreshController, + header: MaterialHeader(), + footer: TaurusFooter(), + onRefresh: () async { + logic.getList(); + }, + onLoad: () async { + // getList(); + }, + child: state.dataList.isNotEmpty + ? ListView.builder( + itemCount: state.dataList.length, + itemBuilder: (context, index) { + KnowledgeReportDetail item = state.dataList[index]; + return InkWell( + onTap: () { + /* RouterManager.router.navigateTo( + context, + RouterManager.quickCheckPersonalPath + + '?jobId=${item.jobName}&studentId=$studentId', + transition: getTransition(), + );*/ + }, + child: Container( + margin: EdgeInsets.symmetric( + vertical: 5.r, horizontal: 14.r), + padding: EdgeInsets.symmetric( + vertical: 14.r, horizontal: 10.r), + decoration: BoxDecoration( + borderRadius: + BorderRadius.all(Radius.circular(10.r)), + color: Colors.white), + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + Text( + item.publishTime.substring(0, 10), + style: TextStyle( + fontSize: 14.sp, + color: Color(0xFF505050)), + ), + SizedBox( + width: 10.r, + ), + Expanded( + child: Text( + item.homeworkName, + style: TextStyle( + fontSize: 14.sp, + color: Color(0xFF505050)), + )), + InkWell( + onTap: () { + EasyLoading.show(status: 'loading...'); + showImg(item.questionPicture, context); + }, + child: Container( + width: 49.r, + height: 22.r, + decoration: BoxDecoration( + borderRadius: BorderRadius.all( + Radius.circular(20.r)), + border: Border.all( + width: 1.r, + color: Color(0xFF8B8B8B)), + ), + child: Center( + child: Text( + '第${item.questionNo}题', + style: TextStyle( + fontSize: 10.sp, + color: Color(0xFF8B8B8B)), + ), + ), + ), + ), + ], + ), + SizedBox( + height: 10.r, + ), + Container( + margin: EdgeInsets.only(top: 8.h), + padding: EdgeInsets.zero, + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + InkWell( + onTap: () { + EasyLoading.show(status: 'loading...'); + showStudent( + item.homeworkId, item.templateId,item.questionNo,item.homeworkName); + }, + child: Container( + margin: EdgeInsets.only(right: 6.r), + width: 56.r, + height: 20.r, + decoration: BoxDecoration( + color: Color(0xFFD4FFED), + borderRadius: + BorderRadius.circular(20.r), + ), + child: Row( + mainAxisAlignment: + MainAxisAlignment.center, + children: [ + quickText('正确率', + color: Color(0xFF4CC793), + size: 10.sp), + Image.asset( + 'assets/images/icon_back_green.png', + width: 8.r, + height: 8.r, + ) + ], + )), + ), + Expanded( + flex: 1, + child: Container( + child: Row( + children: [ + Expanded( + child: Container( + decoration: BoxDecoration( + borderRadius: + BorderRadius.circular( + 10.r), + ), + child: LinearPercentIndicator( + padding: EdgeInsets.zero, + animation: true, + lineHeight: 8.h, + animationDuration: 2500, + percent: + item.correctRate / 100, + progressColor: + Color(0xFF90E0BE), + backgroundColor: + Color(0xFFE8E8E8), + barRadius: + Radius.circular(10.r), + ), + ), + ), + SizedBox(width: 4.w), + quickText( + '${item.correctRate.toStringAsFixed(0)}%', + size: 10.sp, + color: Color(0xFF606060)) + ], + ), + ), + ), + ], + ), + ), + /* progressBar(context, + title: '正确率 >', + color: Color(0xFF90E0BE), + percent: item.correctRate / 100, + padingEdg: EdgeInsets.zero, + marginEdg: EdgeInsets.only(top: 8.h), + studentCall:showStudent(item.questionId,item.jobName), + ),*/ + ], + ), + ), + ); + }) + : const MyEmptyWidget(), + ); + }), + ), + ); + } + + @override + void dispose() { + Get.delete(); + super.dispose(); + } +}