diff --git a/assets/images/ic_home_normal.png b/assets/images/ic_home_normal.png index 30eefd2..3b81a93 100644 Binary files a/assets/images/ic_home_normal.png and b/assets/images/ic_home_normal.png differ diff --git a/assets/images/ic_home_press.png b/assets/images/ic_home_press.png index efff317..b292be5 100644 Binary files a/assets/images/ic_home_press.png and b/assets/images/ic_home_press.png differ diff --git a/assets/images/ic_mine_normal.png b/assets/images/ic_mine_normal.png index 607d01d..1e5dd34 100644 Binary files a/assets/images/ic_mine_normal.png and b/assets/images/ic_mine_normal.png differ diff --git a/assets/images/ic_mine_press.png b/assets/images/ic_mine_press.png index 9ffeb2d..03a2784 100644 Binary files a/assets/images/ic_mine_press.png and b/assets/images/ic_mine_press.png differ diff --git a/assets/images/ic_work_normal.png b/assets/images/ic_work_normal.png index a8cba73..565db6d 100644 Binary files a/assets/images/ic_work_normal.png and b/assets/images/ic_work_normal.png differ diff --git a/assets/images/ic_work_press.png b/assets/images/ic_work_press.png index 827705e..f7d035c 100644 Binary files a/assets/images/ic_work_press.png and b/assets/images/ic_work_press.png differ diff --git a/assets/images/job_home_answer_record.png b/assets/images/job_home_answer_record.png new file mode 100644 index 0000000..21fd223 Binary files /dev/null and b/assets/images/job_home_answer_record.png differ diff --git a/assets/images/job_home_history.png b/assets/images/job_home_history.png new file mode 100644 index 0000000..3e00774 Binary files /dev/null and b/assets/images/job_home_history.png differ diff --git a/assets/images/job_home_knowledge.png b/assets/images/job_home_knowledge.png new file mode 100644 index 0000000..866ad4c Binary files /dev/null and b/assets/images/job_home_knowledge.png differ diff --git a/assets/images/job_home_marking.png b/assets/images/job_home_marking.png new file mode 100644 index 0000000..81e0e6e Binary files /dev/null and b/assets/images/job_home_marking.png differ diff --git a/assets/images/job_home_marking_set.png b/assets/images/job_home_marking_set.png new file mode 100644 index 0000000..3fd1ca0 Binary files /dev/null and b/assets/images/job_home_marking_set.png differ diff --git a/assets/images/job_home_top_bgm.png b/assets/images/job_home_top_bgm.png new file mode 100644 index 0000000..eb9377e Binary files /dev/null and b/assets/images/job_home_top_bgm.png differ diff --git a/assets/images/job_home_youxian.png b/assets/images/job_home_youxian.png new file mode 100644 index 0000000..4e37a46 Binary files /dev/null and b/assets/images/job_home_youxian.png differ diff --git a/assets/images/login_account.png b/assets/images/login_account.png new file mode 100644 index 0000000..9a17d64 Binary files /dev/null and b/assets/images/login_account.png differ diff --git a/assets/images/login_bg.png b/assets/images/login_bg.png new file mode 100644 index 0000000..b199639 Binary files /dev/null and b/assets/images/login_bg.png differ diff --git a/assets/images/login_bgi.png b/assets/images/login_bgi.png deleted file mode 100644 index d102c3c..0000000 Binary files a/assets/images/login_bgi.png and /dev/null differ diff --git a/assets/images/login_logo.png b/assets/images/login_logo.png new file mode 100644 index 0000000..1b083fe Binary files /dev/null and b/assets/images/login_logo.png differ diff --git a/assets/images/login_pwd.png b/assets/images/login_pwd.png new file mode 100644 index 0000000..3a0efc5 Binary files /dev/null and b/assets/images/login_pwd.png differ diff --git a/assets/images/logo.png b/assets/images/logo.png deleted file mode 100644 index c50a5e2..0000000 Binary files a/assets/images/logo.png and /dev/null differ diff --git a/assets/images/work_top_bg.png b/assets/images/work_top_bg.png new file mode 100644 index 0000000..eb9377e Binary files /dev/null and b/assets/images/work_top_bg.png differ diff --git a/assets/images/youx_icon_active.png b/assets/images/youx_icon_active.png new file mode 100644 index 0000000..9a75b84 Binary files /dev/null and b/assets/images/youx_icon_active.png differ diff --git a/assets/images/youx_icon_default.png b/assets/images/youx_icon_default.png new file mode 100644 index 0000000..2708923 Binary files /dev/null and b/assets/images/youx_icon_default.png differ diff --git a/lib/common/api/retrofit_client.dart b/lib/common/api/retrofit_client.dart index 9f9e887..7d1bb0b 100644 --- a/lib/common/api/retrofit_client.dart +++ b/lib/common/api/retrofit_client.dart @@ -1,9 +1,11 @@ import 'package:dio/dio.dart' hide Headers; import 'package:retrofit/retrofit.dart'; +import 'package:school_asignment_app/common/job/class_item.dart'; import 'package:school_asignment_app/common/job/common/app_version_model.dart'; import 'package:school_asignment_app/common/job/common/base_app_version.dart'; import 'package:school_asignment_app/common/job/common/base_page_data.dart'; import 'package:school_asignment_app/common/job/enum_subject.dart'; +import 'package:school_asignment_app/common/job/student_item.dart'; import 'package:school_asignment_app/common/job/user_info_detail.dart'; import 'package:school_asignment_app/common/job/work_student.dart'; import 'package:school_asignment_app/common/job/work_student_params.dart'; @@ -21,15 +23,25 @@ abstract class RetrofitClient { /* start 系统系列接口 */ - @POST("/api/rbac/Auth/Login") + @POST("/api/rbac/Auth/DcLogin") Future toLogin(@Field() String account, @Field() String password); @GET("/api/rbac/User/GetUser") Future getUser(@Query('userId') String userId); + //未批阅,已批阅列表 @GET("/api/hms/Homework/GetList") Future getWorkList(@Queries() WorkStudentParams params); + //获取科目,年级 @GET("/api/app/Common/GetEnumInfos") Future>> getEnumSubjectList(@Query('enumNames') String enumNames); + + //学生班级 + @GET("/api/rbac/Class/GetTeacherClasses") + Future> getStudentClass(); + + //班级学生列表 + @GET("/api/rbac/Class/GetClassStudents") + Future getStudentList(@Query('ClassId') String classId); } diff --git a/lib/common/config/request_config.dart b/lib/common/config/request_config.dart index 4f051c1..a9e3d64 100644 --- a/lib/common/config/request_config.dart +++ b/lib/common/config/request_config.dart @@ -9,7 +9,7 @@ import 'package:school_asignment_app/common/job/common/base_page.dart'; class RequestConfig { - static const _devBaseUrl = "https://dpc-teacher-api.23544.com"; // 开发 + static const _devBaseUrl = "http://192.168.2.119:1091"; // 开发 static const _proBaseUrl = "https://dpc-teacher-api.23544.com"; // 生产 static RequestConfig? _instance; diff --git a/lib/common/job/class_item.dart b/lib/common/job/class_item.dart new file mode 100644 index 0000000..2a55638 --- /dev/null +++ b/lib/common/job/class_item.dart @@ -0,0 +1,32 @@ +import 'package:json_annotation/json_annotation.dart'; + +part 'class_item.g.dart'; + + +@JsonSerializable() +class ClassItem extends Object { + + @JsonKey(name: 'id') + String id; + + @JsonKey(name: 'schoolName') + String schoolName; + + @JsonKey(name: 'grade') + int grade; + + @JsonKey(name: 'className') + String className; + + @JsonKey(name: 'subject') + int? subject; + + ClassItem(this.id,this.schoolName,this.grade,this.className,this.subject,); + + factory ClassItem.fromJson(Map srcJson) => _$ClassItemFromJson(srcJson); + + Map toJson() => _$ClassItemToJson(this); + +} + + diff --git a/lib/common/job/student_item.dart b/lib/common/job/student_item.dart new file mode 100644 index 0000000..410fdc8 --- /dev/null +++ b/lib/common/job/student_item.dart @@ -0,0 +1,104 @@ +import 'package:json_annotation/json_annotation.dart'; + +part 'student_item.g.dart'; + + +@JsonSerializable() +class StudentItem extends Object { + + @JsonKey(name: 'items') + List items; + + @JsonKey(name: 'totalCount') + int totalCount; + + StudentItem(this.items,this.totalCount,); + + factory StudentItem.fromJson(Map srcJson) => _$StudentItemFromJson(srcJson); + + Map toJson() => _$StudentItemToJson(this); + +} + + +@JsonSerializable() +class Items extends Object { + + @JsonKey(name: 'id') + String id; + + @JsonKey(name: 'studentCode') + String studentCode; + + @JsonKey(name: 'name') + String name; + + @JsonKey(name: 'gender') + int gender; + + @JsonKey(name: 'guardianPhone') + String? guardianPhone; + + @JsonKey(name: 'idCard') + String? idCard; + + @JsonKey(name: 'penSerial') + String penSerial; + + @JsonKey(name: 'isActive') + bool isActive; + + @JsonKey(name: 'classStudentId') + String classStudentId; + + @JsonKey(name: 'grade') + int grade; + + @JsonKey(name: 'classId') + String classId; + + @JsonKey(name: 'className') + String className; + + @JsonKey(name: 'evaluationLevel') + int evaluationLevel; + + @JsonKey(name: 'subjectStatus') + List subjectStatus; + + @JsonKey(name: 'creatorName') + String creatorName; + + @JsonKey(name: 'creationTime') + String creationTime; + + Items(this.id,this.studentCode,this.name,this.gender,this.guardianPhone,this.idCard,this.penSerial,this.isActive,this.classStudentId,this.grade,this.classId,this.className,this.evaluationLevel,this.subjectStatus,this.creatorName,this.creationTime,); + + factory Items.fromJson(Map srcJson) => _$ItemsFromJson(srcJson); + + Map toJson() => _$ItemsToJson(this); + +} + + +@JsonSerializable() +class SubjectStatus extends Object { + + @JsonKey(name: 'subject') + int subject; + + @JsonKey(name: 'evaluationLevel') + int evaluationLevel; + + @JsonKey(name: 'priorityAnnotate') + bool priorityAnnotate; + + SubjectStatus(this.subject,this.evaluationLevel,this.priorityAnnotate,); + + factory SubjectStatus.fromJson(Map srcJson) => _$SubjectStatusFromJson(srcJson); + + Map toJson() => _$SubjectStatusToJson(this); + +} + + diff --git a/lib/common/job/user_info.dart b/lib/common/job/user_info.dart index ef74887..83e59b4 100644 --- a/lib/common/job/user_info.dart +++ b/lib/common/job/user_info.dart @@ -13,8 +13,8 @@ class UserInfo extends Object { @JsonKey(name: 'is_admin') String isAdmin; - @JsonKey(name: 'admit_year') - String admitYear; + @JsonKey(name: 'term_year') + String termYear; @JsonKey(name: 'nbf') int nbf; @@ -32,7 +32,7 @@ class UserInfo extends Object { this.nameidentifier, this.givenname, this.isAdmin, - this.admitYear, + this.termYear, this.nbf, this.exp, this.iss, diff --git a/lib/common/job/user_info_detail.dart b/lib/common/job/user_info_detail.dart index b52f68b..931f192 100644 --- a/lib/common/job/user_info_detail.dart +++ b/lib/common/job/user_info_detail.dart @@ -11,34 +11,34 @@ class UserInfoDetail extends Object { String name; @JsonKey(name: 'gender') - int gender; + int? gender; @JsonKey(name: 'schoolId') - String schoolId; + String? schoolId; @JsonKey(name: 'schoolName') String schoolName; @JsonKey(name: 'lastLoginTime') - String lastLoginTime; + String? lastLoginTime; @JsonKey(name: 'isActive') - bool isActive; + bool? isActive; @JsonKey(name: 'accessFailedCount') - int accessFailedCount; + int? accessFailedCount; @JsonKey(name: 'lockoutEndDate') - String lockoutEndDate; + String? lockoutEndDate; @JsonKey(name: 'creatorName') - String creatorName; + String? creatorName; @JsonKey(name: 'creationTime') - String creationTime; + String? creationTime; @JsonKey(name: 'id') - String id; + int id; UserInfoDetail( this.account, diff --git a/lib/common/job/work_student.dart b/lib/common/job/work_student.dart index 32bc86e..8dd9bd5 100644 --- a/lib/common/job/work_student.dart +++ b/lib/common/job/work_student.dart @@ -46,7 +46,7 @@ class Items extends Object { int state; @JsonKey(name: 'collectRate') - int collectRate; + int? collectRate; @JsonKey(name: 'annotateRate') double annotateRate; diff --git a/lib/common/request/rest_dio.dart b/lib/common/request/rest_dio.dart index 4cbdc63..36fcb60 100644 --- a/lib/common/request/rest_dio.dart +++ b/lib/common/request/rest_dio.dart @@ -90,6 +90,10 @@ class AuthInterceptor extends Interceptor { headers["x-Authorization"] = xToken!; } + if ((userInfo?.isExpired() ?? false) && userInfo?.termYear != '') { + headers["term-year"] = userInfo!.termYear; + } + options.headers = headers; return super.onRequest(options, handler); } diff --git a/lib/common/store/user_store.dart b/lib/common/store/user_store.dart index 731e9c0..9fbba17 100644 --- a/lib/common/store/user_store.dart +++ b/lib/common/store/user_store.dart @@ -22,8 +22,14 @@ class UserStore extends GetxController with RequestToolMixin { /// 用户详细信息 Rx userDetailInfo = Rx(null); + //科目 RxList subjectList = RxList(); + //年级 + RxList gradeList = RxList(); + + RxInt readOver = 0.obs; + UserStore init() { token = StorageService.to.read(AppStorageKey.token.value); xToken = StorageService.to.read(AppStorageKey.xToken.value); @@ -51,9 +57,15 @@ class UserStore extends GetxController with RequestToolMixin { } else { Get.toNamed(Routes.login); } + getEnum(); return this; } + void getEnum() async{ + await getSubjectList(); + await getGradeList(); + } + /// 保存 token void setToken(String token) { this.token = token; @@ -91,6 +103,13 @@ class UserStore extends GetxController with RequestToolMixin { subjectList.value = res['EnumSubject']!; } + //获取年级 + getGradeList() async { + var res = await getClient().getEnumSubjectList('EnumGrade'); + gradeList.value = res['EnumGrade']!; + } + + // 用户信息更新 updateUserInfo() async { UserInfo? userInfo = UserStore.to.userInfo.value; diff --git a/lib/common/utils/enum_untils.dart b/lib/common/utils/enum_untils.dart new file mode 100644 index 0000000..5e655f4 --- /dev/null +++ b/lib/common/utils/enum_untils.dart @@ -0,0 +1,20 @@ +import 'package:school_asignment_app/common/job/enum_subject.dart'; +import 'package:school_asignment_app/common/store/user_store.dart'; + +class EnumUtils{ + static String formatSubject(int id) { + if (UserStore.to.subjectList.isEmpty) { + return ''; + } + EnumSubject item = UserStore.to.subjectList.firstWhere((element) => element.id == id); + return item.name ?? ''; + } + + static String formatGrade(int id) { + if (UserStore.to.gradeList.isEmpty) { + return ''; + } + EnumSubject item = UserStore.to.gradeList.firstWhere((element) => element.id == id); + return item.name ?? ''; + } +} \ No newline at end of file diff --git a/lib/page/global_widget/ReturnToHomepage.dart b/lib/page/global_widget/ReturnToHomepage.dart new file mode 100644 index 0000000..bbc065f --- /dev/null +++ b/lib/page/global_widget/ReturnToHomepage.dart @@ -0,0 +1,25 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:get/get.dart'; +import 'package:school_asignment_app/routes/app_pages.dart'; + +// 返回首页 +class ReturnToHomepage extends StatelessWidget { + final Color? bgColor; + const ReturnToHomepage({super.key,this.bgColor = const Color.fromRGBO(135, 135, 135, 1)}); + + @override + Widget build(BuildContext context) { + return InkWell( + onTap: (){ + // Navigator.of(context).popUntil(ModalRoute.withName(Routes.startPage)); + Get.until((route) => route.settings.name == Routes.startPage); + }, + child: Container( + padding: EdgeInsets.only(right: 4.5.w), + alignment: Alignment.center, + child: Icon(Icons.home_rounded, size: 22.sp, color: bgColor), + ), + ); + } +} diff --git a/lib/page/global_widget/start_page.dart b/lib/page/global_widget/start_page.dart index 7780ed4..6dac3e7 100644 --- a/lib/page/global_widget/start_page.dart +++ b/lib/page/global_widget/start_page.dart @@ -93,7 +93,7 @@ class _StartPageState extends State { return BottomNavigationBar( items: [ BottomNavigationBarItem( - label: '首页', + label: '作业', icon: getItemIcon('assets/images/ic_home_normal.png'), activeIcon: getItemIcon('assets/images/ic_home_press.png'), ), diff --git a/lib/page/home_page/children/class_student/class_student_binding.dart b/lib/page/home_page/children/class_student/class_student_binding.dart new file mode 100644 index 0000000..ef650ef --- /dev/null +++ b/lib/page/home_page/children/class_student/class_student_binding.dart @@ -0,0 +1,10 @@ +import 'package:get/get.dart'; + +import 'class_student_logic.dart'; + +class ClassStudentBinding extends Bindings { + @override + void dependencies() { + Get.lazyPut(() => ClassStudentLogic()); + } +} diff --git a/lib/page/home_page/children/class_student/class_student_logic.dart b/lib/page/home_page/children/class_student/class_student_logic.dart new file mode 100644 index 0000000..345fff1 --- /dev/null +++ b/lib/page/home_page/children/class_student/class_student_logic.dart @@ -0,0 +1,37 @@ +import 'package:flutter_easyloading/flutter_easyloading.dart'; +import 'package:flutter_easyrefresh/easy_refresh.dart'; +import 'package:get/get.dart'; +import 'package:get_storage/get_storage.dart'; +import 'package:school_asignment_app/common/job/student_item.dart'; +import 'package:school_asignment_app/common/mixins/request_tool_mixin.dart'; + +import 'class_student_state.dart'; + +class ClassStudentLogic extends GetxController with RequestToolMixin{ + final ClassStudentState state = ClassStudentState(); + late final EasyRefreshController refreshController; + + @override + void onInit() { + super.onInit(); + state.title.value = Get.arguments['title']??''; + state.classId = Get.arguments['classId']??''; + state.page = Get.arguments['page']??''; + EasyLoading.show(status: 'loading...'); + refreshController = EasyRefreshController(); + getList(); + } + + void getList() async{ + StudentItem res = await getClient().getStudentList(state.classId); + state.studentList.value = res.items; + EasyLoading.dismiss(); + refreshController.finishRefresh(); + } + + @override + void dispose() { + super.dispose(); + refreshController.dispose(); + } +} diff --git a/lib/page/home_page/children/class_student/class_student_state.dart b/lib/page/home_page/children/class_student/class_student_state.dart new file mode 100644 index 0000000..6b6db42 --- /dev/null +++ b/lib/page/home_page/children/class_student/class_student_state.dart @@ -0,0 +1,13 @@ +import 'package:get/get.dart'; +import 'package:school_asignment_app/common/job/student_item.dart'; + +class ClassStudentState { + ClassStudentState() { + ///Initialize variables + } + + late RxString title = ''.obs; + late final String classId; + late RxList studentList = RxList(); + late String page = ''; +} diff --git a/lib/page/home_page/children/class_student/class_student_view.dart b/lib/page/home_page/children/class_student/class_student_view.dart new file mode 100644 index 0000000..1250e30 --- /dev/null +++ b/lib/page/home_page/children/class_student/class_student_view.dart @@ -0,0 +1,340 @@ +import 'package:flutter/material.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/student_item.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 'class_student_logic.dart'; + +class ClassStudentPage extends StatefulWidget { + const ClassStudentPage({Key? key}) : super(key: key); + + @override + State createState() => _ClassStudentPageState(); +} + +class _ClassStudentPageState extends State { + final logic = Get.find(); + final state = Get + .find() + .state; + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: const Color.fromRGBO(245, 245, 245, 1), + appBar: AppBar( + backgroundColor: Colors.white, + title: Obx(() { + return Text( + state.title.value, + style: TextStyle(fontSize: 14.sp, color: const Color(0xFF333333)), + ); + }), + centerTitle: true, + leading: IconButton( + icon: const Icon(Icons.arrow_back_ios, color: Colors.black), + onPressed: () => Navigator.of(context).pop(), + ), + actions: const [ + ReturnToHomepage(), + ], + ), + body: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox( + height: 10.r, + ), + Expanded( + child: Padding( + padding: EdgeInsets.symmetric(vertical: 14.r, horizontal: 14.r), + child: EasyRefresh( + firstRefresh: true, + taskIndependence: true, + controller: logic.refreshController, + header: MaterialHeader(), + footer: TaurusFooter(), + onRefresh: () async { + logic.getList(); + }, + child: Obx((){ + return state.studentList.isNotEmpty + ? Utils.isPad() + ? GridView( + shrinkWrap: true, + gridDelegate: + SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 2, + mainAxisSpacing: 10.r, + crossAxisSpacing: 10.r, + childAspectRatio: 556 / 112, + ), + children: List.generate(state.studentList.length, (index) { + Items item = state.studentList[index]; + return InkWell( + onTap: (){ + // RouterManager.router.navigateTo(context, + // '${RouterManager.jobPersonalDetailPath}?studentId=${item.studentId}&studentName=${Uri.encodeComponent(item.studentName)}'); + }, + child: Container( + padding: EdgeInsets.symmetric(horizontal: 10.r), + decoration: BoxDecoration( + borderRadius: + BorderRadius.all(Radius.circular(10.r)), + color: Colors.white, + ), + child: Row( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + Expanded( + child: Text( + item.name, + style: TextStyle( + fontSize: 12.sp, + color: const Color(0xFF6888FD)), + )), + + state.page == 'answerTrajectory'?Container( + height: 20.r, + width: 70.r, + decoration: BoxDecoration( + border: Border.all(width: 1.r,color: const Color(0xFFFFA41E)), + borderRadius: BorderRadius.all(Radius.circular(20.r)), + + ), + child: Center(child: Text('详情',style: TextStyle(fontSize: 10.r,color: Color(0xFFFFA41E))), + )):state.page == 'history'?Container( + height: 20.r, + width: 70.r, + decoration: BoxDecoration( + color: const Color(0xFF6888FD), + borderRadius: BorderRadius.all(Radius.circular(20.r)) + ), + child: Center(child: Text('历史作业',style: TextStyle(fontSize: 10.r,color: Colors.white),)), + ): + item.evaluationLevel == 1 + ? + InkWell( + onTap: () { + /* isClicking = true; + setJobReadLevel( + item.studentGroupDetailId, 0); + EasyLoading.show( + status: 'loading...');*/ + }, + child:Container( + height: 20.r, + width: 80.r, + decoration: BoxDecoration( + borderRadius: BorderRadius.all( + Radius.circular(4.r)), + color:const Color(0xFFB7FFE0), + ), + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: EdgeInsets.only(left: 3.r), + child: Image.asset('assets/images/youx_icon_active.png',width: 14.r,height: 14.r,), + ), + Padding( + padding: EdgeInsets.only(top: 2.r,left: 4.r), + child: Text( + '优先批阅', + style: TextStyle( + fontSize: 10.sp, + color: const Color(0xFF4CC793)), + ), + ), + ], + ), + ), + ) + :InkWell( + onTap: () { + /* isClicking = true; + setJobReadLevel( + item.studentGroupDetailId, 1); + EasyLoading.show( + status: 'loading...');*/ + }, + child: Container( + height: 20.r, + width: 80.r, + decoration: BoxDecoration( + borderRadius: BorderRadius.all( + Radius.circular(4.r)), + color: const Color(0xFFE1E1E1), + ), + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: EdgeInsets.only(left: 3.r), + child: Image.asset('assets/images/youx_icon_default.png',width: 14.r,height: 14.r,), + ), + Padding( + padding: EdgeInsets.only(top: 2.r,left: 4.r), + child: Text( + '优先批阅', + style: TextStyle( + fontSize: 10.sp, + color: const Color(0xFF8A9691)), + ), + ), + ], + ), + ), + ), + ], + ), + ), + ); + }), + ) + : ListView.builder( + itemBuilder: (context, index) { + Items item = state.studentList[index]; + return InkWell( + onTap: (){ + // RouterManager.router.navigateTo(context, + // '${RouterManager.jobPersonalDetailPath}?studentId=${item.studentId}&studentName=${Uri.encodeComponent(item.studentName)}'); + }, + child: Container( + padding: EdgeInsets.symmetric( + vertical: 20.r, horizontal: 15.r), + margin: EdgeInsets.only(bottom: 15.r), + decoration: BoxDecoration( + borderRadius: + BorderRadius.all(Radius.circular(10.r)), + color: Colors.white, + ), + child: Row( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + Expanded( + child: Text( + item.name, + style: TextStyle( + fontSize: 12.sp, + color: Color(0xFF6888FD)), + )), + state.page == 'answerTrajectory'?Container( + height: 24.r, + width: 72.r, + decoration: BoxDecoration( + border: Border.all(width: 1.r,color: Color(0xFFFFA41E)), + borderRadius: BorderRadius.all(Radius.circular(20.r)), + + ), + child: Center(child: Text('详情',style: TextStyle(fontSize: 10.r,color: Color(0xFFFFA41E))), + )):state.page == 'history'?Container( + height: 24.r, + width: 82.r, + decoration: BoxDecoration( + color: Color(0xFF6888FD), + borderRadius: BorderRadius.all(Radius.circular(20.r)) + ), + child: Center(child: Text('历史作业',style: TextStyle(fontSize: 10.r,color: Colors.white),)), + ): + item.evaluationLevel == 1 + ? InkWell( + onTap: () { + /*isClicking = true; + setJobReadLevel( + item.studentGroupDetailId, 0); + EasyLoading.show( + status: 'loading...');*/ + }, + child: Container( + height: 24.r, + width: 82.r, + decoration: BoxDecoration( + borderRadius: BorderRadius.all( + Radius.circular(4.r)), + color:Color(0xFFB7FFE0), + ), + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: EdgeInsets.only(left: 3.r), + child: Image.asset('assets/images/youx_icon_active.png',width: 14.r,height: 14.r,), + ), + Padding( + padding: EdgeInsets.only(top: 2.r,left: 4.r), + child: Text( + '优先批阅', + style: TextStyle( + fontSize: 10.sp, + color: const Color(0xFF4CC793)), + ), + ), + ], + ), + ), + ) + : InkWell( + onTap: () { + /* setJobReadLevel( + item.studentGroupDetailId, 1); + EasyLoading.show( + status: 'loading...');*/ + }, + child: Container( + height: 24.r, + width: 82.r, + decoration: BoxDecoration( + borderRadius: BorderRadius.all( + Radius.circular(4.r)), + color: const Color(0xFFE1E1E1), + ), + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: EdgeInsets.only(left: 3.r), + child: Image.asset('assets/images/youx_icon_default.png',width: 14.r,height: 14.r,), + ), + Padding( + padding: EdgeInsets.only(top: 2.r,left: 4.r), + child: Text( + '优先批阅', + style: TextStyle( + fontSize: 10.sp, + color: const Color(0xFF8A9691)), + ), + ), + ], + ), + ), + ), + ], + ), + ), + ); + }, + itemCount: state.studentList.length, + ) + : const MyEmptyWidget(); + }), + ), + ), + ) + ], + ), + ); + } + + @override + void dispose() { + Get.delete(); + super.dispose(); + } +} \ No newline at end of file diff --git a/lib/page/home_page/children/read_over/read_over_binding.dart b/lib/page/home_page/children/read_over/read_over_binding.dart new file mode 100644 index 0000000..e32eeb7 --- /dev/null +++ b/lib/page/home_page/children/read_over/read_over_binding.dart @@ -0,0 +1,10 @@ +import 'package:get/get.dart'; + +import 'read_over_logic.dart'; + +class ReadOverBinding extends Bindings { + @override + void dependencies() { + Get.lazyPut(() => ReadOverLogic()); + } +} diff --git a/lib/page/home_page/children/read_over/read_over_logic.dart b/lib/page/home_page/children/read_over/read_over_logic.dart new file mode 100644 index 0000000..c3650d2 --- /dev/null +++ b/lib/page/home_page/children/read_over/read_over_logic.dart @@ -0,0 +1,133 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_easyrefresh/easy_refresh.dart'; +import 'package:get/get.dart'; +import 'package:school_asignment_app/common/job/enum_subject.dart'; +import 'package:school_asignment_app/common/job/work_student.dart'; +import 'package:school_asignment_app/common/job/work_student_params.dart'; +import 'package:school_asignment_app/common/mixins/request_tool_mixin.dart'; +import 'package:school_asignment_app/common/store/user_store.dart'; + +import 'read_over_state.dart'; + +class ReadOverLogic extends GetxController with RequestToolMixin, GetTickerProviderStateMixin{ + final ReadOverState state = ReadOverState(); + late TabController tabController; + /* 待阅卷 */ + late final EasyRefreshController refreshController1; + late final EasyRefreshController refreshController2; + + @override + void onInit() { + super.onInit(); + refreshController1 = EasyRefreshController(); + refreshController2 = EasyRefreshController(); + tabController = TabController( + length: 2, + vsync: this, + ); + getList(); + } + + void getList() async { + WorkStudentParams params = WorkStudentParams( + assessType: state.tabIndex.value, + ); + WorkStudent data = await getClient().getWorkList(params); + state.workList.value = data.items; + refreshController1.finishRefresh(); + refreshController2.finishRefresh(); + print('state.workList.length='); + print(state.workList.length); + } + + /// 刷新方法 + Future onMyRefresh(EasyRefreshController controller, int tab) async { + /* params.page = RequestConfig.basePage.page; + List lists = await getData(controller, params, isReFresh: true); + try { + tab == 1 ? (markingDatas1 = lists) : (markingDatas2 = lists); + } catch (e) {} + toUpState(setState, () {}, mounted);*/ + getList(); + } + + /// 加载方法 + Future onMyLoad(EasyRefreshController controller, int tab) async { + /*params.page++; + List lists = await getData(controller, params); + if (lists.isNotEmpty) { + tab == 1 ? markingDatas1.addAll(lists) : markingDatas2.addAll(lists); + toUpState(setState, () {}, mounted); + }*/ + } + + /* Future showStudents( + BuildContext context, [ + bool? submitted = false, + String? className, + ]) async { + ToastUtils.showLoading(); + List students = []; + + showModalBottomSheet( + context: context, + elevation: 10, + backgroundColor: Colors.white, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.only( + topLeft: Radius.circular(20.r), + topRight: Radius.circular(20.r), + ), + ), + builder: (BuildContext context) { + return Padding( + padding: EdgeInsets.symmetric(horizontal: 2.w), + child: Column( + children: [ + Container( + margin: EdgeInsets.only(top: 14.h), + child: quickText( + '${className ?? ''}${submitted! ? '已提交' : '未提交'}作业学生', + size: 18.sp, + fontWeight: FontWeight.bold, + color: Color.fromRGBO(60, 60, 60, 1), + ), + ), + Expanded( + child: ListView( + padding: EdgeInsets.symmetric(vertical: 8.h, horizontal: 4.w), + children: [ + Wrap( + spacing: 6.0, // 主轴(水平)方向间距 + runSpacing: 4.0, // 纵轴(垂直)方向间距 + alignment: WrapAlignment.spaceAround, //沿主轴方向居中 + children: students.map((e) { + return Chip( + backgroundColor: Color.fromRGBO(239, 242, 255, 1), + avatar: CircleAvatar( + backgroundColor: Colors.white, + child: quickText(e.studentName.substring(0, 1), + size: 12.sp, color: Theme.of(context).primaryColor), + ), + label: quickText(e.studentName, color: Color.fromRGBO(80, 94, 110, 1), size: 12.sp), + ); + }).toList(), + ), + ], + ), + ) + ], + ), + ); + }, + ); + }*/ + + @override + void dispose() { + super.dispose(); + tabController.dispose(); + refreshController1.dispose(); + refreshController2.dispose(); + } +} diff --git a/lib/page/home_page/children/read_over/read_over_state.dart b/lib/page/home_page/children/read_over/read_over_state.dart new file mode 100644 index 0000000..1bf60aa --- /dev/null +++ b/lib/page/home_page/children/read_over/read_over_state.dart @@ -0,0 +1,13 @@ +import 'package:get/get.dart'; +import 'package:school_asignment_app/common/job/work_student.dart'; + +class ReadOverState { + ReadOverState() { + ///Initialize variables + } + + int active = 1; + late RxList workList = RxList(); + late RxInt tabIndex = 0.obs; + late bool completedToRefresh = true; +} diff --git a/lib/page/home_page/children/read_over/read_over_view.dart b/lib/page/home_page/children/read_over/read_over_view.dart new file mode 100644 index 0000000..87142f4 --- /dev/null +++ b/lib/page/home_page/children/read_over/read_over_view.dart @@ -0,0 +1,421 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_easyrefresh/easy_refresh.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:functional_widget_annotation/functional_widget_annotation.dart'; +import 'package:get/get.dart'; +import 'package:school_asignment_app/common/job/work_student.dart'; +import 'package:school_asignment_app/common/utils/enum_untils.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/my_text.dart'; +import 'package:school_asignment_app/page/home_page/children/read_over/widget/task_list_item.dart'; + +import 'read_over_logic.dart'; + +class ReadOverPage extends StatefulWidget { + const ReadOverPage({Key? key}) : super(key: key); + + @override + State createState() => _ReadOverPageState(); +} + +class _ReadOverPageState extends State { + final logic = Get.find(); + final state = Get.find().state; + + @override + Widget build(BuildContext context) { + return AnnotatedRegion( + value: const SystemUiOverlayStyle( + systemNavigationBarColor: Color(0xFF000000), + systemNavigationBarDividerColor: null, + statusBarColor: Colors.white, + systemNavigationBarIconBrightness: Brightness.light, + statusBarIconBrightness: Brightness.dark, + statusBarBrightness: Brightness.light, + ), + child: Scaffold( + backgroundColor: const Color.fromRGBO(244, 244, 244, 1), + body: OrientationBuilder( + builder: (BuildContext context, Orientation orientation) { + return Column( + children: [ + Container( + color: Colors.white, + margin: EdgeInsets.only(top: MediaQuery.of(context).padding.top), + padding: EdgeInsets.only(bottom: 9.h, top: 4.h), + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Expanded( + flex: 1, + child: Container( + alignment: Alignment.centerLeft, + padding: EdgeInsets.only(left: 10.w), + child: InkWell( + onTap: () { + Get.back(); + }, + child: Icon( + Icons.arrow_back_ios_sharp, + size: 16.sp, + ), + ), + )), + Expanded( + flex: 4, + child: Container( + padding: EdgeInsets.symmetric(vertical: 2.h), + alignment: Alignment.center, + decoration: BoxDecoration( + color: const Color.fromRGBO(243, 243, 243, 1), + borderRadius: BorderRadius.circular(8.r), + ), + child: TabBar( + padding: EdgeInsets.zero, + indicatorPadding: EdgeInsets.zero, + indicatorWeight: 0, + labelPadding: EdgeInsets.symmetric(horizontal: 2.w), + controller: logic.tabController, + unselectedLabelStyle: TextStyle( + fontSize: 14.sp, + color: const Color.fromRGBO(69, 83, 100, 1), + ), + labelStyle: TextStyle( + fontSize: 14.sp, + color: const Color.fromRGBO(104, 136, 253, 1), + ), + // labelColor: const Color.fromRGBO(45, 56, 76, 1), + indicator: const BoxDecoration(), + onTap: (index) { + state.tabIndex.value = index; + if (index == 1 && state.completedToRefresh) { + // 已阅卷 + // _refreshController2.callRefresh(); + state.completedToRefresh = false; + } + logic.getList(); + }, + tabs: [ + Tab( + iconMargin: EdgeInsets.zero, + height: 34.h, + child: Obx(() { + return Container( + width: 140.w, + alignment: Alignment.center, + decoration: BoxDecoration( + color: state.tabIndex.value == 0 ? const Color.fromRGBO(255, 255, 255, 1) : null, + borderRadius: BorderRadius.all(Radius.circular(8.r)), + ), + child: quickText( + '待批阅', + size: 14.sp, + color: state.tabIndex.value == 0 ? Theme.of(context).primaryColor : const Color.fromRGBO(80, 94, 110, 1), + fontWeight: state.tabIndex.value == 0 ? FontWeight.bold : null, + ), + ); + }), + ), + Tab( + iconMargin: EdgeInsets.zero, + height: 34.h, + child: Obx(() { + return Container( + width: 140.w, + alignment: Alignment.center, + decoration: BoxDecoration( + color: state.tabIndex.value == 1 ? const Color.fromRGBO(255, 255, 255, 1) : null, + borderRadius: BorderRadius.all(Radius.circular(8.r)), + ), + child: quickText( + '已批阅', + size: 14.sp, + color: state.tabIndex.value == 1 ? Theme.of(context).primaryColor : const Color.fromRGBO(80, 94, 110, 1), + fontWeight: state.tabIndex.value == 1 ? FontWeight.bold : null, + ), + ); + }), + ), + ], + ), + ), + ), + Expanded( + flex: 1, + child: InkWell( + onTap: () { + /* RouterManager.router + .navigateTo( + context, RouterManager.jobStudentGroupPath, + transition: getTransition());*/ + }, + child: Icon(const IconData(0xe63e, fontFamily: "AlibabaIcon"), color: const Color.fromRGBO(44, 48, 63, 1), size: 24.sp), + ), + ), + ], + ), + ), + /* if (state.tabIndex.value == 1) + $CompletedJobConditionFilter( + controller: _tabController2, + jobType: params2.markingType ?? 1, + customTime: _tabController2.index != 3 || + (params2.startTime == null && params2.endTime == null) + ? null + : PickerDateRange( + params2.startTime == null ? null : DateTime.parse( + params2.startTime!), + params2.endTime == null ? null : DateTime.parse(params2 + .endTime!), + ), + onJobTypeTap: (int jobTypeVal) { + params2.markingType = jobTypeVal; + _refreshController2.callRefresh(); + }, + onTimeFilter: (String? startTime, String? endTime) { + if (startTime == null && endTime == null && + _tabController2.index == 3) { + _tabController2.animateTo(0); + } + params2.endTime = endTime; + params2.startTime = startTime; + _refreshController2.callRefresh(); + }, + ),*/ + Expanded( + child: IndexedStack( + index: state.tabIndex.value, + children: [ + $easyRefresh( + controller: logic.refreshController1, + tab: 1, + type: state.active, + data: state.workList, + onLoad: logic.onMyLoad, + onRefresh: logic.onMyRefresh, + logic: logic), + $easyRefresh( + controller: logic.refreshController2, + tab: 2, + type: state.active, + data: state.workList, + onLoad: logic.onMyLoad, + onRefresh: logic.onMyRefresh, + logic: logic), + ], + )), + ], + ); + }, + ), + ), + ); + } + + @override + void dispose() { + Get.delete(); + super.dispose(); + } +} + + +/// 已阅卷 +/// OnRefreshCallback? onRefresh +/// +@swidget +Widget $easyRefresh({ + required EasyRefreshController controller, + required Future Function(EasyRefreshController controller, int tab) onRefresh, + required Future Function(EasyRefreshController controller, int tab) onLoad, + required List data, + required int tab, + required int type, + required ReadOverLogic logic, +}) { + bool completed = tab == 2; // 是否是待批阅 + bool isPadFlag = Utils.isPad(); + return Obx(() { + return EasyRefresh( + firstRefresh: false, + taskIndependence: true, + /*enableControlFinishLoad: true, + enableControlFinishRefresh: true,*/ + emptyWidget: data.isEmpty ? const MyEmptyWidget() : null, + controller: controller, + header: MaterialHeader(), + footer: TaurusFooter(), + child: completed && isPadFlag + ? GridView( + padding: EdgeInsets.only(top: 11.h, bottom: 10.h, left: 12.w, right: 12.w), + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 2, //横轴三个子widget + mainAxisSpacing: 10.h, + crossAxisSpacing: 6.w, + childAspectRatio: 1.81 //宽高比为1时,子widget + ), + children: List.generate(data.length, (index) { + Items item = data[index]; + String subjectName = EnumUtils.formatSubject(item.subject); + return $reviewedItem(jobTaskItem: item, type: type, subjectName: subjectName); + }), + ) + : ListView.builder( + padding: EdgeInsets.only(top: 11.h, bottom: 10.h, left: 12.w, right: 12.w), + itemBuilder: (context, index) { + Items item = data[index]; + return TaskListItem( + completed: completed, + jobTaskItem: item, + type: type, + ); + /*HomeworkTasksViewItem( + completed: completed, + jobTaskItem: data[index], + call: () => controller.callRefresh(), + );*/ + }, + itemCount: data.length, + ), + onRefresh: () => onRefresh(controller, tab), + onLoad: () => onLoad(controller, tab), + ); + }); +} + +@swidget +Widget $reviewedItem({required Items jobTaskItem, required int type, required String subjectName}) { + EdgeInsets padEdg = EdgeInsets.symmetric(horizontal: 10.w); + + return InkWell( + onTap: () { + /* String url = + '${RouterManager.jobListParticipateInClassPath}?&jobId=${jobTaskItem.id}&genderName=${Uri.encodeComponent(jobTaskItem.genderName)}&jobName=${Uri.encodeComponent(jobTaskItem.title)}&completed=${true}'; + RouterManager.router.navigateTo(context, url, transition: getTransition());*/ + }, + child: Container( + padding: EdgeInsets.only(top: 10.h), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(6.r), + color: Colors.white, + boxShadow: const [ + BoxShadow( + color: Color.fromRGBO(210, 216, 241, 1), + offset: Offset.zero, //阴影y轴偏移量 + blurRadius: 5.8, //阴影模糊程度 + spreadRadius: 0, //阴影扩散程度 + ) + ], + ), + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + // 顶部任务名称 + Padding( + padding: padEdg, + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + width: 32.w, + height: 18.h, + alignment: Alignment.center, + padding: EdgeInsets.only(left: 2.w), + decoration: BoxDecoration( + color: type == 1 ? const Color.fromRGBO(104, 136, 253, 1) : const Color.fromRGBO(255, 175, 56, 1), + borderRadius: BorderRadius.only( + topLeft: Radius.circular(14.r), + topRight: Radius.circular(3.r), + bottomLeft: Radius.circular(4.r), + bottomRight: Radius.circular(4.r), + ), + ), + margin: EdgeInsets.only(right: 4.w), + child: quickText(type == 1 ? '作业' : '考试', color: Colors.white, size: 10.sp), + ), + Expanded( + child: quickText(jobTaskItem.name, size: 14.sp, color: const Color.fromRGBO(70, 70, 70, 1), maxLines: 2), + ) + ], + ), + ), + + Padding( + padding: padEdg, + child: Row( + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + quickText( + jobTaskItem.publishTime.substring(0, 10), + color: const Color.fromRGBO(97, 97, 97, 1), + size: 10.sp, + fontWeight: FontWeight.w500, + ), + quickText(' / ', color: const Color.fromRGBO(76, 199, 147, 1), size: 10.sp, fontWeight: FontWeight.w500), + quickText( + '参与班级:', + color: const Color.fromRGBO(76, 199, 147, 1), + size: 9.sp, + ), + quickText( + '${jobTaskItem.classCount}', + color: const Color.fromRGBO(76, 199, 147, 1), + size: 10.sp, + ), + quickText(' / ', color: const Color.fromRGBO(116, 145, 253, 1), size: 10.sp, fontWeight: FontWeight.w500), + quickText( + '科目:$subjectName', + color: const Color.fromRGBO(116, 145, 253, 1), + size: 9.sp, + ), + ], + ), + ), + /*Padding( + padding: EdgeInsets.symmetric(horizontal: 10.w), + child: FavoriteButton( + jobTaskItem.id, + jobTaskItem.title, + margin: EdgeInsets.only(top: 4.h, bottom: 6.h), + ), + ),*/ + GestureDetector( + onTap: () { + /* RouterManager.router.navigateTo( + context, + RouterManager.jobReportPagePath + + '?title=${Uri.encodeComponent(jobTaskItem.title)}&id=${jobTaskItem.id}', + transition: getTransition(), + );*/ + }, + child: Container( + padding: EdgeInsets.symmetric(vertical: 6.h), + decoration: BoxDecoration( + borderRadius: BorderRadius.only(bottomLeft: Radius.circular(6.r), bottomRight: Radius.circular(6.r)), + color: Colors.white, + boxShadow: const [ + BoxShadow( + color: Color.fromRGBO(0, 0, 0, 0.15), + offset: Offset(0, -0.0001), //阴影y轴偏移量 + blurRadius: 4, //阴影模糊程度 + spreadRadius: 0, //阴影扩散程度 + ) + ], + ), + child: Row(children: [ + Expanded( + child: Container( + alignment: Alignment.center, + child: quickText('查看报告', color: const Color.fromRGBO(118, 118, 118, 1), size: 11.sp), + ), + ), + ]), + ), + ), + ], + ), + ), + ); +} diff --git a/lib/page/home_page/widget/task_list_item.dart b/lib/page/home_page/children/read_over/widget/task_list_item.dart similarity index 97% rename from lib/page/home_page/widget/task_list_item.dart rename to lib/page/home_page/children/read_over/widget/task_list_item.dart index 64aeb19..1fefafb 100644 --- a/lib/page/home_page/widget/task_list_item.dart +++ b/lib/page/home_page/children/read_over/widget/task_list_item.dart @@ -1,19 +1,17 @@ import 'package:flutter/material.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/work_student.dart'; +import 'package:school_asignment_app/common/utils/enum_untils.dart'; import 'package:school_asignment_app/page/global_widget/my_text.dart'; -import 'package:school_asignment_app/page/home_page/home_logic.dart'; import 'package:school_asignment_app/common/utils/utils.dart'; class TaskListItem extends StatefulWidget { final bool completed; final Items jobTaskItem; final int type; - final HomeLogic logic; - const TaskListItem({Key? key,required this.completed,required this.jobTaskItem,required this.type,required this.logic}) : super(key: key); + const TaskListItem({Key? key,required this.completed,required this.jobTaskItem,required this.type}) : super(key: key); @override State createState() => _TaskListItemState(); @@ -106,7 +104,7 @@ class _TaskListItemState extends State { ), quickText(' / ', color: const Color.fromRGBO(116, 145, 253, 1), size: 12.sp, fontWeight: FontWeight.w500), quickText( - '科目:${widget.logic.formatSubject(widget.jobTaskItem.subject)}' , + '科目:${EnumUtils.formatSubject(widget.jobTaskItem.subject)}' , color: const Color.fromRGBO(116, 145, 253, 1), size: 12.sp, fontWeight: FontWeight.w600, @@ -225,7 +223,7 @@ class _TaskListItemState extends State { crossAxisAlignment: CrossAxisAlignment.end, children: [ quickText( - widget.logic.formatSubject(widget.jobTaskItem.subject), + EnumUtils.formatSubject(widget.jobTaskItem.subject), color: const Color.fromRGBO(97, 97, 97, 1), size: 12.sp, ), diff --git a/lib/page/home_page/children/read_over/widget/top_user_info.dart b/lib/page/home_page/children/read_over/widget/top_user_info.dart new file mode 100644 index 0000000..64fd320 --- /dev/null +++ b/lib/page/home_page/children/read_over/widget/top_user_info.dart @@ -0,0 +1,72 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:get/get.dart'; +import 'package:school_asignment_app/page/home_page/home_logic.dart'; +import 'package:school_asignment_app/routes/app_pages.dart'; + +class TopUserInfo extends StatelessWidget { + TopUserInfo({Key? key}) : super(key: key); + final controller = Get.find; + final state = Get.find().state; + @override + Widget build(BuildContext context) { + return InkWell( + onTap: () { + Get.toNamed(Routes.myInfo); + }, + child: Container( + color: Colors.white, + padding: EdgeInsets.only( + top: MediaQuery.of(context).padding.top + 4.h, + left: 14.w, + right: 14.w, + bottom: 19.h), + child: Row( + children: [ + Container( + decoration: BoxDecoration( + color: const Color.fromRGBO(245, 246, 251, 1), + borderRadius: BorderRadius.circular(30.r), + ), + child: Row( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + ClipRRect( + borderRadius: BorderRadius.circular(50.w), + child: Container( + alignment: Alignment.center, + color: const Color.fromRGBO(163, 211, 255, 1), + padding: EdgeInsets.all(1.r), + child: Image.asset('assets/images/login_logo.png', + width: 32.w, height: 32.w), + ), + ), + Container( + margin: EdgeInsets.only(left: 10.h), + child: Text( + state.userInfo.value!.givenname, + style: TextStyle( + fontSize: 15.sp, + color: const Color.fromRGBO(45, 56, 76, 0.9)), + ), + ), + Container( + padding: EdgeInsets.symmetric(horizontal: 4.w), + child: Icon( + Icons.arrow_forward_ios_rounded, + size: 12.sp, + color: const Color.fromRGBO(45, 56, 76, 0.9), + ), + ), + SizedBox(width: 5.w) + ], + ), + ), + const Expanded(child: SizedBox()) + ], + ), + ), + ); + } +} diff --git a/lib/page/home_page/children/student_history_work/student_history_work_binding.dart b/lib/page/home_page/children/student_history_work/student_history_work_binding.dart new file mode 100644 index 0000000..ed4dcf5 --- /dev/null +++ b/lib/page/home_page/children/student_history_work/student_history_work_binding.dart @@ -0,0 +1,10 @@ +import 'package:get/get.dart'; + +import 'student_history_work_logic.dart'; + +class StudentHistoryWorkBinding extends Bindings { + @override + void dependencies() { + Get.lazyPut(() => StudentHistoryWorkLogic()); + } +} diff --git a/lib/page/home_page/children/student_history_work/student_history_work_logic.dart b/lib/page/home_page/children/student_history_work/student_history_work_logic.dart new file mode 100644 index 0000000..2baf451 --- /dev/null +++ b/lib/page/home_page/children/student_history_work/student_history_work_logic.dart @@ -0,0 +1,40 @@ +import 'package:flutter_easyloading/flutter_easyloading.dart'; +import 'package:flutter_easyrefresh/easy_refresh.dart'; +import 'package:get/get.dart'; +import 'package:get_storage/get_storage.dart'; +import 'package:school_asignment_app/common/job/class_item.dart'; +import 'package:school_asignment_app/common/mixins/request_tool_mixin.dart'; +import 'package:school_asignment_app/routes/app_pages.dart'; + +import 'student_history_work_state.dart'; + +class StudentHistoryWorkLogic extends GetxController with RequestToolMixin { + final StudentHistoryWorkState state = StudentHistoryWorkState(); + late final EasyRefreshController refreshController; + String nextPage = ''; + @override + void onInit() { + super.onInit(); + nextPage = Get.arguments['page']??''; + EasyLoading.show(status: 'loading...'); + refreshController = EasyRefreshController(); + getList(); + } + + void getList() async { + List data = await getClient().getStudentClass(); + state.clssList.value = data; + EasyLoading.dismiss(); + refreshController.finishRefresh(); + } + + void goNextPage(String id,String title) { + Get.toNamed(Routes.classStudentPage,arguments: {'title':title,'classId':id,'page':nextPage}); + } + + @override + void dispose() { + super.dispose(); + refreshController.dispose(); + } +} diff --git a/lib/page/home_page/children/student_history_work/student_history_work_state.dart b/lib/page/home_page/children/student_history_work/student_history_work_state.dart new file mode 100644 index 0000000..e7dd14d --- /dev/null +++ b/lib/page/home_page/children/student_history_work/student_history_work_state.dart @@ -0,0 +1,9 @@ +import 'package:get/get.dart'; +import 'package:school_asignment_app/common/job/class_item.dart'; + +class StudentHistoryWorkState { + StudentHistoryWorkState() { + ///Initialize variables + } + late RxList clssList = RxList(); +} diff --git a/lib/page/home_page/children/student_history_work/student_history_work_view.dart b/lib/page/home_page/children/student_history_work/student_history_work_view.dart new file mode 100644 index 0000000..7d7d370 --- /dev/null +++ b/lib/page/home_page/children/student_history_work/student_history_work_view.dart @@ -0,0 +1,62 @@ +import 'package:flutter/material.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/page/global_widget/ReturnToHomepage.dart'; +import 'package:school_asignment_app/page/home_page/widget/student_group_list.dart'; + +import 'student_history_work_logic.dart'; + +class StudentHistoryWorkPage extends StatefulWidget { + const StudentHistoryWorkPage({Key? key}) : super(key: key); + + @override + State createState() => _StudentHistoryWorkPageState(); +} + +class _StudentHistoryWorkPageState extends State { + final logic = Get.find(); + final state = Get.find().state; + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: const Color.fromRGBO(245, 245, 245, 1), + appBar: AppBar( + backgroundColor: Colors.white, + title: Text( + '我的学生分组', + style: TextStyle(fontSize: 14.sp, color: const Color(0xFF333333)), + ), + centerTitle: true, + leading: IconButton( + icon: const Icon(Icons.arrow_back_ios, color: Colors.black), + onPressed: () => Navigator.of(context).pop(), + ), + actions: const [ + ReturnToHomepage(), + ], + ), + body: Padding( + padding: EdgeInsets.only(top: 15.r, left: 14.r, right: 14.r), + child: EasyRefresh( + firstRefresh: false, + taskIndependence: true, + controller: logic.refreshController, + header: MaterialHeader(), + footer: TaurusFooter(), + onRefresh: () async{ + logic.getList(); + }, + child: StudentGroupList(state.clssList,logic.goNextPage), + ), + ), + ); + } + + @override + void dispose() { + Get.delete(); + super.dispose(); + } +} \ No newline at end of file diff --git a/lib/page/home_page/home_logic.dart b/lib/page/home_page/home_logic.dart index f0b6967..f8cc40f 100644 --- a/lib/page/home_page/home_logic.dart +++ b/lib/page/home_page/home_logic.dart @@ -1,145 +1,28 @@ -import 'package:flutter/material.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/enum_subject.dart'; import 'package:school_asignment_app/common/job/work_student.dart'; import 'package:school_asignment_app/common/job/work_student_params.dart'; import 'package:school_asignment_app/common/mixins/request_tool_mixin.dart'; import 'package:school_asignment_app/common/store/user_store.dart'; -import 'package:school_asignment_app/common/utils/toast_utils.dart'; -import 'package:school_asignment_app/page/global_widget/my_text.dart'; import 'home_state.dart'; class HomeLogic extends GetxController with RequestToolMixin, GetTickerProviderStateMixin { final HomeState state = HomeState(); - late TabController tabController; - /* 待阅卷 */ - late final EasyRefreshController refreshController1; - late final EasyRefreshController refreshController2; - @override void onInit() { super.onInit(); - state.userInfo = UserStore.to.userInfo; - state.active = Get.arguments ?? 1; - refreshController1 = EasyRefreshController(); - refreshController2 = EasyRefreshController(); - tabController = TabController( - length: 2, - vsync: this, - ); getList(); } - void getList() async { WorkStudentParams params = WorkStudentParams( - assessType: state.tabIndex.value, + assessType: 0, ); WorkStudent data = await getClient().getWorkList(params); - state.workList.value = data.items; - refreshController1.finishRefresh(); - refreshController2.finishRefresh(); - print('state.workList.length='); - print(state.workList.length); + UserStore.to.readOver.value = data.items.length; + } - - /// 刷新方法 - Future onMyRefresh(EasyRefreshController controller, int tab) async { - /* params.page = RequestConfig.basePage.page; - List lists = await getData(controller, params, isReFresh: true); - try { - tab == 1 ? (markingDatas1 = lists) : (markingDatas2 = lists); - } catch (e) {} - toUpState(setState, () {}, mounted);*/ - getList(); - } - - /// 加载方法 - Future onMyLoad(EasyRefreshController controller, int tab) async { - /*params.page++; - List lists = await getData(controller, params); - if (lists.isNotEmpty) { - tab == 1 ? markingDatas1.addAll(lists) : markingDatas2.addAll(lists); - toUpState(setState, () {}, mounted); - }*/ - } - String formatSubject(int id) { - if (UserStore.to.subjectList.isEmpty) { - return ''; - } - EnumSubject item = UserStore.to.subjectList.firstWhere((element) => element.id == id); - return item.name ?? ''; - } - - /* Future showStudents( - BuildContext context, [ - bool? submitted = false, - String? className, - ]) async { - ToastUtils.showLoading(); - List students = []; - - showModalBottomSheet( - context: context, - elevation: 10, - backgroundColor: Colors.white, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.only( - topLeft: Radius.circular(20.r), - topRight: Radius.circular(20.r), - ), - ), - builder: (BuildContext context) { - return Padding( - padding: EdgeInsets.symmetric(horizontal: 2.w), - child: Column( - children: [ - Container( - margin: EdgeInsets.only(top: 14.h), - child: quickText( - '${className ?? ''}${submitted! ? '已提交' : '未提交'}作业学生', - size: 18.sp, - fontWeight: FontWeight.bold, - color: Color.fromRGBO(60, 60, 60, 1), - ), - ), - Expanded( - child: ListView( - padding: EdgeInsets.symmetric(vertical: 8.h, horizontal: 4.w), - children: [ - Wrap( - spacing: 6.0, // 主轴(水平)方向间距 - runSpacing: 4.0, // 纵轴(垂直)方向间距 - alignment: WrapAlignment.spaceAround, //沿主轴方向居中 - children: students.map((e) { - return Chip( - backgroundColor: Color.fromRGBO(239, 242, 255, 1), - avatar: CircleAvatar( - backgroundColor: Colors.white, - child: quickText(e.studentName.substring(0, 1), - size: 12.sp, color: Theme.of(context).primaryColor), - ), - label: quickText(e.studentName, color: Color.fromRGBO(80, 94, 110, 1), size: 12.sp), - ); - }).toList(), - ), - ], - ), - ) - ], - ), - ); - }, - ); - }*/ - @override void dispose() { super.dispose(); - tabController.dispose(); - refreshController1.dispose(); - refreshController2.dispose(); } } diff --git a/lib/page/home_page/home_state.dart b/lib/page/home_page/home_state.dart index 16b2743..38018a6 100644 --- a/lib/page/home_page/home_state.dart +++ b/lib/page/home_page/home_state.dart @@ -1,8 +1,5 @@ -import 'package:flutter/material.dart'; import 'package:get/get.dart'; -import 'package:school_asignment_app/common/job/enum_subject.dart'; import 'package:school_asignment_app/common/job/user_info.dart'; -import 'package:school_asignment_app/common/job/work_student.dart'; import 'package:school_asignment_app/common/store/user_store.dart'; class HomeState { @@ -11,8 +8,6 @@ class HomeState { } late Rx userInfo; - int active = 1; - late RxList workList = RxList(); - late RxInt tabIndex = 0.obs; - late bool completedToRefresh = true; + late RxInt readOver = UserStore.to.readOver; + } diff --git a/lib/page/home_page/home_view.dart b/lib/page/home_page/home_view.dart index a361259..172810c 100644 --- a/lib/page/home_page/home_view.dart +++ b/lib/page/home_page/home_view.dart @@ -1,19 +1,11 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; -import 'package:flutter_easyrefresh/easy_refresh.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:functional_widget_annotation/functional_widget_annotation.dart'; import 'package:get/get.dart'; -import 'package:get_storage/get_storage.dart'; -import 'package:school_asignment_app/common/job/work_student.dart'; -import 'package:school_asignment_app/common/store/app_storage_key.dart'; -import 'package:school_asignment_app/common/utils/storage.dart'; +import 'package:badges/badges.dart' as badges; 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/global_scaffold.dart'; import 'package:school_asignment_app/page/global_widget/my_text.dart'; -import 'package:school_asignment_app/page/home_page/widget/task_list_item.dart'; -import 'package:school_asignment_app/page/home_page/widget/top_user_info.dart'; import 'package:school_asignment_app/routes/app_pages.dart'; import 'home_logic.dart'; @@ -25,7 +17,8 @@ class HomePage extends StatefulWidget { State createState() => _HomePageState(); } -class _HomePageState extends State with AutomaticKeepAliveClientMixin { +class _HomePageState extends State + with AutomaticKeepAliveClientMixin { final logic = Get.find(); final state = Get.find().state; @@ -35,7 +28,7 @@ class _HomePageState extends State with AutomaticKeepAliveClientMixin @override Widget build(BuildContext context) { super.build(context); - + var spaceWidth = SizedBox(height: ScreenUtil().screenWidth / 19); return AnnotatedRegion( value: const SystemUiOverlayStyle( systemNavigationBarColor: Color(0xFF000000), @@ -45,167 +38,67 @@ class _HomePageState extends State with AutomaticKeepAliveClientMixin statusBarIconBrightness: Brightness.dark, statusBarBrightness: Brightness.light, ), - child: Scaffold( - backgroundColor: const Color.fromRGBO(244, 244, 244, 1), - body: OrientationBuilder( - builder: (BuildContext context, Orientation orientation) { - return Column( - children: [ - Container( - color: Colors.white, - margin: EdgeInsets.only(top: MediaQuery.of(context).padding.top), - padding: EdgeInsets.only(bottom: 9.h, top: 4.h), - child: Row( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - const Expanded(flex: 1, child: SizedBox()), - Expanded( - flex: 4, - child: Container( - padding: EdgeInsets.symmetric(vertical: 2.h), - alignment: Alignment.center, - decoration: BoxDecoration( - color: const Color.fromRGBO(243, 243, 243, 1), - borderRadius: BorderRadius.circular(8.r), - ), - child: TabBar( - padding: EdgeInsets.zero, - indicatorPadding: EdgeInsets.zero, - indicatorWeight: 0, - labelPadding: EdgeInsets.symmetric(horizontal: 2.w), - controller: logic.tabController, - unselectedLabelStyle: TextStyle( - fontSize: 14.sp, - color: const Color.fromRGBO(69, 83, 100, 1), - ), - labelStyle: TextStyle( - fontSize: 14.sp, - color: const Color.fromRGBO(104, 136, 253, 1), - ), - // labelColor: const Color.fromRGBO(45, 56, 76, 1), - indicator: const BoxDecoration(), - onTap: (index) { - state.tabIndex.value = index; - if (index == 1 && state.completedToRefresh) { - // 已阅卷 - // _refreshController2.callRefresh(); - state.completedToRefresh = false; - } - logic.getList(); - }, - tabs: [ - Tab( - iconMargin: EdgeInsets.zero, - height: 34.h, - child: Obx(() { - return Container( - width: 140.w, - alignment: Alignment.center, - decoration: BoxDecoration( - color: state.tabIndex.value == 0 ? const Color.fromRGBO(255, 255, 255, 1) : null, - borderRadius: BorderRadius.all(Radius.circular(8.r)), - ), - child: quickText( - '待批阅', - size: 14.sp, - color: state.tabIndex.value == 0 ? Theme.of(context).primaryColor : const Color.fromRGBO(80, 94, 110, 1), - fontWeight: state.tabIndex.value == 0 ? FontWeight.bold : null, - ), - ); - }), - ), - Tab( - iconMargin: EdgeInsets.zero, - height: 34.h, - child: Obx(() { - return Container( - width: 140.w, - alignment: Alignment.center, - decoration: BoxDecoration( - color: state.tabIndex.value == 1 ? const Color.fromRGBO(255, 255, 255, 1) : null, - borderRadius: BorderRadius.all(Radius.circular(8.r)), - ), - child: quickText( - '已批阅', - size: 14.sp, - color: state.tabIndex.value == 1 ? Theme.of(context).primaryColor : const Color.fromRGBO(80, 94, 110, 1), - fontWeight: state.tabIndex.value == 1 ? FontWeight.bold : null, - ), - ); - }), - ), - ], - ), - ), - ), - Expanded( - flex: 1, - child: InkWell( - onTap: () { - /* RouterManager.router - .navigateTo( - context, RouterManager.jobStudentGroupPath, - transition: getTransition());*/ - }, - child: Icon(const IconData(0xe63e, fontFamily: "AlibabaIcon"), color: const Color.fromRGBO(44, 48, 63, 1), size: 24.sp), - ), - ), - ], + child: ListView( + children: [ + Container( + height: 200.h, + width: double.infinity, + decoration: const BoxDecoration( + image: DecorationImage( + image: AssetImage('assets/images/job_home_top_bgm.png'), + fit: BoxFit.fill, // 完全填充 + ), + ), + ), + SizedBox(height: 30.h), + Obx(() { + return $TermRow( + context, + [ + EntranceModel( + title: '作业批阅', + image: 'assets/images/job_home_marking.png', + navigationUrl: Routes.readOverPage), + EntranceModel( + title: '学生历史作业', + image: 'assets/images/job_home_history.png', + navigationUrl: Routes.studentHistoryWorkPage, + page: 'history', ), - ), - /* if (state.tabIndex.value == 1) - $CompletedJobConditionFilter( - controller: _tabController2, - jobType: params2.markingType ?? 1, - customTime: _tabController2.index != 3 || - (params2.startTime == null && params2.endTime == null) - ? null - : PickerDateRange( - params2.startTime == null ? null : DateTime.parse( - params2.startTime!), - params2.endTime == null ? null : DateTime.parse(params2 - .endTime!), - ), - onJobTypeTap: (int jobTypeVal) { - params2.markingType = jobTypeVal; - _refreshController2.callRefresh(); - }, - onTimeFilter: (String? startTime, String? endTime) { - if (startTime == null && endTime == null && - _tabController2.index == 3) { - _tabController2.animateTo(0); - } - params2.endTime = endTime; - params2.startTime = startTime; - _refreshController2.callRefresh(); - }, - ),*/ - Expanded( - child: IndexedStack( - index: state.tabIndex.value, - children: [ - $easyRefresh( - controller: logic.refreshController1, - tab: 1, - type: state.active, - data: state.workList, - onLoad: logic.onMyLoad, - onRefresh: logic.onMyRefresh, - logic: logic), - $easyRefresh( - controller: logic.refreshController2, - tab: 2, - type: state.active, - data: state.workList, - onLoad: logic.onMyLoad, - onRefresh: logic.onMyRefresh, - logic: logic), - ], - )), + EntranceModel( + title: '知识点点掌握', + image: 'assets/images/job_home_knowledge.png', + navigationUrl: '') + ], + state.readOver.value); + }), + spaceWidth, + $TermRow( + context, + [ + EntranceModel( + title: '答题轨迹', + image: 'assets/images/job_home_answer_record.png', + navigationUrl: ''), + EntranceModel( + title: '优先批阅设定', + image: 'assets/images/job_home_youxian.png', + navigationUrl: Routes.studentHistoryWorkPage, + page: 'set', + ) ], - ); - }, - ), + 0), + spaceWidth, + $TermRow( + context, + [ + EntranceModel( + title: '批阅设置', + image: 'assets/images/job_home_marking_set.png', + navigationUrl: '') + ], + 0), + ], ), ); } @@ -217,201 +110,148 @@ class _HomePageState extends State with AutomaticKeepAliveClientMixin } } -/// 已阅卷 -/// OnRefreshCallback? onRefresh -/// -@swidget -Widget $easyRefresh({ - required EasyRefreshController controller, - required Future Function(EasyRefreshController controller, int tab) onRefresh, - required Future Function(EasyRefreshController controller, int tab) onLoad, - required List data, - required int tab, - required int type, - required HomeLogic logic, -}) { - bool completed = tab == 2; // 是否是待批阅 - bool isPadFlag = Utils.isPad(); - return Obx(() { - return EasyRefresh( - firstRefresh: false, - taskIndependence: true, - /*enableControlFinishLoad: true, - enableControlFinishRefresh: true,*/ - emptyWidget: data.isEmpty ? const MyEmptyWidget() : null, - controller: controller, - header: MaterialHeader(), - footer: TaurusFooter(), - child: completed && isPadFlag - ? GridView( - padding: EdgeInsets.only(top: 11.h, bottom: 10.h, left: 12.w, right: 12.w), - gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( - crossAxisCount: 2, //横轴三个子widget - mainAxisSpacing: 10.h, - crossAxisSpacing: 6.w, - childAspectRatio: 1.81 //宽高比为1时,子widget - ), - children: List.generate(data.length, (index) { - Items item = data[index]; - String subjectName = logic.formatSubject(item.subject); - return $reviewedItem(jobTaskItem: item, type: type, subjectName: subjectName); - }), - ) - : ListView.builder( - padding: EdgeInsets.only(top: 11.h, bottom: 10.h, left: 12.w, right: 12.w), - itemBuilder: (context, index) { - Items item = data[index]; - return TaskListItem( - completed: completed, - jobTaskItem: item, - type: type, - logic: logic, - ); - /*HomeworkTasksViewItem( - completed: completed, - jobTaskItem: data[index], - call: () => controller.callRefresh(), - );*/ - }, - itemCount: data.length, - ), - onRefresh: () => onRefresh(controller, tab), - onLoad: () => onLoad(controller, tab), - ); - }); +class EntranceModel extends Object { + String title; + String image; + String navigationUrl; + String? page; + + EntranceModel( + {required this.title, + required this.image, + required this.navigationUrl, + this.page}); } @swidget -Widget $reviewedItem({required Items jobTaskItem, required int type, required String subjectName}) { - EdgeInsets padEdg = EdgeInsets.symmetric(horizontal: 10.w); - - return InkWell( - onTap: () { - /* String url = - '${RouterManager.jobListParticipateInClassPath}?&jobId=${jobTaskItem.id}&genderName=${Uri.encodeComponent(jobTaskItem.genderName)}&jobName=${Uri.encodeComponent(jobTaskItem.title)}&completed=${true}'; - RouterManager.router.navigateTo(context, url, transition: getTransition());*/ - }, - child: Container( - padding: EdgeInsets.only(top: 10.h), - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(6.r), - color: Colors.white, - boxShadow: const [ - BoxShadow( - color: Color.fromRGBO(210, 216, 241, 1), - offset: Offset.zero, //阴影y轴偏移量 - blurRadius: 5.8, //阴影模糊程度 - spreadRadius: 0, //阴影扩散程度 - ) - ], - ), - child: Column( - mainAxisAlignment: MainAxisAlignment.spaceBetween, +Widget $TermRow(BuildContext context, List items, int? data) { + var leng = items.length; + Widget childWidget; + switch (leng) { + case 1: + childWidget = + Row(children: [Expanded(child: $TermItem(context, items[0], data!))]); + break; + case 2: + childWidget = Row(children: [ + Expanded(flex: 9, child: $TermItem(context, items[0], data!)), + const Expanded(flex: 1, child: SizedBox()), + Expanded(flex: 9, child: $TermItem(context, items[1], data!)), + ]); + break; + case 3: + double theHeight = ScreenUtil().screenWidth / 19 + 54.h * 2; + childWidget = Row( children: [ - // 顶部任务名称 - Padding( - padding: padEdg, - child: Row( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Container( - width: 32.w, - height: 18.h, - alignment: Alignment.center, - padding: EdgeInsets.only(left: 2.w), - decoration: BoxDecoration( - color: type == 1 ? const Color.fromRGBO(104, 136, 253, 1) : const Color.fromRGBO(255, 175, 56, 1), - borderRadius: BorderRadius.only( - topLeft: Radius.circular(14.r), - topRight: Radius.circular(3.r), - bottomLeft: Radius.circular(4.r), - bottomRight: Radius.circular(4.r), - ), - ), - margin: EdgeInsets.only(right: 4.w), - child: quickText(type == 1 ? '作业' : '考试', color: Colors.white, size: 10.sp), - ), - Expanded( - child: quickText(jobTaskItem.name, size: 14.sp, color: const Color.fromRGBO(70, 70, 70, 1), maxLines: 2), - ) - ], - ), - ), - - Padding( - padding: padEdg, - child: Row( - crossAxisAlignment: CrossAxisAlignment.end, - children: [ - quickText( - jobTaskItem.publishTime.substring(0, 10), - color: const Color.fromRGBO(97, 97, 97, 1), - size: 10.sp, - fontWeight: FontWeight.w500, - ), - quickText(' / ', color: const Color.fromRGBO(76, 199, 147, 1), size: 10.sp, fontWeight: FontWeight.w500), - quickText( - '参与班级:', - color: const Color.fromRGBO(76, 199, 147, 1), - size: 9.sp, - ), - quickText( - '${jobTaskItem.classCount}', - color: const Color.fromRGBO(76, 199, 147, 1), - size: 10.sp, - ), - quickText(' / ', color: const Color.fromRGBO(116, 145, 253, 1), size: 10.sp, fontWeight: FontWeight.w500), - quickText( - '科目:$subjectName', - color: const Color.fromRGBO(116, 145, 253, 1), - size: 9.sp, - ), - ], - ), - ), - /*Padding( - padding: EdgeInsets.symmetric(horizontal: 10.w), - child: FavoriteButton( - jobTaskItem.id, - jobTaskItem.title, - margin: EdgeInsets.only(top: 4.h, bottom: 6.h), - ), - ),*/ - GestureDetector( - onTap: () { - /* RouterManager.router.navigateTo( - context, - RouterManager.jobReportPagePath + - '?title=${Uri.encodeComponent(jobTaskItem.title)}&id=${jobTaskItem.id}', - transition: getTransition(), - );*/ - }, - child: Container( - padding: EdgeInsets.symmetric(vertical: 6.h), - decoration: BoxDecoration( - borderRadius: BorderRadius.only(bottomLeft: Radius.circular(6.r), bottomRight: Radius.circular(6.r)), - color: Colors.white, - boxShadow: const [ - BoxShadow( - color: Color.fromRGBO(0, 0, 0, 0.15), - offset: Offset(0, -0.0001), //阴影y轴偏移量 - blurRadius: 4, //阴影模糊程度 - spreadRadius: 0, //阴影扩散程度 - ) + Expanded( + child: $TermItem(context, items[0], data!, theHeight: theHeight)), + SizedBox(width: ScreenUtil().screenWidth / 19), + Expanded( + child: SizedBox( + height: theHeight, + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + $TermItem(context, items[1], data), + $TermItem(context, items[2], data), ], ), - child: Row(children: [ - Expanded( - child: Container( - alignment: Alignment.center, - child: quickText('查看报告', color: const Color.fromRGBO(118, 118, 118, 1), size: 11.sp), - ), - ), - ]), ), ), ], - ), - ), + ); + break; + default: + childWidget = Container(); + } + + return Container( + padding: EdgeInsets.symmetric(horizontal: 14.w), child: childWidget); +} + +@swidget +Widget $TermItem(BuildContext context, EntranceModel e, int data, + {double? theHeight}) { + bool isJob = e.title == '作业批阅'; + + return Material( + color: Colors.white, + elevation: 3.r, + shadowColor: const Color.fromRGBO(231, 231, 231, 1), + borderRadius: BorderRadius.all(Radius.circular(8.r)), + child: InkWell( + onTap: () { + Get.toNamed(e.navigationUrl,arguments: {'page':e.page??''}); + }, + + // splashColor: splashColor, + borderRadius: BorderRadius.all(Radius.circular(8.r)), + child: badges.Badge( + showBadge: isJob && data > 0, + ignorePointer: false, + badgeContent: quickText(data, color: Colors.white, size: 10.sp), + badgeAnimation: const badges.BadgeAnimation.rotation( + animationDuration: Duration(seconds: 1), + colorChangeAnimationDuration: Duration(seconds: 1), + loopAnimation: false, + curve: Curves.fastOutSlowIn, + colorChangeAnimationCurve: Curves.easeInCubic, + ), + badgeStyle: badges.BadgeStyle( + badgeColor: const Color.fromRGBO(255, 105, 105, 1), + shape: badges.BadgeShape.square, + borderRadius: BorderRadius.only( + topLeft: Radius.circular(10.r), + topRight: Radius.circular(8.5.r), + bottomRight: Radius.circular(8.5.r)), + // borderSide: BorderSide(color: Colors.white, width: 2), + elevation: 1, + padding: EdgeInsets.symmetric( + horizontal: Utils.isPad() ? 11.w : 16.w, vertical: 2.h), + ), + position: badges.BadgePosition.topEnd(top: 10.r, end: 10.r), + child: Container( + height: theHeight, + padding: EdgeInsets.symmetric(vertical: 12.h), + decoration: BoxDecoration( + borderRadius: BorderRadius.all(Radius.circular(8.r)), + // boxShadow: [ + // BoxShadow( + // color: const Color.fromRGBO(231, 231, 231, 1), + // offset: Offset(4.w, 6.h), //阴影y轴偏移量 + // blurRadius: 8, //阴影模糊程度 + // spreadRadius: 0.2, //阴影扩散程度 + // ) + // ], + // border: Border.all(width: 0.5.w, color: Color.fromARGB(255, 219, 226, 250)), + ), + alignment: Alignment.center, + child: isJob + ? Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Image.asset(e.image, + height: 32.r, width: 32.r, fit: BoxFit.cover), + SizedBox(height: 6.r), + quickText(e.title, + size: 12.sp, + color: const Color.fromRGBO(79, 79, 79, 1), + fontWeight: FontWeight.w500), + ], + ) + : Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Image.asset(e.image, + height: 32.r, width: 32.r, fit: BoxFit.cover), + SizedBox(width: 6.r), + quickText(e.title, + size: 12.sp, + color: const Color.fromRGBO(79, 79, 79, 1), + fontWeight: FontWeight.w500), + ], + ), + ), + )), ); } diff --git a/lib/page/home_page/widget/student_group_list.dart b/lib/page/home_page/widget/student_group_list.dart new file mode 100644 index 0000000..3cb9f5a --- /dev/null +++ b/lib/page/home_page/widget/student_group_list.dart @@ -0,0 +1,163 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:get/get.dart'; +import 'package:school_asignment_app/common/job/class_item.dart'; +import 'package:school_asignment_app/common/utils/enum_untils.dart'; +import 'package:school_asignment_app/common/utils/utils.dart'; +import 'package:school_asignment_app/page/global_widget/MyEmptyWidget.dart'; + +class StudentGroupList extends StatelessWidget { + final List studentGroups; + final Function goNextPage; + final Widget? rightBtn; + + const StudentGroupList(this.studentGroups, this.goNextPage, + {Key? key,this.rightBtn}) + : super(key: key); + + @override + Widget build(BuildContext context) { + return Obx(() { + return studentGroups != null && studentGroups.isNotEmpty + ? Utils.isPad() + ? GridView( + shrinkWrap: true, + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 2, + mainAxisSpacing: 10.r, + crossAxisSpacing: 10.r, + childAspectRatio: 556 / 112, + ), + children: List.generate(studentGroups.length, (index) { + ClassItem item = studentGroups[index]; + return InkWell( + onTap: () { + goNextPage(item.id,'${EnumUtils.formatGrade(item.grade)}${item.className}'); + }, + child: Container( + padding: EdgeInsets.symmetric(horizontal: 10.r), + decoration: BoxDecoration( + borderRadius: BorderRadius.all(Radius.circular(10.r)), + color: Colors.white, + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Padding( + padding: EdgeInsets.only(right: 8.r), + child: Text( + '${EnumUtils.formatGrade(item.grade)}${item.className}', + style: TextStyle( + fontSize: 10.sp, color: Color(0xFF6888FD)), + ), + ), + const Spacer(), + /*Expanded( + child: Text( + classNames, + style: TextStyle( + fontSize: 10.sp, + color: Color(0xFF999999), + overflow: TextOverflow.ellipsis, + ), + textAlign: TextAlign.end, + ), + ),*/ + rightBtn != null + ? rightBtn! + : Container( + margin: EdgeInsets.only(left: 5.r), + height: 20.r, + width: 55.r, + decoration: BoxDecoration( + borderRadius: + BorderRadius.all(Radius.circular(20.r)), + color: const Color(0xFF6888FD), + ), + child: Center( + child: Text( + '详情', + style: TextStyle( + fontSize: 10.sp, color: Colors.white), + ), + ), + ) + ], + ), + ), + ); + }), + ) + : ListView.builder( + shrinkWrap: true, + itemBuilder: (context, index) { + ClassItem item = studentGroups[index]; + return InkWell( + onTap: () { + // goNextPage(item.groupId, item.groupName); + }, + child: Container( + padding: + EdgeInsets.symmetric(vertical: 15.r, horizontal: 10.r), + margin: EdgeInsets.only(bottom: 10.r), + decoration: BoxDecoration( + borderRadius: BorderRadius.all(Radius.circular(10.r)), + color: Colors.white, + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Padding( + padding: EdgeInsets.only(right: 8.r), + child: Text( + '${EnumUtils.formatGrade(item.grade)}${item.className}', + style: TextStyle( + fontSize: 14.sp, color: Color(0xFF6888FD)), + ), + ), + const Spacer(), + /* Expanded( + child: Text( + classNames, + style: TextStyle( + fontSize: 12.sp, + color: Color(0xFF999999), + overflow: TextOverflow.ellipsis, + ), + textAlign: TextAlign.end, + ), + ),*/ + rightBtn != null + ? rightBtn! + : Container( + margin: EdgeInsets.only(left: 5.r), + height: 24.r, + width: 55.r, + decoration: BoxDecoration( + borderRadius: + BorderRadius.all(Radius.circular(20.r)), + color: const Color(0xFF6888FD), + ), + child: Center( + child: Text( + '详情', + style: TextStyle( + fontSize: 10.sp, color: Colors.white), + ), + ), + ) + ], + ), + ), + ); + }, + itemCount: studentGroups.length, + ) + : Padding( + padding: EdgeInsets.only( + top: MediaQuery.of(context).size.height / 2 - 200.r), + child: const MyEmptyWidget(), + ); + }); + } +} diff --git a/lib/page/home_page/widget/top_user_info.dart b/lib/page/home_page/widget/top_user_info.dart index 9a34a61..64fd320 100644 --- a/lib/page/home_page/widget/top_user_info.dart +++ b/lib/page/home_page/widget/top_user_info.dart @@ -38,7 +38,7 @@ class TopUserInfo extends StatelessWidget { alignment: Alignment.center, color: const Color.fromRGBO(163, 211, 255, 1), padding: EdgeInsets.all(1.r), - child: Image.asset('assets/images/logo.png', + child: Image.asset('assets/images/login_logo.png', width: 32.w, height: 32.w), ), ), diff --git a/lib/page/login_page/login_logic.dart b/lib/page/login_page/login_logic.dart index 1cf3b13..6b4266b 100644 --- a/lib/page/login_page/login_logic.dart +++ b/lib/page/login_page/login_logic.dart @@ -22,7 +22,7 @@ class LoginLogic extends GetxController with RequestToolMixin { @override void onInit() { super.onInit(); - state.userNameController = TextEditingController(text: 'wangyang')..addListener(userNameListener); + state.userNameController = TextEditingController(text: 'longyunfei')..addListener(userNameListener); state.passwordController = TextEditingController(text: '123@abc'); state.pwdFocus = FocusNode(); state.theFocus = FocusNode(); @@ -63,6 +63,7 @@ class LoginLogic extends GetxController with RequestToolMixin { if (!state.readAgreement.value) return toMsg('请阅读用户协议'); EasyLoading.show(status: 'loading...'); + try { await getClient().toLogin(userName, userPwd); String? nameidentifier = UserStore.to.userInfo.value?.nameidentifier; @@ -74,7 +75,6 @@ class LoginLogic extends GetxController with RequestToolMixin { throw Exception('用户信息获取失败'); } UserStore.to.setUserDetailInfo(data); - UserStore.to.getSubjectList(); EasyLoading.dismiss(); Get.offAllNamed(Routes.startPage); // if (resultData.code != 200 || userData?.accessToken == null || userData?.accessToken == '') { diff --git a/lib/page/login_page/login_view.dart b/lib/page/login_page/login_view.dart index 0bfc893..865a954 100644 --- a/lib/page/login_page/login_view.dart +++ b/lib/page/login_page/login_view.dart @@ -7,7 +7,6 @@ import 'package:school_asignment_app/common/utils/utils.dart'; import 'package:school_asignment_app/page/global_widget/my_text.dart'; import 'package:school_asignment_app/routes/app_pages.dart'; - import 'login_logic.dart'; class LoginPage extends StatefulWidget { @@ -19,9 +18,7 @@ class LoginPage extends StatefulWidget { class _LoginPageState extends State { final logic = Get.find(); - final state = Get - .find() - .state; + final state = Get.find().state; @override Widget build(BuildContext context) { @@ -47,7 +44,7 @@ class _LoginPageState extends State { alignment: Alignment.center, decoration: const BoxDecoration( image: DecorationImage( - image: AssetImage('assets/images/login_bgi.png'), + image: AssetImage('assets/images/login_bg.png'), fit: BoxFit.fill, // 完全填充 ), ), @@ -61,8 +58,8 @@ class _LoginPageState extends State { child: SizedBox( height: 86.w, width: 86.w, - child: Image.asset( - 'assets/images/logo.png', fit: BoxFit.cover), + child: Image.asset('assets/images/login_logo.png', + fit: BoxFit.cover), ), ), Container( @@ -70,9 +67,10 @@ class _LoginPageState extends State { horizontal: 32.w, vertical: 24.h), padding: EdgeInsets.only( top: 34.h, bottom: 16.h, left: 22.w, right: 22.w), - decoration: BoxDecoration( - color: Colors.white, - border: Border.all(width: 1.w, color: Colors.white), + color: Colors.transparent, + /* decoration: BoxDecoration( + color: Colors.transparent, + border: Border.all(width: 1.w, color: Colors.white), borderRadius: BorderRadius.all(Radius.circular(10.w)), boxShadow: const [ BoxShadow( @@ -82,105 +80,130 @@ class _LoginPageState extends State { spreadRadius: 100, //阴影扩散程度 ) ], - ), + ),*/ child: Column(children: [ - TextField( - controller: state.userNameController, - maxLines: 1, - maxLength: 20, - textInputAction: TextInputAction.next, - onEditingComplete: () { - Get.focusScope?.nextFocus(); - // FocusScope.of(context).requestFocus(_pwdFocus); - }, - style: TextStyle( - color: const Color.fromRGBO(80, 87, 103, 1), - fontSize: 15.sp, - ), - decoration: InputDecoration( - hintText: "请输入账号", - hintStyle: TextStyle(fontSize: 16.sp, - color: const Color.fromRGBO(153, 153, 153, 1)), - labelText: "账号", - labelStyle: TextStyle(fontSize: 16.sp, - color: const Color.fromRGBO(148, 163, 182, 1)), - suffixIcon: !state.hasNameVal - ? null - : Transform.translate( - offset: Offset(10, 10), // 根据原始组件的padding值来设置偏移量 - child: IconButton( - alignment: Alignment.center, - padding: EdgeInsets.zero, - icon: Icon( - Icons.highlight_off_sharp, - color: Colors.grey, - size: 16.r, - ), - onPressed: () { - state.userNameController.clear(); // 清空文本框内容 - state.passwordController.clear(); - }, + Container( + padding: EdgeInsets.symmetric(horizontal: 10.r), + decoration: BoxDecoration( + color: Colors.transparent, + border: Border.all(width: 1.w, color: const Color(0xFFAECBFF)), + borderRadius: BorderRadius.all(Radius.circular(17.w)), + ), + child: Center( + child: TextField( + controller: state.userNameController, + /* maxLines: 1, + maxLength: 20,*/ + textInputAction: TextInputAction.next, + onEditingComplete: () { + Get.focusScope?.nextFocus(); + // FocusScope.of(context).requestFocus(_pwdFocus); + }, + style: TextStyle( + color: Colors.white, + fontSize: 14.sp, + ), + decoration: InputDecoration( + hintText: "请输入账号", + hintStyle: TextStyle( + fontSize: 14.sp, + color: Colors.white,), + // labelText: "账号", + labelStyle: TextStyle( + fontSize: 14.sp, + color: Colors.white,), + border: InputBorder.none, + prefixIcon:Image.asset('assets/images/login_account.png',width: 20.r,height: 20.r,), + /* suffixIcon: !state.hasNameVal + ? null + : Transform.translate( + offset: + Offset(10, 10), // 根据原始组件的padding值来设置偏移量 + child: IconButton( + alignment: Alignment.center, + padding: EdgeInsets.zero, + icon: Icon( + Icons.highlight_off_sharp, + color: Colors.grey, + size: 16.r, + ), + onPressed: () { + state.userNameController + .clear(); // 清空文本框内容 + state.passwordController.clear(); + }, + ), + ),*/ ), ), ), ), + SizedBox(height: 15.r,), Obx(() { - return TextField( - focusNode: state.pwdFocus, - controller: state.passwordController, - keyboardType: TextInputType.number, - maxLines: 1, - obscureText: state.isShowPwd.value, - //隐藏密码显示 - textInputAction: TextInputAction.go, - // onSubmitted: (val) => toLogin(), - style: TextStyle( - color: const Color.fromRGBO(80, 87, 103, 1), - fontSize: 15.sp, + return Container( + padding: EdgeInsets.symmetric(horizontal: 10.r), + decoration: BoxDecoration( + color: Colors.transparent, + border: Border.all(width: 1.w, color: const Color(0xFFAECBFF)), + borderRadius: BorderRadius.all(Radius.circular(17.w)), ), - decoration: InputDecoration( - hintText: "请输入密码", - suffix: GestureDetector( - onTap: logic.showPassword, - child: Icon( - Icons.remove_red_eye, - color: state.isShowPwd.value ? Theme - .of(context) - .primaryColor : Colors.grey, - ), + child: TextField( + focusNode: state.pwdFocus, + controller: state.passwordController, + keyboardType: TextInputType.number, + maxLines: 1, + obscureText: state.isShowPwd.value, + //隐藏密码显示 + textInputAction: TextInputAction.go, + // onSubmitted: (val) => toLogin(), + style: TextStyle( + color: Colors.white, + fontSize: 14.sp, + ), + decoration: InputDecoration( + hintText: "请输入密码", + /* suffix: GestureDetector( + onTap: logic.showPassword, + child: Icon( + Icons.remove_red_eye, + color: state.isShowPwd.value + ? Theme.of(context).primaryColor + : Colors.grey, + ), + ),*/ + prefixIcon: Image.asset('assets/images/login_pwd.png',width: 20.r,height: 20.r,), + hintStyle: TextStyle( + fontSize: 14.sp, + color: Colors.white,), + border: InputBorder.none, + // labelText: "密码", + isDense: true, + labelStyle: TextStyle( + fontSize: 14.sp, + color: Colors.white,), ), - hintStyle: TextStyle(fontSize: 16.sp, - color: const Color.fromRGBO( - 153, 153, 153, 1)), - labelText: "密码", - isDense: true, - labelStyle: TextStyle(fontSize: 16.sp, - color: const Color.fromRGBO( - 148, 163, 182, 1)), ), ); }), SizedBox( - height: 12.h, + height: 22.h, ), - Row( + /* Row( children: [ Container( width: 30.w, padding: EdgeInsets.only(right: 10.w), child: Obx(() { return Checkbox( - activeColor: Theme - .of(context) - .primaryColor, + activeColor: Theme.of(context).primaryColor, checkColor: Colors.white, value: state.keepPwd.value, onChanged: (value) { Get.focusScope?.nextFocus(); - /* FocusScope.of(context).requestFocus( + *//* FocusScope.of(context).requestFocus( state.pwdFocus); FocusScope.of(context).requestFocus( - state.theFocus);*/ + state.theFocus);*//* state.keepPwd.value = value ?? false; }, ); @@ -189,25 +212,25 @@ class _LoginPageState extends State { InkWell( onTap: () { Utils.hideKeyboard(); - /*Get.focusScope?.nextFocus(); - Get.focusScope?.nextFocus();*/ + *//*Get.focusScope?.nextFocus(); + Get.focusScope?.nextFocus();*//* - /* FocusScope.of(context).requestFocus( + *//* FocusScope.of(context).requestFocus( state.pwdFocus); FocusScope.of(context).requestFocus( - state.theFocus);*/ + state.theFocus);*//* state.keepPwd.value = !state.keepPwd.value; }, child: Text( '记住密码', style: TextStyle( fontSize: 14.sp, - color: const Color.fromRGBO(148, 163, 182, 1), + color: Colors.white, ), ), ), ], - ), + ),*/ InkWell( onTap: () { logic.toLogin(); @@ -217,19 +240,20 @@ class _LoginPageState extends State { return Container( margin: EdgeInsets.symmetric(vertical: 10.h), decoration: BoxDecoration( - color: state.canLogin.value ? const Color.fromRGBO( - 9, 105, 246, 1) : Colors.grey, + color: state.canLogin.value + ? const Color.fromRGBO(107, 104, 252, 1) + : const Color(0xFFdddddd), boxShadow: [ BoxShadow( - color: const Color.fromRGBO( - 46, 91, 255, 0.5), + color: + const Color.fromRGBO(46, 91, 255, 0.5), offset: Offset(6.w, 10.h), //阴影y轴偏移量 blurRadius: 14, //阴影模糊程度 spreadRadius: 0.5, //阴影扩散程度 ) ], borderRadius: BorderRadius.all( - Radius.circular(8.w), + Radius.circular(17.w), ), ), alignment: Alignment.center, @@ -250,12 +274,12 @@ class _LoginPageState extends State { padding: EdgeInsets.only(right: 10.w), child: Obx(() { return Checkbox( - activeColor: Colors.deepOrangeAccent, + activeColor: Theme.of(context).primaryColor, checkColor: Colors.white, value: state.readAgreement.value, onChanged: (value) { Utils.hideKeyboard(); - /* FocusScope.of(context).requestFocus( + /* FocusScope.of(context).requestFocus( state.pwdFocus); FocusScope.of(context).requestFocus( state.theFocus);*/ @@ -266,21 +290,22 @@ class _LoginPageState extends State { ), InkWell( onTap: () { - Get.toNamed(Routes.agreementPage, - arguments: {"type": AGREEMENT_KEY - .USER_AGREEMENT.name}); + Get.toNamed(Routes.agreementPage, arguments: { + "type": AGREEMENT_KEY.USER_AGREEMENT.name + }); }, child: quickText('请仔细阅读', size: 13.sp), ), InkWell( onTap: () { - Get.toNamed(Routes.agreementPage, - arguments: {"type": AGREEMENT_KEY - .USER_AGREEMENT.name}); + Get.toNamed(Routes.agreementPage, arguments: { + "type": AGREEMENT_KEY.USER_AGREEMENT.name + }); }, child: Text( '《用户协议》', - style: TextStyle(fontSize: 14.r, + style: TextStyle( + fontSize: 14.r, color: Colors.deepOrangeAccent), ), ), @@ -301,4 +326,4 @@ class _LoginPageState extends State { Get.delete(); super.dispose(); } -} \ No newline at end of file +} diff --git a/lib/routes/app_pages.dart b/lib/routes/app_pages.dart index c28df46..cd3ff4f 100644 --- a/lib/routes/app_pages.dart +++ b/lib/routes/app_pages.dart @@ -1,7 +1,13 @@ import 'package:get/get.dart'; import 'package:school_asignment_app/page/global_widget/other_page.dart'; import 'package:school_asignment_app/page/global_widget/start_page.dart'; +import 'package:school_asignment_app/page/home_page/children/class_student/class_student_binding.dart'; +import 'package:school_asignment_app/page/home_page/children/class_student/class_student_view.dart'; import 'package:school_asignment_app/page/home_page/children/my_info.dart'; +import 'package:school_asignment_app/page/home_page/children/read_over/read_over_binding.dart'; +import 'package:school_asignment_app/page/home_page/children/read_over/read_over_view.dart'; +import 'package:school_asignment_app/page/home_page/children/student_history_work/student_history_work_binding.dart'; +import 'package:school_asignment_app/page/home_page/children/student_history_work/student_history_work_view.dart'; import 'package:school_asignment_app/page/home_page/home_binding.dart'; import 'package:school_asignment_app/page/home_page/home_view.dart'; import 'package:school_asignment_app/page/login_page/children/agreement_page.dart'; @@ -17,8 +23,11 @@ abstract class AppPages { GetPage(name: Routes.agreementPage, page: () => const AgreementPage(), binding: LoginBinding(), transition: Transition.noTransition), GetPage(name: Routes.home, page: () => const HomePage(), binding: HomeBinding(), transition: Transition.noTransition), GetPage(name: Routes.startPage, page: () => const StartPage(), binding: StartPageIndexBinding(), transition: Transition.noTransition), - GetPage(name: Routes.myInfo, page: () => MyInfo(), transition: Transition.noTransition), + GetPage(name: Routes.myInfo, page: () => const MyInfo(), transition: Transition.noTransition), GetPage(name: Routes.work, page: () => const WorkPage(), binding: WorkBinding(), transition: Transition.noTransition), GetPage(name: Routes.otherPage, page: () => const OhterPage(), transition: Transition.noTransition), + GetPage(name: Routes.readOverPage, page: () => const ReadOverPage(), binding: ReadOverBinding(), transition: Transition.noTransition), + GetPage(name: Routes.studentHistoryWorkPage, page: () => const StudentHistoryWorkPage(), binding: StudentHistoryWorkBinding(), transition: Transition.noTransition), + GetPage(name: Routes.classStudentPage, page: () => const ClassStudentPage(), binding: ClassStudentBinding(), transition: Transition.noTransition), ]; } diff --git a/lib/routes/app_routes.dart b/lib/routes/app_routes.dart index 3a04e3d..af7f5ab 100644 --- a/lib/routes/app_routes.dart +++ b/lib/routes/app_routes.dart @@ -8,4 +8,7 @@ abstract class Routes { static const myInfo = '/myInfo'; static const work = '/work'; static const otherPage = '/otherPage'; + static const readOverPage = '/readOverPage'; + static const studentHistoryWorkPage = '/studentHistoryWorkPage'; + static const classStudentPage = '/classStudentPage'; } \ No newline at end of file diff --git a/pubspec.lock b/pubspec.lock index abfd627..5758047 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -33,6 +33,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.11.0" + badges: + dependency: "direct main" + description: + name: badges + sha256: a7b6bbd60dce418df0db3058b53f9d083c22cdb5132a052145dc267494df0b84 + url: "https://pub.dev" + source: hosted + version: "3.1.2" boolean_selector: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 0e0e534..91159ab 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -69,6 +69,7 @@ dependencies: # end retrofit请求封装 # 进度条 percent_indicator: ^4.2.3 + badges: ^3.1.2 dev_dependencies: flutter_test: