diff --git a/src/timemanagerapp/assets/images/userphoto.jpg b/src/timemanagerapp/assets/images/userphoto.jpg new file mode 100644 index 0000000..839e84d Binary files /dev/null and b/src/timemanagerapp/assets/images/userphoto.jpg differ diff --git a/src/timemanagerapp/lib/controller/CourseController.dart b/src/timemanagerapp/lib/controller/CourseController.dart index eafc0e4..cd592a9 100644 --- a/src/timemanagerapp/lib/controller/CourseController.dart +++ b/src/timemanagerapp/lib/controller/CourseController.dart @@ -54,12 +54,11 @@ class CourseController { 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, + courseId: await idGenerator.generateId(), teacher: courseForm.getTeacher(), location: courseForm.getLocation(), start: startDate, diff --git a/src/timemanagerapp/lib/controller/TaskController.dart b/src/timemanagerapp/lib/controller/TaskController.dart index e97e1e8..dded571 100644 --- a/src/timemanagerapp/lib/controller/TaskController.dart +++ b/src/timemanagerapp/lib/controller/TaskController.dart @@ -37,70 +37,36 @@ class TaskController { //addscheduleForm Future 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: