diff --git a/making_school_asignment_app/lib/common/api/retrofit_client.dart b/making_school_asignment_app/lib/common/api/retrofit_client.dart index 2bba4c0..1d28a27 100644 --- a/making_school_asignment_app/lib/common/api/retrofit_client.dart +++ b/making_school_asignment_app/lib/common/api/retrofit_client.dart @@ -98,4 +98,11 @@ abstract class RetrofitClient { //收集订正 @POST("/api/hms/Homework/Collect") Future getCollect(@Field() String homeworkId); + + //收藏夹列表 + @GET("/api/hms/FavStudent/GetList") + Future> getFavList( + @Query('HomeworkName') String homeworkName, @Query('ClassId') String classId); + + } diff --git a/making_school_asignment_app/lib/common/api/retrofit_client.g.dart b/making_school_asignment_app/lib/common/api/retrofit_client.g.dart index ad91f13..49c0206 100644 --- a/making_school_asignment_app/lib/common/api/retrofit_client.g.dart +++ b/making_school_asignment_app/lib/common/api/retrofit_client.g.dart @@ -590,6 +590,42 @@ class _RetrofitClient implements RetrofitClient { return value; } + @override + Future> getFavList( + String homeworkName, + String classId, + ) async { + final _extra = {}; + final queryParameters = { + r'HomeworkName': homeworkName, + r'ClassId': classId, + }; + final _headers = {}; + const Map? _data = null; + final _result = await _dio.fetch>( + _setStreamType>(Options( + method: 'GET', + headers: _headers, + extra: _extra, + ) + .compose( + _dio.options, + '/api/hms/FavStudent/GetList', + queryParameters: queryParameters, + data: _data, + ) + .copyWith( + baseUrl: _combineBaseUrls( + _dio.options.baseUrl, + baseUrl, + )))); + final value = BasePageData.fromJson( + _result.data!, + (json) => HomeworkFavs.fromJson(json as Map), + ); + return value; + } + RequestOptions _setStreamType(RequestOptions requestOptions) { if (T != dynamic && !(requestOptions.responseType == ResponseType.bytes || diff --git a/making_school_asignment_app/lib/common/job/annotated_class.dart b/making_school_asignment_app/lib/common/job/annotated_class.dart index 2483b53..1fe56e2 100644 --- a/making_school_asignment_app/lib/common/job/annotated_class.dart +++ b/making_school_asignment_app/lib/common/job/annotated_class.dart @@ -114,42 +114,45 @@ class AnnotatedStudents extends Object { class HomeworkFavs extends Object { @JsonKey(name: 'id') - String id; + String? id; @JsonKey(name: 'homeworkId') - String homeworkId; + String? homeworkId; @JsonKey(name: 'homeworkName') - String homeworkName; + String? homeworkName; @JsonKey(name: 'grade') - int grade; + int? grade; @JsonKey(name: 'subject') - int subject; + int? subject; @JsonKey(name: 'classId') - String classId; + String? classId; @JsonKey(name: 'className') - String className; + String? className; @JsonKey(name: 'studentId') - int studentId; + int? studentId; @JsonKey(name: 'studentName') - String studentName; + String? studentName; @JsonKey(name: 'templateId') - String templateId; + int templateId; @JsonKey(name: 'questionNo') - int questionNo; + int? questionNo; @JsonKey(name: 'subjectiveAnswer') - String subjectiveAnswer; + String? subjectiveAnswer; - HomeworkFavs(this.id,this.homeworkId,this.homeworkName,this.grade,this.subject,this.classId,this.className,this.studentId,this.studentName,this.templateId,this.questionNo,this.subjectiveAnswer,); + @JsonKey(name: 'zgtAnswer') + String? zgtAnswer; + + HomeworkFavs(this.id,this.homeworkId,this.homeworkName,this.grade,this.subject,this.classId,this.className,this.studentId,this.studentName,this.templateId,this.questionNo,this.subjectiveAnswer,this.zgtAnswer); factory HomeworkFavs.fromJson(Map srcJson) => _$HomeworkFavsFromJson(srcJson); diff --git a/making_school_asignment_app/lib/page/home_page/children/annotate_class/widget/annotate_item.dart b/making_school_asignment_app/lib/page/home_page/children/annotate_class/widget/annotate_item.dart index a15fb5d..cbc740e 100644 --- a/making_school_asignment_app/lib/page/home_page/children/annotate_class/widget/annotate_item.dart +++ b/making_school_asignment_app/lib/page/home_page/children/annotate_class/widget/annotate_item.dart @@ -73,7 +73,9 @@ class _AnnotateItemState extends State { child: ItemBtn( title: "收藏夹", font: widget.font - 2.sp, - clickFunction: () {}, + clickFunction: () { + Get.toNamed(Routes.favStudentPage,arguments: {'title':widget.name}); + }, ), ), const Expanded(flex: 1, child: SizedBox()), @@ -113,7 +115,9 @@ class _AnnotateItemState extends State { child: ItemBtn( title: "收藏夹", font: widget.font - 2.sp, - clickFunction: () {}, + clickFunction: () { + Get.toNamed(Routes.favStudentPage,arguments: {'homeworkName':widget.name,'classId':widget.item.classId}); + }, ), ), ], 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 index e6742b2..a905aa9 100644 --- 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 @@ -53,6 +53,8 @@ class _AnswerTrajectoryPageState extends State { border: Border( bottom: BorderSide(width: 1.r, color: Color(0xFFCCCCCC)))), child: TabBar( + dividerHeight: 0, + tabAlignment: TabAlignment.start, onTap: (int val) { state.tabIndex.value = val; // EasyLoading.show(status: 'loading...'); 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 index 0188c6d..ffab758 100644 --- 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 @@ -30,9 +30,6 @@ class AnswerTrajectoryJob extends StatelessWidget { 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());*/ Get.toNamed(Routes.answerTrajectoryDetailPage,arguments: {'homeworkId':item.id,'title':item.name,'grade':item.grade}); }, child: Container( diff --git a/making_school_asignment_app/lib/page/home_page/children/fav_student/fav_student_binding.dart b/making_school_asignment_app/lib/page/home_page/children/fav_student/fav_student_binding.dart new file mode 100644 index 0000000..a5fa24f --- /dev/null +++ b/making_school_asignment_app/lib/page/home_page/children/fav_student/fav_student_binding.dart @@ -0,0 +1,10 @@ +import 'package:get/get.dart'; + +import 'fav_student_logic.dart'; + +class FavStudentBinding extends Bindings { + @override + void dependencies() { + Get.lazyPut(() => FavStudentLogic()); + } +} diff --git a/making_school_asignment_app/lib/page/home_page/children/fav_student/fav_student_logic.dart b/making_school_asignment_app/lib/page/home_page/children/fav_student/fav_student_logic.dart new file mode 100644 index 0000000..0759a23 --- /dev/null +++ b/making_school_asignment_app/lib/page/home_page/children/fav_student/fav_student_logic.dart @@ -0,0 +1,43 @@ +import 'package:flutter_easyloading/flutter_easyloading.dart'; +import 'package:get/get.dart'; +import 'package:making_school_asignment_app/common/job/annotated_class.dart'; +import 'package:making_school_asignment_app/common/job/common/base_page_data.dart'; +import 'package:making_school_asignment_app/common/mixins/request_tool_mixin.dart'; + +import 'fav_student_state.dart'; + +class FavStudentLogic extends GetxController with RequestToolMixin { + final FavStudentState state = FavStudentState(); + + @override + void onInit() { + super.onInit(); + state.homeworkName.value = Get.arguments['homeworkName']; + state.classId = Get.arguments['classId']; + EasyLoading.show(status: 'loading...'); + getList(); + } + + void getList() async { + BasePageData data = + await getClient().getFavList(state.homeworkName.value, state.classId); + List arr = []; + List groupList = []; + if(data.items.isNotEmpty){ + for(var item in data.items){ + arr.add(item.questionNo); + } + state.pageList.value = arr.toSet().toList(); + for(var page in state.pageList.value){ + var printList = data.items + .where((element) => element.questionNo == page) + .toList(); + groupList.add({"questionPage": page, "list": printList}); + } + groupList + .sort((a, b) => a['questionPage'].compareTo(b['questionPage'])); + } + state.favList.value = [...groupList]; + EasyLoading.dismiss(); + } +} diff --git a/making_school_asignment_app/lib/page/home_page/children/fav_student/fav_student_state.dart b/making_school_asignment_app/lib/page/home_page/children/fav_student/fav_student_state.dart new file mode 100644 index 0000000..3f92973 --- /dev/null +++ b/making_school_asignment_app/lib/page/home_page/children/fav_student/fav_student_state.dart @@ -0,0 +1,13 @@ +import 'package:get/get.dart'; +import 'package:making_school_asignment_app/common/job/annotated_class.dart'; + +class FavStudentState { + FavStudentState() { + ///Initialize variables + } + + late RxString homeworkName = ''.obs; + late String classId = ''; + late RxList favList = RxList(); + late RxList pageList = RxList(); +} diff --git a/making_school_asignment_app/lib/page/home_page/children/fav_student/fav_student_view.dart b/making_school_asignment_app/lib/page/home_page/children/fav_student/fav_student_view.dart new file mode 100644 index 0000000..4f719e7 --- /dev/null +++ b/making_school_asignment_app/lib/page/home_page/children/fav_student/fav_student_view.dart @@ -0,0 +1,307 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:get/get.dart'; +import 'package:making_school_asignment_app/common/job/annotated_class.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/ReturnToHomepage.dart'; +import 'package:making_school_asignment_app/page/global_widget/my_text.dart'; + +import 'fav_student_logic.dart'; + +class FavStudentPage extends StatefulWidget { + const FavStudentPage({Key? key}) : super(key: key); + + @override + State createState() => _FavStudentPageState(); +} + +class _FavStudentPageState 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( + // titleSpacing: 0, + elevation: 0.0, + leading: IconButton( + icon: Icon(Icons.arrow_back_ios), + onPressed: () => Navigator.of(context).pop()), + iconTheme: IconThemeData(color: Colors.black), + title: quickText('收藏夹'), + centerTitle: true, + backgroundColor: Colors.white, + actions: const [ + ReturnToHomepage(), + ], + ), + body: Container( + child: Column( + children: [ + Padding( + padding: EdgeInsets.symmetric(vertical: 0.r, horizontal: 14.r), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Obx(() { + return Text( + state.homeworkName.value, + style: + TextStyle(fontSize: 14.sp, color: Color(0xFF3C3C3C)), + ); + }), + // 下拉框 + Container( + padding: EdgeInsets.symmetric( + vertical: 10.h, horizontal: 10.w), + child: Row( + children: [ + /* $classSelection(involveClasses, classData, + call: (JobReportJoinClass _classData) { + classData = _classData; + if (_classData.gradeId == -1) classData = null; + className = _classData.className; + _future = getData(); + toUpState(setState, () {}, mounted); + }),*/ + ], + ), + ), + ], + ), + ), + Container( + width: MediaQuery + .of(context) + .size + .width, + height: 1.r, + decoration: const BoxDecoration( + color: Color(0xFFCCCCCC), + ), + ), + Obx((){ + return state.favList.isNotEmpty + ? Expanded( + child: Utils.isPad() + ? Padding( + padding: EdgeInsets.only( + top: 10.r, + bottom: 8.r, + left: 14.r, + right: 14.r), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: + List.generate(state.favList.length, (index) { + var item = state.favList[index]; + return Padding( + padding: EdgeInsets.only(bottom: 8.r), + child: Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + Padding( + padding: + EdgeInsets.only(bottom: 5.r), + child: Text( + '第${item['questionPage']}页', + style: TextStyle( + fontSize: 12.sp, + color: Color(0xFF2E5BFF)), + ), + ), + GridView( + gridDelegate: + SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 2, + mainAxisSpacing: 8.r, + crossAxisSpacing: 10.r, + childAspectRatio: 556 / 112, + ), + shrinkWrap: true, + children: List.generate( + item['list'].length, (i) { + HomeworkFavs student = item['list'][i]; + return Container( + padding: EdgeInsets.symmetric( + vertical: 5.r, + horizontal: 10.r), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: + BorderRadius.all( + Radius.circular( + 6.r)), + ), + child: InkWell( + onTap: () { + /*showStudentDialog(context, + student, groupList);*/ + }, + child: Row( + mainAxisAlignment: + MainAxisAlignment + .spaceBetween, + children: [ + quickText( + student.studentName, + color: const Color( + 0xFF333333), + size: 12.sp), + Expanded( + child: Container()), + Padding( + padding: + EdgeInsets.only( + right: 8.r), + child: Text( + student.className!, + style: TextStyle( + fontSize: 12.sp, + color: const Color( + 0xFF666666)), + ), + ), + InkWell( + onTap: () async { + /* var confim = + await confirmDialog(); + if (confim) { + getDelete( + student); + }*/ + }, + child: Image.asset( + 'assets/images/favorite_delete_icon.png', + width: 24.r, + height: 24.r, + ), + ), + ], + ), + ), + ); + })), + ], + ), + ); + })), + ) + : ListView.builder( + shrinkWrap: true, + itemBuilder: (context, index) { + var item = state.favList[index]; + return Padding( + padding: EdgeInsets.only( + top: 10.r, + bottom: 8.r, + left: 14.r, + right: 14.r), + child: Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + Padding( + padding: EdgeInsets.only(bottom: 5.r), + child: Text( + '第${item['questionPage']}页', + style: TextStyle( + fontSize: 14.sp, + color: Color(0xFF2E5BFF)), + ), + ), + ListView.builder( + itemBuilder: (context, i) { + HomeworkFavs student = item['list'][i]; + return InkWell( + onTap: () { + /* showStudentDialog( + context, student, groupList);*/ + }, + child: Container( + padding: EdgeInsets.symmetric( + vertical: 5.r, + horizontal: 10.r), + margin: EdgeInsets.only(top: 5.r), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.all( + Radius.circular(6.r)), + ), + child: Row( + mainAxisAlignment: + MainAxisAlignment + .spaceBetween, + children: [ + quickText(student.studentName, + color: Color(0xFF333333), + size: 14.sp), + Expanded(child: Container()), + Padding( + padding: EdgeInsets.only( + right: 8.r), + child: Text( + student.className!, + style: TextStyle( + fontSize: 14.sp, + color: Color( + 0xFF666666)), + ), + ), + InkWell( + onTap: () async { + /*var confim = + await confirmDialog(); + if (confim) { + getDelete(student); + }*/ + }, + child: Image.asset( + 'assets/images/favorite_delete_icon.png', + width: 32.r, + height: 32.r, + ), + ), + ], + ), + ), + ); + }, + itemCount: item['list'].length, + shrinkWrap: true, + ), + ], + ), + ); + }, + itemCount: state.favList.length, + ), + ) + : Padding( + padding: EdgeInsets.only( + top: MediaQuery + .of(context) + .size + .height / 2 - 200.r), + child: const MyEmptyWidget(), + ); + }), + + ], + )), + ); + } + + @override + void dispose() { + Get.delete(); + super.dispose(); + } +} \ No newline at end of file diff --git a/making_school_asignment_app/lib/routes/app_pages.dart b/making_school_asignment_app/lib/routes/app_pages.dart index 92b1f61..5da8ddd 100644 --- a/making_school_asignment_app/lib/routes/app_pages.dart +++ b/making_school_asignment_app/lib/routes/app_pages.dart @@ -11,6 +11,8 @@ import 'package:making_school_asignment_app/page/home_page/children/answer_traje import 'package:making_school_asignment_app/page/home_page/children/answer_trajectory_detail/answer_trajectory_detail_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/fav_student/fav_student_binding.dart'; +import 'package:making_school_asignment_app/page/home_page/children/fav_student/fav_student_view.dart'; import 'package:making_school_asignment_app/page/home_page/children/homework_review/configuration_files/index.dart'; import 'package:making_school_asignment_app/page/home_page/children/homework_review/index.dart'; import 'package:making_school_asignment_app/page/home_page/children/job_report/job_report_binding.dart'; @@ -88,6 +90,8 @@ abstract class AppPages { // 批阅主页(作业、考试) GetPage(name: Routes.reviewHomework, page: () => const HomeworkReview(), binding: HomeworkReviewBinding(), transition: getTransition()), GetPage(name: Routes.reviewExam, page: () => const HomeworkReview(), binding: HomeworkReviewBinding(), transition: getTransition()), + GetPage(name: Routes.favStudentPage, page: () => const FavStudentPage(), binding: FavStudentBinding(), 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 e00664d..5a12ae2 100644 --- a/making_school_asignment_app/lib/routes/app_routes.dart +++ b/making_school_asignment_app/lib/routes/app_routes.dart @@ -23,5 +23,6 @@ abstract class Routes { // 批阅主页 static const reviewHomework = '/review/reviewHomework'; // 作业批阅 static const reviewExam = '/review/reviewExam'; // 考试批阅 + static const favStudentPage = '/favStudentPage'; // 收藏夹 } \ No newline at end of file