知识点掌握

This commit is contained in:
machuanyu 2024-05-27 17:48:49 +08:00
parent e349922528
commit 3dcbf121aa
8 changed files with 681 additions and 0 deletions

View File

@ -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());
}
}

View File

@ -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<KnowledgePointsGrasp> 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();
}
}

View File

@ -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<KnowledgePointsGrasp> dataList=RxList();
late String dateStart = Utils.getWeekStartDate().toString().substring(0, 10);
late String dateEnd = Utils.getWeekEndDate().toString().substring(0, 10);
late RxString customTimeStr = '自定义'.obs;
}

View File

@ -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<KnowledgePointsGraspPage> createState() =>
_KnowledgePointsGraspPageState();
}
class _KnowledgePointsGraspPageState extends State<KnowledgePointsGraspPage> {
final logic = Get.find<KnowledgePointsGraspLogic>();
final state = Get
.find<KnowledgePointsGraspLogic>()
.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<KnowledgePointsGraspLogic>();
super.dispose();
}
}

View File

@ -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());
}
}

View File

@ -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<KnowledgeReportDetail> data = await getClient().getKnowledgeReportDetail(state.dateStart,state.dateEnd,state.knowledgeId);
state.dataList.value = data;
EasyLoading.dismiss();
}
getStudents(homeworkId,templateId,questionNo) async{
List<Students> data = await getClient().getQuestionStudentState(homeworkId,templateId,questionNo);
state.studentList.value = data;
}
@override
void dispose(){
super.dispose();
refreshController.dispose();
}
}

View File

@ -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<KnowledgeReportDetail> dataList=RxList();
late RxList<Students> studentList=RxList();
late RxString knowledgeName=''.obs;
}

View File

@ -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<KnowledgePointsGraspDetailPage> createState() =>
_KnowledgePointsGraspDetailPageState();
}
class _KnowledgePointsGraspDetailPageState
extends State<KnowledgePointsGraspDetailPage> {
final logic = Get.find<KnowledgePointsGraspDetailLogic>();
final state = Get.find<KnowledgePointsGraspDetailLogic>().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<KnowledgePointsGraspDetailLogic>();
super.dispose();
}
}