From fda5a362f1f79d237a332afa1e28bf0f72f7e332 Mon Sep 17 00:00:00 2001 From: machuanyu <840649825@qq.com> Date: Fri, 31 May 2024 14:00:15 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E6=94=B6=E8=97=8F=E5=A4=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../lib/common/api/retrofit_client.dart | 7 + .../lib/common/api/retrofit_client.g.dart | 36 ++ .../lib/common/job/annotated_class.dart | 29 +- .../annotate_class/widget/annotate_item.dart | 8 +- .../answer_trajectory_view.dart | 2 + .../widget/answer_trajectory_job.dart | 3 - .../fav_student/fav_student_binding.dart | 10 + .../fav_student/fav_student_logic.dart | 43 +++ .../fav_student/fav_student_state.dart | 13 + .../fav_student/fav_student_view.dart | 307 ++++++++++++++++++ .../lib/routes/app_pages.dart | 4 + .../lib/routes/app_routes.dart | 1 + 12 files changed, 445 insertions(+), 18 deletions(-) create mode 100644 making_school_asignment_app/lib/page/home_page/children/fav_student/fav_student_binding.dart create mode 100644 making_school_asignment_app/lib/page/home_page/children/fav_student/fav_student_logic.dart create mode 100644 making_school_asignment_app/lib/page/home_page/children/fav_student/fav_student_state.dart create mode 100644 making_school_asignment_app/lib/page/home_page/children/fav_student/fav_student_view.dart 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 From 597b758cf2251f22932d89bdcf5a76e62879ef39 Mon Sep 17 00:00:00 2001 From: machuanyu <840649825@qq.com> Date: Fri, 31 May 2024 15:25:10 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E6=94=B6=E8=97=8F=E5=A4=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../annotate_class/widget/annotate_item.dart | 4 +- .../fav_student/fav_student_logic.dart | 28 +- .../fav_student/fav_student_state.dart | 5 + .../fav_student/fav_student_view.dart | 111 ++++++-- .../widget/favorite_student_dialog.dart | 245 ++++++++++++++++++ .../job_report/widget/dropdown_selection.dart | 9 +- 6 files changed, 378 insertions(+), 24 deletions(-) create mode 100644 making_school_asignment_app/lib/page/home_page/children/fav_student/widget/favorite_student_dialog.dart 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 58f2672..432b2c9 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 @@ -74,7 +74,7 @@ class _AnnotateItemState extends State { title: "收藏夹", font: widget.font - 2.sp, clickFunction: () { - Get.toNamed(Routes.favStudentPage,arguments: {'title':widget.name}); + Get.toNamed(Routes.favStudentPage,arguments: {'homeworkName':widget.name,'classId':widget.item.classId,'homeworkId':widget.logic.state.homeworkId.value,'grade':widget.item.grade}); }, ), ), @@ -116,7 +116,7 @@ class _AnnotateItemState extends State { title: "收藏夹", font: widget.font - 2.sp, clickFunction: () { - Get.toNamed(Routes.favStudentPage,arguments: {'homeworkName':widget.name,'classId':widget.item.classId}); + Get.toNamed(Routes.favStudentPage,arguments: {'homeworkName':widget.name,'classId':widget.item.classId,'homeworkId':widget.logic.state.homeworkId.value,'grade':widget.item.grade}); }, ), ), 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 index 0759a23..f3e5bdd 100644 --- 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 @@ -13,14 +13,29 @@ class FavStudentLogic extends GetxController with RequestToolMixin { void onInit() { super.onInit(); state.homeworkName.value = Get.arguments['homeworkName']; + state.homeworkId = Get.arguments['homeworkId']; + state.grade = Get.arguments['grade']; state.classId = Get.arguments['classId']; EasyLoading.show(status: 'loading...'); + getClass(); + } + + void getClass() async { + List data = await getClient().getAnnotatedClassList(state.homeworkId); + state.involveClasses.value = data; + + state.involveClasses.value = [state.classData.value, ...(data ?? [])]; + for (var element in state.involveClasses) { + if (element.classId == state.classId && element.grade == state.grade) { + state.classData.value = element; + } + } getList(); } void getList() async { BasePageData data = - await getClient().getFavList(state.homeworkName.value, state.classId); + await getClient().getFavList(state.homeworkName.value, state.classData.value.classId != '-1' ? state.classData.value.classId : ''); List arr = []; List groupList = []; if(data.items.isNotEmpty){ @@ -40,4 +55,15 @@ class FavStudentLogic extends GetxController with RequestToolMixin { state.favList.value = [...groupList]; EasyLoading.dismiss(); } + + getDelete(student) async { + /* RestClient _client = await getClient(); + BaseStructureResult res = await _client.getJobDeFavorites( + widget.jobId, student.studentId, student.questionPage!); + if (res.success) { + _future = getData(); + setState(() {}); + }*/ + } + } 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 index 3f92973..89a5534 100644 --- 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 @@ -7,7 +7,12 @@ class FavStudentState { } late RxString homeworkName = ''.obs; + late String homeworkId = ''; + late int grade; late String classId = ''; late RxList favList = RxList(); late RxList pageList = RxList(); + late RxList involveClasses = RxList(); + late AnnotatedClass defaultClass = AnnotatedClass('', -1, '-1', '', '', -1, -1, -1, -1, -1, [], [], -1, -1, -1, -1, -1, [], []); + late Rx classData = defaultClass.obs; } 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 index 4f719e7..4cb33f2 100644 --- 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 @@ -6,6 +6,8 @@ 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 'package:making_school_asignment_app/page/home_page/children/fav_student/widget/favorite_student_dialog.dart'; +import 'package:making_school_asignment_app/page/home_page/children/job_report/widget/dropdown_selection.dart'; import 'fav_student_logic.dart'; @@ -22,6 +24,75 @@ class _FavStudentPageState extends State { .find() .state; + void showStudentDialog(BuildContext context, HomeworkFavs item, List groups) { + showDialog( + context: context, + builder: (BuildContext context) { + return AlertDialog( + insetPadding: EdgeInsets.all(25.r), + content: FavoriteStudentDialog( + item: item, + group: groups, + deleteFav: logic.getDelete, + confirmDialog: confirmDialog), + contentPadding: const EdgeInsets.all(0), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.all(Radius.circular(15.r)))); + }, + ); + } + Future confirmDialog() async { + return await showDialog( + context: context, + builder: (context) => AlertDialog( + actionsPadding: EdgeInsets.symmetric(vertical: 10.r, horizontal: 10.r), + content: Text( + '确定删除吗?', + style: TextStyle(fontSize: 14.sp, color: Color(0xFF505E6E)), + ), + actionsAlignment: MainAxisAlignment.center, + actions: [ + InkWell( + child: Container( + width: 97.r, + height: 27.r, + decoration: BoxDecoration( + borderRadius: BorderRadius.all(Radius.circular(20.r)), + color: Color(0xFF6888FD), + ), + child: const Center( + child: Text( + '确定', + style: TextStyle(color: Colors.white), + ))), + onTap: () { + // 执行操作 + // Navigator.of(context).pop(true); + Get.back(result: true); + }, + ), + InkWell( + onTap: () { + // Navigator.of(context).pop(false); + Get.back(result: false); + }, + child: Container( + width: 97.r, + height: 27.r, + decoration: BoxDecoration( + borderRadius: BorderRadius.all(Radius.circular(20.r)), + color: Color(0xFFF4F4F4), + ), + child: const Center( + child: Text( + '取消', + style: TextStyle(color: Color(0xFF666666)), + ))), + ), + ], + ), + ); + } @override Widget build(BuildContext context) { return Scaffold( @@ -49,27 +120,33 @@ class _FavStudentPageState extends State { mainAxisAlignment: MainAxisAlignment.spaceBetween, crossAxisAlignment: CrossAxisAlignment.center, children: [ - Obx(() { - return Text( - state.homeworkName.value, - style: - TextStyle(fontSize: 14.sp, color: Color(0xFF3C3C3C)), - ); - }), + Expanded( + child: Obx(() { + return Text( + state.homeworkName.value, + style: + TextStyle(fontSize: 14.sp, color: Color(0xFF3C3C3C),), + overflow: TextOverflow.ellipsis, + ); + }), + ), // 下拉框 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); - }),*/ + Obx(() { + return DropdownSelection( + bgColor: Colors.white, + involveClasses: state.involveClasses.value, + classData: state.classData.value, + call: (AnnotatedClass item) { + state.classData.value = item; + if (item.grade == -1) state.classData.value = state.defaultClass; + logic.getList(); + }); + }), ], ), ), @@ -142,8 +219,8 @@ class _FavStudentPageState extends State { ), child: InkWell( onTap: () { - /*showStudentDialog(context, - student, groupList);*/ + showStudentDialog(context, + student, state.favList); }, child: Row( mainAxisAlignment: diff --git a/making_school_asignment_app/lib/page/home_page/children/fav_student/widget/favorite_student_dialog.dart b/making_school_asignment_app/lib/page/home_page/children/fav_student/widget/favorite_student_dialog.dart new file mode 100644 index 0000000..b89ffad --- /dev/null +++ b/making_school_asignment_app/lib/page/home_page/children/fav_student/widget/favorite_student_dialog.dart @@ -0,0 +1,245 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:get/get.dart'; +import 'package:get/get_rx/get_rx.dart'; +import 'package:making_school_asignment_app/common/job/annotated_class.dart'; +import 'package:making_school_asignment_app/page/global_widget/MyEmptyWidget.dart'; +import 'package:photo_view/photo_view.dart'; +import 'package:photo_view/photo_view_gallery.dart'; + +class FavoriteStudentDialog extends StatefulWidget { + final HomeworkFavs item; + final List group; + final Function deleteFav; + final Future Function() confirmDialog; + + const FavoriteStudentDialog({Key? key, + required this.item, + required this.group, + required this.deleteFav, + required this.confirmDialog}) + : super(key: key); + + @override + State createState() => _FavoriteStudentDialogState(); +} + +class _FavoriteStudentDialogState extends State { + RxInt defaultIndex = 0.obs; + RxList imageList = RxList(); + late PageController pageController; + late Rx currentStudent = Rx(HomeworkFavs('','','',-1,-1,'','',-1,'',-1,-1,'','')); + + @override + void initState() { + super.initState(); + currentStudent.value = widget.item; + List list = []; + for (var element in widget.group) { + for (var item in element['list']) { + list.add(item); + } + } + imageList.value = list; + defaultIndex.value = + list.indexWhere((element) => element.id == widget.item.id); + + pageController = PageController(initialPage: defaultIndex.value); + } + + @override + void dispose() { + super.dispose(); + pageController.dispose(); + } + + @override + Widget build(BuildContext context) { + return Container( + width: MediaQuery + .of(context) + .size + .width, + height: MediaQuery + .of(context) + .size + .height, + padding: EdgeInsets.symmetric(vertical: 10.r, horizontal: 14.r), + child: Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Obx(() { + return Text( + '${currentStudent.value.className} ${currentStudent.value + .studentName}', + style: TextStyle(fontSize: 12.sp, color: Color(0xFF4E73FD)), + ); + }), + Expanded(child: Container()), + Text( + '第${currentStudent.value.questionNo}页', + style: TextStyle(fontSize: 12.sp, color: Color(0xFF868686)), + ), + InkWell( + onTap: () async { + bool confim = await widget.confirmDialog(); + if (confim) { + widget.deleteFav(currentStudent); + imageList.removeAt(defaultIndex.value); + if (imageList.isNotEmpty) { + if (defaultIndex.value < imageList.length) { + currentStudent.value = imageList[defaultIndex.value]; + } else { + currentStudent.value = + imageList[defaultIndex.value - 1]; + defaultIndex = defaultIndex - 1; + } + } else { + currentStudent.value.className = ''; + currentStudent.value.studentName = ''; + } + } + }, + child: Padding( + padding: EdgeInsets.symmetric(horizontal: 8.r), + child: Image.asset( + 'assets/images/favorite_delete_icon.png', + width: 22.r, + height: 22.r, + ), + ), + ), + InkWell( + onTap: () { + Navigator.pop(context); + }, + child: Image.asset( + 'assets/images/favorite_dialog_close.png', + width: 22.r, + height: 22.r, + ), + ), + ], + ), + SizedBox( + height: 10.r, + ), + Obx(() { + return imageList.isNotEmpty + ? Expanded( + child: Container( + color: Colors.white, + width: MediaQuery + .of(context) + .size + .width, + child: PhotoViewGallery.builder( + scrollPhysics: const BouncingScrollPhysics(), + builder: (BuildContext context, int index) { + final HomeworkFavs item = imageList[index]; + return PhotoViewGalleryPageOptions( + imageProvider: NetworkImage(item.zgtAnswer!), + heroAttributes: PhotoViewHeroAttributes(tag: item.id!), + ); + }, + itemCount: imageList.length, + pageController: pageController, + onPageChanged: (index) { + defaultIndex.value = index; + currentStudent.value = imageList[index]; + }, + scrollDirection: Axis.horizontal, + ), + ), + ) + : Padding( + padding: EdgeInsets.only( + top: MediaQuery + .of(context) + .size + .height / 2 - 200.r), + child: const MyEmptyWidget(), + ); + }), + Obx(() { + return imageList.isNotEmpty?Padding( + padding: EdgeInsets.symmetric(vertical: 15.r), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + InkWell( + onTap: () { + if (defaultIndex.value > 0) { + defaultIndex.value = defaultIndex.value - 1; + pageController.jumpToPage(defaultIndex.value); + } + }, + child: Container( + width: + (MediaQuery + .of(context) + .size + .width - 78.r) / 2 - 10.r, + height: 28.r, + decoration: BoxDecoration( + borderRadius: BorderRadius.all(Radius.circular(6.r)), + border: Border.all( + width: 1.r, + color: Color(0xFFCACACA), + style: BorderStyle.solid), + ), + child: Center( + child: Text( + '上一页', + style: TextStyle( + fontSize: 10.r, + color: defaultIndex == 0 + ? Color(0xFFCACACA) + : Color(0xFF505E6E)), + )), + ), + ), + InkWell( + onTap: () { + if (defaultIndex.value < imageList.length - 1) { + defaultIndex.value = defaultIndex.value + 1; + pageController.jumpToPage(defaultIndex.value); + } + }, + child: Container( + width: + (MediaQuery + .of(context) + .size + .width - 78.r) / 2 - 10.r, + height: 28.r, + decoration: BoxDecoration( + borderRadius: BorderRadius.all(Radius.circular(6.r)), + border: Border.all( + width: 1.r, + color: Color(0xFFCACACA), + style: BorderStyle.solid), + ), + child: Center( + child: Text( + '下一页', + style: TextStyle( + fontSize: 10.r, + color: defaultIndex == imageList.length - 1 + ? Color(0xFFCACACA) + : Color(0xFF505E6E)), + )), + ), + ), + ], + ), + ):Container(); + }) + ], + ), + ); + } +} diff --git a/making_school_asignment_app/lib/page/home_page/children/job_report/widget/dropdown_selection.dart b/making_school_asignment_app/lib/page/home_page/children/job_report/widget/dropdown_selection.dart index fd0a208..3160499 100644 --- a/making_school_asignment_app/lib/page/home_page/children/job_report/widget/dropdown_selection.dart +++ b/making_school_asignment_app/lib/page/home_page/children/job_report/widget/dropdown_selection.dart @@ -8,7 +8,8 @@ class DropdownSelection extends StatefulWidget { final List? involveClasses; final AnnotatedClass? classData; final Function(AnnotatedClass) call; - const DropdownSelection({Key? key, required this.involveClasses, required this.classData, required this.call}) : super(key: key); + final Color? bgColor; + const DropdownSelection({Key? key, required this.involveClasses, required this.classData, required this.call,this.bgColor}) : super(key: key); @override State createState() => _DropdownSelectionState(); @@ -20,9 +21,9 @@ class _DropdownSelectionState extends State { return Container( // width: 200.r, padding: EdgeInsets.symmetric(horizontal: 10.r), - decoration: const BoxDecoration( - color: Color(0xFFF5F5F5), - borderRadius: BorderRadius.vertical( + decoration: BoxDecoration( + color: widget.bgColor ?? const Color(0xFFF5F5F5), + borderRadius: const BorderRadius.vertical( top: Radius.elliptical(10, 10), bottom: Radius.elliptical(10, 10), )),