From bd8ea17214e46ddfabaaa19d57fdb4c8cb70bdca Mon Sep 17 00:00:00 2001 From: LRC <991971966@qq.com> Date: Sun, 15 Oct 2023 00:45:39 +0800 Subject: [PATCH] =?UTF-8?q?team=E9=A1=B5=E9=9D=A2=E5=9F=BA=E6=9C=AC?= =?UTF-8?q?=E5=AE=8C=E6=88=90,=E7=99=BB=E5=BD=95=E6=B3=A8=E5=86=8C?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=E5=9F=BA=E6=9C=AC=E5=AE=8C=E6=88=90,?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=B8=AA=E4=BA=BA=E8=AE=A1=E5=88=92=E9=A1=B5?= =?UTF-8?q?=E9=9D=A2=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../assets/images/userphoto.jpg | Bin 0 -> 7062 bytes .../lib/controller/CourseController.dart | 3 +- .../lib/controller/TaskController.dart | 90 +++++---------- .../lib/controller/TeamController.dart | 6 +- .../lib/controller/UserController.dart | 20 +++- .../lib/controller/WorkController.dart | 104 ++++++++++++++++++ .../lib/database/dao/UserDao.dart | 2 +- src/timemanagerapp/lib/entity/User.dart | 39 +++---- src/timemanagerapp/lib/entity/Work.dart | 18 +-- .../lib/ruters/AddScheduleRoute.dart | 5 +- .../lib/ruters/AddTeamRoute.dart | 17 +++ .../lib/ruters/ManageUserTeamRoute.dart | 17 +++ src/timemanagerapp/lib/ruters/TeamRoute.dart | 44 ++++++++ .../lib/ruters/TimetableRoute.dart | 17 --- src/timemanagerapp/lib/setting/Setting.dart | 12 +- .../lib/widgets/AddScheduleFormWidget.dart | 18 ++- .../lib/widgets/AddScheduleWidget.dart | 0 .../lib/widgets/AddTeamWidget.dart | 45 ++++++++ .../lib/widgets/HomeWidget.dart | 71 +++++++++--- .../lib/widgets/LoginWidget.dart | 34 +++++- .../lib/widgets/ManageUserTeamWidget.dart | 61 ++++++++++ .../lib/widgets/RegisterWidget.dart | 43 ++++++-- src/timemanagerapp/lib/widgets/TeamWidgt.dart | 89 +++++++++++++++ .../lib/widgets/TestWidget.dart | 17 +-- src/timemanagerapp/pubspec.yaml | 1 + 25 files changed, 603 insertions(+), 170 deletions(-) create mode 100644 src/timemanagerapp/assets/images/userphoto.jpg create mode 100644 src/timemanagerapp/lib/ruters/AddTeamRoute.dart create mode 100644 src/timemanagerapp/lib/ruters/ManageUserTeamRoute.dart create mode 100644 src/timemanagerapp/lib/ruters/TeamRoute.dart delete mode 100644 src/timemanagerapp/lib/ruters/TimetableRoute.dart delete mode 100644 src/timemanagerapp/lib/widgets/AddScheduleWidget.dart diff --git a/src/timemanagerapp/assets/images/userphoto.jpg b/src/timemanagerapp/assets/images/userphoto.jpg new file mode 100644 index 0000000000000000000000000000000000000000..839e84d69ce1929bb7d098fe96c9120654fdae04 GIT binary patch literal 7062 zcmb_g1z1!~+di9wufPld# z4+Qt%0u&Dh#RUR59t@9=;LI690zyI}Vibai2uVaph#)6HqDaZe$j%_hDalDGacR<% zN1jDpx4gTKi4^005%YKN5*^Zf zigTy$=P-aD^50F3#d{I;dmb$&+x6!jPdO}_Mc;7$VDrzfHrPduj30#ru_j?#lgqCVBXD7@mnp-Kj^Ml1m68ggfVJ;{F&Y@51X zYm^^xV_{%i`u}k<_sJ(K0^QEC|_E1ISlj208lMm5z8-_@?SXQvesI{-qaT% zg8^W6WM%Qfc@FAd6hQEf_0^(!EdX=87Fc+z+T|1{QBTjclk)J}?~oz)c#{v!2m{XX z|3>09wM}@xEt?);FaoSsH`UF!<5cTh$4b3sGQK$v{LBOT;<7!K+_ii_J2I1j1;8v^ zbVf$#oGqPWfacPH&t}KZ|AEZRt<`d;7)R;l;z}VZ=Q0yJ*XB!j^^45fRZi+5$dD*o zRGdl~;~voO0l+6dXQ-PA?z%k>HjN7ZSiNSuhOx``Utm zAy5DWr<6gGk~8w7$S9bY1<-=Hg@lh=U?3P+_i;#aPjc_U$fBj&M33EkMZJzb!uo3J z0h! zY#xV%FMOpzC+d0ALCPdUSw6Io(|S3IOJsNY1=kJ8#ZfX%x1u&&YZdyPgk#b?$va# zKc%L{bj@fp0e>{2ZN4*)iMO!%Ds6;Zp|#tbeiMbe{=tXVF7E8Q22rWYB~2p)vmX+2 zMjHZ;d@;n`bwet)P1I!uKb~rdv5VMpbWw`uzYeEB=H9Gu4PcP&jCvi73@e~9NxkJ@ zRb3o5{I8Pk<}-q@od?~W7CdW9OXpbx@GDgw5Z4cOW8(x&>*Vv0F8p@w zm7QEsJ%*Ekwzc`$1UDq4ag!~G0strk28Y5SztjLanQYj}B+KZMGV%)u$|9L{T*=W^ zf$`5+u4Vt6b=<}(joXU}qa+_jdukuF-YY3IE=}X=HB-A7R+*eg&Givq7BkE~hS%!( z%@J+cc*kVJwDeFpGw8DkxAp#~!Hk;)y0Lw)YxS+N!R1L2^TQ5`ttr`|tl}gHste&p zR_XWEVF6PB<$mz1Pvy8EHh^w^!Ai@JSo zG%Kx-xC{YHnVu?x_u$N+HBjF3?Yk)E5y|7qv>qZ zI)X*!iE!k;F2=X(gC&xcs+uU#^UTw?RPr~t6<%p5A7B9>%f(!6z>;1b!KR-3nj2{b zkK+iW-W(UuZ{G8kzoCo&K{WPU8>``GBCCaBJ>OUDqFZAD?KJjNOfXJzPP3>t24HZB z>^iNUE(HRL*oahA!OCrS^_h&8X)j2q>PF<%j0dZ{q;|YFSWx$Wi0l|ka0yg!!pKF^W~N+Kl3HwW{`GVRHCIh1uY^sHn!z1Q!P zgYu)5^7hxYP#Sef^~Dah;z|4l__|4)pn04Wg-@gihU3E^&|g~oCB+jZJ|iV#KGC8M z97)a?XyuwsDTIz^X&L+}NAQUp0TeZu>a|=n2g5toDb{*I&>e9bQEhYq-Rl88t}8YH z$hqec3^H@hNud!spNTj9(**E1$9icc((_AH@>b7&&%@dhp+8Ia+;>X=sRb+Wejsn# z?$PkiF$LuOnLDn0rqM91TcB}v7b_PT)f%!TEb-9HbItRs7#qNT9%0D*;hiS+t>`Un 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 addScheduleForm(ScheduleForm scheduleForm) async { List taskListToInsert = []; - // 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: int.parse(raspiyane[scheduleForm.getStartTime() - 1][0].split(':')[0]), - // minutes: int.parse(raspiyane[scheduleForm.getStartTime() - 1][0].split(':')[1]), - // )); - // - // final endDate = termstartdate.add(Duration( - // days: (7 * (week - 1) + day! - 1), - // hours: int.parse(raspiyane[scheduleForm.getEndTime() - 1][1].split(':')[0]), - // minutes: int.parse(raspiyane[scheduleForm.getEndTime() - 1][1].split(':')[1]), - // )); - // int taskId = await idGenerator.generateId(); - // Task task = Task( - // id:await idGenerator.generateId(), - // name: scheduleForm.getTask(), - // userId: Setting.user!.getId!, - // content: scheduleForm.getContent(), - // taskId: taskId, - // startTime: startDate, - // endTime: endDate, - // ); - // taskListToInsert.add(task); - // } - await insertTaskList(taskListToInsert); - } + 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, + )); + int taskId = await idGenerator.generateId(); + Task task = Task( + id: await idGenerator.generateId(), + name: scheduleForm.getName, + userId: Setting.user!.getId!, + content: scheduleForm.getContent, + taskId: await idGenerator.generateId(), + startTime: startDate, + endTime: endDate, + ); + taskListToInsert.add(task); + } + await insertTaskList(taskListToInsert); + } + } - // Future addCourseForm(CourseForm courseForm) async { - // List courseListToInsert = []; - // for (int week = courseForm.getStartWeek(); week <= courseForm.getEndWeek(); week++) { - // for(int day in courseForm.selectedDays){ - // // 计算具体的日期和时间 - // final startDate = termstartdate.add(Duration( - // days: (7 * (week - 1) + day! - 1), - // hours: int.parse(raspiyane[courseForm.getStartTime() - 1][0].split(':')[0]), - // minutes: int.parse(raspiyane[courseForm.getStartTime() - 1][0].split(':')[1]), - // )); - // - // final endDate = termstartdate.add(Duration( - // days: (7 * (week - 1) + day! - 1), - // hours: int.parse(raspiyane[courseForm.getEndTime() - 1][1].split(':')[0]), - // minutes: int.parse(raspiyane[courseForm.getEndTime() - 1][1].split(':')[1]), - // )); - // int courseId = await idGenerator.generateId(); - // Course course = Course( - // id:await idGenerator.generateId(), - // name: courseForm.getCourse(), - // userId: Setting.user!.getId!, - // courseId: courseId, - // teacher: courseForm.getTeacher(), - // location: courseForm.getLocation(), - // start: startDate, - // end: endDate, - // credit: courseForm.getCredit(), - // remark: courseForm.getNote() - // ); - // courseListToInsert.add(course); - // } - // } - // await insertCourseList(courseListToInsert); - // } Future insertTask(Task task) async { return await TaskDao().insertTask(task); diff --git a/src/timemanagerapp/lib/controller/TeamController.dart b/src/timemanagerapp/lib/controller/TeamController.dart index 5398cbc..25c7f3e 100644 --- a/src/timemanagerapp/lib/controller/TeamController.dart +++ b/src/timemanagerapp/lib/controller/TeamController.dart @@ -5,6 +5,8 @@ import '../entity/Work.dart'; import 'package:timemanagerapp/database/dao/TeamDao.dart'; import 'package:timemanagerapp/database/dao/WorkDao.dart'; +import '../setting/Setting.dart'; + class TeamController { late int leaderid; List teamList = []; //实时维护的teamList缓存 @@ -12,8 +14,8 @@ class TeamController { NetWorkController netWorkController = NetWorkController(); - TeamController(int leaderid) { - this.leaderid = leaderid; + TeamController() { //leaderid为当前用户的id + this.leaderid = Setting.user!.getId!; //TODO: 从服务器中根据leaderid获取teamList for (var team in teamList) { diff --git a/src/timemanagerapp/lib/controller/UserController.dart b/src/timemanagerapp/lib/controller/UserController.dart index 95bd2bd..2592ff7 100644 --- a/src/timemanagerapp/lib/controller/UserController.dart +++ b/src/timemanagerapp/lib/controller/UserController.dart @@ -3,6 +3,7 @@ import 'package:timemanagerapp/database/MyDatebase.dart'; import 'package:timemanagerapp/entity/User.dart'; import '../setting/Setting.dart'; +import '../util/dataUtil.dart'; import 'NetWorkController.dart'; /** @@ -10,6 +11,7 @@ import 'NetWorkController.dart'; */ class UserController { NetWorkController netWorkController = NetWorkController(); + IdGenerator idGenerator = IdGenerator(); //对外暴露实例 static UserController getInstance() { @@ -21,16 +23,30 @@ class UserController { } Future login(User user) async { - int userid = await netWorkController.login(user); + //todo:将用户信息上传到服务器 + // int userid = await netWorkController.login(user); + //本地测试 + int userid = Setting.user!.getId!; + if(userid == -1){ + return false; + } user.id = userid; await Setting.saveUser(user); return true; } Future register(User user) async { - int userid = await netWorkController.register(user); + //todo:将用户信息上传到服务器 + // int userid = await netWorkController.login(user); + //本地测试 + int userid = await idGenerator.generateId(); + print("userid生成:"+userid.toString()); + if(userid == -1){ + return false; + } user.id = userid; await Setting.saveUser(user); + //todo:将用户信息上传到服务器 return true; } diff --git a/src/timemanagerapp/lib/controller/WorkController.dart b/src/timemanagerapp/lib/controller/WorkController.dart index e69de29..88d4e5d 100644 --- a/src/timemanagerapp/lib/controller/WorkController.dart +++ b/src/timemanagerapp/lib/controller/WorkController.dart @@ -0,0 +1,104 @@ +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 { + IdGenerator idGenerator = IdGenerator(); + List WorkList = []; //实时维护的courseList缓存 + 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']), + // ); + // Works.add(Work); + // } + // WorkList = Works; // 将Work对象添加到列表中 + return WorkList; + } + + //addscheduleForm + Future addScheduleForm(ScheduleForm scheduleForm,int teamId) async { + List WorkListToInsert = []; + 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(), + workId: await idGenerator.generateId(), + userId: Setting.user!.getId!, + status: "未完成", + workContent: scheduleForm.getContent, + teamId: teamId, + functionaryId: 0, //??? + 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; + } + // + // //delete + // 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/database/dao/UserDao.dart b/src/timemanagerapp/lib/database/dao/UserDao.dart index 0d8f883..bd64ce0 100644 --- a/src/timemanagerapp/lib/database/dao/UserDao.dart +++ b/src/timemanagerapp/lib/database/dao/UserDao.dart @@ -32,7 +32,7 @@ class UserDao { //!!!注意字符串需加双引号 await txn.rawInsert(''' INSERT INTO users(teamId,username,password,role) - VALUES(${user.teamId},"${user.username}","${user.password}",${user.role}) + VALUES("${user.username}","${user.password}",${user.role}) '''); }); } diff --git a/src/timemanagerapp/lib/entity/User.dart b/src/timemanagerapp/lib/entity/User.dart index c044a2f..450deed 100644 --- a/src/timemanagerapp/lib/entity/User.dart +++ b/src/timemanagerapp/lib/entity/User.dart @@ -1,13 +1,11 @@ class User { int? id; - int teamId; String username; String password; int role; //0表示一般用户,1表示管理员 User({ this.id, - required this.teamId, required this.username, required this.password, required this.role, @@ -16,7 +14,6 @@ class User { Map toMap() { return { - 'teamId': teamId, 'username': "$username", 'password': "$password", 'role': role, @@ -26,8 +23,6 @@ class User { // Getter methods int? get getId => id; - int get getTeamId => teamId; - String get getUsername => username; String get getPassword => password; @@ -39,9 +34,6 @@ class User { id = newId; } - set setTeamId(int newTeamId) { - teamId = newTeamId; - } set setUsername(String newUsername) { username = newUsername; @@ -56,26 +48,25 @@ class User { } // 构造一个 User 对象的工厂方法 - factory User.parseString(String userString) { - final parts = userString.split(', '); // 根据 toString() 生成的格式分割字符串 - final id = int.parse(parts[0].substring(8)); // 提取并解析 id - final teamId = int.parse(parts[1].substring(7)); // 提取并解析 teamId - final username = parts[2].substring(10); // 提取用户名 - final password = parts[3].substring(10); // 提取密码 - final role = int.parse(parts[4].substring(6)); // 提取并解析 role - - return User( - id: id, - teamId: teamId, - username: username, - password: password, - role: role, - ); + static User parseString(String userString) { + final regex = RegExp(r'User\(id: (-?\d+), username: (.*), password: (.*), role: (-?\d+)\)'); + final match = regex.firstMatch(userString); + if (match != null && match.groupCount == 4) { + return User( + id: int.parse(match.group(1)!), + username: match.group(2)!, + password: match.group(3)!, + role: int.parse(match.group(4)!), + ); + } else { + throw FormatException("Invalid userString format"); + } } + // toString method @override String toString() { - return 'User(id: $id, teamId:$teamId, username: $username, password: $password, role: $role)'; + return 'User(id: $id, username: $username, password: $password, role: $role)'; } } diff --git a/src/timemanagerapp/lib/entity/Work.dart b/src/timemanagerapp/lib/entity/Work.dart index d1ef65e..5d386fd 100644 --- a/src/timemanagerapp/lib/entity/Work.dart +++ b/src/timemanagerapp/lib/entity/Work.dart @@ -1,13 +1,13 @@ class Work { - int? id; - int userId; - String status; - String workContent; - int teamId; - int functionaryId; - int workId; - DateTime endTime; - DateTime startTime; + late int? id; + late int userId; + late String status; + late String workContent; + late int teamId; + late int functionaryId; + late int workId; + late DateTime endTime; + late DateTime startTime; Work({ this.id, diff --git a/src/timemanagerapp/lib/ruters/AddScheduleRoute.dart b/src/timemanagerapp/lib/ruters/AddScheduleRoute.dart index 3ec0586..e0c7f97 100644 --- a/src/timemanagerapp/lib/ruters/AddScheduleRoute.dart +++ b/src/timemanagerapp/lib/ruters/AddScheduleRoute.dart @@ -3,9 +3,10 @@ import 'package:flutter/material.dart'; import 'package:timemanagerapp/widgets/AddScheduleFormWidget.dart'; class AddScheduleRoute extends StatelessWidget { - const AddScheduleRoute({Key? key,required this.scheduleType}) : super(key: key); + const AddScheduleRoute({Key? key,required this.scheduleType,this.teamId}) : super(key: key); final String scheduleType;//可选值为task和work + final int? teamId ; @override Widget build(BuildContext context) { @@ -13,7 +14,7 @@ class AddScheduleRoute extends StatelessWidget { appBar: AppBar( title: Text('添加自定义个人计划'), ), - body: AddScheduleFormWidget(scheduleType: scheduleType,), + body: AddScheduleFormWidget(scheduleType: scheduleType,teamId: teamId), ); } } \ No newline at end of file diff --git a/src/timemanagerapp/lib/ruters/AddTeamRoute.dart b/src/timemanagerapp/lib/ruters/AddTeamRoute.dart new file mode 100644 index 0000000..6784ecf --- /dev/null +++ b/src/timemanagerapp/lib/ruters/AddTeamRoute.dart @@ -0,0 +1,17 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +import '../widgets/AddTeamWidget.dart'; + +class AddTeamRoute extends StatelessWidget { + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text('添加团队'), + ), + body: AddTeamWidget(), + ); + } +} diff --git a/src/timemanagerapp/lib/ruters/ManageUserTeamRoute.dart b/src/timemanagerapp/lib/ruters/ManageUserTeamRoute.dart new file mode 100644 index 0000000..dacc5b7 --- /dev/null +++ b/src/timemanagerapp/lib/ruters/ManageUserTeamRoute.dart @@ -0,0 +1,17 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +import '../widgets/ManageUserTeamWidget.dart'; + +class ManageUserTeamRoute extends StatelessWidget { + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text('团队成员管理'), + ), + body: ManageUserTeamWidget(), + ); + } +} diff --git a/src/timemanagerapp/lib/ruters/TeamRoute.dart b/src/timemanagerapp/lib/ruters/TeamRoute.dart new file mode 100644 index 0000000..557548b --- /dev/null +++ b/src/timemanagerapp/lib/ruters/TeamRoute.dart @@ -0,0 +1,44 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +import '../setting/Setting.dart'; +import '../widgets/AddTeamWidget.dart'; +import '../widgets/TeamWidgt.dart'; + +class TeamRoute extends StatelessWidget { + + @override + Widget build(BuildContext context) { + if(Setting.user!.getId == -1){ + return Scaffold( + appBar: AppBar( + title: Text('我的团队'), + ), + body: Center( + child: Text('请先登录'), + ), + ); + } + else { + return Scaffold( + appBar: AppBar( + title: Text('我的团队'), + ), + body: TeamWidget(), + floatingActionButton: FloatingActionButton( + onPressed: () async { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) { + return AddTeamWidget(); + }, + ), + ); + }, + child: Icon(Icons.add), + ), + ); + } + } +} diff --git a/src/timemanagerapp/lib/ruters/TimetableRoute.dart b/src/timemanagerapp/lib/ruters/TimetableRoute.dart deleted file mode 100644 index 9c7b86b..0000000 --- a/src/timemanagerapp/lib/ruters/TimetableRoute.dart +++ /dev/null @@ -1,17 +0,0 @@ -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; -import 'package:timemanagerapp/widgets/AddCourseFormWidget.dart'; -import 'package:timemanagerapp/widgets/TimetableWidget.dart'; - -class TimetableRoute extends StatelessWidget { - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - title: Text('时间表'), - ), - body: TimetableWidget(), - ); - } -} diff --git a/src/timemanagerapp/lib/setting/Setting.dart b/src/timemanagerapp/lib/setting/Setting.dart index 2ad17a8..57004df 100644 --- a/src/timemanagerapp/lib/setting/Setting.dart +++ b/src/timemanagerapp/lib/setting/Setting.dart @@ -9,6 +9,7 @@ class Setting { static DateTime startdate_init = DateTime(2023, 8, 28); static late DateTime startdate; static late User? user; + static User nullUser = User(id:-1, username: "null", password: "null", role: 0); static double pixelToMinuteRatio_ratio = 1; static late double deviceWidth ; @@ -44,14 +45,17 @@ class Setting { String res = null.toString(); if(prefs!.containsKey("user")) res = prefs!.getString("user")!; if (res == null.toString()) { - return User(id:0, teamId: 0, username: "", password: "", role: 0); + user = nullUser; + return nullUser; } else { - return User.parseString(res); + user = User.parseString(res); + return user; } } - static saveUser(User user) { + static saveUser(User newuser) { //保存 - prefs?.setString("user", user.toString()); + user = newuser; + prefs?.setString("user", newuser.toString()); } } diff --git a/src/timemanagerapp/lib/widgets/AddScheduleFormWidget.dart b/src/timemanagerapp/lib/widgets/AddScheduleFormWidget.dart index 462a01d..1394f9e 100644 --- a/src/timemanagerapp/lib/widgets/AddScheduleFormWidget.dart +++ b/src/timemanagerapp/lib/widgets/AddScheduleFormWidget.dart @@ -2,20 +2,28 @@ import 'package:flutter/material.dart'; import 'package:multi_select_flutter/dialog/multi_select_dialog_field.dart'; import 'package:multi_select_flutter/util/multi_select_item.dart'; import 'package:timemanagerapp/controller/TaskController.dart'; +import 'package:timemanagerapp/controller/WorkController.dart'; import 'package:timemanagerapp/entity/ScheduleForm.dart'; import 'package:timemanagerapp/entity/Task.dart'; class AddScheduleFormWidget extends StatefulWidget { - const AddScheduleFormWidget({Key? key,required this.scheduleType}) : super(key: key); + const AddScheduleFormWidget({Key? key,required this.scheduleType,this.teamId}) : super(key: key); final String scheduleType;//可选值为task和work + final int? teamId ; @override - _AddScheduleFormWidgetState createState() => _AddScheduleFormWidgetState(); + _AddScheduleFormWidgetState createState() => _AddScheduleFormWidgetState(scheduleType:scheduleType ,teamId:teamId); } class _AddScheduleFormWidgetState extends State { + _AddScheduleFormWidgetState({required this.scheduleType,this.teamId}); + + final String scheduleType;//可选值为task和work + final int? teamId ; TaskController taskController = TaskController(); + WorkController workController = WorkController(); + final GlobalKey _formKey = GlobalKey(); ScheduleForm scheduleForm = ScheduleForm(); //ScheduleForm变量 @@ -194,7 +202,11 @@ class _AddScheduleFormWidgetState extends State { scheduleForm.endWeek = int.parse(endWeek); scheduleForm.startTime = startTime; scheduleForm.endTime = endTime; - taskController.addScheduleForm(scheduleForm).then((value) => Navigator.pop(context)); // 关闭当前界面 + if(scheduleType == "task") { + taskController.addScheduleForm(scheduleForm).then((value) => Navigator.pop(context)); // 关闭当前界面 + }else{ + workController.addScheduleForm(scheduleForm,teamId!).then((value) => Navigator.pop(context)); // 关闭当前界面 + } } }, diff --git a/src/timemanagerapp/lib/widgets/AddScheduleWidget.dart b/src/timemanagerapp/lib/widgets/AddScheduleWidget.dart deleted file mode 100644 index e69de29..0000000 diff --git a/src/timemanagerapp/lib/widgets/AddTeamWidget.dart b/src/timemanagerapp/lib/widgets/AddTeamWidget.dart index e69de29..50553c0 100644 --- a/src/timemanagerapp/lib/widgets/AddTeamWidget.dart +++ b/src/timemanagerapp/lib/widgets/AddTeamWidget.dart @@ -0,0 +1,45 @@ +import 'package:flutter/material.dart'; + +class AddTeamWidget extends StatelessWidget { + TextEditingController teamNameController = TextEditingController(); + TextEditingController teamDescriptionController = TextEditingController(); + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text('创建团队'), + ), + body: Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + children: [ + TextField( + controller: teamNameController, + decoration: InputDecoration( + labelText: '团队名称', + ), + ), + SizedBox(height: 10), + TextField( + controller: teamDescriptionController, + decoration: InputDecoration( + labelText: '团队描述', + ), + ), + SizedBox(height: 20), + ElevatedButton( + onPressed: () { + String teamName = teamNameController.text; + String teamDescription = teamDescriptionController.text; + //todo + Navigator.pop(context); + }, + child: Text('确定'), + ), + ], + ), + ), + ); + } +} diff --git a/src/timemanagerapp/lib/widgets/HomeWidget.dart b/src/timemanagerapp/lib/widgets/HomeWidget.dart index 3565870..3454163 100644 --- a/src/timemanagerapp/lib/widgets/HomeWidget.dart +++ b/src/timemanagerapp/lib/widgets/HomeWidget.dart @@ -3,11 +3,15 @@ import 'package:timemanagerapp/controller/CourseController.dart'; import 'package:timemanagerapp/controller/UserController.dart'; import 'package:timemanagerapp/database/MyDatebase.dart'; import 'package:timemanagerapp/ruters/AddScheduleRoute.dart'; +import 'package:timemanagerapp/ruters/TeamRoute.dart'; import 'package:timemanagerapp/ruters/TestRoute.dart'; +import 'package:timemanagerapp/widgets/RegisterWidget.dart'; import 'package:timemanagerapp/widgets/TimetableWidget.dart'; import '../ruters/AddCourseRoute.dart'; import '../ruters/UserSettingRoute.dart'; +import '../setting/Setting.dart'; +import 'LoginWidget.dart'; class HomeWidget extends StatefulWidget { const HomeWidget({Key? key}) : super(key: key); @@ -21,11 +25,11 @@ class _HomeWidgetState extends State { late UserController userController; late CourseController courseController; + bool isLoggedIn = false; // 假设初始状态为未登录 @override void initState() { super.initState(); - MyDatabase.initDatabase(); userController = UserController.getInstance(); courseController = CourseController.getInstance(); } @@ -109,7 +113,7 @@ class _HomeWidgetState extends State { ), ); }, - child: Text('添加任务'), + child: Text('添加个人计划'), ), const SizedBox(height: 10), ], @@ -133,7 +137,7 @@ class _HomeWidgetState extends State { MaterialPageRoute( builder: (context) { //todo - return Container(); + return TeamRoute(); }, ), ); @@ -155,9 +159,54 @@ class _HomeWidgetState extends State { child: Column( children: [ UserAccountsDrawerHeader( - //todo 未登录时显示未登录,点击可以跳转到登录界面,登录后显示用户名 - accountName: Text('Username'), - accountEmail: Text('user@example.com'), + accountName: GestureDetector( + onTap: () { + if (Setting.user!.getId! == -1) { + // 导航到登录页面 + Navigator.push( + context, + MaterialPageRoute( + builder: (context) { + return LoginWidget(); // 替换为你的登录页面组件 + }, + ), + ); + }else{ + //退出登录 + Setting.saveUser(Setting.nullUser); + setState(() { + }); + } + }, + child: Setting.user!.getId! != -1 ? Text(Setting.user!.getUsername!) : Text('未登录'), + ), + accountEmail: GestureDetector( // 点击邮箱登录 + onTap: () { + if (Setting.user!.getId! == -1) { + // 导航到登录页面 + Navigator.push( + context, + MaterialPageRoute( + builder: (context) { + return LoginWidget(); // 替换为你的登录页面组件 + }, + ), + ); + }else{ + //退出登录 + Setting.saveUser(Setting.nullUser); + setState(() { + }); + } + }, + child: Setting.user!.getId! != -1 + ? Text('退出登录') + : SizedBox(), // 未登录时不显示邮箱 + ), + currentAccountPicture: CircleAvatar( + backgroundImage: AssetImage( + 'assets/images/userphoto.jpg'), // 替换为你的图片路径 + ), ), ListTile( title: Text('用户设置'), @@ -175,7 +224,7 @@ class _HomeWidgetState extends State { }, ), ListTile( - title: Text('登录'), + title: Text('注册'), onTap: () { //todo // 导航到UserSettingWight页面 @@ -183,18 +232,12 @@ class _HomeWidgetState extends State { context, MaterialPageRoute( builder: (context) { - return UserSettingRoute(); + return RegisterWidget(); }, ), ); }, ), - ListTile( - title: Text('退出登录'), - onTap: () { - //todo action - }, - ), ListTile( title: Text('开发者测试'), onTap: () { diff --git a/src/timemanagerapp/lib/widgets/LoginWidget.dart b/src/timemanagerapp/lib/widgets/LoginWidget.dart index c6e0054..9a83733 100644 --- a/src/timemanagerapp/lib/widgets/LoginWidget.dart +++ b/src/timemanagerapp/lib/widgets/LoginWidget.dart @@ -1,6 +1,31 @@ import 'package:flutter/material.dart'; +import 'package:timemanagerapp/controller/UserController.dart'; + +import '../entity/User.dart'; + +class LoginWidget extends StatefulWidget { + @override + _LoginWidgetState createState() => _LoginWidgetState(); +} + +class _LoginWidgetState extends State { + final UserController userController = UserController.getInstance(); + final TextEditingController usernameController = TextEditingController(); + final TextEditingController passwordController = TextEditingController(); + + Future handleLogin() async { + String username = usernameController.text; + String password = passwordController.text; + bool res = await userController.login(User(username: username, password: password, role: 0)); + if(res) { + Navigator.pop(context); + }else{ + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(content: Text('用户名或密码错误')) + ); + } + } -class LoginWidget extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( @@ -14,12 +39,14 @@ class LoginWidget extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.center, children: [ TextFormField( + controller: usernameController, decoration: InputDecoration( labelText: '用户名', ), ), SizedBox(height: 16.0), TextFormField( + controller: passwordController, obscureText: true, // 密码输入框,隐藏文本 decoration: InputDecoration( labelText: '密码', @@ -27,10 +54,7 @@ class LoginWidget extends StatelessWidget { ), SizedBox(height: 24.0), ElevatedButton( - onPressed: () { - // 在这里添加处理登录按钮点击事件的代码 - // 通常会验证用户名和密码,并执行相应的登录逻辑 - }, + onPressed: handleLogin, child: Text('登录'), ), ], diff --git a/src/timemanagerapp/lib/widgets/ManageUserTeamWidget.dart b/src/timemanagerapp/lib/widgets/ManageUserTeamWidget.dart index e69de29..ddc8679 100644 --- a/src/timemanagerapp/lib/widgets/ManageUserTeamWidget.dart +++ b/src/timemanagerapp/lib/widgets/ManageUserTeamWidget.dart @@ -0,0 +1,61 @@ +import 'package:flutter/material.dart'; + +class ManageUserTeamWidget extends StatefulWidget { + const ManageUserTeamWidget({Key? key}) : super(key: key); + + @override + _AddTeamWidgetState createState() => _AddTeamWidgetState(); +} + +class _AddTeamWidgetState extends State { + TextEditingController memberIdController = TextEditingController(); + + void handleInviteButton() { + String memberId = memberIdController.text; + // 这里可以实现将成员加入团队的逻辑 + + // 弹出成功发送邀请的提示框 + showDialog( + context: context, + builder: (BuildContext context) { + return AlertDialog( + title: Text('成功发送邀请'), + content: Text('已成功发送邀请给成员ID: $memberId'), + actions: [ + TextButton( + child: Text('确定'), + onPressed: () { + Navigator.of(context).pop(); // 关闭对话框 + }, + ), + ], + ); + }, + ); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text('添加团队成员'), + ), + body: Padding( + padding: EdgeInsets.all(16.0), + child: Column( + children: [ + TextField( + controller: memberIdController, + decoration: InputDecoration(labelText: '成员ID'), + ), + SizedBox(height: 20), + ElevatedButton( + onPressed: handleInviteButton, + child: Text('邀请'), + ), + ], + ), + ), + ); + } +} diff --git a/src/timemanagerapp/lib/widgets/RegisterWidget.dart b/src/timemanagerapp/lib/widgets/RegisterWidget.dart index 263b1bd..4bc23e9 100644 --- a/src/timemanagerapp/lib/widgets/RegisterWidget.dart +++ b/src/timemanagerapp/lib/widgets/RegisterWidget.dart @@ -1,6 +1,35 @@ import 'package:flutter/material.dart'; +import 'package:timemanagerapp/controller/UserController.dart'; + +import '../entity/User.dart'; + +class RegisterWidget extends StatefulWidget { + @override + _RegisterWidgetState createState() => _RegisterWidgetState(); +} + +class _RegisterWidgetState extends State { + UserController userController = UserController.getInstance(); + + final TextEditingController usernameController = TextEditingController(); + final TextEditingController passwordController = TextEditingController(); + final TextEditingController confirmPasswordController = TextEditingController(); + + void handleRegister() { + String username = usernameController.text; + String password = passwordController.text; + String confirmPassword = confirmPasswordController.text; + + if (password != confirmPassword) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(content: Text('两次输入的密码不一致')) + ); + return; + }else{ + userController.register(User(username:username, password:password, role:0)).then((value) => Navigator.pop(context)); + } + } -class RegisterWidget extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( @@ -14,30 +43,30 @@ class RegisterWidget extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.center, children: [ TextFormField( + controller: usernameController, decoration: InputDecoration( labelText: '用户名', ), ), SizedBox(height: 16.0), TextFormField( - obscureText: true, // 密码输入框,隐藏文本 + controller: passwordController, + obscureText: true, decoration: InputDecoration( labelText: '密码', ), ), SizedBox(height: 16.0), TextFormField( - obscureText: true, // 密码输入框,隐藏文本 + controller: confirmPasswordController, + obscureText: true, decoration: InputDecoration( labelText: '确认密码', ), ), SizedBox(height: 24.0), ElevatedButton( - onPressed: () { - // 在这里添加处理注册按钮点击事件的代码 - // 通常会验证输入的用户名和密码,然后执行注册逻辑 - }, + onPressed: handleRegister, child: Text('注册'), ), ], diff --git a/src/timemanagerapp/lib/widgets/TeamWidgt.dart b/src/timemanagerapp/lib/widgets/TeamWidgt.dart index e69de29..0b52951 100644 --- a/src/timemanagerapp/lib/widgets/TeamWidgt.dart +++ b/src/timemanagerapp/lib/widgets/TeamWidgt.dart @@ -0,0 +1,89 @@ +import 'package:flutter/material.dart'; +import 'package:timemanagerapp/controller/TeamController.dart'; +import 'package:timemanagerapp/ruters/AddScheduleRoute.dart'; +import 'package:timemanagerapp/ruters/AddTeamRoute.dart'; +import 'package:timemanagerapp/widgets/AddScheduleFormWidget.dart'; +import 'package:timemanagerapp/widgets/AddTeamWidget.dart'; + +import 'package:flutter/material.dart'; +import 'package:timemanagerapp/widgets/AddTeamWidget.dart'; +import 'package:timemanagerapp/widgets/ManageUserTeamWidget.dart'; + +import '../entity/Team.dart'; + +class TeamWidget extends StatefulWidget { + const TeamWidget({Key? key}) : super(key: key); + + @override + _TeamWidgetState createState() => _TeamWidgetState(); +} + +class _TeamWidgetState extends State { + List teamList = [ + Team(teamName: 'Team 1', leaderId: 1, maxNumber: 10), + Team(teamName: 'Team 2', leaderId: 1, maxNumber: 10), + Team(teamName: 'Team 3', leaderId: 1, maxNumber: 10) + ]; + + TeamController teamController = TeamController(); + + @override + initState(){ + super.initState(); + //todo: get teamList from database + } + + @override + Widget build(BuildContext context) { + return Center( + child: ListView.builder( + itemCount: teamList.length, + itemBuilder: (BuildContext context, int index) { + Team team = teamList[index]; + return Column( + children: [ + ListTile( + leading: Icon(Icons.group), // 团队的icon + title: Text(team.teamName), // 团队名称 + trailing: Row( + mainAxisSize: MainAxisSize.min, + children: [ + IconButton( + icon: Icon(Icons.person_add), // 添加成员的功能按键 + onPressed: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) { + return ManageUserTeamWidget(); + }, + ), + ); + }, + ), + IconButton( + icon: Icon(Icons.assignment), // 团队任务的功能按键 + onPressed: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) { + return AddScheduleRoute( + scheduleType: "work", + teamId: 1, + ); + }, + ), + ); + }, + ), + ], + ), + ), + ], + ); + }, + ), + ); + } +} diff --git a/src/timemanagerapp/lib/widgets/TestWidget.dart b/src/timemanagerapp/lib/widgets/TestWidget.dart index a716196..520a71c 100644 --- a/src/timemanagerapp/lib/widgets/TestWidget.dart +++ b/src/timemanagerapp/lib/widgets/TestWidget.dart @@ -28,7 +28,6 @@ import 'package:timemanagerapp/entity/Course.dart'; import 'package:timemanagerapp/entity/User.dart'; import 'package:timemanagerapp/database/MyDatebase.dart'; -import '../ruters/TimetableRoute.dart'; class TestWidget extends StatefulWidget { const TestWidget({Key? key}) : super(key: key); @@ -62,7 +61,7 @@ class _TestWidgetState extends State { ), ElevatedButton( onPressed: () => userController.insertUser(User( - teamId: 3231, username: "测试用户", password: "23243", role: 1)), + username: "测试用户", password: "23243", role: 1)), child: Text('插入一个测试用户'), ), ElevatedButton( @@ -138,20 +137,6 @@ class _TestWidgetState extends State { }, child: Text('显示课程列表'), ), - ElevatedButton( - onPressed: () { - // 导航到AddCourseFormWidget页面 - Navigator.push( - context, - MaterialPageRoute( - builder: (context) { - return TimetableRoute(); - }, - ), - ); - }, - child: Text('查看时间表'), - ), AddCourseButton(onCourseAdded: (jsonstr) { // 在这里执行添加课程的逻辑,可以将课程名传递给你的 addCourse() 函数 courseController.test_autoImportCours(jsonstr); diff --git a/src/timemanagerapp/pubspec.yaml b/src/timemanagerapp/pubspec.yaml index 55d922b..5273524 100644 --- a/src/timemanagerapp/pubspec.yaml +++ b/src/timemanagerapp/pubspec.yaml @@ -69,6 +69,7 @@ flutter: assets: - assets/pythoncode/zfn_api.py - assets/pythoncode/getschedule.py + - assets/images/userphoto.jpg # To add assets to your application, add an assets section, like this: # assets: