From 79018f3b705fe0eb01595cb430fab074b3cb69d2 Mon Sep 17 00:00:00 2001 From: LRC <991971966@qq.com> Date: Fri, 20 Oct 2023 10:12:03 +0800 Subject: [PATCH] =?UTF-8?q?=E6=88=90=E5=93=811.1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/timemanagerapp/android/app/build.gradle | 13 +- .../android/app/src/debug/AndroidManifest.xml | 5 + .../android/app/src/main/AndroidManifest.xml | 10 +- .../app/src/profile/AndroidManifest.xml | 5 + .../lib/controller/NetWorkController.dart | 68 ++++- .../lib/controller/TeamController.dart | 4 +- .../controller/TimetableWidgetController.dart | 100 ++++++- .../lib/controller/UserController.dart | 16 ++ .../lib/controller/WorkController.dart | 266 +++++++++--------- src/timemanagerapp/lib/entity/Course.dart | 4 +- .../lib/ruters/AddCourseRoute.dart | 2 +- .../lib/ruters/AddTeamRoute.dart | 2 +- src/timemanagerapp/lib/ruters/TeamRoute.dart | 16 +- src/timemanagerapp/lib/setting/Setting.dart | 14 +- .../lib/widgets/AddCourseFormWidget.dart | 5 + .../lib/widgets/AddScheduleFormWidget.dart | 64 ++++- .../lib/widgets/AddTeamWidget.dart | 2 + .../lib/widgets/AutoImportWidget.dart | 3 +- .../lib/widgets/FreeTimetableWidget.dart | 114 +++++--- .../lib/widgets/HomeWidget.dart | 25 +- .../lib/widgets/TeamWidget.dart | 12 +- .../lib/widgets/TestWidget.dart | 159 ++++++----- .../lib/widgets/TimetableWidget.dart | 50 ++-- src/workserver/config.js | 13 +- src/workserver/controllers/teamUser.js | 6 + src/workserver/controllers/xah/course.js | 7 +- 26 files changed, 653 insertions(+), 332 deletions(-) diff --git a/src/timemanagerapp/android/app/build.gradle b/src/timemanagerapp/android/app/build.gradle index d6f4833..c161838 100644 --- a/src/timemanagerapp/android/app/build.gradle +++ b/src/timemanagerapp/android/app/build.gradle @@ -5,7 +5,7 @@ plugins { } def localProperties = new Properties() -def localPropertiesFile = rootProject.file('local.properties') +def localPropertiesFile = rootProject.file('key.properties') if (localPropertiesFile.exists()) { localPropertiesFile.withReader('UTF-8') { reader -> localProperties.load(reader) @@ -43,11 +43,18 @@ android { versionName flutterVersionName } +// signingConfigs { +// release { +// keyAlias keystoreProperties['keyAlias'] +// keyPassword keystoreProperties['keyPassword'] +// storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null +// storePassword keystoreProperties['storePassword'] +// } +// } buildTypes { release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. signingConfig signingConfigs.debug +// signingConfig signingConfigs.release } } } diff --git a/src/timemanagerapp/android/app/src/debug/AndroidManifest.xml b/src/timemanagerapp/android/app/src/debug/AndroidManifest.xml index 399f698..49fdd92 100644 --- a/src/timemanagerapp/android/app/src/debug/AndroidManifest.xml +++ b/src/timemanagerapp/android/app/src/debug/AndroidManifest.xml @@ -4,4 +4,9 @@ to allow setting breakpoints, to provide hot reload, etc. --> + + + + + diff --git a/src/timemanagerapp/android/app/src/main/AndroidManifest.xml b/src/timemanagerapp/android/app/src/main/AndroidManifest.xml index f6f59e2..5b32bfa 100644 --- a/src/timemanagerapp/android/app/src/main/AndroidManifest.xml +++ b/src/timemanagerapp/android/app/src/main/AndroidManifest.xml @@ -1,8 +1,10 @@ + + android:usesCleartextTraffic="true" //http + + + + + + diff --git a/src/timemanagerapp/android/app/src/profile/AndroidManifest.xml b/src/timemanagerapp/android/app/src/profile/AndroidManifest.xml index 399f698..49fdd92 100644 --- a/src/timemanagerapp/android/app/src/profile/AndroidManifest.xml +++ b/src/timemanagerapp/android/app/src/profile/AndroidManifest.xml @@ -4,4 +4,9 @@ to allow setting breakpoints, to provide hot reload, etc. --> + + + + + diff --git a/src/timemanagerapp/lib/controller/NetWorkController.dart b/src/timemanagerapp/lib/controller/NetWorkController.dart index b4607b5..308081a 100644 --- a/src/timemanagerapp/lib/controller/NetWorkController.dart +++ b/src/timemanagerapp/lib/controller/NetWorkController.dart @@ -13,8 +13,8 @@ import '../entity/Work.dart'; class NetWorkController { // String baseUrl = "http://192.168.111.226:3000/"; - String baseUrl = "http://5902e9v900.zicp.fun:30002/"; - // String baseUrl = "http://5902e9v900.zicp.fun:3000/"; + // String baseUrl = "http://5902e9v900.zicp.fun:30002/"; + String baseUrl = "http://5902e9v900.zicp.fun:3000/"; //----------------------登录注册相关---------------------------- //getUserList @@ -31,6 +31,7 @@ class NetWorkController { .toList(); return userList; } else { + print("获取用户列表"); return null; } } @@ -50,7 +51,7 @@ class NetWorkController { if (jsonResponse['code'] == 200) { return User.fromJson(jsonResponse['data']['user'][0]); } else { - print("login failed"); + print("登录失败"); return null; } } @@ -68,7 +69,7 @@ class NetWorkController { if (jsonResponse['code'] == 200) { return true; } else { - print("login failed"); + print("注册失败"); return false; } } @@ -87,6 +88,7 @@ class NetWorkController { if (jsonResponse['code'] == 200) { return true; } else { + print("删除所有用户失败"); return false; } } @@ -108,11 +110,12 @@ class NetWorkController { .toList(); return teamList; } else { + print("获取My团队列表失败"); return null; } } - Future?> getAllTeamList(int userId) async { + Future?> getAllTeamListByUserId(int userId) async { final response = await http.get( Uri.parse(baseUrl + 'get_team').replace(queryParameters: {'userId': userId.toString()}), headers: { @@ -128,10 +131,32 @@ class NetWorkController { .toList(); return teamList; } else { + print("获取All团队列表ByUserId失败"); return null; } } + Future> getAllTeamList() async { + final response = await http.get( + Uri.parse(baseUrl + 'get_team'), + headers: { + 'Content-Type': 'application/json; charset=UTF-8', + }, + + ); + + final jsonResponse = json.decode(response.body); + if (jsonResponse['code'] == 200) { + List teamList = (jsonResponse['data'] as List) + .map((team) => Team.fromJson(team as Map)) + .toList(); + return teamList; + } else { + print("获取All团队列表失败"); + return []; + } + } + Future insertTeam(Team team) async { final response = await http.post( Uri.parse(baseUrl+'add_team'), @@ -145,6 +170,7 @@ class NetWorkController { if (jsonResponse['code'] == 200) { return true; } else { + print("insert team 失败:"); return false; } } @@ -251,7 +277,27 @@ class NetWorkController { //----------------------团队任务相关---------------------------- Future?> getTeamWorkList(int teamId) async { final response = await http.get( - Uri.parse(baseUrl + 'get_work').replace(queryParameters: {'id': teamId.toString()}), + Uri.parse(baseUrl + 'get_work').replace(queryParameters: {'teamId': teamId.toString()}), + headers: { + 'Content-Type': 'application/json; charset=UTF-8', + }, + ); + + final jsonResponse = json.decode(response.body); + if (jsonResponse['code'] == 200) { + List teamWorkList = (jsonResponse['data'] as List) + .map((work) => Work.fromJson(work as Map)) + .toList(); + return teamWorkList; + } else { + return null; + } + } + + //获取服务器所有work + Future?> getALlTeamWorkList() async { + final response = await http.get( + Uri.parse(baseUrl + 'get_work'), headers: { 'Content-Type': 'application/json; charset=UTF-8', }, @@ -325,6 +371,7 @@ class NetWorkController { .toList(); return freeTimeList; } else { + print("获取空闲时间失败"); return null; } } @@ -345,6 +392,7 @@ class NetWorkController { .toList(); return courseList; } else { + print("获取课程失败"); return null; } } @@ -362,6 +410,7 @@ class NetWorkController { if (jsonResponse['code'] == 200) { return true; } else { + print("插入课程失败"); return false; } } @@ -379,6 +428,7 @@ class NetWorkController { if (jsonResponse['code'] == 200) { return true; } else { + print("更新课程失败"); return false; } } @@ -396,6 +446,7 @@ class NetWorkController { if (jsonResponse['code'] == 200) { return true; } else { + print("删除课程失败"); return false; } } @@ -416,6 +467,7 @@ class NetWorkController { .toList(); return taskList; } else { + print("获取个人计划失败"); return null; } } @@ -433,6 +485,7 @@ class NetWorkController { if (jsonResponse['code'] == 200) { return true; } else { + print("更新个人计划失败"); return false; } } @@ -450,6 +503,7 @@ class NetWorkController { if (jsonResponse['code'] == 200) { return true; } else { + print("插入个人计划失败"); return false; } } @@ -467,6 +521,7 @@ class NetWorkController { if (jsonResponse['code'] == 200) { return true; } else { + print("删除个人计划失败"); return false; } } @@ -501,6 +556,7 @@ class NetWorkController { if(data['code'] == 1000){ return resJson; }else{ + print("获取导入课程失败"); return null; } } diff --git a/src/timemanagerapp/lib/controller/TeamController.dart b/src/timemanagerapp/lib/controller/TeamController.dart index 75a42c2..29c41bb 100644 --- a/src/timemanagerapp/lib/controller/TeamController.dart +++ b/src/timemanagerapp/lib/controller/TeamController.dart @@ -66,7 +66,7 @@ class TeamController { //参考模板 joindedTeamList = []; allTeamList = []; - List? res = await netWorkController.getAllTeamList(Setting.user!.getId!); + List? res = await netWorkController.getAllTeamListByUserId(Setting.user!.getId!); if(res==null){ return []; }else{ @@ -75,7 +75,7 @@ class TeamController { for(Team team in allTeamList){ teamIdMap[team.id!] = team; } - joindedTeamList = allTeamList; + joindedTeamList.addAll(allTeamList); //对象之间赋值不能直接= for(Team team in myTeamList){ // 删除myTeamList中的特定元素 joindedTeamList.removeWhere((element) => element.id == team.id); diff --git a/src/timemanagerapp/lib/controller/TimetableWidgetController.dart b/src/timemanagerapp/lib/controller/TimetableWidgetController.dart index 40ccbac..74162e7 100644 --- a/src/timemanagerapp/lib/controller/TimetableWidgetController.dart +++ b/src/timemanagerapp/lib/controller/TimetableWidgetController.dart @@ -1,13 +1,13 @@ import 'dart:ui'; import 'package:timemanagerapp/entity/Course.dart'; +import 'package:timemanagerapp/entity/FreeTime.dart'; import 'package:timemanagerapp/setting/Setting.dart'; class TimetableWidgetController { - late List courseList; - late DateTime mondayTime; - late int weekCount; - late DateTime termStartDate; + static late DateTime mondayTime = getmondayTime(); + static late int weekCount = getWeekCount(); + static late DateTime termStartDate = Setting.startdate; static List timePoints = [ DateTime(2023, 9, 22, 7, 00), @@ -41,7 +41,7 @@ class TimetableWidgetController { } //时间转换为时间轴的piexl值的函数 - List convertTimeList(List timePoints, double deviceWidth) { + static List convertTimeList(List timePoints, double deviceWidth) { List convertedTimes = []; for (var time in timePoints) { int hour = time.hour; @@ -55,12 +55,66 @@ class TimetableWidgetController { return convertedTimes; } - int getWeekCount() { - weekCount = DateTime.now().difference(termStartDate).inDays ~/ 7 + 1; + //补充从学期开始到现在没有任何任务的空闲时间 + List repairFreeTimeBlockList(List freeTimeBlockList) { + List repairedFreeTimeBlockList = []; + DateTime termStartDate = Setting.startdate; + DateTime termEndDate = termStartDate.add(Duration(days: 7 * Setting.termAllWeekCout)); + //设置termEndDate的时分秒为23:00:00 + termEndDate = DateTime(termEndDate.year, termEndDate.month, termEndDate.day, 23, 00, 00); + + Set freeTimeBlockSet = {}; //用于去重,已有的所有空闲时间的日期的集合 + for (var freeTimeBlock in freeTimeBlockList) { + //仅仅比较日期,不比较具体时分秒 + //仅保留从学期开始到学期结束的空闲时间 + bool keepFlag = true; + if(freeTimeBlock.startTime.isBefore(termStartDate)){ + keepFlag = false; + } + if(freeTimeBlock.endTime.isAfter(termEndDate)){ + keepFlag = false; + } + if (freeTimeBlock.startTime.hour < 7) { + keepFlag = false; + } + if (freeTimeBlock.endTime.hour > 23) { + keepFlag = false; + } + // if(freeTimeBlock.startTime.compareTo(freeTimeBlock.endTime)==0){ //报错 + // keepFlag = false; //如果开始时间和结束时间相同,就不保留,但是要添加到freeTimeBlockSet中,表示已经考虑到 + // freeTimeBlockSet.add(DateTime(freeTimeBlock.startTime.year, freeTimeBlock.startTime.month, freeTimeBlock.startTime.day)); + // } + if(keepFlag){ + freeTimeBlockSet.add(DateTime(freeTimeBlock.startTime.year, freeTimeBlock.startTime.month, freeTimeBlock.startTime.day)); + repairedFreeTimeBlockList.add(freeTimeBlock); + }else{ + freeTimeBlockList.remove(freeTimeBlock); + } + } + + //从学期开始到学期结束的空闲时间 + for(var date = termStartDate; date.isBefore(termEndDate); date = date.add(Duration(days: 1))){ + date = DateTime(date.year, date.month, date.day); + if(freeTimeBlockSet.contains(date)){ + //如果已经有了,就不用再添加了 + continue; + } + DateTime startTime = DateTime(date.year, date.month, date.day, 7, 0); + DateTime endTime = DateTime(date.year, date.month, date.day, 23, 0); + FreeTime freeTime = FreeTime(startTime: startTime, endTime: endTime); + repairedFreeTimeBlockList.add(freeTime); + } + + return repairedFreeTimeBlockList; + } + + static int getWeekCount({DateTime ? dateTime}) { + dateTime ??= DateTime.now(); + weekCount = dateTime.difference(termStartDate).inDays ~/ 7 + 1; return weekCount; } - DateTime getmondayTime() { + static DateTime getmondayTime() { mondayTime = DateTime.now(); //获取本周星期一是几号 while (mondayTime.weekday != 1) { @@ -69,6 +123,36 @@ class TimetableWidgetController { return mondayTime; } + static List getSelectDayList(DateTime date) { + List selectedDayList = []; + //根据data是星期几就selectedDayList添加几个元素 + int day = date.weekday; + switch (day) { + case 1: + selectedDayList.add("周一"); + break; + case 2: + selectedDayList.add("周二"); + break; + case 3: + selectedDayList.add("周三"); + break; + case 4: + selectedDayList.add("周四"); + break; + case 5: + selectedDayList.add("周五"); + break; + case 6: + selectedDayList.add("周六"); + break; + case 7: + selectedDayList.add("周日"); + break; + } + return selectedDayList; + } + Map transformTimeBlockMap(List blockList) { Map timeblockMap = {}; for (var timeBlock in blockList) { diff --git a/src/timemanagerapp/lib/controller/UserController.dart b/src/timemanagerapp/lib/controller/UserController.dart index 005c433..0b98d87 100644 --- a/src/timemanagerapp/lib/controller/UserController.dart +++ b/src/timemanagerapp/lib/controller/UserController.dart @@ -71,6 +71,22 @@ class UserController { return true; } + // //注销 + // Future deleteUser(User postUser) async { + // //todo:将用户信息上传到服务器 + // int userid = await idGenerator.generateId(); + // postUser.id = userid; + // bool res = await netWorkController.register(postUser); + // //本地测试 + // if(!res){ + // print('注册失败'); + // return false; + // } + // //设置为注册后需要继续登录 + // // await Setting.saveUser(postUser); + // //todo:将用户信息上传到服务器 + // return true; + // } Future insertUser(User user) async { diff --git a/src/timemanagerapp/lib/controller/WorkController.dart b/src/timemanagerapp/lib/controller/WorkController.dart index 915aab5..091ecf1 100644 --- a/src/timemanagerapp/lib/controller/WorkController.dart +++ b/src/timemanagerapp/lib/controller/WorkController.dart @@ -1,133 +1,133 @@ -import 'package:timemanagerapp/entity/ScheduleForm.dart'; - -import '../database/dao/WorkDao.dart'; -import '../entity/Work.dart'; -import '../setting/Setting.dart'; -import '../util/dataUtil.dart'; -import 'NetWorkController.dart'; - -class WorkController { - static IdGenerator idGenerator = IdGenerator(); - static List WorkList = []; //实时维护的courseList缓存 - static NetWorkController netWorkController = NetWorkController(); - - DateTime termstartdate = Setting.startdate; //Setting.getStartDate(); - - Future> getWorks() async { - //todo http获取 - List> workMaps = await WorkDao().getWorks(); - List Works = []; // 用于存储转换后的Work对象列表 - - for (var workMap in workMaps) { - // 使用Work类的构造函数从Map创建Work对象 - Work work = Work( - id: workMap['id'], - userId: workMap['userId'], - content: workMap['content'], - workId: workMap['workId'], - name: workMap['name'], - startTime: DateTime.parse(workMap['startTime']), - endTime: DateTime.parse(workMap['endTime']), - status: workMap['status'], - teamId: workMap['teamId'], - ); - Works.add(work); - } - WorkList = Works; // 将Work对象添加到列表中 - return WorkList; - } - - //addscheduleForm - Future addScheduleForm(ScheduleForm scheduleForm,int teamId) async { - List WorkListToInsert = []; - int allWorkId = await idGenerator.generateId(); - for (int week = scheduleForm.getStartWeek; week <= scheduleForm.getEndWeek; week++) { - for (int day in scheduleForm.selectedDays) { - // 计算具体的日期和时间 - final startDate = termstartdate.add(Duration( - days: (7 * (week - 1) + day! - 1), - hours: scheduleForm.getStartTime.hour, - minutes: scheduleForm.getStartTime.minute - )); - - final endDate = termstartdate.add(Duration( - days: (7 * (week - 1) + day! - 1), - hours: scheduleForm.getEndTime.hour, - minutes: scheduleForm.getEndTime.minute, - )); - Work work = Work( - id: await idGenerator.generateId(), - name: scheduleForm.getName, - workId: allWorkId, - userId: Setting.user!.getId!, - status: "未完成", - content: scheduleForm.getContent, - teamId: teamId, - endTime: endDate, - startTime: startDate, - ); - WorkListToInsert.add(work); - } - } - await insertWorkList(WorkListToInsert); - } - - Future insertWork(Work Work) async { - return await WorkDao().insertWork(Work); - } - - Future insertWorkList(List workList) async { - int result = 0; - for (Work work in workList) { - result += await WorkDao().insertWork(work); - } - return result; - } - - //模仿Task的数数据操作写work - //query - Future> getWorkList() async { - List> workMaps = await WorkDao().getWorks(); - List workList = []; // 用于存储转换后的Work对象列表 - - for (var workMap in workMaps) { - // 使用Work类的构造函数从Map创建Work对象 - Work work = Work( - id: workMap['id'], - userId: workMap['userId'], - content: workMap['content'], - workId: workMap['workId'], - name: workMap['name'], - startTime: DateTime.parse(workMap['startTime']), - endTime: DateTime.parse(workMap['endTime']), - status: workMap['status'], - teamId: workMap['teamId'], - ); - workList.add(work); - } - WorkList = workList; // 将Work对象添加到列表中 - return WorkList; - } - - // //delete 模仿Task的数数据操作 - // Future deleteWorkByid(int id) async{ - // return await WorkDao().deleteWorkByid(id); - // } - - - Future deleteWorkByWorkid(int workid) async { - return await WorkDao().deleteWorkByWorkid(workid); - } - - Future deleteAllWorks() async { - return await WorkDao().deleteAllWorks(); - } - - //update - Future updateWork(Work work) async { - return await WorkDao().updateWork(work); - } - - - -} \ No newline at end of file +// import 'package:timemanagerapp/entity/ScheduleForm.dart'; +// +// import '../database/dao/WorkDao.dart'; +// import '../entity/Work.dart'; +// import '../setting/Setting.dart'; +// import '../util/dataUtil.dart'; +// import 'NetWorkController.dart'; +// +// class WorkController { +// static IdGenerator idGenerator = IdGenerator(); +// static List WorkList = []; //实时维护的courseList缓存 +// static NetWorkController netWorkController = NetWorkController(); +// +// DateTime termstartdate = Setting.startdate; //Setting.getStartDate(); +// +// Future> getWorks() async { +// //todo http获取 +// List> workMaps = await WorkDao().getWorks(); +// List Works = []; // 用于存储转换后的Work对象列表 +// +// for (var workMap in workMaps) { +// // 使用Work类的构造函数从Map创建Work对象 +// Work work = Work( +// id: workMap['id'], +// userId: workMap['userId'], +// content: workMap['content'], +// workId: workMap['workId'], +// name: workMap['name'], +// startTime: DateTime.parse(workMap['startTime']), +// endTime: DateTime.parse(workMap['endTime']), +// status: workMap['status'], +// teamId: workMap['teamId'], +// ); +// Works.add(work); +// } +// WorkList = Works; // 将Work对象添加到列表中 +// return WorkList; +// } +// +// //addscheduleForm +// Future addScheduleForm(ScheduleForm scheduleForm,int teamId) async { +// List WorkListToInsert = []; +// int allWorkId = await idGenerator.generateId(); +// for (int week = scheduleForm.getStartWeek; week <= scheduleForm.getEndWeek; week++) { +// for (int day in scheduleForm.selectedDays) { +// // 计算具体的日期和时间 +// final startDate = termstartdate.add(Duration( +// days: (7 * (week - 1) + day! - 1), +// hours: scheduleForm.getStartTime.hour, +// minutes: scheduleForm.getStartTime.minute +// )); +// +// final endDate = termstartdate.add(Duration( +// days: (7 * (week - 1) + day! - 1), +// hours: scheduleForm.getEndTime.hour, +// minutes: scheduleForm.getEndTime.minute, +// )); +// Work work = Work( +// id: await idGenerator.generateId(), +// name: scheduleForm.getName, +// workId: allWorkId, +// userId: Setting.user!.getId!, +// status: "未完成", +// content: scheduleForm.getContent, +// teamId: teamId, +// endTime: endDate, +// startTime: startDate, +// ); +// WorkListToInsert.add(work); +// } +// } +// await insertWorkList(WorkListToInsert); +// } +// +// Future insertWork(Work Work) async { +// return await WorkDao().insertWork(Work); +// } +// +// Future insertWorkList(List workList) async { +// int result = 0; +// for (Work work in workList) { +// result += await WorkDao().insertWork(work); +// } +// return result; +// } +// +// //模仿Task的数数据操作写work +// //query +// Future> getWorkList() async { +// List> workMaps = await WorkDao().getWorks(); +// List workList = []; // 用于存储转换后的Work对象列表 +// +// for (var workMap in workMaps) { +// // 使用Work类的构造函数从Map创建Work对象 +// Work work = Work( +// id: workMap['id'], +// userId: workMap['userId'], +// content: workMap['content'], +// workId: workMap['workId'], +// name: workMap['name'], +// startTime: DateTime.parse(workMap['startTime']), +// endTime: DateTime.parse(workMap['endTime']), +// status: workMap['status'], +// teamId: workMap['teamId'], +// ); +// workList.add(work); +// } +// WorkList = workList; // 将Work对象添加到列表中 +// return WorkList; +// } +// +// // //delete 模仿Task的数数据操作 +// // Future deleteWorkByid(int id) async{ +// // return await WorkDao().deleteWorkByid(id); +// // } +// +// +// Future deleteWorkByWorkid(int workid) async { +// return await WorkDao().deleteWorkByWorkid(workid); +// } +// +// Future deleteAllWorks() async { +// return await WorkDao().deleteAllWorks(); +// } +// +// //update +// Future updateWork(Work work) async { +// return await WorkDao().updateWork(work); +// } +// +// +// +// } \ No newline at end of file diff --git a/src/timemanagerapp/lib/entity/Course.dart b/src/timemanagerapp/lib/entity/Course.dart index 3ea79bb..b7ac771 100644 --- a/src/timemanagerapp/lib/entity/Course.dart +++ b/src/timemanagerapp/lib/entity/Course.dart @@ -72,9 +72,9 @@ class Course { String get getRemark => remark; - DateTime get getstartTime => startTime; + DateTime get getStartTime => startTime; - DateTime get getendTime => endTime; + DateTime get getEndTime => endTime; // Setter methods set setId(int newId) { diff --git a/src/timemanagerapp/lib/ruters/AddCourseRoute.dart b/src/timemanagerapp/lib/ruters/AddCourseRoute.dart index 6f8eead..d2585f2 100644 --- a/src/timemanagerapp/lib/ruters/AddCourseRoute.dart +++ b/src/timemanagerapp/lib/ruters/AddCourseRoute.dart @@ -13,7 +13,7 @@ class AddCourseRoute extends StatelessWidget { Widget build(BuildContext context) { return Scaffold( appBar: AppBar( - title: Text('添加自定义课程'), + title: Text('编辑自定义课程'), ), body: AddCourseFormWidget(exitCourse: exitCourse), ); diff --git a/src/timemanagerapp/lib/ruters/AddTeamRoute.dart b/src/timemanagerapp/lib/ruters/AddTeamRoute.dart index 6784ecf..03717ba 100644 --- a/src/timemanagerapp/lib/ruters/AddTeamRoute.dart +++ b/src/timemanagerapp/lib/ruters/AddTeamRoute.dart @@ -9,7 +9,7 @@ class AddTeamRoute extends StatelessWidget { Widget build(BuildContext context) { return Scaffold( appBar: AppBar( - title: Text('添加团队'), + title: Text('编辑团队信息'), ), body: AddTeamWidget(), ); diff --git a/src/timemanagerapp/lib/ruters/TeamRoute.dart b/src/timemanagerapp/lib/ruters/TeamRoute.dart index ba60f04..6eb723e 100644 --- a/src/timemanagerapp/lib/ruters/TeamRoute.dart +++ b/src/timemanagerapp/lib/ruters/TeamRoute.dart @@ -7,10 +7,19 @@ import '../widgets/TeamWidget.dart'; class TeamRoute extends StatelessWidget { //TeamWidgetKey - GlobalKey teamWidgetKey = GlobalKey(); + + @override + initState() { + Setting.init(); + + } @override Widget build(BuildContext context) { + if(Setting.teamWidgetKey == null) { + Setting.teamWidgetKey = + GlobalKey(); // 初始化TeamWidgetKey,initState只有StatefulWidget才有 + } if(Setting.user!.getId == -1){ return Scaffold( appBar: AppBar( @@ -26,8 +35,9 @@ class TeamRoute extends StatelessWidget { appBar: AppBar( title: Text('我的团队'), ), - body: TeamWidget(), + body: TeamWidget(key: Setting.teamWidgetKey!), floatingActionButton: FloatingActionButton( + //添加团队悬浮按钮 onPressed: () async { await Navigator.push( context, @@ -37,7 +47,7 @@ class TeamRoute extends StatelessWidget { }, ), ); - teamWidgetKey.currentState!.futureDo(); + Setting.teamWidgetKey!.currentState!.futureDo(); }, child: Icon(Icons.add), ), diff --git a/src/timemanagerapp/lib/setting/Setting.dart b/src/timemanagerapp/lib/setting/Setting.dart index 339de78..1462859 100644 --- a/src/timemanagerapp/lib/setting/Setting.dart +++ b/src/timemanagerapp/lib/setting/Setting.dart @@ -1,13 +1,19 @@ -import 'dart:ffi'; - +import 'dart:core'; +import 'package:flutter/cupertino.dart'; import 'package:shared_preferences/shared_preferences.dart'; import '../entity/User.dart'; +import '../widgets/FreeTimetableWidget.dart'; +import '../widgets/TeamWidget.dart'; +import '../widgets/TimetableWidget.dart'; class Setting { static SharedPreferences? prefs; static bool initFlag = true; static DateTime startdate_init = DateTime(2023, 8, 28); + static int termAllWeekCout = 20; // 一学期的周数 + static DateTime timeTableStartTime = DateTime(2023, 8, 28, 7, 00); // 一天的开始时间 + static DateTime timeTableEndTime = DateTime(2023, 8, 28, 23, 00); // 一天的结束时间 static late DateTime startdate; static late User? user; static User nullUser = User(id:-1, username: "null", password: "null", role: 0); @@ -16,6 +22,10 @@ class Setting { static bool isMusicPlaying = false; // 用于番茄钟音乐播放的状态 static bool isDeveloperButtonVisible = false; // 假设开发者测试初始状态为不可见 + static GlobalKey? timetableWidgetKey; + static GlobalKey? teamWidgetKey; + static GlobalKey? freeTimetableWidgeKey; + static init() async { //初始化 print("Setting初始化"); diff --git a/src/timemanagerapp/lib/widgets/AddCourseFormWidget.dart b/src/timemanagerapp/lib/widgets/AddCourseFormWidget.dart index 1c806a0..64d0cee 100644 --- a/src/timemanagerapp/lib/widgets/AddCourseFormWidget.dart +++ b/src/timemanagerapp/lib/widgets/AddCourseFormWidget.dart @@ -6,6 +6,7 @@ import 'package:timemanagerapp/controller/CourseController.dart'; import 'package:timemanagerapp/entity/Course.dart'; import 'package:timemanagerapp/entity/CourseForm.dart'; +import '../controller/TimetableWidgetController.dart'; import '../provider/TimeProvider.dart'; class AddCourseFormWidget extends StatefulWidget { const AddCourseFormWidget({Key? key,this.exitCourse}) : super(key: key); @@ -72,6 +73,9 @@ class _AddCourseFormWidgetState extends State { note = exitCourse!.getRemark; teacher = exitCourse!.getTeacher; location = exitCourse!.getLocation; + selectedDays = TimetableWidgetController.getSelectDayList(exitCourse!.getStartTime); + startWeek = TimetableWidgetController.getWeekCount(dateTime:exitCourse!.getStartTime).toString(); + endWeek = TimetableWidgetController.getWeekCount(dateTime:exitCourse!.getEndTime).toString(); } _courseController = TextEditingController(text: course); @@ -121,6 +125,7 @@ class _AddCourseFormWidgetState extends State { SizedBox(height: 16.0), MultiSelectDialogField( items: daysList, + initialValue: selectedDays, // 设置初始选定的值 title: Text('上课日*'), validator: (values) { if (values == null || values.isEmpty) { diff --git a/src/timemanagerapp/lib/widgets/AddScheduleFormWidget.dart b/src/timemanagerapp/lib/widgets/AddScheduleFormWidget.dart index d2b64ad..045068a 100644 --- a/src/timemanagerapp/lib/widgets/AddScheduleFormWidget.dart +++ b/src/timemanagerapp/lib/widgets/AddScheduleFormWidget.dart @@ -8,6 +8,7 @@ import 'package:timemanagerapp/controller/WorkController.dart'; import 'package:timemanagerapp/entity/ScheduleForm.dart'; import 'package:timemanagerapp/entity/Task.dart'; +import '../controller/TimetableWidgetController.dart'; import '../provider/TimeProvider.dart'; class AddScheduleFormWidget extends StatefulWidget { AddScheduleFormWidget({Key? key,required this.scheduleType,this.teamId,this.exitSchedule}) : super(key: key); @@ -25,6 +26,8 @@ class _AddScheduleFormWidgetState extends State { late TextEditingController _nameController; late TextEditingController _contenController; + late TextEditingController _startWeekController; + late TextEditingController _endWeekController; final String scheduleType;//可选值为task和work final int? teamId ; @@ -46,7 +49,7 @@ class _AddScheduleFormWidgetState extends State { List selectedDays = []; - List> daysList = [ + static List> daysList = [ MultiSelectItem('周一', '一'), MultiSelectItem('周二', '二'), MultiSelectItem('周三', '三'), @@ -72,10 +75,18 @@ class _AddScheduleFormWidgetState extends State { if(exitSchedule != null){ name = exitSchedule.getName; content = exitSchedule.getContent; + startTime = exitSchedule.getStartTime; + endTime = exitSchedule.getEndTime; + selectedDays = TimetableWidgetController.getSelectDayList(exitSchedule!.getStartTime); + startWeek = TimetableWidgetController.getWeekCount(dateTime:exitSchedule!.getStartTime).toString(); + endWeek = TimetableWidgetController.getWeekCount(dateTime:exitSchedule!.getEndTime).toString(); } _nameController = TextEditingController(text: name); _contenController = TextEditingController(text: content); + _startWeekController = TextEditingController(text: startWeek); + _endWeekController = TextEditingController(text: endWeek); + } @override @@ -109,6 +120,7 @@ class _AddScheduleFormWidgetState extends State { SizedBox(height: 16.0), MultiSelectDialogField( items: daysList, + initialValue: selectedDays, // 设置初始选定的值 title: Text('星期几*'), validator: (values) { if (values == null || values.isEmpty) { @@ -124,6 +136,7 @@ class _AddScheduleFormWidgetState extends State { ), SizedBox(height: 16.0), TextFormField( + controller: _startWeekController, decoration: InputDecoration(labelText: '开始周'), onSaved: (value) => startWeek = value ?? '', validator: (value) { @@ -135,6 +148,7 @@ class _AddScheduleFormWidgetState extends State { ), SizedBox(height: 16.0), TextFormField( + controller: _endWeekController, decoration: InputDecoration(labelText: '结束周'), onSaved: (value) => endWeek = value ?? '', validator: (value) { @@ -151,7 +165,7 @@ class _AddScheduleFormWidgetState extends State { ), controller: TextEditingController( text: startTime != null - ? '${startTime!.hour}:${startTime!.minute}' + ? '${startTime!.hour.toString().padLeft(2, '0')}:${startTime!.minute.toString().padLeft(2, '0')}' : '', ), readOnly: true, @@ -180,7 +194,7 @@ class _AddScheduleFormWidgetState extends State { ), controller: TextEditingController( text: endTime != null - ? '${endTime!.hour}:${endTime!.minute}' + ? '${endTime!.hour.toString().padLeft(2, '0')} :${endTime!.minute.toString().padLeft(2, '0')}' : '', ), readOnly: true, @@ -216,7 +230,7 @@ class _AddScheduleFormWidgetState extends State { ElevatedButton( onPressed: () { // 点击确定按钮后的操作 - if (_formKey.currentState!.validate()) { + if (_formKey.currentState!.validate()&&startTime!=endTime!&&startTime.isBefore(endTime!)) { _formKey.currentState!.save(); // 在这里执行表单提交操作 scheduleForm.name = name; @@ -230,7 +244,7 @@ class _AddScheduleFormWidgetState extends State { if(exitSchedule != null){//先删除再添加 taskController.deleteTaskByTaskid(exitSchedule!.getTaskId).then((value){ taskController.addScheduleForm(scheduleForm).then(((value){ - Provider.of(context, listen: false).updateTimetable(); // 更新时间表页面操作 + // Provider.of(context, listen: false).updateTimetable(); // 更新时间表页面操作 // 关闭当前界面 // Provider.of(context, listen: false).updateTimetable(); // 更新菜单栏页面操作 // timePro.updatTimtTablecount++; @@ -239,7 +253,7 @@ class _AddScheduleFormWidgetState extends State { }); }else{ taskController.addScheduleForm(scheduleForm).then(((value){ - Provider.of(context, listen: false).updateTimetable(); // 更新时间表页面操作 + // Provider.of(context, listen: false).updateTimetable(); // 更新时间表页面操作 // 关闭当前界面 // Provider.of(context, listen: false).updateTimetable(); // 更新菜单栏页面操作 // timePro.updatTimtTablecount++; @@ -250,7 +264,7 @@ class _AddScheduleFormWidgetState extends State { if(exitSchedule != null){//先删除再添加 teamController.deleteWorkByWorkId(exitSchedule!.getWorkId).then((value){ teamController.addScheduleForm(scheduleForm,teamId!).then(((value){ - Provider.of(context, listen: false).updateTimetable(); // 更新时间表页面操作 + // Provider.of(context, listen: false).updateTimetable(); // 更新时间表页面操作 // 关闭当前界面 // Provider.of(context, listen: false).updateTimetable(); // 更新菜单栏页面操作 // timePro.updatTimtTablecount++; @@ -259,13 +273,47 @@ class _AddScheduleFormWidgetState extends State { }); }else{ teamController.addScheduleForm(scheduleForm,teamId!).then(((value){ - Provider.of(context, listen: false).updateTimetable(); // 更新时间表页面操作 + // Provider.of(context, listen: false).updateTimetable(); // 更新时间表页面操作 // 关闭当前界面 // timePro.updatTimtTablecount++; Navigator.pop(context); })); } } + }else{ + if(startTime==endTime){ + showDialog( + context: context, + builder: (context) { + return AlertDialog( + title: Text('时间错误'), + content: Text('开始时间和结束时间不能相同'), + actions: [ + TextButton( + onPressed: () => Navigator.pop(context), + child: Text('确定'), + ), + ], + ); + }, + ); + }else if(startTime!.isAfter(endTime!)){ + showDialog( + context: context, + builder: (context) { + return AlertDialog( + title: Text('时间错误'), + content: Text('开始时间不能晚于结束时间'), + actions: [ + TextButton( + onPressed: () => Navigator.pop(context), + child: Text('确定'), + ), + ], + ); + }, + ); + } } }, child: Text('确定'), diff --git a/src/timemanagerapp/lib/widgets/AddTeamWidget.dart b/src/timemanagerapp/lib/widgets/AddTeamWidget.dart index 80cf43a..6044504 100644 --- a/src/timemanagerapp/lib/widgets/AddTeamWidget.dart +++ b/src/timemanagerapp/lib/widgets/AddTeamWidget.dart @@ -5,6 +5,8 @@ import 'package:timemanagerapp/entity/Team.dart'; import '../setting/Setting.dart'; class AddTeamWidget extends StatefulWidget { + const AddTeamWidget({Key? key}) : super(key: key); + @override _AddTeamWidgetState createState() => _AddTeamWidgetState(); } diff --git a/src/timemanagerapp/lib/widgets/AutoImportWidget.dart b/src/timemanagerapp/lib/widgets/AutoImportWidget.dart index 3d3bbf2..9c799b0 100644 --- a/src/timemanagerapp/lib/widgets/AutoImportWidget.dart +++ b/src/timemanagerapp/lib/widgets/AutoImportWidget.dart @@ -48,7 +48,8 @@ class _AutoImportWidgetState extends State { loading = false; }); if (res != 0) { - Provider.of(context, listen: false).updateTimetable(); // 更新时间表页面操作 + // Provider.of(context, listen: false).updateTimetable(); // 更新时间表页面操作 + Setting.timetableWidgetKey!.currentState!.localFutureDo(); Navigator.pop(context); } else { showDialog( diff --git a/src/timemanagerapp/lib/widgets/FreeTimetableWidget.dart b/src/timemanagerapp/lib/widgets/FreeTimetableWidget.dart index 77eb3ed..a1339f6 100644 --- a/src/timemanagerapp/lib/widgets/FreeTimetableWidget.dart +++ b/src/timemanagerapp/lib/widgets/FreeTimetableWidget.dart @@ -8,11 +8,13 @@ import 'package:timemanagerapp/controller/TeamController.dart'; import '../controller/TimetableWidgetController.dart'; import '../entity/FreeTime.dart'; import '../entity/Team.dart'; +import '../entity/Work.dart'; import '../provider/TimeProvider.dart'; +import '../ruters/AddScheduleRoute.dart'; import '../setting/Setting.dart'; class FreeTimetableWidget extends StatefulWidget { - FreeTimetableWidget({Key ? key,required this.team}) : super(key: key); + FreeTimetableWidget({required Key key,required this.team}) : super(key: key); final double deviceWidth = Setting.deviceWidth; final Team team; @@ -54,23 +56,7 @@ class FreeTimetableWidgetState extends State { final double hourHeight = 60.0 * 1.5; //预设的时间轴的值,由于时间轴是由课表得来,所以这里是DateTime类型,需要经过一次转换为Piexl的值 - List timePoints = [ - DateTime(2023, 9, 22, 7, 30), - DateTime(2023, 9, 22, 8, 0), // 8:00 AM - DateTime(2023, 9, 22, 9, 35), // 8:15 PM - DateTime(2023, 9, 22, 10, 5), - DateTime(2023, 9, 22, 11, 40), - DateTime(2023, 9, 22, 12, 30), - DateTime(2023, 9, 22, 13, 30), - DateTime(2023, 9, 22, 15, 5), // 8:00 AM - DateTime(2023, 9, 22, 15, 35), // 12:30 PM - DateTime(2023, 9, 22, 17, 10), - DateTime(2023, 9, 22, 18, 30), - DateTime(2023, 9, 22, 19, 15), // 8:00 AM - DateTime(2023, 9, 22, 20, 5), // 12:30 PM - DateTime(2023, 9, 22, 20, 55), - DateTime(2023, 9, 22, 21, 40), - ]; + //时间轴的集合,类型为Offset var positions = []; @@ -82,6 +68,10 @@ class FreeTimetableWidgetState extends State { //获取数据库课程表 freeTimeBlockList = await teamController.getFreeTime(team.getId!); + //补充那一天没有任何任务的空闲时间 + freeTimeBlockList = timetableWidgetController + .repairFreeTimeBlockList(freeTimeBlockList); + dataCaculateAfterFutherDo(); print('serverFutureDo 完成'); @@ -93,12 +83,13 @@ class FreeTimetableWidgetState extends State { @override initState() { super.initState(); + //初始化 freeTimeBlockWeekMap = {}; freeTimeBlockList = []; //设置当前周 - currentWeek = timetableWidgetController.getWeekCount(); + currentWeek = TimetableWidgetController.getWeekCount(); showWeek = currentWeek; // showWeek = 1; // @@ -118,7 +109,7 @@ class FreeTimetableWidgetState extends State { - var mondayTime = timetableWidgetController.getmondayTime(); + var mondayTime = TimetableWidgetController.getmondayTime(); //showMon showMonth = mondayTime.add(Duration(days: 7 * (showWeek - currentWeek))).month; @@ -134,7 +125,7 @@ class FreeTimetableWidgetState extends State { } //调用函数初始化时间轴的绝对坐标 positions = - timetableWidgetController.convertTimeList(timePoints, deviceWidth); + TimetableWidgetController.convertTimeList(TimetableWidgetController.timePoints, deviceWidth); } @@ -152,27 +143,22 @@ class FreeTimetableWidgetState extends State { onRefresh: () { print('下拉refresh'); return serverFutureDo().then((value){ - // Provider.of(context, listen: false).updateTimetable(); // 更新时间表页面操作 }); }, child: GestureDetector( onHorizontalDragEnd: (details) { - // teamController.getFreeTime(tea).then((value){ - // workList = value; - // setState(() { - // - // }); - // }); serverFutureDo(); if (details.primaryVelocity! > 0) { // 右滑 setState(() { showWeek--; + dataCaculateAfterFutherDo(); }); } else if (details.primaryVelocity! < 0) { // 左滑 setState(() { showWeek++; + dataCaculateAfterFutherDo(); }); } }, @@ -289,12 +275,12 @@ class FreeTimetableWidgetState extends State { child: Row( children: [ Text( - timePoints[index] + TimetableWidgetController.timePoints[index] .hour .toString() .padLeft(2, '0') + ':' + - timePoints[index] + TimetableWidgetController.timePoints[index] .minute .toString() .padLeft(2, '0'), @@ -363,7 +349,9 @@ class FreeTimetableWidgetState extends State { children: [ FreeTimeBlockContenWidget( currentItem: - currentItem), + currentItem, + team: team, + ), ], ), ), @@ -431,10 +419,12 @@ class BlockGestureWidget extends StatelessWidget { super.key, required this.currentItem, required this.blockGestureWidgetChilld, + required this.team, }); final currentItem; final blockGestureWidgetChilld; + final Team team; @override Widget build(BuildContext context) { @@ -446,7 +436,7 @@ class BlockGestureWidget extends StatelessWidget { builder: (BuildContext context) { return AlertDialog( // 根据currentItem显示更多信息 - title: Text(currentItem.name), + title: Text('空闲时间'), content: SingleChildScrollView( child: ListBody( children: [ @@ -468,6 +458,52 @@ class BlockGestureWidget extends StatelessWidget { }, ); }, + onLongPress: () { + // 长按弹出选项 + showDialog( + context: context, + builder: (BuildContext context) { + return AlertDialog( + title: Text('菜单'), + content: Column( + mainAxisSize: MainAxisSize.min, + children: [ + ElevatedButton( + onPressed: () async { + // 导航到查看空团队空闲时间页面 + await Navigator.push( + context, + MaterialPageRoute( + builder: (context) { + return AddScheduleRoute( + scheduleType: "work", + teamId: team.id!, + exitSchedule: Work( + startTime: currentItem.startTime, + endTime: currentItem.endTime, + teamId: team.id!, + userId: Setting.user!.id!, + status: '', + content: '', + name: '', + workId: 0, + ) + ); + }, + ), + ); + Navigator.of(context).pop(); + Setting.freeTimetableWidgeKey!.currentState!.serverFutureDo(); + }, + child: Text('添加团队任务'), + ), + SizedBox(height: 10), + ], + ), + ); + }, + ); + }, child: blockGestureWidgetChilld, ); } @@ -476,10 +512,11 @@ class BlockGestureWidget extends StatelessWidget { class FreeTimeBlockContenWidget extends StatelessWidget { const FreeTimeBlockContenWidget({ super.key, - required this.currentItem, + required this.currentItem, required this.team, }); final currentItem; + final Team team; @override Widget build(BuildContext context) { @@ -492,7 +529,10 @@ class FreeTimeBlockContenWidget extends StatelessWidget { ':' + (currentItem as FreeTime).startTime.minute.toString().padLeft(2, '0'), style: TextStyle( - fontSize: 10, + fontSize: 12, + color: Colors.black, + //加粗 + fontWeight: FontWeight.bold, ), overflow: TextOverflow.clip, ), @@ -501,12 +541,16 @@ class FreeTimeBlockContenWidget extends StatelessWidget { ':' + (currentItem as FreeTime).endTime.minute.toString().padLeft(2, '0'), style: TextStyle( - fontSize: 10, + fontSize: 12, + color: Colors.black, + //加粗 + fontWeight: FontWeight.bold, ), overflow: TextOverflow.clip, ), ], ), + team: team, ); } } \ No newline at end of file diff --git a/src/timemanagerapp/lib/widgets/HomeWidget.dart b/src/timemanagerapp/lib/widgets/HomeWidget.dart index f208be5..92eaf1c 100644 --- a/src/timemanagerapp/lib/widgets/HomeWidget.dart +++ b/src/timemanagerapp/lib/widgets/HomeWidget.dart @@ -28,7 +28,6 @@ class HomeWidget extends StatefulWidget { } class _HomeWidgetState extends State { - GlobalKey timetableWidgetKey = GlobalKey(); //课程表的key,用于刷新课程表,代表TimetableWidgetState对象 late UserController userController; late CourseController courseController; @@ -39,6 +38,8 @@ class _HomeWidgetState extends State { @override void initState() { super.initState(); + Setting.timetableWidgetKey = GlobalKey(); //课程表的key,用于刷新课程表,代表TimetableWidgetState对象; + userController = UserController.getInstance(); courseController = CourseController.getInstance(); } @@ -77,6 +78,7 @@ class _HomeWidgetState extends State { children: [ ElevatedButton( onPressed: () async { + Navigator.of(context).pop();//关闭弹窗 // 导航到AddCourseFormWidget页面 await Navigator.push( context, @@ -91,12 +93,13 @@ class _HomeWidgetState extends State { // }); //更新课程表从本地数据库 // print("触发更新课程表"); - timetableWidgetKey.currentState!.localFutureDo(); + Setting.timetableWidgetKey!.currentState!.localFutureDo(); }, child: Text('添加课程'), ), ElevatedButton( onPressed: () async { + Navigator.of(context).pop();//关闭弹窗 // 导航到AddCourseFormWidget页面 await Navigator.push( context, @@ -109,7 +112,7 @@ class _HomeWidgetState extends State { }, ), ); - timetableWidgetKey.currentState!.localFutureDo(); + Setting.timetableWidgetKey!.currentState!.localFutureDo(); }, child: Text('添加个人计划'), ), @@ -149,8 +152,8 @@ class _HomeWidgetState extends State { }, ), ); - timetableWidgetKey.currentState!.serverFutureDo(); - timetableWidgetKey.currentState!.localFutureDo(); + Setting.timetableWidgetKey!.currentState!.serverFutureDo(); + Setting.timetableWidgetKey!.currentState!.localFutureDo(); }, ), Builder( @@ -188,7 +191,7 @@ class _HomeWidgetState extends State { await Setting.saveInitFlag(true); } setState(() {}); - timetableWidgetKey.currentState!.localFutureDo(); + Setting.timetableWidgetKey!.currentState!.localFutureDo(); }, child: Setting.user!.getId! != -1 ? Text(Setting.user!.getUsername!) @@ -212,7 +215,7 @@ class _HomeWidgetState extends State { await Setting.saveInitFlag(true); } setState(() {}); - timetableWidgetKey.currentState!.localFutureDo(); + Setting.timetableWidgetKey!.currentState!.localFutureDo(); }, child: Setting.user!.getId! != -1 ? Text('退出登录') @@ -236,7 +239,7 @@ class _HomeWidgetState extends State { }, ), ); - timetableWidgetKey.currentState!.localFutureDo(); + Setting.timetableWidgetKey!.currentState!.localFutureDo(); }, ), GestureDetector( @@ -309,16 +312,14 @@ class _HomeWidgetState extends State { }, ), ); - setState(() { - }); - timetableWidgetKey.currentState!.localFutureDo(); + Setting.timetableWidgetKey!.currentState!.localFutureDo(); }, ), ], ), ); }), - body: TimetableWidget(key: timetableWidgetKey), + body: TimetableWidget(key: Setting.timetableWidgetKey!), ); } diff --git a/src/timemanagerapp/lib/widgets/TeamWidget.dart b/src/timemanagerapp/lib/widgets/TeamWidget.dart index 699a8df..024e68f 100644 --- a/src/timemanagerapp/lib/widgets/TeamWidget.dart +++ b/src/timemanagerapp/lib/widgets/TeamWidget.dart @@ -7,9 +7,10 @@ import 'package:timemanagerapp/widgets/FreeTimetableWidget.dart'; import 'package:timemanagerapp/widgets/ManageUserTeamWidget.dart'; import '../entity/Team.dart'; +import '../setting/Setting.dart'; class TeamWidget extends StatefulWidget { - const TeamWidget({Key? key}) : super(key: key); + const TeamWidget({required key}) : super(key: key); @override TeamWidgetState createState() => TeamWidgetState(); @@ -42,6 +43,9 @@ class TeamWidgetState extends State { @override initState() { super.initState(); + + Setting.freeTimetableWidgeKey = GlobalKey(); + futureDo(); //todo: get teamList from database } @@ -111,7 +115,7 @@ class TeamWidgetState extends State { context, MaterialPageRoute( builder: (context) { - return FreeTimetableWidget(team: team); + return FreeTimetableWidget(team: team,key:Setting.freeTimetableWidgeKey!); }, ), ); @@ -155,7 +159,7 @@ class TeamWidgetState extends State { builder: (context) { return AddScheduleRoute( scheduleType: "work", - teamId: 1, + teamId: team.id! ); }, ), @@ -239,7 +243,7 @@ class TeamWidgetState extends State { context, MaterialPageRoute( builder: (context) { - return FreeTimetableWidget(team: team); + return FreeTimetableWidget(team: team,key:Setting.freeTimetableWidgeKey!); }, ), ); diff --git a/src/timemanagerapp/lib/widgets/TestWidget.dart b/src/timemanagerapp/lib/widgets/TestWidget.dart index 9fbc591..3890676 100644 --- a/src/timemanagerapp/lib/widgets/TestWidget.dart +++ b/src/timemanagerapp/lib/widgets/TestWidget.dart @@ -50,7 +50,6 @@ class _TestWidgetState extends State { late UserController userController; late CourseController courseController; late TaskController taskController; - late WorkController WwrkController; @override void initState() { @@ -269,7 +268,7 @@ class _TestWidgetState extends State { ), ElevatedButton( onPressed: () { - WorkController().getWorks().then((works) { + TeamController().getWorks().then((works) { showDialog( context: context, builder: (context) { @@ -293,47 +292,47 @@ class _TestWidgetState extends State { }, child: Text('显示团队任务列表'), ), + // ElevatedButton( + // onPressed: () { + // UserController() + // .login(User(username: 'root', password: 'root', role: 1)) + // .then((resUser) { + // showDialog( + // context: context, + // builder: (context) { + // return AlertDialog( + // title: Text('登录信息'), + // content: SingleChildScrollView( + // child: Text(resUser!.toString())), + // ); + // }, + // ); + // }); + // }, + // child: Text('登录'), + // ), + // ElevatedButton( + // onPressed: () { + // NetWorkController() + // .register(User(id: Setting.user!.getId!, username:'testReg' , password: '123', role: 0)) + // .then((res) { + // showDialog( + // context: context, + // builder: (context) { + // return AlertDialog( + // title: Text('注册'), + // content: SingleChildScrollView( + // child: Text(res.toString())), + // ); + // }, + // ); + // }); + // }, + // child: Text('注册'), + // ), ElevatedButton( onPressed: () { - UserController() - .login(User(username: 'root', password: 'root', role: 1)) - .then((resUser) { - showDialog( - context: context, - builder: (context) { - return AlertDialog( - title: Text('登录信息'), - content: SingleChildScrollView( - child: Text(resUser!.toString())), - ); - }, - ); - }); - }, - child: Text('登录'), - ), - ElevatedButton( - onPressed: () { - NetWorkController() - .register(User(id: Setting.user!.getId!, username:'testReg' , password: '123', role: 0)) - .then((res) { - showDialog( - context: context, - builder: (context) { - return AlertDialog( - title: Text('注册'), - content: SingleChildScrollView( - child: Text(res.toString())), - ); - }, - ); - }); - }, - child: Text('注册'), - ), - ElevatedButton( - onPressed: () { - TeamController().getMyTeamList().then((teamList) { + NetWorkController().getAllTeamList().then((teamList) { showDialog( context: context, builder: (context) { @@ -355,46 +354,46 @@ class _TestWidgetState extends State { ); }); }, - child: Text('显示团队列表'), - ), - ElevatedButton( - onPressed: () { - TeamController() - .insertTeam(Team(leaderId: Setting.user!.getId!, teamName: "test3", maxNumber: 5)) - .then((resTeam) { - showDialog( - context: context, - builder: (context) { - return AlertDialog( - title: Text('录'), - content: SingleChildScrollView( - child: Text(resTeam.toString())), - ); - }, - ); - }); - }, - child: Text('增加团队'), - ), - ElevatedButton( - onPressed: () { - NetWorkController() - .deleteTeam(2) - .then((resTeam) { - showDialog( - context: context, - builder: (context) { - return AlertDialog( - title: Text('录'), - content: SingleChildScrollView( - child: Text(resTeam.toString())), - ); - }, - ); - }); - }, - child: Text('删除团队'), + child: Text('显示数据库所有团队列表(不可用)'), ), + // ElevatedButton( + // onPressed: () { + // TeamController() + // .insertTeam(Team(leaderId: Setting.user!.getId!, teamName: "test3", maxNumber: 5)) + // .then((resTeam) { + // showDialog( + // context: context, + // builder: (context) { + // return AlertDialog( + // title: Text('录'), + // content: SingleChildScrollView( + // child: Text(resTeam.toString())), + // ); + // }, + // ); + // }); + // }, + // child: Text('增加团队'), + // ), + // ElevatedButton( + // onPressed: () { + // NetWorkController() + // .deleteTeam(2) + // .then((resTeam) { + // showDialog( + // context: context, + // builder: (context) { + // return AlertDialog( + // title: Text('录'), + // content: SingleChildScrollView( + // child: Text(resTeam.toString())), + // ); + // }, + // ); + // }); + // }, + // child: Text('删除团队'), + // ), ElevatedButton( onPressed: () { NetWorkController() diff --git a/src/timemanagerapp/lib/widgets/TimetableWidget.dart b/src/timemanagerapp/lib/widgets/TimetableWidget.dart index 5af5cf6..a303e65 100644 --- a/src/timemanagerapp/lib/widgets/TimetableWidget.dart +++ b/src/timemanagerapp/lib/widgets/TimetableWidget.dart @@ -26,6 +26,8 @@ class TimetableWidget extends StatefulWidget { } class TimetableWidgetState extends State { + + late double deviceWidth; int firstInit = 0; @@ -100,12 +102,15 @@ class TimetableWidgetState extends State { @override initState() { super.initState(); + + + //初始化 timeBlockWeekMap = {}; timeBlockList = []; //设置当前周 - currentWeek = timetableWidgetController.getWeekCount(); + currentWeek = TimetableWidgetController.getWeekCount(); showWeek = currentWeek; // showWeek = 1; // @@ -137,7 +142,7 @@ class TimetableWidgetState extends State { - var mondayTime = timetableWidgetController.getmondayTime(); + var mondayTime = TimetableWidgetController.getmondayTime(); //showMon showMonth = mondayTime.add(Duration(days: 7 * (showWeek - currentWeek))).month; @@ -153,7 +158,7 @@ class TimetableWidgetState extends State { } //调用函数初始化时间轴的绝对坐标 positions = - timetableWidgetController.convertTimeList(TimetableWidgetController.timePoints, deviceWidth); + TimetableWidgetController.convertTimeList(TimetableWidgetController.timePoints, deviceWidth); } @@ -168,7 +173,7 @@ class TimetableWidgetState extends State { timeBlockWeekMap = timetableWidgetController.transformTimeBlockMap(timeBlockList); //按每周分组 - var mondayTime = timetableWidgetController.getmondayTime(); + var mondayTime = TimetableWidgetController.getmondayTime(); //showMon showMonth = mondayTime.add(Duration(days: 7 * (showWeek - currentWeek))).month; @@ -182,24 +187,13 @@ class TimetableWidgetState extends State { } //调用函数初始化时间轴的绝对坐标 positions = - timetableWidgetController.convertTimeList(TimetableWidgetController.timePoints, deviceWidth); + TimetableWidgetController.convertTimeList(TimetableWidgetController.timePoints, deviceWidth); // print('Recent monday '+DateTime.now().day.toString()); } @override Widget build(BuildContext contexvoidt) { - // if (firstInit == 0) { - // //第一次初始化 - // dataInitAfterFutherDo(); - // firstInit = 1; - // } else { - // //更新 - // updateAfterFutherDo(); - // } - - // print('dataCaculateAfterFutherDo'); - // dataCaculateAfterFutherDo(); return Consumer(builder: (ctx, timePro, child) { print('Rebuild timePro'); @@ -501,7 +495,7 @@ class ShowTimeTextWidget extends StatelessWidget{ } class BlockGestureWidget extends StatelessWidget { - const BlockGestureWidget({ + BlockGestureWidget({ super.key, required this.currentItem, required this.blockGestureWidgetChilld, @@ -568,11 +562,12 @@ class BlockGestureWidget extends StatelessWidget { mainAxisSize: MainAxisSize.min, children: [ ElevatedButton( - onPressed: () { + onPressed: () async { // 添加编辑功能 + Navigator.of(context).pop();//关闭弹窗 if (currentItem is Course) { // 导航到AddCourseFormWidget页面 - Navigator.push( + await Navigator.push( context, MaterialPageRoute( builder: (context) { @@ -580,9 +575,10 @@ class BlockGestureWidget extends StatelessWidget { }, ), ); + Setting.timetableWidgetKey!.currentState!.localFutureDo(); } else if (currentItem is Task) { // 导航到AddTaskFormWidget页面 - Navigator.push( + await Navigator.push( context, MaterialPageRoute( builder: (context) { @@ -590,16 +586,18 @@ class BlockGestureWidget extends StatelessWidget { }, ), ); + Setting.timetableWidgetKey!.currentState!.localFutureDo(); } else { // 导航到AddWorkFormWidget页面 - Navigator.push( + await Navigator.push( context, - MaterialPageRoute( + MaterialPageRoute( builder: (context) { return AddScheduleRoute(exitSchedule:currentItem, scheduleType: 'work',teamId: (currentItem as Work).getTeamId); }, ), ); + Setting.timetableWidgetKey!.currentState!.localFutureDo(); } }, child: Text('编辑'), @@ -612,18 +610,22 @@ class BlockGestureWidget extends StatelessWidget { .deleteCourse((currentItem as Course).getCourseId).then((value){ // Provider.of(context, listen: false).updateTimetable(); // 更新时间表页面操作 // Navigator.of(context).pop() + Setting.timetableWidgetKey!.currentState!.localFutureDo(); }); } else if (currentItem is Task) { TaskController().deleteTaskByTaskid( (currentItem as Task).getTaskId).then((value){ - Provider.of(context, listen: false).updateTimetable(); // 更新时间表页面操作 + // Provider.of(context, listen: false).updateTimetable(); // 更新时间表页面操作 // Navigator.of(context).pop() + Setting.timetableWidgetKey!.currentState!.localFutureDo(); }); } else { TeamController().deleteWorkByWorkId((currentItem as Work).getWorkId).then((value){ - Provider.of(context, listen: false).updateTimetable(); // 更新时间表页面操作 + // Provider.of(context, listen: false).updateTimetable(); // 更新时间表页面操作 // Navigator.of(context).pop() + Setting.timetableWidgetKey!.currentState!.localFutureDo(); + Setting.timetableWidgetKey!.currentState!.serverFutureDo(); }); } Navigator.of(context).pop(); diff --git a/src/workserver/config.js b/src/workserver/config.js index 23d48c5..57f334f 100644 --- a/src/workserver/config.js +++ b/src/workserver/config.js @@ -1,9 +1,16 @@ const configs = { + // mysql: { + // host: '118.195.213.51', + // port: '3306', + // user: 'root', + // password: '123456', // 自己设置的密码 + // database: 'expressFrame' // 数据库的名字 + // }, mysql: { - host: '118.195.213.51', - port: '3306', + host: '5902e9v900.zicp.fun', + port: '33006', user: 'root', - password: '123456', // 自己设置的密码 + password: 'mysql@2341', // 自己设置的密码 database: 'expressFrame' // 数据库的名字 }, // 打印错误 diff --git a/src/workserver/controllers/teamUser.js b/src/workserver/controllers/teamUser.js index 6bc0536..abc4a00 100644 --- a/src/workserver/controllers/teamUser.js +++ b/src/workserver/controllers/teamUser.js @@ -205,6 +205,12 @@ const teamUserController = { freeTimeMap[date] = []; } freeTimeMap[date] = freeTimeMap[date].concat(remainingFreeTime); + }else{ + //插入一个0时长的空心闲时间,便于客户端知道考虑到这一天后还是没有空闲时间 + if (!freeTimeMap[date]) { + freeTimeMap[date] = []; + } + freeTimeMap[date] = freeTimeMap[date].concat({startTime: date + 'T12:00:00.000', endTime: date+'T12:00:00.000'}); } } const freeTimeList = []; diff --git a/src/workserver/controllers/xah/course.js b/src/workserver/controllers/xah/course.js index 530af01..c785ebd 100644 --- a/src/workserver/controllers/xah/course.js +++ b/src/workserver/controllers/xah/course.js @@ -110,14 +110,15 @@ const courseController = { console.log(term); //定位到脚本的位置 - const pythonScriptPath = path.join(__dirname,'..', '..', 'utils', 'getCourse', 'getSchedule.py'); + // const pythonScriptPath = path.join(__dirname,'..', '..', 'utils', 'getCourse', 'getSchedule.py'); - // const pythonScriptPath = '/usr/scripts/getCourse/getschedule.py'; + const pythonScriptPath = '/usr/scripts/getCourse/getschedule.py'; console.log('pythonScriptPath : ' + pythonScriptPath); //用子进程执行代码 - const pythonProcess = spawn('python', [pythonScriptPath]); + // const pythonProcess = spawn('python', [pythonScriptPath]); + const pythonProcess = spawn('/usr/bin/python3', [pythonScriptPath]); //输入部分 pythonProcess.stdin.write(info.userId + '\n');