Compare commits

..

35 Commits

Author SHA1 Message Date
RenshuZh 4a098e0d2e 音乐部分
2 years ago
RenshuZh bdbf4a28dc tomatoClock
2 years ago
LRC 9abe619843 nodeserver,network_login
2 years ago
LRC 6d2ad8182b 时间表可点按,可长按
2 years ago
LRC b7f39dab8d bug修复:导入课程不全,左右滑动无变化
2 years ago
LRC 3caa8daadf 全局状态2
2 years ago
LRC bd8ea17214 team页面基本完成,登录注册功能基本完成,添加个人计划页面完成
2 years ago
LRC 6821622f48 ScheduleForm.dart
2 years ago
LRC 944c25577b 重命名,合并timetable.homepage
2 years ago
LRC 87aea3bbd1 18.15
2 years ago
RenshuZh 02ca0e5c2a zrs
2 years ago
LRC 63c0f98356 to 新权
2 years ago
LRC 08a925426e to lxq
2 years ago
LRC dbd4878087 tmp
2 years ago
LRC 64e0cb7872 HOme
2 years ago
LRC ddf2aa6ff8 HomeWighet.dart
2 years ago
LRC bf8753c22e 可运行
2 years ago
LRC bb7f3afd97 loaclnetword
2 years ago
LRC 40fac61eba test
2 years ago
LRC 790f5f046a test
2 years ago
LRC e9e887b900 test/
2 years ago
LRC 1a51f9c008 test
2 years ago
LRC 5dd780eb97 restore
2 years ago
LRC 7c6ccefc15 课程块滚动
2 years ago
LRC 4983638625 json导入
2 years ago
LRC 69312c16c2 数据库bug修复
2 years ago
LRC f8ce4b819c 周次显示,可滑动,可添加课程并显示
2 years ago
LRC 1e0f12d682 数据库1.0,时间表1.0,添加自定义课程1.0
2 years ago
LRC 9e9f469bee 9.22
2 years ago
LRC 91450f8f58 ge/GeneratedPluginRegistrant finish
2 years ago
LRC f0fd62bd98 project_inti
2 years ago
LRC 9f67ba870b project_init
2 years ago
LRC a27acb6d68 project_init
2 years ago
LRC b98627c0c1 project_init
2 years ago
LRC 590e19a3ae project_init
2 years ago

54
.gitignore vendored

@ -0,0 +1,54 @@
# Miscellaneous
*.class
*.log
*.pyc
*.swp
.DS_Store
.atom/
.buildlog/
**/.history
**/.svn/
**/migrate_working_dir/
# IntelliJ related
*.iml
*.ipr
*.iws
**/.idea/
# The .vscode folder contains launch configuration and tasks you configure in
# VS Code which you may wish to be included in version control, so this line
# is commented out by default.
**/vscode/
# Flutter/Dart/Pub related
**/src/timemanagerapp/.*
**/doc/api/
**/build/
**/ios/
**/linux/
**/macos/
**/web/
**/windows/
**/android/
**/.dart_tool/
**/.flutter-plugins
**/.flutter-plugins-dependencies
**/.packages
**/.pub-cache/
**/.pub/
# Symbolication related
app.*.symbols
# Obfuscation related
app.*.map.json
# Android Studio will place build artifacts here
/android/app/debug
/android/app/profile
/android/app/release
!.gitignore

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 64 KiB

@ -1,8 +1,8 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<application
android:label="多为时间"
android:label="timemanagerapp"
android:name="${applicationName}"
android:icon="@mipmap/logo">
android:icon="@mipmap/ic_launcher">
<activity
android:name=".MainActivity"
android:exported="true"
@ -30,9 +30,4 @@
android:name="flutterEmbedding"
android:value="2" />
</application>
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
</manifest>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

@ -4,9 +4,4 @@
to allow setting breakpoints, to provide hot reload, etc.
-->
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
</manifest>

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 372 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 90 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 266 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 192 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 MiB

@ -1,134 +0,0 @@
/*
Navicat MySQL Data Transfer
Source Server : LRC_debian
Source Server Version : 50742
Source Host : 5902e9v900.zicp.fun:33006
Source Database : expressFrame02
Target Server Type : MYSQL
Target Server Version : 50742
File Encoding : 65001
Date: 2023-10-26 12:49:35
*/
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for clocks
-- ----------------------------
DROP TABLE IF EXISTS `clocks`;
CREATE TABLE `clocks` (
`id` bigint(20) NOT NULL,
`clockId` bigint(20) NOT NULL,
`userId` bigint(20) NOT NULL,
`text` text,
`img` text,
`music` text,
PRIMARY KEY (`id`) USING BTREE,
KEY `fk_clocks_clocks_1` (`userId`),
CONSTRAINT `fk_clocks_clocks_1` FOREIGN KEY (`userId`) REFERENCES `users` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;
-- ----------------------------
-- Table structure for course
-- ----------------------------
DROP TABLE IF EXISTS `course`;
CREATE TABLE `course` (
`id` bigint(20) NOT NULL,
`userId` bigint(20) DEFAULT NULL,
`courseId` bigint(20) NOT NULL,
`name` text NOT NULL,
`credit` double DEFAULT NULL,
`teacher` text,
`location` text,
`remark` text,
`startTime` text NOT NULL,
`endTime` text NOT NULL,
PRIMARY KEY (`id`) USING BTREE,
KEY `fk_course_course_1` (`userId`),
CONSTRAINT `fk_course_course_1` FOREIGN KEY (`userId`) REFERENCES `users` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;
-- ----------------------------
-- Table structure for tasks
-- ----------------------------
DROP TABLE IF EXISTS `tasks`;
CREATE TABLE `tasks` (
`id` bigint(20) NOT NULL,
`taskId` bigint(20) NOT NULL,
`userId` bigint(20) NOT NULL,
`content` text,
`name` text NOT NULL,
`startTime` text NOT NULL,
`endTime` text NOT NULL,
PRIMARY KEY (`id`) USING BTREE,
KEY `fk_tasks_tasks_1` (`userId`),
CONSTRAINT `fk_tasks_tasks_1` FOREIGN KEY (`userId`) REFERENCES `users` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;
-- ----------------------------
-- Table structure for teams
-- ----------------------------
DROP TABLE IF EXISTS `teams`;
CREATE TABLE `teams` (
`id` bigint(20) NOT NULL,
`leaderId` bigint(20) NOT NULL,
`teamName` varchar(200) NOT NULL,
`maxNumber` bigint(20) DEFAULT NULL,
`introduce` text,
PRIMARY KEY (`id`) USING BTREE,
UNIQUE KEY `teamName` (`teamName`) USING BTREE,
KEY `fk_teams_teams_1` (`leaderId`),
CONSTRAINT `fk_teams_teams_1` FOREIGN KEY (`leaderId`) REFERENCES `users` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;
-- ----------------------------
-- Table structure for users
-- ----------------------------
DROP TABLE IF EXISTS `users`;
CREATE TABLE `users` (
`id` bigint(20) NOT NULL,
`username` varchar(255) NOT NULL,
`password` text NOT NULL,
`role` bigint(20) NOT NULL,
PRIMARY KEY (`id`) USING BTREE,
UNIQUE KEY `username` (`username`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;
-- ----------------------------
-- Table structure for userteams
-- ----------------------------
DROP TABLE IF EXISTS `userteams`;
CREATE TABLE `userteams` (
`id` bigint(20) NOT NULL,
`userId` bigint(20) NOT NULL,
`teamId` bigint(20) NOT NULL,
PRIMARY KEY (`id`) USING BTREE,
KEY `fk_userteams_userteams_1` (`userId`),
KEY `fk_userteams_userteams_2` (`teamId`),
CONSTRAINT `fk_userteams_userteams_1` FOREIGN KEY (`userId`) REFERENCES `users` (`id`) ON DELETE CASCADE,
CONSTRAINT `fk_userteams_userteams_2` FOREIGN KEY (`teamId`) REFERENCES `teams` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;
-- ----------------------------
-- Table structure for works
-- ----------------------------
DROP TABLE IF EXISTS `works`;
CREATE TABLE `works` (
`id` bigint(20) NOT NULL,
`userId` bigint(20) NOT NULL,
`workId` bigint(20) NOT NULL,
`teamId` bigint(20) NOT NULL,
`name` text NOT NULL,
`content` text,
`status` text,
`endTime` text NOT NULL,
`startTime` text NOT NULL,
PRIMARY KEY (`id`) USING BTREE,
KEY `fk_works_works_1` (`userId`),
KEY `fk_works_works_2` (`teamId`),
CONSTRAINT `fk_works_works_1` FOREIGN KEY (`userId`) REFERENCES `users` (`id`) ON DELETE CASCADE,
CONSTRAINT `fk_works_works_2` FOREIGN KEY (`teamId`) REFERENCES `teams` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;

Binary file not shown.

Before

Width:  |  Height:  |  Size: 243 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 179 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 279 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 MiB

@ -12,8 +12,6 @@ class CourseController {
return new CourseController();
}
static CourseDao courseDao = CourseDao();
GetCourseByLogin getCourseByLogin = GetCourseByLogin();
IdGenerator idGenerator = IdGenerator();
List<Course> courseList = []; //courseList
@ -42,59 +40,40 @@ class CourseController {
Future<void> addCourseForm(CourseForm courseForm) async {
List<Course> courseListToInsert = [];
int allCourseId = await idGenerator.generateId();
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]),
));
Course course = Course(
id:await idGenerator.generateId(),
name: courseForm.getCourse(),
userId: Setting.user!.getId!,
courseId: allCourseId,
teacher: courseForm.getTeacher(),
location: courseForm.getLocation(),
startTime: startDate,
endTime: endDate,
credit: courseForm.getCredit(),
remark: courseForm.getNote()
);
courseListToInsert.add(course);
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]),
));
Course course = Course(
id:await idGenerator.generateId(),
name: courseForm.getCourse(),
userId: Setting.user!.getId!,
courseId: await idGenerator.generateId(),
teacher: courseForm.getTeacher(),
location: courseForm.getLocation(),
startTime: startDate,
endTime: endDate,
credit: courseForm.getCredit(),
remark: courseForm.getNote()
);
courseListToInsert.add(course);
}
}
}
await insertCourseList(courseListToInsert);
}
Future<List<Course>> init() async {
var res = await netWorkController.getCourseList(Setting.user!.getId!);
if(res == null || res.length == 0){
courseList = [];
}else{
courseList = res;
}
for(Course course in courseList){
await courseDao.insertCourse(course);
}
return courseList;
}
Future<void> dispos() async {
courseDao.deleteAllCourses();
}
Future<List<Course>> getCourses() async {
List<Map<String, dynamic>> courseMaps = await courseDao.getCourses();
List<Map<String, dynamic>> courseMaps = await CourseDao().getCourses();
List<Course> courses = []; // Course
for (var courseMap in courseMaps) {
@ -108,8 +87,8 @@ class CourseController {
teacher: courseMap['teacher'],
location: courseMap['location'],
remark: courseMap['remark'],
startTime: DateTime.parse(courseMap['startTime']),
endTime: DateTime.parse(courseMap['endTime']),
startTime: DateTime.parse(courseMap['start']),
endTime: DateTime.parse(courseMap['end']),
);
courses.add(course);
}
@ -118,28 +97,19 @@ class CourseController {
}
Future<int> insertCourse(Course course) async {
return await courseDao.insertCourse(course);
}
Future<bool> insertLocalCourse() async {
List<Course> localCourseList = await getCourses();
return await netWorkController.insertCourseList(localCourseList);
return await CourseDao().insertCourse(course);
}
Future<int> insertCourseList(List<Course> courseList) async {
netWorkController.insertCourseList(courseList);
int result = 0;
for(Course course in courseList){
result += await courseDao.insertCourse(course);
result += await CourseDao().insertCourse(course);
}
return result;
}
Future<int> autoImportCours(int userId,String passwd,int year, int term) async {
String ? jsonstr = await netWorkController.getUserCoursejson(userId, passwd, year, term);
if(jsonstr == null || jsonstr == ""){
return 0;
}
Future<int> autoImportCours(int stuid,String passwd,int year, int term) async {
String jsonstr = await netWorkController.getUserCoursejson(stuid, passwd, year, term);
List<Course> courseList = await getCourseByLogin.dealRawString(jsonstr);
return await insertCourseList(courseList);
}
@ -152,13 +122,11 @@ class CourseController {
Future<int> deleteAllCourses() async {
return await courseDao.deleteAllCourses();
return await CourseDao().deleteAllCourses();
}
Future<int> deleteCourse(int courseId) async {
netWorkController.deleteCourse(courseId);
return await courseDao.deleteCourseByCourseId(courseId);
return await CourseDao().deleteCourseByCourseId(courseId);
}
}

@ -1,619 +1,86 @@
import 'dart:async';
import 'dart:async';
import 'dart:convert';
import "package:http/http.dart" as http;
import 'package:timemanagerapp/entity/Task.dart';
import 'dart:io';
import '../entity/Course.dart';
import '../entity/Course.dart';
import '../entity/FreeTime.dart';
import '../entity/Team.dart';
import '../entity/User.dart';
import '../entity/Work.dart';
import 'package:http/http.dart' as http;
class NetWorkController {
// String baseUrl = "http://192.168.111.226:3000/";
// String baseUrl = "http://5902e9v900.zicp.fun:30002/";
String baseUrl = "http://5902e9v900.zicp.fun:3000/";
//--------------------------------------------------
//getUserList
Future<List<User>?> getUserList() async {
final response = await http.get(
Uri.parse(baseUrl+'get_user'),
headers: <String, String>{
'Content-Type': 'application/json; charset=UTF-8',
},);
final jsonResponse = json.decode(response.body);
if (jsonResponse['code'] == 200) {
List<User> userList = (jsonResponse['data'] as List)
.map((user) => User.fromJson(user as Map<String, dynamic>))
.toList();
return userList;
} else {
print("获取用户列表");
return null;
}
}
Future<User?> login(User user) async {
final response = await http.post(
Uri.parse(baseUrl+'login'),
headers: <String, String>{
'Content-Type': 'application/json; charset=UTF-8',
},
body: jsonEncode(user.toMap()),
);
final jsonResponse = json.decode(response.body);
print("login response.statusCode = " + jsonResponse[0].toString());
if (jsonResponse['code'] == 200) {
return User.fromJson(jsonResponse['data']['user'][0]);
} else {
print("登录失败");
return null;
}
}
Future<bool> register(User user) async {
final response = await http.post(
Uri.parse(baseUrl+'register'),
headers: <String, String>{
'Content-Type': 'application/json; charset=UTF-8',
},
body: jsonEncode(user.toMap()),
);
final jsonResponse = json.decode(response.body);
if (jsonResponse['code'] == 200) {
return true;
} else {
print("注册失败");
return false;
}
}
//updeateUser
Future<bool> updateUser(User user) async {
final response = await http.post(
Uri.parse(baseUrl+'update_user'),
Future<http.Response> login(User user) {
return http.post(
Uri.parse('http://192.168.33.140:3000/login'),
headers: <String, String>{
'Content-Type': 'application/json; charset=UTF-8',
},
body: jsonEncode(user.toMap()),
);
final jsonResponse = json.decode(response.body);
if (jsonResponse['code'] == 200) {
return true;
} else {
print("更新用户信息失败");
return false;
}
}
//server todo
Future<bool> deleteAllUser() async {
final response = await http.post(
Uri.parse(baseUrl+'deleteUser'),
headers: <String, String>{
'Content-Type': 'application/json; charset=UTF-8',
},
body: jsonEncode({}),
);
final jsonResponse = json.decode(response.body);
if (jsonResponse['code'] == 200) {
return true;
} else {
print("删除所有用户失败");
return false;
}
Future<int> register(User user) async {
return Future(() => 1);
}
//--------------------------------------------------
Future<List<Team>?> getMyTeamList(int userId) async {
final response = await http.get(
Uri.parse(baseUrl + 'get_team').replace(queryParameters: {'leaderId': userId.toString()}),
headers: <String, String>{
'Content-Type': 'application/json; charset=UTF-8',
},
);
final jsonResponse = json.decode(response.body);
if (jsonResponse['code'] == 200) {
List<Team> teamList = (jsonResponse['data'] as List)
.map((team) => Team.fromJson(team as Map<String, dynamic>))
.toList();
return teamList;
} else {
print("获取My团队列表失败");
return null;
}
Future<List<Work>> getSameFreeWork(int teamid) {
List<Work> workList = [];
return Future(() => workList);
}
Future<List<Team>?> getAllTeamListByUserId(int userId) async {
final response = await http.get(
Uri.parse(baseUrl + 'get_team').replace(queryParameters: {'userId': userId.toString()}),
headers: <String, String>{
'Content-Type': 'application/json; charset=UTF-8',
},
);
final jsonResponse = json.decode(response.body);
if (jsonResponse['code'] == 200) {
List<Team> teamList = (jsonResponse['data'] as List)
.map((team) => Team.fromJson(team as Map<String, dynamic>))
.toList();
return teamList;
} else {
print("获取All团队列表ByUserId失败");
return null;
}
}
//getTeamByTeamName
Future<Team?> getTeamByTeamName(String teamName) async {
final response = await http.get(
Uri.parse(baseUrl + 'get_team').replace(queryParameters: {'teamName': teamName}),
headers: <String, String>{
'Content-Type': 'application/json; charset=UTF-8',
},
);
final jsonResponse = json.decode(response.body);
if (jsonResponse['code'] == 200) {
List<Team> teamList = (jsonResponse['data'] as List)
.map((team) => Team.fromJson(team as Map<String, dynamic>))
.toList();
if(teamList.length > 1) {
print("存在重复团队名");
return null;
}
return teamList[0];
} else {
print("获取团队列表ByTeamName失败");
return null;
}
Future<List<Work>> getTeamWorkList(int teamid) {
List<Work> workList = [];
return Future(() => workList);
}
Future<List<Team>> getAllTeamList() async {
final response = await http.get(
Uri.parse(baseUrl + 'get_team'),
headers: <String, String>{
'Content-Type': 'application/json; charset=UTF-8',
},
);
final jsonResponse = json.decode(response.body);
if (jsonResponse['code'] == 200) {
List<Team> teamList = (jsonResponse['data'] as List)
.map((team) => Team.fromJson(team as Map<String, dynamic>))
.toList();
return teamList;
} else {
print("获取All团队列表失败");
return [];
}
Future<List<Team>> getTeamList(int userid) {
List<Team> teamList = [];
return Future(() => teamList);
}
Future<bool> insertTeam(Team team) async {
final response = await http.post(
Uri.parse(baseUrl+'add_team'),
headers: <String, String>{
'Content-Type': 'application/json; charset=UTF-8',
},
body: jsonEncode(team.toMap()),
);
final jsonResponse = json.decode(response.body);
if (jsonResponse['code'] == 200) {
return true;
} else {
print("insert team 失败:");
return false;
}
return true;
}
Future<bool> deleteTeam(int teamId) async {
final response = await http.post(
Uri.parse(baseUrl+'delete_team'),
headers: <String, String>{
'Content-Type': 'application/json; charset=UTF-8',
},
body: JsonEncoder().convert({
'teamId':teamId,
}),
);
final jsonResponse = json.decode(response.body);
if (jsonResponse['code'] == 200) {
return true;
} else {
print("delete team 失败:" + jsonResponse['data'].toString());
return false;
}
Future<bool> deleteTeam(int teamid) async {
return true;
}
Future<bool> updateTeam(Team team) async {
final response = await http.post(
Uri.parse(baseUrl+'update_team'),
headers: <String, String>{
'Content-Type': 'application/json; charset=UTF-8',
},
body: jsonEncode(team.toMap()),
);
final jsonResponse = json.decode(response.body);
if (jsonResponse['code'] == 200) {
return true;
} else {
return false;
}
return true;
}
//--------------------------------------------------
Future<List<User>?> getTeamUserList(int teamId) async {
final response = await http.get(
Uri.parse(baseUrl + 'get_team_member').replace(queryParameters: {'teamId': teamId.toString()}),
headers: <String, String>{
'Content-Type': 'application/json; charset=UTF-8',
},
);
final jsonResponse = json.decode(response.body);
if (jsonResponse['code'] == 200) {
List<User> teamUserList = (jsonResponse['data'] as List)
.map((user) => User.fromJson(user as Map<String, dynamic>))
.toList();
return teamUserList;
} else {
return [];
}
Future<List<User>> getTeamUserList(int teamid) async {
List<User> userList = [];
return userList;
}
Future<bool> insertTeamUser(int id,int teamId, String userName) async {
final response = await http.post(
Uri.parse(baseUrl+'add_team_member'),
headers: <String, String>{
'Content-Type': 'application/json; charset=UTF-8',
},
body: JsonEncoder().convert({
'id': id,
'teamId': teamId,
'userName': userName,
}),
);
final jsonResponse = json.decode(response.body);
if (jsonResponse['code'] == 200) {
return true;
} else {
return false;
}
Future<bool> insertTeamUser(int teamid, int userid) async {
return true;
}
Future<bool> deleteTeamUser(int teamId, int userId) async {
final response = await http.post(
Uri.parse(baseUrl+'delete_team_member'),
headers: <String, String>{
'Content-Type': 'application/json; charset=UTF-8',
},
body: JsonEncoder().convert({
'teamId': teamId,
'userId': userId,
}),
);
final jsonResponse = json.decode(response.body);
if (jsonResponse['code'] == 200) {
return true;
} else {
print("delete team user 失败:");
return false;
}
}
//--------------------------------------------------
Future<List<Work>?> getTeamWorkList(int teamId) async {
final response = await http.get(
Uri.parse(baseUrl + 'get_work').replace(queryParameters: {'teamId': teamId.toString()}),
headers: <String, String>{
'Content-Type': 'application/json; charset=UTF-8',
},
);
final jsonResponse = json.decode(response.body);
if (jsonResponse['code'] == 200) {
List<Work> teamWorkList = (jsonResponse['data'] as List)
.map((work) => Work.fromJson(work as Map<String, dynamic>))
.toList();
return teamWorkList;
} else {
return null;
}
}
//work
Future<List<Work>?> getALlTeamWorkList() async {
final response = await http.get(
Uri.parse(baseUrl + 'get_work'),
headers: <String, String>{
'Content-Type': 'application/json; charset=UTF-8',
},
);
final jsonResponse = json.decode(response.body);
if (jsonResponse['code'] == 200) {
List<Work> teamWorkList = (jsonResponse['data'] as List)
.map((work) => Work.fromJson(work as Map<String, dynamic>))
.toList();
return teamWorkList;
} else {
return null;
}
}
Future<bool> insertTeamWork(List<Work> workList) async {
final response = await http.post(
Uri.parse(baseUrl+'add_work'),
headers: <String, String>{
'Content-Type': 'application/json; charset=UTF-8',
},
//Mpajson
body: JsonEncoder().convert(
workList.map((work) => work.toMap()).toList(),
)
);
final jsonResponse = json.decode(response.body);
if (jsonResponse['code'] == 200) {
return true;
} else {
print("TeamWork插入失败");
print("body:"+ workList.map((work) => work.toMap()).toList().toString());
return false;
}
}
Future<bool> deleteTeamWork(workId) async {
final response = await http.post(
Uri.parse(baseUrl+'delete_work'),
headers: <String, String>{
'Content-Type': 'application/json; charset=UTF-8',
},
body: JsonEncoder().convert({
'workId': workId, //
}),
);
final jsonResponse = json.decode(response.body);
if (jsonResponse['code'] == 200) {
return true;
} else {
return false;
}
}
//server todo
Future<List<FreeTime>?> getFreeTime(int teamid) async {
final response = await http.get(
Uri.parse(baseUrl + 'get_freeTime').replace(queryParameters: {'teamId': teamid.toString()}),
headers: <String, String>{
'Content-Type': 'application/json; charset=UTF-8',
},
);
final jsonResponse = json.decode(response.body);
if (jsonResponse['code'] == 200) {
List<FreeTime> freeTimeList = (jsonResponse['data'] as List)
.map((freeTime) => FreeTime.fromJson(freeTime as Map<String, dynamic>))
.toList();
return freeTimeList;
} else {
print("获取空闲时间失败");
return null;
}
}
//--------------------------------------------------
Future<List<Course>?> getCourseList(int userId) async {
final response = await http.get(
Uri.parse(baseUrl + 'get_course').replace(queryParameters: {'userId': userId.toString()}),
headers: <String, String>{
'Content-Type': 'application/json; charset=UTF-8',
},
);
final jsonResponse = json.decode(response.body);
if (jsonResponse['code'] == 200) {
List<Course> courseList = (jsonResponse['data'] as List)
.map((course) => Course.fromJson(course as Map<String, dynamic>))
.toList();
return courseList;
} else {
print("获取课程失败");
return null;
}
}
Future<bool> insertCourseList(List<Course> courseList) async {
final response = await http.post(
Uri.parse(baseUrl+'add_course'),
headers: <String, String>{
'Content-Type': 'application/json; charset=UTF-8',
},
body: jsonEncode(courseList.map((course) => course.toMap()).toList()),
);
final jsonResponse = json.decode(response.body);
if (jsonResponse['code'] == 200) {
return true;
} else {
print("插入课程失败");
return false;
}
Future<bool> deleteTeamUser(int teamid, int userid) async {
return true;
}
//todo
// Future<bool> deleteTeamUser(int teamid,int userid) async {
// return true;
// }
//app,
Future<bool> updateCourse(List<Course> courseList) async {
final response = await http.post(
Uri.parse(baseUrl+'update_course'),
headers: <String, String>{
'Content-Type': 'application/json; charset=UTF-8',
},
body: jsonEncode(courseList.map((course) => course.toMap()).toList()),
);
final jsonResponse = json.decode(response.body);
if (jsonResponse['code'] == 200) {
return true;
} else {
print("更新课程失败");
return false;
}
return true;
}
Future<bool> deleteCourse(courseId) async {
final response = await http.post(
Uri.parse(baseUrl+'delete_course'),
headers: <String, String>{
'Content-Type': 'application/json; charset=UTF-8',
},
body: jsonEncode({'courseId': courseId}),
);
final jsonResponse = json.decode(response.body);
if (jsonResponse['code'] == 200) {
return true;
} else {
print("删除课程失败");
return false;
}
Future<bool> updateTask(List<Work> workList) async {
return true;
}
//--------------------------------------------------
Future<List<Task>?> getTaskList(int userId) async {
final response = await http.get(
Uri.parse(baseUrl + 'get_task').replace(queryParameters: {'userId': userId.toString()}),
headers: <String, String>{
'Content-Type': 'application/json; charset=UTF-8',
},
);
final jsonResponse = json.decode(response.body);
if (jsonResponse['code'] == 200) {
List<Task> taskList = (jsonResponse['data'] as List)
.map((task) => Task.fromJson(task as Map<String, dynamic>))
.toList();
return taskList;
} else {
print("获取个人计划失败");
return null;
}
Future<String> getUserCoursejson(
int stuid, String passwd, int year, int term) {
String res = "";
return Future(() => res);
}
Future<bool> updateTask(List<Work> taskList) async {
final response = await http.post(
Uri.parse(baseUrl+'update_task'),
headers: <String, String>{
'Content-Type': 'application/json; charset=UTF-8',
},
body: jsonEncode(taskList.map((work) => work.toMap()).toList()),
);
final jsonResponse = json.decode(response.body);
if (jsonResponse['code'] == 200) {
return true;
} else {
print("更新个人计划失败");
return false;
}
}
Future<bool> insertTask(List<Task> taskList) async {
final response = await http.post(
Uri.parse(baseUrl+'add_task'),
headers: <String, String>{
'Content-Type': 'application/json; charset=UTF-8',
},
body: jsonEncode(taskList.map((task) => task.toMap()).toList()),
);
final jsonResponse = json.decode(response.body);
if (jsonResponse['code'] == 200) {
return true;
} else {
print("插入个人计划失败");
return false;
}
}
Future<bool> deleteTask(taskId) async {
final response = await http.post(
Uri.parse(baseUrl+'delete_task'),
headers: <String, String>{
'Content-Type': 'application/json; charset=UTF-8',
},
body: jsonEncode({'taskId': taskId}),
);
final jsonResponse = json.decode(response.body);
if (jsonResponse['code'] == 200) {
return true;
} else {
print("删除个人计划失败");
return false;
}
}
//--------------------------------------------------
Future<String ?> getUserCoursejson(int userId, String passwd, int year, int term) async {
final response = await http.get(
Uri.parse(baseUrl+'get_all_course').replace(queryParameters: {
'userId': userId.toString(),
'passwd': passwd,
'year': year.toString(),
'term': term.toString(),
}),
);
final jsonResponse = json.decode(response.body);
//res
String resJson = jsonResponse['data'];
//res
//
String jsonString = resJson;
//
jsonString = jsonString.trim().replaceAll(RegExp(r"^\{|\}$"), '');
// 使 JSON
jsonString = jsonString.replaceAll(RegExp(r"'"), '"');
// JSON
Map<String, dynamic> data = Map<String, dynamic>.from(json.decode('{$jsonString}'));
if(data['code'] == 1000){
return resJson;
}else{
print("获取导入课程失败");
return null;
}
}
Future<String> getText() async{
final response=await http.get(Uri.parse("https://api.xygeng.cn/one"));
final jsonResponse = json.decode(response.body);
String content=jsonResponse['data']['content'];
print(content);
return content;
}
}

@ -7,11 +7,10 @@ import '../util/dataUtil.dart';
import 'NetWorkController.dart';
class TaskController {
static IdGenerator idGenerator = IdGenerator();
static List<Task> taskList = []; //taskList
static NetWorkController netWorkController = NetWorkController();
static late TaskDao taskDao;
IdGenerator idGenerator = IdGenerator();
List<Task> taskList = []; //courseList
NetWorkController netWorkController = NetWorkController();
late TaskDao taskDao;
DateTime termstartdate = Setting.startdate; //Setting.getStartDate();
@ -19,23 +18,6 @@ class TaskController {
taskDao = TaskDao();
}
Future<List<Task>> init() async {
var res = await netWorkController.getTaskList(Setting.user!.getId!);
if(res == null || res.length == 0){
taskList = [];
}else{
taskList = res;
}
for(Task task in taskList){
await taskDao.insertTask(task);
}
return taskList;
}
Future<void> dispos() async {
taskDao.deleteAllTasks();
}
Future<List<Task>> getTasks() async {
List<Map<String, dynamic>> taskMaps = await taskDao.getTasks();
List<Task> tasks = []; // Task
@ -60,7 +42,6 @@ class TaskController {
//addscheduleForm
Future<void> addScheduleForm(ScheduleForm scheduleForm) async {
List<Task> taskListToInsert = [];
int allTaskId = await idGenerator.generateId();
for (int week = scheduleForm.getStartWeek; week <= scheduleForm.getEndWeek; week++) {
for (int day in scheduleForm.selectedDays) {
//
@ -75,29 +56,28 @@ class TaskController {
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: allTaskId,
taskId: await idGenerator.generateId(),
startTime: startDate,
endTime: endDate,
);
taskListToInsert.add(task);
}
await insertTaskList(taskListToInsert);
}
await insertTaskList(taskListToInsert);
}
Future<int> insertTask(Task task) async {
netWorkController.insertTask([task]);
return await taskDao.insertTask(task);
}
Future<int> insertTaskList(List<Task> taskList) async {
netWorkController.insertTask(taskList);
int result = 0;
for (Task task in taskList) {
result += await taskDao.insertTask(task);
@ -110,13 +90,11 @@ class TaskController {
return await taskDao.deleteTaskByid(id);
}
Future<int> deleteTaskByTaskid(int taskId) async {
netWorkController.deleteTask(taskId);
return await taskDao.deleteTaskByTaskid(taskId);
Future<int> deleteTaskByTaskid(int taskid) async {
return await taskDao.deleteTaskByTaskid(taskid);
}
Future<int> deleteAllTasks() async {
// netWorkController.deleteTask(taskId);
return await taskDao.deleteAllTasks();
}

@ -1,269 +1,87 @@
import 'package:timemanagerapp/controller/NetWorkController.dart';
import 'package:timemanagerapp/entity/User.dart';
import '../entity/FreeTime.dart';
import '../entity/ScheduleForm.dart';
import '../entity/Team.dart';
import '../entity/Work.dart';
import 'package:timemanagerapp/database/dao/TeamDao.dart';
import 'package:timemanagerapp/database/dao/WorkDao.dart';
import '../setting/Setting.dart';
import '../util/dataUtil.dart';
class TeamController {
late int leaderid;
static List<Team> allTeamList = []; //allTeamList
static List<Team> myTeamList = []; //myTeamList
static List<Team> joindedTeamList = []; //teamList
static List<Work> workList = []; //workList
static Map<int,Work> worKIdMap = {};
static Map<int,Team> teamIdMap = {};
static Map<int,List<Work>> woroListMapByTeamId = {};
static Map<int,List<User>> userListMapByTeamId = {};
static NetWorkController netWorkController = NetWorkController();
static IdGenerator idGenerator = IdGenerator();
List<Team> teamList = []; //teamList
Map<int, List<Work>> Wordmaplist = {};
NetWorkController netWorkController = NetWorkController();
DateTime termstartdate = Setting.startdate; //Setting.getStartDate();
TeamController() { //leaderidid
this.leaderid = Setting.user!.getId!;
//TODO: leaderidmyTeamList
//TODO: leaderidteamList
for (var team in myTeamList) {
for (var team in teamList) {
//TODO: team.idWorklist[team.id]
//Wordmaplist[team.id].add()
}
}
//-----------------------------------Team-------------------------------
// Future<void> deleteAllTeams() async {
// await netWorkController.deleteAllTeams();
// }
Future<List<Team>> getMyTeamList() async {
//
myTeamList = [];
List<Team>? res = await netWorkController.getMyTeamList(Setting.user!.getId!);
if(res==null){
return [];
}else{
// teamIdMap = {};
// for(Team team in res){
// teamIdMap[team.id!] = team;
// }
myTeamList = res;
return res;
}
Future<List<Team>> getTeams(int userid) async {
return await netWorkController.getTeamList(userid);
}
Future<List<Team>> getJoinedTeamList() async {
if(myTeamList.length==0){
await getMyTeamList();
}
//
joindedTeamList = [];
allTeamList = [];
List<Team>? res = await netWorkController.getAllTeamListByUserId(Setting.user!.getId!);
if(res==null){
return [];
}else{
allTeamList = res;
teamIdMap = {};
for(Team team in allTeamList){
teamIdMap[team.id!] = team;
}
joindedTeamList.addAll(allTeamList); //=
for(Team team in myTeamList){
// myTeamList
joindedTeamList.removeWhere((element) => element.id == team.id);
}
return joindedTeamList;
}
Future<bool> createTeam(Team team) async {
return await netWorkController.insertTeam(team);
}
// Future<void> insertTeamList(List<Team> myTeamList) async {
// for (Team team in myTeamList) {
// await netWorkController.insertTeam(team);
// }
// }
Future<bool> deleteTeam(Team team) async {
// List<User> memberList = await getTeamUserList(team.getId!); //
// for(User user in memberList){
// deleteTeamUser(team, user.getId!);
// }
return await netWorkController.deleteTeam(team.getId!);
Future<void> insertTeamList(List<Team> teamList) async {
for (Team team in teamList) {
await TeamDao().insertTeam(team);
}
}
Future<bool> insertTeam(Team team) async {
team.id = await idGenerator.generateId();
bool res = await netWorkController.insertTeam(team);
print("insertTeam: $res");
if(res == false) return false;
//
int id = await idGenerator.generateId();
await netWorkController.insertTeamUser(id,team.id!, Setting.user!.getUsername!);
return true;
Future<void> deleteAllTeams() async {
await TeamDao().deleteAllTeams();
}
//joinTeam
Future<bool> joinTeam(String teamName) async {
//
for(Team team in allTeamList){
if(team.getTeamName == teamName){
return false;
}
}
Team ? team = await netWorkController.getTeamByTeamName(teamName);
if(team == null){
return false;
}
int id = await idGenerator.generateId();
return await netWorkController.insertTeamUser(id,team!.getId!, Setting.user!.getUsername!);
Future<bool> deleteTeam(int teamid) async {
return await netWorkController.deleteTeam(teamid);
}
Future<bool> updateTeam(Team team) async {
return await netWorkController.updateTeam(team);
}
//------------------------------------TeamUser-------------------------------------
Future<List<User>> getTeamUserList(int teamid) async {
List<User>? res = await netWorkController.getTeamUserList(teamid);
if(res == null){
return [];
}else{
List<User> tmp = [];
for(User user in res){
if(user.getId != Setting.user!.getId!){ //
tmp.add(user);
}
}
res = tmp;
userListMapByTeamId[teamid] = res;
return res;
}
Future<void> insertWork(Work work) async {
// return await netWorkController.insertWork(work);
}
Future<bool> insertTeamUser(int teamid, String membername) async {
if(membername == Setting.user!.getUsername){//
return false;
}
int id = await idGenerator.generateId();
return await netWorkController.insertTeamUser(id,teamid, membername);
}
Future<bool> deleteTeamUser(Team team, int userId) async {
if(team.getLeaderId == userId){
return await deleteTeam(team);
}else{
return await netWorkController.deleteTeamUser(team.getId!, userId);
Future<void> insertWorkList(List<Work> workList) async {
for (Work work in workList) {
await WorkDao().insertWork(work);
}
}
//---------------------------Work----------------------
Future<List<Work>> getWorks() async {
workList = [];
// myTeamList = [];
// joindedTeamList = [];
// myTeamList = await getMyTeamList();
// joindedTeamList = await getJoinedTeamList();
// allTeamList = myTeamList + joindedTeamList;
var res = await getJoinedTeamList(); //team,
if(res == null) {
return [];
}
for(Team team in allTeamList){
workList.addAll(await getWorksByTeamId(team.id));
}
return workList;
Future<void> deleteAllWorks() async {
await WorkDao().deleteAllWorks();
}
Future<List<Work>> getWorksByTeamId(teamId) async {
var res = await netWorkController.getTeamWorkList(teamId);
if(res == null){
return [];
}else{
woroListMapByTeamId[teamId] = [];
for(int index = 0; index < res.length; index++){
res[index].teamName = teamIdMap[teamId]!.getTeamName;
woroListMapByTeamId[teamId]!.add(res[index]);
}
return res;
}
Future<void> deleteWork(int id) async {
await WorkDao().deleteWorkByid(id);
}
//addscheduleForm
Future<void> addScheduleForm(ScheduleForm scheduleForm,int teamId) async {
List<Work> 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<void> updateWork(Work work) async {
await WorkDao().updateWork(work);
}
//
// Future<bool> insertWork(Work work) async {
// return await netWorkController.insertTeamWork(work);
// }
Future<void> insertWorkList(List<Work> workList) async {
// for (Work work in workList) {
await netWorkController.insertTeamWork(workList);
// }
Future<List<Map<String, dynamic>>> getWorks() async {
return WorkDao().getWorks();
}
// Future<void> deleteAllWorks() async {
// await netWorkController.deleteAllWorks();
// }
Future<void> deleteWorkByWorkId(int workId) async {
await netWorkController.deleteTeamWork(workId);
Future<List<Map<String, dynamic>>> getWorksByTeamid(int teamid) async {
return WorkDao().getWorksByTeamid(teamid);
}
// Future<void> updateWork(Work work) async {
// await netWorkController.u(work);
// }
Future<List<FreeTime>> getFreeTime(int teamid)async{
var res = await netWorkController.getFreeTime(teamid);
if(res == null){
return [];
}else{
return res;
}
Future<List<Work>> getSameFreeWork(int teamid){
return netWorkController.getSameFreeWork(teamid);
}

@ -1,33 +1,15 @@
import 'dart:ui';
import 'package:timemanagerapp/entity/Course.dart';
import 'package:timemanagerapp/entity/FreeTime.dart';
import 'package:timemanagerapp/setting/Setting.dart';
class TimetableWidgetController {
static late DateTime mondayTime = getmondayTime();
static late int weekCount = getWeekCount();
static late DateTime termStartDate = Setting.startdate;
static List<DateTime> timePoints = [
DateTime(2023, 9, 22, 7, 00),
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),
DateTime(2023, 9, 22, 23, 00),
];
final double pixelToMinuteRatio =
0.9 * Setting.pixelToMinuteRatio_ratio; //old:0.9
late List<Course> courseList;
late DateTime mondayTime;
late int weekCount;
late DateTime termStartDate;
TimetableWidgetController() {
mondayTime = getmondayTime();
@ -41,85 +23,27 @@ class TimetableWidgetController {
}
//piexl
static List<Offset> convertTimeList(List<DateTime> timePoints) {
print("deviceWidth: ${Setting.deviceWidth.toString()}");
List<Offset> convertTimeList(List<DateTime> timePoints, double deviceWidth) {
List<Offset> convertedTimes = [];
for (var time in timePoints) {
int hour = time.hour;
int minute = time.minute;
int totalMinutes = (hour - 7) * 60 + minute;
double convertedTime = totalMinutes * Setting.pixelToMinuteRatio_ratio;
convertedTimes.add(Offset(Setting.deviceWidth * 0.015, convertedTime));
double convertedTime = totalMinutes * pixelToMinuteRatio;
convertedTimes.add(Offset(deviceWidth * 0.015, convertedTime));
}
// print("convertedTimesOffset: $convertedTimes");
return convertedTimes;
}
//
List<FreeTime> repairFreeTimeBlockList(List freeTimeBlockList) {
List<FreeTime> repairedFreeTimeBlockList = [];
DateTime termStartDate = Setting.startdate;
DateTime termEndDate = termStartDate.add(Duration(days: 7 * Setting.termAllWeekCout));
//termEndDate23:00:00
termEndDate = DateTime(termEndDate.year, termEndDate.month, termEndDate.day, 23, 00, 00);
Set<DateTime> 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;
int getWeekCount() {
weekCount = DateTime.now().difference(termStartDate).inDays ~/ 7 + 1;
return weekCount;
}
static DateTime getmondayTime() {
DateTime getmondayTime() {
mondayTime = DateTime.now();
print("获取mondayTime: $mondayTime");
//
while (mondayTime.weekday != 1) {
mondayTime = mondayTime.subtract(Duration(days: 1));
@ -127,37 +51,7 @@ class TimetableWidgetController {
return mondayTime;
}
static List<String> getSelectDayList(DateTime date) {
List<String> selectedDayList = [];
//dataselectedDayList
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<int, List> transformTimeBlockMap(List blockList) {
Map<int, List> transformCourseMap(List blockList) {
Map<int, List> timeblockMap = {};
for (var timeBlock in blockList) {
int weekCount = timeBlock.startTime.difference(termStartDate).inDays ~/ 7 + 1; //
@ -171,24 +65,23 @@ class TimetableWidgetController {
}
//x
var weekListPixel=[0,0.12,0.24,0.36,0.48,0.60,0.72];
var weekListPixel=[0,Setting.deviceWidth*0.12,Setting.deviceWidth*0.24,Setting.deviceWidth*0.36,Setting.deviceWidth*0.48,Setting.deviceWidth*0.60,Setting.deviceWidth*0.72];
// Course(this.name, this.teacher, this.location, this.startTime, this.endTime);
double getdy(timeBlock)
{
//9
double y=((timeBlock.startTime.hour-7)*60+timeBlock.startTime.minute)*Setting.pixelToMinuteRatio_ratio + 9;
double y=(((timeBlock.startTime.hour-7)*60+timeBlock.startTime.minute)*0.9)*Setting.pixelToMinuteRatio_ratio;
return y;
}
double getdx(timeBlock)
{
int x=timeBlock.startTime.weekday-1;
return Setting.deviceWidth*weekListPixel[x].toDouble();
return weekListPixel[x].toDouble();
}
double getHeight(timeBlock){
return ((timeBlock.endTime.hour*60+timeBlock.endTime.minute)-(timeBlock.startTime.hour*60+timeBlock.startTime.minute))*Setting.pixelToMinuteRatio_ratio;
return (((timeBlock.endTime.hour-7)*60+timeBlock.endTime.minute)*0.9-this.getdy(timeBlock))*Setting.pixelToMinuteRatio_ratio;
}
}

@ -2,104 +2,54 @@ import 'package:timemanagerapp/database/dao/UserDao.dart';
import 'package:timemanagerapp/database/MyDatebase.dart';
import 'package:timemanagerapp/entity/User.dart';
import '../provider/TimeProvider.dart';
import '../setting/Setting.dart';
import '../util/dataUtil.dart';
import 'CourseController.dart';
import 'NetWorkController.dart';
import 'TaskController.dart';
/**
*
*/
class UserController {
static NetWorkController netWorkController = NetWorkController();
static IdGenerator idGenerator = IdGenerator();
NetWorkController netWorkController = NetWorkController();
IdGenerator idGenerator = IdGenerator();
//
static UserController getInstance() {
return new UserController();
}
//getUserList
Future<List<User>> getUserList() async {
List<User>? res = await netWorkController.getUserList();
if(res==null){
return [];
}else{
return res;
}
Future<List<Map<String, dynamic>>> getUsers() async {
return await UserDao.getInstance().getUsers();
}
Future<bool> login(User login_user) async {
Future<bool> login(User user) async {
//todo:
User ?user = await netWorkController.login(login_user);
// int userid = await netWorkController.login(user);
//
// int userid = Setting.user!.getId!;
if(user == null){
int userid = Setting.user!.getId!;
if(userid == -1){
return false;
}
user.id = userid;
await Setting.saveUser(user);
//
if(Setting.initFlag) {
//
await MyDatabase.reBuildDatabase();
print('从服务器初始化');
await CourseController().init();
await TaskController().init();
await Setting.saveInitFlag(false);
}
return true;
}
Future<bool> register(User postUser) async {
Future<bool> register(User user) async {
//todo:
int userid = await idGenerator.generateId();
postUser.id = userid;
bool res = await netWorkController.register(postUser);
// int userid = await netWorkController.login(user);
//
if(!res){
print('注册失败');
int userid = await idGenerator.generateId();
print("userid生成:"+userid.toString());
if(userid == -1){
return false;
}
//
// await Setting.saveUser(postUser);
user.id = userid;
await Setting.saveUser(user);
//todo:
return true;
}
//updateUser
Future<bool> updateUser(User postUser) async {
bool res = await netWorkController.updateUser(postUser);
if( !res ){
return false;
}else{
await Setting.saveUser(postUser);
return true;
}
}
// //
// Future<bool> 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<void> insertUser(User user) async {
await UserDao.getInstance().insertUser(user);
}

@ -1,133 +1,105 @@
// 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<Work> WorkList = []; //courseList
// static NetWorkController netWorkController = NetWorkController();
//
// DateTime termstartdate = Setting.startdate; //Setting.getStartDate();
//
// Future<List<Work>> getWorks() async {
// //todo http
// List<Map<String, dynamic>> workMaps = await WorkDao().getWorks();
// List<Work> Works = []; // Work
//
// for (var workMap in workMaps) {
// // 使WorkMapWork
// 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<void> addScheduleForm(ScheduleForm scheduleForm,int teamId) async {
// List<Work> 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<int> insertWork(Work Work) async {
// return await WorkDao().insertWork(Work);
// }
//
// Future<int> insertWorkList(List<Work> workList) async {
// int result = 0;
// for (Work work in workList) {
// result += await WorkDao().insertWork(work);
// }
// return result;
// }
//
// //仿Taskwork
// //query
// Future<List<Work>> getWorkList() async {
// List<Map<String, dynamic>> workMaps = await WorkDao().getWorks();
// List<Work> workList = []; // Work
//
// for (var workMap in workMaps) {
// // 使WorkMapWork
// 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<int> deleteWorkByid(int id) async{
// // return await WorkDao().deleteWorkByid(id);
// // }
//
//
// Future<int> deleteWorkByWorkid(int workid) async {
// return await WorkDao().deleteWorkByWorkid(workid);
// }
//
// Future<int> deleteAllWorks() async {
// return await WorkDao().deleteAllWorks();
// }
//
// //update
// Future<int> updateWork(Work work) async {
// return await WorkDao().updateWork(work);
// }
//
//
//
// }
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<Work> WorkList = []; //courseList
NetWorkController netWorkController = NetWorkController();
DateTime termstartdate = Setting.startdate; //Setting.getStartDate();
Future<List<Work>> getWorks() async {
//todo http
// List<Map<String, dynamic>> WorkMaps = await WorkDao().getWorks();
// List<Work> Works = []; // Work
//
// for (var WorkMap in WorkMaps) {
// // 使WorkMapWork
// 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<void> addScheduleForm(ScheduleForm scheduleForm,int teamId) async {
List<Work> 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(),
name: scheduleForm.getName,
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<int> insertWork(Work Work) async {
// return await WorkDao().insertWork(Work);
// }
//
Future<int> insertWorkList(List<Work> WorkList) async {
int result = 0;
// for (Work Work in WorkList) {
// result += await WorkDao().insertWork(Work);
// }
return result;
}
//
// //delete
// Future<int> deleteWorkByid(int id) async {
// return await WorkDao().deleteWorkByid(id);
// }
//
// Future<int> deleteWorkByWorkid(int Workid) async {
// return await WorkDao().deleteWorkByWorkid(Workid);
// }
//
// Future<int> deleteAllWorks() async {
// return await WorkDao().deleteAllWorks();
// }
//
// //update
// Future<int> updateWork(Work Work) async {
// return await WorkDao().updateWork(Work);
// }
}

@ -18,7 +18,8 @@ class MyDatabase {
await openDatabase(path, version: 1, onCreate: _createTables);
//
// await dropAllTables(database);
// await _dropAllTables(database);
//
await _createTables(database, 1);
@ -26,8 +27,6 @@ class MyDatabase {
}
static Future<void> _createTables(Database db, int version) async {
// await _createAllTableBySql(db);
print("create table");
//Course
await _createCourseTable(db, version);
// User
@ -40,83 +39,17 @@ class MyDatabase {
await _createTaskTable(db, version);
// Team
await _createTeamTable(db, version);
print("create table success");
}
static Future<void> _createAllTableBySql(Database db) async{
//bug:
await db.execute('''
CREATE TABLE IF NOT EXISTS users(
id BIGINT PRIMARY KEY,
username VARCHAR(255) NOT NULL UNIQUE,
password TEXT NOT NULL,
role BIGINT NOT NULL
);
CREATE TABLE IF NOT EXISTS works (
id BIGINT PRIMARY KEY,
userId BIGINT NOT NULL,
workId BIGINT NOT NULL,
teamId BIGINT NOT NULL,
name TEXT NOT NULL,
content TEXT,
status TEXT,
endTime TEXT NOT NULL,
startTime TEXT NOT NULL
);
CREATE TABLE IF NOT EXISTS clocks (
id BIGINT PRIMARY KEY,
clockId BIGINT NOT NULL,
userId BIGINT NOT NULL,
text TEXT,
img TEXT,
music TEXT
);
CREATE TABLE IF NOT EXISTS tasks (
id BIGINT PRIMARY KEY,
taskId BIGINT NOT NULL,
userId BIGINT NOT NULL,
content TEXT,
name TEXT NOT NULL,
startTime TEXT NOT NULL,
endTime TEXT NOT NULL
);
CREATE TABLE IF NOT EXISTS course(
id BIGINT PRIMARY KEY,
userId BIGINT,
courseId BIGINT NOT NULL,
name TEXT NOT NULL,
credit REAL,
teacher TEXT,
location TEXT,
remark TEXT,
start TEXT NOT NULL,
end TEXT NOT NULL
);
CREATE TABLE IF NOT EXISTS teams (
id BIGINT PRIMARY KEY,
leaderId BIGINT NOT NULL,
teamName TEXT NOT NULL,
maxNumber BIGINT,
introduce TEXT
);
CREATE TABLE IF NOT EXISTS userteams (
id BIGINT PRIMARY KEY,
userId BIGINT NOT NULL,
teamId BIGINT NOT NULL
);
''');
}
static Future<void> _createUserTable(Database db, int version) async {
// User
await db.execute('''
CREATE TABLE IF NOT EXISTS users(
id BIGINT PRIMARY KEY,
username VARCHAR(255) NOT NULL,
password TEXT NOT NULL,
role BIGINT NOT NULL
id INTEGER PRIMARY KEY,
username TEXT NOT NULL,
password TEXT NOT NULL,
role INTEGER NOT NULL
);
''');
// print("userstable create success");
@ -126,13 +59,13 @@ class MyDatabase {
// Work
await db.execute('''
CREATE TABLE IF NOT EXISTS works (
id BIGINT PRIMARY KEY,
userId BIGINT NOT NULL,
workId BIGINT NOT NULL,
teamId BIGINT NOT NULL,
id INTEGER PRIMARY KEY,
userId INTEGER NOT NULL,
workId INTEGER NOT NULL,
teamId INTEGER NOT NULL,
name TEXT NOT NULL,
content TEXT,
status TEXT,
workContent TEXT NOT NULL,
endTime TEXT NOT NULL,
startTime TEXT NOT NULL
);
@ -144,9 +77,9 @@ class MyDatabase {
// Clock
await db.execute('''
CREATE TABLE IF NOT EXISTS clocks (
id BIGINT PRIMARY KEY,
clockId BIGINT NOT NULL,
userId BIGINT NOT NULL,
id INTEGER PRIMARY KEY,
clockId INTEGER NOT NULL,
userId INTEGER NOT NULL,
text TEXT,
img TEXT,
music TEXT
@ -158,9 +91,9 @@ class MyDatabase {
// Task
await db.execute('''
CREATE TABLE IF NOT EXISTS tasks (
id BIGINT PRIMARY KEY,
taskId BIGINT NOT NULL,
userId BIGINT NOT NULL,
id INTEGER PRIMARY KEY,
taskId INTEGER NOT NULL,
userId INTEGER NOT NULL,
content TEXT,
name TEXT NOT NULL,
startTime TEXT NOT NULL,
@ -173,16 +106,16 @@ class MyDatabase {
// Course
await db.execute('''
CREATE TABLE IF NOT EXISTS course(
id BIGINT PRIMARY KEY,
userId BIGINT,
courseId BIGINT NOT NULL,
id INTEGER PRIMARY KEY,
userId INTEGER,
courseId INTEGER NOT NULL,
name TEXT NOT NULL,
credit REAL,
teacher TEXT,
location TEXT,
remark TEXT,
startTime TEXT NOT NULL,
endTime TEXT NOT NULL
start TEXT NOT NULL,
end TEXT NOT NULL
);
''');
}
@ -191,10 +124,10 @@ class MyDatabase {
// Team
await db.execute('''
CREATE TABLE IF NOT EXISTS teams (
id BIGINT PRIMARY KEY,
leaderId BIGINT NOT NULL,
id INTEGER PRIMARY KEY,
leaderId INTEGER NOT NULL,
teamName TEXT NOT NULL,
maxNumber BIGINT,
maxNumber INTEGER,
introduce TEXT
);
''');
@ -203,18 +136,17 @@ class MyDatabase {
static Future<void> _createUserTeamTable(Database db, int version) async {
// userTeam
await db.execute('''
CREATE TABLE IF NOT EXISTS userteams (
id BIGINT PRIMARY KEY,
userId BIGINT NOT NULL,
teamId BIGINT NOT NULL
CREATE TABLE IF NOT EXISTS userteams (
id INTEGER PRIMARY KEY,
userId INTEGER NOT NULL,
teamId INTEGER NOT NULL
);
''');
}
//
static Future<void> dropAllTables(Database database) async {
static Future<void> _dropAllTables(Database database) async {
// SQL
await database.transaction((txn) async {
// 'table1''table2''table3'
await txn.execute('DROP TABLE IF EXISTS users');
@ -226,14 +158,4 @@ class MyDatabase {
await txn.execute('DROP TABLE IF EXISTS userteams');
});
}
static Future<void> reBuildDatabase() async {
final databasePath = await getDatabasesPath();
final path = join(databasePath, 'tma.db');
final database =
await openDatabase(path, version: 1, onCreate: _createTables);
await dropAllTables(database);
await _createTables(database, 1);
}
}

@ -17,8 +17,7 @@ class CourseDao {
Future<List<Map<String, dynamic>>> getCourses() async {
final database = await _database;
if (database != null) {
return database.query('course', orderBy: 'id ASC');
// return database.rawQuery('SELECT * FROM course');
return database.rawQuery('SELECT * FROM course');
} else {
return [];
}
@ -28,14 +27,14 @@ class CourseDao {
final database = await _database;
int result = 0;
if (database != null) {
await database.transaction((txn) async {
//
//!!!
var tmp = course.toMap();
result += await database.insert('course', course.toMap());
// result = await txn.rawInsert('''
// INSERT INTO course(userId,courseId,name,credit,teacher,location,remark,start,end)
// VALUES(${course.userId},${course.courseId},"${course.name}",${course.credit},"${course.teacher}","${course.location}","${course.remark}","${course.startTime}","${course.endTime}")
// ''');
result = await txn.rawInsert('''
INSERT INTO course(userId,courseId,name,credit,teacher,location,remark,start,end)
VALUES(${course.userId},${course.courseId},"${course.name}",${course.credit},"${course.teacher}","${course.location}","${course.remark}","${course.startTime}","${course.endTime}")
''');
});
// print("课程插入 : " + course.toString());
}
return result;
@ -45,16 +44,16 @@ class CourseDao {
final database = await _database;
int result = 0;
if (database != null) {
result += await database
.update('course', course.toMap(), where: 'id = ?', whereArgs: [course.id]);
// result = await txn.rawUpdate('''
// UPDATE course SET userId = ${course.userId},courseId = ${course
// .courseId},name = "${course.name}",credit = ${course
// .credit},teacher = "${course.teacher}",location = "${course
// .location}",remark = "${course.remark}",start = "${course
// .startTime}",end = "${course.endTime}"
// WHERE id = ${course.id}
// ''');
await database.transaction((txn) async {
result = await txn.rawUpdate('''
UPDATE course SET userId = ${course.userId},courseId = ${course
.courseId},name = "${course.name}",credit = ${course
.credit},teacher = "${course.teacher}",location = "${course
.location}",remark = "${course.remark}",start = "${course
.startTime}",end = "${course.endTime}"
WHERE id = ${course.id}
''');
});
}
return result;
}
@ -63,17 +62,16 @@ class CourseDao {
final database = await _database;
int result = 0;
if (database != null) {
result += await database
.update('course', course.toMap(), where: 'courseId = ?', whereArgs: [course.courseId]);
// result = await txn.rawUpdate('''
// UPDATE course SET userId = ${course.userId},courseId = ${course
// .courseId},name = "${course.name}",credit = ${course
// .credit},teacher = "${course.teacher}",location = "${course
// .location}",remark = "${course.remark}",start = "${course
// .startTime}",end = "${course.endTime}"
// WHERE courseId = ${course.courseId}
// ''');
await database.transaction((txn) async {
result = await txn.rawUpdate('''
UPDATE course SET userId = ${course.userId},courseId = ${course
.courseId},name = "${course.name}",credit = ${course
.credit},teacher = "${course.teacher}",location = "${course
.location}",remark = "${course.remark}",start = "${course
.startTime}",end = "${course.endTime}"
WHERE courseId = ${course.courseId}
''');
});
}
return result;
}

@ -16,7 +16,7 @@ class WorkDao {
Future<List<Map<String, dynamic>>> getWorks() async {
final database = await db;
if (database != null) {
return database.query('works', orderBy: 'id ASC');
return database.query('Work', orderBy: 'id ASC');
} else {
return [];
}
@ -25,65 +25,52 @@ class WorkDao {
Future<List<Map<String, dynamic>>> getWorksByTeamid(int teamid) async {
final database = await db;
if (database != null) {
return database.query('works', where: 'teamId = ?', whereArgs: [teamid], orderBy: 'id ASC');
return database.query('Work', where: 'teamid = ?', whereArgs: [teamid], orderBy: 'id ASC');
} else {
return [];
}
}
Future<int> insertWork(Work work) async {
Future<void> insertWork(Work work) async {
final database = await db;
int res = 0;
if (database != null) {
res += await database.insert('works', work.toMap());
await database.insert('Work', work.toMap());
}
return res;
}
Future<int> updateWork(Work work) async {
Future<void> updateWork(Work work) async {
final database = await db;
int res = 0;
if (database != null) {
res += await database
.update('works', work.toMap(), where: 'id = ?', whereArgs: [work.id]);
await database
.update('Work', work.toMap(), where: 'id = ?', whereArgs: [work.id]);
}
return res;
}
Future<int> deleteWorkByid(int id) async {
Future<void> deleteWorkByid(int id) async {
final database = await db;
int res = 0;
if (database != null) {
res += await database.delete('works', where: 'id = ?', whereArgs: [id]);
await database.delete('Work', where: 'id = ?', whereArgs: [id]);
}
return res;
}
Future<int> deleteWorkByWorkid(int workid) async {
Future<void> deleteWorkByWorkid(int workid) async {
final database = await db;
int res = 0;
if (database != null) {
res += await database.delete('works', where: 'workId = ?', whereArgs: [workid]);
await database.delete('Work', where: 'workid = ?', whereArgs: [workid]);
}
return res;
}
Future<int> deleteWorkByTeamid(int teamid) async {
Future<void> deleteWorkByTeamid(int teamid) async {
final database = await db;
int res = 0;
if (database != null) {
res += await database.delete('works', where: 'teamId = ?', whereArgs: [teamid]);
await database.delete('Work', where: 'teamid = ?', whereArgs: [teamid]);
}
return res;
}
Future<int> deleteAllWorks() async {
Future<void> deleteAllWorks() async {
final database = await db;
int res = 0;
if (database != null) {
res += await database.delete('works', where: '1=1');
await database.delete('Work', where: '1=1');
}
return res;
}
}

@ -27,7 +27,6 @@ class Course {
Map<String,dynamic> toMap(){
return {
'id': id,
'userId':userId,
'courseId':courseId,
'name':"$name",
@ -40,20 +39,7 @@ class Course {
};
}
factory Course.fromJson(Map<String, dynamic> course) {
return Course(
id: course['id'],
userId: course['userId'],
courseId: course['courseId'],
name: course['name'],
credit: 1.0*course['credit'],
teacher: course['teacher'],
location: course['location'],
remark: course['remark'],
startTime: DateTime.parse(course['startTime']),
endTime: DateTime.parse(course['endTime']),
);
}
// Getter methods
int? get getId => id;
@ -72,9 +58,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) {

@ -1,83 +0,0 @@
class FreeTime {
int? id;
int? userId;
String? content;
String? name;
DateTime startTime;
DateTime endTime;
FreeTime({
this.id,
this.userId,
this.content,
this.name,
required this.startTime,
required this.endTime,
});
Map<String, dynamic> toMap() {
return {
'id': id,
'userId': userId,
'content': "$content",
'name': "$name",
'startTime': "${startTime.toIso8601String()}",
'endTime': "${endTime.toIso8601String()}"
};
}
factory FreeTime.fromJson(Map<String, dynamic> task) {
return FreeTime(
// id: task['id'],
// userId: task['userId'],
// content: task['content'],
// name: task['name'],
startTime: DateTime.parse(task['startTime']),
endTime: DateTime.parse(task['endTime']),
);
}
// Getter methods
int? get getId => id;
int? get getUserId => userId;
String? get getContent => content;
String? get getName => name;
DateTime get getStartTime => startTime;
DateTime get getEndTime => endTime;
// Setter methods
set setId(int newId) {
id = newId;
}
set setUserId(int newUserId) {
userId = newUserId;
}
set setContent(String newContent) {
content = newContent;
}
set setName(String newName) {
name = newName;
}
set setStartTime(DateTime newStartTime) {
startTime = newStartTime;
}
set setEndTime(DateTime newEndTime) {
endTime = newEndTime;
}
// toString method
@override
String toString() {
return 'FreeTime(id: $id, userId: $userId, content: $content, name: $name, startTime: $startTime, endTime: $endTime)';
}
}

@ -19,7 +19,6 @@ class Task {
Map<String, dynamic> toMap() {
return {
'id': id,
'userId': userId,
'content': "$content",
'taskId': taskId,
@ -29,18 +28,6 @@ class Task {
};
}
factory Task.fromJson(Map<String, dynamic> task) {
return Task(
id: task['id'],
userId: task['userId'],
content: task['content'],
taskId: task['taskId'],
name: task['name'],
startTime: DateTime.parse(task['startTime']),
endTime: DateTime.parse(task['endTime']),
);
}
// Getter methods
int? get getId => id;

@ -3,36 +3,22 @@ class Team {
int leaderId;
String teamName;
int maxNumber;
String? introduce;
Team({
this.id,
required this.leaderId,
required this.teamName,
required this.maxNumber,
this.introduce
});
Map<String, dynamic> toMap() {
return {
'id': id,
'leaderId': leaderId,
'teamName': "$teamName",
'maxNumber': maxNumber,
'introduce': "$introduce"
};
}
factory Team.fromJson(Map<String, dynamic> json) {
return Team(
id: json['id'],
leaderId: json['leaderId'],
teamName: json['teamName'],
maxNumber: json['maxNumber'],
introduce: json['introduce'],
);
}
// Getter methods
int? get getId => id;
@ -42,8 +28,6 @@ class Team {
int get getMaxNumber => maxNumber;
String? get getIntroduce => introduce;
// Setter methods
set setId(int newId) {
id = newId;
@ -61,13 +45,9 @@ class Team {
maxNumber = newMaxNumber;
}
set setIntroduce(String newIntroduce) {
introduce = newIntroduce;
}
// toString method
@override
String toString() {
return 'Team{id: $id, leaderId: $leaderId, teamName: $teamName, maxNumber: $maxNumber, introduce: $introduce}';
return 'Team(id: $id, leaderId:$leaderId, teamName:$teamName, maxNumber: $maxNumber)';
}
}

@ -14,20 +14,12 @@ class User {
Map<String, dynamic> toMap() {
return {
'id': id,
'username': "$username",
'password': "$password",
'role': role,
};
}
factory User.fromJson(Map<String, dynamic> user) {
return User(
id: user['id'],
username: user['username'],
password: user['password'],
role: user['role'],
);
}
// Getter methods
int? get getId => id;

@ -2,22 +2,22 @@ class Work {
late int? id;
late int userId;
late String status;
late String content;
late String workContent;
late String name;
late int teamId;
late int functionaryId;
late int workId;
late DateTime endTime;
late DateTime startTime;
late String? teamName;
Work({
this.id,
required this.userId,
required this.status,
required this.content,
required this.workContent,
required this.teamId,
this.teamName,
required this.name,
required this.functionaryId,
required this.workId,
required this.endTime,
required this.startTime,
@ -25,32 +25,18 @@ class Work {
Map<String, dynamic> toMap() {
return {
'id': id,
'userId': userId,
'status': "$status",
'content': "$content",
'workContent': "$workContent",
'teamId': teamId,
'name': "$name",
'functionaryId': functionaryId,
'workId': workId,
'endTime': "${endTime.toIso8601String()}",
'startTime': "${startTime.toIso8601String()}"
};
}
factory Work.fromJson(Map<String, dynamic> work) {
return Work(
id: work['id'],
userId: work['userId'],
status: work['status'],
content: work['content'],
teamId: work['teamId'],
name: work['name'],
workId: work['workId'],
endTime: DateTime.parse(work['endTime']),
startTime: DateTime.parse(work['startTime']),
);
}
// Getter methods
int? get getId => id;
@ -58,14 +44,14 @@ class Work {
String get getStatus => status;
String get getContent => content;
String get getWorkContent => workContent;
String get getName => name;
String? get getTeamName => teamName;
int get getTeamId => teamId;
int get getFunctionaryId => functionaryId;
int get getWorkId => workId;
DateTime get getEndTime => endTime;
@ -85,22 +71,22 @@ class Work {
status = newStatus;
}
set setContent(String newcontent) {
content = newcontent;
set setWorkContent(String newWorkContent) {
workContent = newWorkContent;
}
set setTeamId(int newTeamId) {
teamId = newTeamId;
}
set setTeamName(String newTeamName) {
teamName = newTeamName;
}
set setName(String newName) {
name = newName;
}
set setFunctionaryId(int newFunctionaryId) {
functionaryId = newFunctionaryId;
}
set setWorkId(int newWorkId) {
workId = newWorkId;
}
@ -116,6 +102,6 @@ class Work {
// toString method
@override
String toString() {
return 'Work(id: $id, userId:$userId, name:$name, status: $status, content: $content, teamId: $teamId, workId: $workId, endTime: $endTime, startTime: $startTime)';
return 'Work(id: $id, userId:$userId, name:$name, status: $status, workContent: $workContent, teamId: $teamId, functionaryId: $functionaryId, workId: $workId, endTime: $endTime, startTime: $startTime)';
}
}

@ -1,9 +1,6 @@
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:timemanagerapp/provider/TeamProvider.dart';
import 'package:timemanagerapp/provider/TeamUserProvider.dart';
import 'package:timemanagerapp/setting/Setting.dart';
import 'package:timemanagerapp/util/MyLogger.dart';
import 'package:timemanagerapp/widgets/HomeWidget.dart';
import 'package:timemanagerapp/provider/TimeProvider.dart';
@ -12,10 +9,9 @@ init() async {
await Setting.init();
}
Future<void> main() async {
void main() async {
await init();
runApp(MyApp());
// Logger();
}
class MyApp extends StatelessWidget {
@ -23,25 +19,14 @@ class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
Setting.deviceWidth = MediaQuery.of(context).size.width;
// print("deviceWidth获取1: ${Setting.deviceWidth}");
return MultiProvider( //Timetable
providers: [
ChangeNotifierProvider(create: (ctx) => TimeProvider()),
ChangeNotifierProvider(create: (ctx) => TeamProvider()),
ChangeNotifierProvider(create: (ctx) => TeamUserProvider()),
],
child: MaterialApp(
home: Scaffold(
body: LayoutBuilder(
builder: (context, constraints) {
Setting.deviceWidth = constraints.maxWidth;
// print("deviceWidth获取2: ${Setting.deviceWidth}");
// 使
return HomeWidget();
},
),
body: HomeWidget(),
),
),
); // MaterialApp

@ -1,20 +0,0 @@
import 'package:flutter/cupertino.dart';
class TeamProvider extends ChangeNotifier {
int _updatTeamCount = 0;
int get updatTeamCount => _updatTeamCount;
set updatTeamCount(int value) {
print("provider手动更新Team表");
_updatTeamCount = value;
notifyListeners();
}
void updatTeame() {
print("provider手动更新Team表");
_updatTeamCount = ~_updatTeamCount;
notifyListeners();
}
}

@ -1,20 +0,0 @@
import 'package:flutter/cupertino.dart';
class TeamUserProvider extends ChangeNotifier {
int _updatTeamUserCount = 0;
int get updatTeameCount => _updatTeamUserCount;
set updatTeameUserCount(int value) {
print("provider手动更新TeamUser表");
_updatTeamUserCount = value;
notifyListeners();
}
void updatTeameUser() {
print("provider手动更新TeamUser表");
_updatTeamUserCount = ~_updatTeamUserCount;
notifyListeners();
}
}

@ -2,21 +2,23 @@ import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:timemanagerapp/widgets/AddCourseFormWidget.dart';
import '../entity/Course.dart';
class AddCourseRoute extends StatelessWidget {
final Course? exitCourse;
final VoidCallback onCourseAdded;
AddCourseRoute({this.exitCourse});
AddCourseRoute({required this.onCourseAdded});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('编辑自定义课程'),
title: Text('添加自定义课程'),
),
body: AddCourseFormWidget(exitCourse: exitCourse),
body: AddCourseFormWidget(),
);
}
@override
dispose() {//
onCourseAdded();
}
}

@ -3,19 +3,18 @@ import 'package:flutter/material.dart';
import 'package:timemanagerapp/widgets/AddScheduleFormWidget.dart';
class AddScheduleRoute extends StatelessWidget {
AddScheduleRoute({Key? key, required this.scheduleType, this.teamId, this.exitSchedule}) : super(key: key);
const AddScheduleRoute({Key? key,required this.scheduleType,this.teamId}) : super(key: key);
final String scheduleType; //taskwork
final int? teamId;
final exitSchedule;
final String scheduleType;//taskwork
final int? teamId ;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: scheduleType == 'task' ? Text('编辑个人计划') : Text('编辑团队任务'),
title: Text('添加自定义个人计划'),
),
body: AddScheduleFormWidget(scheduleType: scheduleType, teamId: teamId, exitSchedule: exitSchedule),
body: AddScheduleFormWidget(scheduleType: scheduleType,teamId: teamId),
);
}
}
}

@ -9,7 +9,7 @@ class AddTeamRoute extends StatelessWidget {
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('编辑团队信息'),
title: Text('添加团队'),
),
body: AddTeamWidget(),
);

@ -1,17 +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(),
// );
// }
// }
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(),
);
}
}

@ -1,27 +1,14 @@
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:timemanagerapp/controller/TeamController.dart';
import '../setting/Setting.dart';
import '../widgets/AddTeamWidget.dart';
import '../widgets/JoinTeamWidget.dart';
import '../widgets/TeamWidget.dart';
import '../widgets/TeamWidgt.dart';
class TeamRoute extends StatelessWidget {
//TeamWidgetKey
TeamController teamController = TeamController();
@override
initState() {
Setting.init();
}
@override
Widget build(BuildContext context) {
if(Setting.teamWidgetKey == null) {
Setting.teamWidgetKey =
GlobalKey(); // TeamWidgetKey,initStateStatefulWidget
}
if(Setting.user!.getId == -1){
return Scaffold(
appBar: AppBar(
@ -37,55 +24,16 @@ class TeamRoute extends StatelessWidget {
appBar: AppBar(
title: Text('我的团队'),
),
body: TeamWidget(key: Setting.teamWidgetKey!),
body: TeamWidget(),
floatingActionButton: FloatingActionButton(
//
onPressed: () async {
//
showDialog(
context: context,
builder: (BuildContext context) {
return AlertDialog(
title: Text('选择操作'),
content: Column(
mainAxisSize: MainAxisSize.min,
children: [
ElevatedButton(
onPressed: () async {
//
Navigator.of(context).pop(); //
await Navigator.push(
context,
MaterialPageRoute(
builder: (context) {
return JoinTeamWidget();
},
),
);
},
child: Text('加入团队'),
),
ElevatedButton(
onPressed: () async {
//
Navigator.of(context).pop();
await Navigator.push(
context,
MaterialPageRoute(
builder: (context) {
return AddTeamWidget();
},
),
);
Setting.teamWidgetKey!.currentState!.futureDo();
},
child: Text('创建团队'),
),
SizedBox(height: 10),
],
),
);
},
Navigator.push(
context,
MaterialPageRoute(
builder: (context) {
return AddTeamWidget();
},
),
);
},
child: Icon(Icons.add),

@ -2,17 +2,12 @@ import 'package:flutter/material.dart';
import 'package:timemanagerapp/widgets/TomatoClockWidget.dart';
class TomatoClockRoute extends StatelessWidget {
final int flag;
final double selectedDuration;
const TomatoClockRoute({super.key, required this.flag,required this.selectedDuration});
@override
Widget build(BuildContext context) {
return Scaffold(
body: TomatoClockWidget(flag:flag,selectedDuration:selectedDuration)
body: TomatoClockWidget()
);
}
}

@ -1,17 +1,17 @@
// import 'package:flutter/cupertino.dart';
// import 'package:flutter/material.dart';
// import 'package:timemanagerapp/widgets/UserSettingWidget.dart';
//
// import '../tests/TestWidget.dart';
//
// class UserSettingRoute extends StatelessWidget {
// @override
// Widget build(BuildContext context) {
// return Scaffold(
// appBar: AppBar(
// title: Text('设置'),
// ),
// body: UserSettingWidget(),
// );
// }
// }
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:timemanagerapp/widgets/UserSettingWidget.dart';
import '../tests/TestWidget.dart';
class UserSettingRoute extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('设置'),
),
body: UserSettingWidgt(),
);
}
}

@ -1,43 +1,25 @@
import 'dart:core';
import 'package:flutter/cupertino.dart';
import 'dart:ffi';
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 late DateTime startdate;
static int termAllWeekCout = 20; //
static DateTime timeTableStartTime = DateTime(2023, 8, 28, 7, 00); //
static DateTime timeTableEndTime = DateTime(2023, 8, 28, 23, 00); //
static late User? user = User(id:-1, username: "null", password: "null", role: 0);
static late User? user;
static User nullUser = User(id:-1, username: "null", password: "null", role: 0);
static double pixelToMinuteRatio_ratio = 300; //
static late double deviceWidth = 400; //
static bool isMusicPlaying = false; //
static bool isDeveloperButtonVisible = false; //
static GlobalKey<TimetableWidgetState>? timetableWidgetKey;
static GlobalKey<TeamWidgetState>? teamWidgetKey;
static GlobalKey<FreeTimetableWidgetState>? freeTimetableWidgeKey;
static late User testUer;
static double pixelToMinuteRatio_ratio = 1;
static late double deviceWidth ;
static init() async {
//
print("Setting初始化");
// prefs!.setString("startdate", startdate.toString());
prefs = await SharedPreferences.getInstance();
getStartDate();
getUser();
getIsDeveloperButtonVisible();
getpixelToMinuteRatio_ratio();
getInitFlag();
saveStartDate(startdate_init); //
startdate = getStartDate();
user = getUser();
print("Setting初始化成功");
}
@ -49,15 +31,13 @@ class Setting {
saveStartDate(startdate_init);
return startdate_init;
} else {
startdate = DateTime.parse(res);
return startdate;
return DateTime.parse(res);
}
}
static saveStartDate(DateTime startdate) async {
static saveStartDate(DateTime startdate) {
//
Setting.startdate = startdate;
await prefs?.setString("startdate", startdate.toString());
prefs?.setString("startdate", startdate.toString());
}
static User? getUser() {
@ -73,68 +53,9 @@ class Setting {
}
}
static saveUser(User newuser) async {
static saveUser(User newuser) {
//
user = newuser;
await prefs?.setString("user", newuser.toString());
prefs?.setString("user", newuser.toString());
}
//pixelToMinuteRatio_ratio
static double getpixelToMinuteRatio_ratio() {
//
double? res;
if(prefs!.containsKey("pixelToMinuteRatio_ratio")) res = prefs!.getDouble("pixelToMinuteRatio_ratio")!;
if (res == null) {
pixelToMinuteRatio_ratio = 1;
return 1;
} else {
pixelToMinuteRatio_ratio = res!;
return pixelToMinuteRatio_ratio;
}
}
static savepixelToMinuteRatio_ratio(double value) async {
//
pixelToMinuteRatio_ratio = value;
await prefs?.setDouble("pixelToMinuteRatio_ratio", value);
}
static bool getIsDeveloperButtonVisible() {
//
bool? res;
if(prefs!.containsKey("isDeveloperButtonVisible")) res = prefs!.getBool("isDeveloperButtonVisible")!;
if (res == null) {
isDeveloperButtonVisible = false;
return false;
} else {
isDeveloperButtonVisible = res!;
return isDeveloperButtonVisible;
}
}
static saveIsDeveloperButtonVisible(bool value) async {
//
isDeveloperButtonVisible = value;
await prefs?.setBool("isDeveloperButtonVisible", value);
}
static getInitFlag() {
bool? getInitFlag = prefs!.getBool("initFlag");
if (getInitFlag == null) {
initFlag = true;
return true;
} else {
initFlag = getInitFlag;
return initFlag;
}
}
static saveInitFlag(bool value) async {
initFlag = value;
await prefs?.setBool("initFlag", value);
}
}

@ -1,38 +1,38 @@
// import 'dart:developer';
//
// import 'package:flutter/material.dart';
// import 'package:shared_preferences/shared_preferences.dart';
// import 'package:timemanagerapp/setting/Setting.dart';
// import 'package:timemanagerapp/util/GetCourseByLogin.dart';
// import 'package:timemanagerapp/widgets/AddCourseFormWidget.dart';
// import 'package:timemanagerapp/widgets/LoginWidget.dart';
// import 'package:timemanagerapp/widgets/TimetableWidget.dart';
//
//
// init() async {
// WidgetsFlutterBinding.ensureInitialized();
// await Setting.init();
// }
//
// void main() async {
// await init();
// runApp(MyApp());
//
//
// }
//
// class MyApp extends StatelessWidget {
//
//
// @override
// Widget build(BuildContext context) {
// return MaterialApp(
// home: Scaffold(
// appBar: AppBar(
// title: Text('课表'),
// ),
// body: TimetableWidget(),
// ),
// );
// }
// }
import 'dart:developer';
import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:timemanagerapp/setting/Setting.dart';
import 'package:timemanagerapp/util/GetCourseByLogin.dart';
import 'package:timemanagerapp/widgets/AddCourseFormWidget.dart';
import 'package:timemanagerapp/widgets/LoginWidget.dart';
import 'package:timemanagerapp/widgets/TimetableWidget.dart';
init() async {
WidgetsFlutterBinding.ensureInitialized();
await Setting.init();
}
void main() async {
await init();
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('课表'),
),
body: TimetableWidget(),
),
);
}
}

@ -6,9 +6,9 @@ import 'package:timemanagerapp/setting/Setting.dart';
import 'package:timemanagerapp/util/dataUtil.dart';
class GetCourseByLogin {
String id = ""; //
String passwd = ""; //
String year = "2023"; //
String id = "210340156"; //
String passwd = "123111@qaq"; //
String year = "2022"; //
String term = "1"; //
DateTime termstartdate = Setting.startdate;
List<Course> courses = []; //
@ -94,7 +94,7 @@ class GetCourseByLogin {
final courseTitle = courseData['title'];
//
final timeRegex = RegExp(r'星期([一二三四五六日])第(\d+)-(\d+)节\{([^{}]+)\}'); //Bug:/d+
final timeRegex = RegExp(r'星期([一二三四五六日])第(\d)-(\d)节\{([^{}]+)\}');
final match = timeRegex.firstMatch(courseTime);
final Iterable<Match> allMatches = timeRegex.allMatches(courseTime); //Bug:
for(var match in allMatches){
@ -150,7 +150,7 @@ class GetCourseByLogin {
credit: courseData['credit'],
teacher: courseData['teacher'],
location: courseData['place'],
remark: "学校导入课程",
remark: "schoolclass",
startTime: startdate,
endTime: endDate,
);

@ -1,132 +0,0 @@
import 'package:flutter/material.dart';
import 'package:logger/logger.dart';
import 'dart:convert';
import 'dart:io';
import 'package:path_provider/path_provider.dart';
import 'package:logger/src/logger.dart';
import 'package:logger/src/log_output.dart';
import 'dart:io' as io;
class MyLogger extends StatefulWidget {
@override
_MyLoggerState createState() => _MyLoggerState();
}
class _MyLoggerState extends State<MyLogger> {
late File file;
late Logger logger;
@override
void initState() {
getDirectoryForLogRecord().whenComplete(
() {
FileOutput fileOutPut = FileOutput(file: file);
ConsoleOutput consoleOutput = ConsoleOutput();
List<LogOutput> multiOutput = [fileOutPut, consoleOutput];
logger = Logger(
filter: DevelopmentFilter(),
// Use the default LogFilter (-> only log in debug mode)
printer: PrettyPrinter(
methodCount: 2,
// number of method calls to be displayed
errorMethodCount: 8,
// number of method calls if stacktrace is provided
lineLength: 120,
// width of the output
colors: false,
// Colorful log messages
printEmojis: true,
// Print an emoji for each log message
printTime: true // Should each log print contain a timestamp
),
// Use the PrettyPrinter to format and print log
output:
MultiOutput(multiOutput) // Use the default LogOutput (-> send everything to console)
);
},
);
// TODO: implement initState
super.initState();
}
Future<void> getDirectoryForLogRecord() async {
final Directory directory = await getApplicationDocumentsDirectory();
file = File('${directory.path}/withMultiOutput.txt');
}
@override
Widget build(BuildContext context) {
return ElevatedButton(
onPressed: () {
print("you pressed it");
// logger.v("Verbose log");
//
// logger.d("Debug log");
//
// logger.i("Info log");
//
// logger.w("Warning log");
//
// logger.e("Error log");
//
// logger.wtf("What a terrible failure log");
showDialog(
context: context,
builder: (context) {
String content = file.readAsStringSync();
return AlertDialog(
title: Text('结果'),
content: SingleChildScrollView(
child: Text(content)),
);
},
);
},
// height: 60,
// minWidth: 120,
// color: Colors.blue,
child: Text(
'TEST WITH BOTH',
style: TextStyle(color: Colors.white),
),
);
}
}
/// Writes the log output to a file.
class FileOutput extends LogOutput {
late File file;
final bool overrideExisting;
final Encoding encoding;
IOSink ? _sink;
// IOSink? _sink;
FileOutput({
required this.file,
this.overrideExisting = false,
this.encoding = utf8,
});
@override
void init() {
_sink = file.openWrite(
mode: overrideExisting ? FileMode.writeOnly : FileMode.writeOnlyAppend,
encoding: encoding,
);
}
@override
void output(OutputEvent event) {
_sink?.writeAll(event.lines, '\n');
print('log-------'+event.lines.toString()+'\n');
}
@override
void destroy() async {
await _sink?.flush();
await _sink?.close();
}
}

@ -17,8 +17,6 @@ class IdGenerator {
late int sequence = 0;
late int lastTimestamp = -1;
static int lastId = 0;//id
IdGenerator() {
//workerId = Random().nextInt(pow(2, WORKER_ID_BITS)) % 4096;
var wordidrang = pow(2, WORKER_ID_BITS).toInt();
@ -57,13 +55,7 @@ class IdGenerator {
(workerId << SEQUENCE_BITS) |
sequence;
//id
if(id == lastId){
return await generateId();
}else{
lastId = id;
return id;
}
return id;
}
int tilNextMillis(int lastTimestamp) {

@ -3,40 +3,26 @@ import 'package:multi_select_flutter/dialog/multi_select_dialog_field.dart';
import 'package:multi_select_flutter/util/multi_select_item.dart';
import 'package:provider/provider.dart';
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);
final Course? exitCourse;
const AddCourseFormWidget({Key? key}) : super(key: key);
@override
_AddCourseFormWidgetState createState() => _AddCourseFormWidgetState(exitCourse: exitCourse);
_AddCourseFormWidgetState createState() => _AddCourseFormWidgetState();
}
class _AddCourseFormWidgetState extends State<AddCourseFormWidget> {
_AddCourseFormWidgetState({this.exitCourse});
late TextEditingController _courseController;
late TextEditingController _creditController;
late TextEditingController _noteController;
late TextEditingController _startWeekController;
late TextEditingController _endWeekController;
late TextEditingController _startTimeController;
late TextEditingController _endTimeController;
late TextEditingController _teacherController;
late TextEditingController _locationController;
CourseController courseController = CourseController();
final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
CourseForm courseForm = CourseForm();
Course? exitCourse;
String course = '';
String credit = '';
String note = '';
String startWeek = '';
String endWeek = '';
String startWeek = '1';
String endWeek = '12';
String startTime = '1';
String endTime = '2';
String teacher = '';
@ -64,30 +50,6 @@ class _AddCourseFormWidgetState extends State<AddCourseFormWidget> {
'周日': 7,
};
@override
void initState() {
super.initState();
if(exitCourse != null){
course = exitCourse!.getName;
credit = exitCourse!.getCredit.toString();
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);
_creditController = TextEditingController(text: credit);
_noteController = TextEditingController(text: note);
_startWeekController = TextEditingController(text: startWeek);
_endWeekController = TextEditingController(text: endWeek);
_startTimeController = TextEditingController(text: startTime);
_endTimeController = TextEditingController(text: endTime);
_teacherController = TextEditingController(text: teacher);
_locationController = TextEditingController(text: location);
}
@override
Widget build(BuildContext context) {
@ -100,7 +62,6 @@ class _AddCourseFormWidgetState extends State<AddCourseFormWidget> {
crossAxisAlignment: CrossAxisAlignment.stretch, //
children: <Widget>[
TextFormField( //
controller: _courseController,
decoration: InputDecoration(labelText: '课程*'), //
onSaved: (value) => course = value ?? '', //
validator: (value) { //
@ -112,20 +73,17 @@ class _AddCourseFormWidgetState extends State<AddCourseFormWidget> {
),
SizedBox(height: 16.0),//
TextFormField(
controller: _creditController,
decoration: InputDecoration(labelText: '学分'),
onSaved: (value) => credit = value ?? '',
),
SizedBox(height: 16.0),
TextFormField(
controller: _noteController,
decoration: InputDecoration(labelText: '备注'),
onSaved: (value) => note = value ?? '',
),
SizedBox(height: 16.0),
MultiSelectDialogField<String>(
items: daysList,
initialValue: selectedDays, //
title: Text('上课日*'),
validator: (values) {
if (values == null || values.isEmpty) {
@ -141,7 +99,6 @@ class _AddCourseFormWidgetState extends State<AddCourseFormWidget> {
),
SizedBox(height: 16.0),
TextFormField(
controller: _startWeekController,
decoration: InputDecoration(labelText: '开始周'),
onSaved: (value) => startWeek = value ?? '',
validator: (value) {
@ -153,7 +110,6 @@ class _AddCourseFormWidgetState extends State<AddCourseFormWidget> {
),
SizedBox(height: 16.0),
TextFormField(
controller: _endWeekController,
decoration: InputDecoration(labelText: '结束周'),
onSaved: (value) => endWeek = value ?? '',
validator: (value) {
@ -165,7 +121,6 @@ class _AddCourseFormWidgetState extends State<AddCourseFormWidget> {
),
SizedBox(height: 16.0),
DropdownButtonFormField<String>(
// controller: _startTimeController,
value: startTime,
onChanged: (newValue) {
setState(() {
@ -210,13 +165,11 @@ class _AddCourseFormWidgetState extends State<AddCourseFormWidget> {
),
SizedBox(height: 16.0),
TextFormField(
controller: _teacherController,
decoration: InputDecoration(labelText: '老师'),
onSaved: (value) => teacher = value ?? '',
),
SizedBox(height: 16.0),
TextFormField(
controller: _locationController,
decoration: InputDecoration(labelText: '地点'),
onSaved: (value) => location = value ?? '',
),
@ -231,14 +184,18 @@ class _AddCourseFormWidgetState extends State<AddCourseFormWidget> {
},
child: Text('取消'),
),
ElevatedButton(
Selector<TimeProvider, TimeProvider>( // time
selector: (ctx, provider) => provider,
shouldRebuild: (pre, next) => false,
builder: (ctx, timePro, child) {
return ElevatedButton(
onPressed: () {
//
if (_formKey.currentState!.validate()) {
_formKey.currentState!.save();
//
courseForm.course = course;
courseForm.credit = double.parse(credit==''?'-1':credit);
courseForm.credit = double.parse(credit);
courseForm.note = note;
courseForm.location = location;
courseForm.selectedDays = selectedDays.map((e) => weekdayMap[e]!).toList();
@ -247,28 +204,20 @@ class _AddCourseFormWidgetState extends State<AddCourseFormWidget> {
courseForm.startTime = int.parse(startTime);
courseForm.endTime = int.parse(endTime);
courseForm.teacher = teacher;
if(exitCourse != null){//
courseController.deleteCourse(exitCourse!.getCourseId).then((value){
courseController.addCourseForm(courseForm).then(((value){
//
// Provider.of<TimeProvider>(context, listen: false).updateTimetable(); //
// timePro.updatTimtTablecount = 100;
Navigator.pop(context);
courseController.addCourseForm(courseForm).then(((value){
//
timePro.updateTimetable();
// timePro.updatTimtTablecount = 100;
Navigator.pop(context);
}));
});
}else{
courseController.addCourseForm(courseForm).then(((value){
//
// Provider.of<TimeProvider>(context, listen: false).updateTimetable(); //
// timePro.updatTimtTablecount = 100;
Navigator.pop(context);
}));
}
}));
};
},
child: Text('确定'),
),
);
},
// child: Icon(Icons.add),
),
],
),
],

@ -3,39 +3,29 @@ import 'package:multi_select_flutter/dialog/multi_select_dialog_field.dart';
import 'package:multi_select_flutter/util/multi_select_item.dart';
import 'package:provider/provider.dart';
import 'package:timemanagerapp/controller/TaskController.dart';
import 'package:timemanagerapp/controller/TeamController.dart';
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);
const AddScheduleFormWidget({Key? key,required this.scheduleType,this.teamId}) : super(key: key);
final String scheduleType;//taskwork
final int? teamId ;
var exitSchedule;
@override
_AddScheduleFormWidgetState createState() => _AddScheduleFormWidgetState(scheduleType:scheduleType ,teamId:teamId,exitSchedule:exitSchedule);
_AddScheduleFormWidgetState createState() => _AddScheduleFormWidgetState(scheduleType:scheduleType ,teamId:teamId);
}
class _AddScheduleFormWidgetState extends State<AddScheduleFormWidget> {
_AddScheduleFormWidgetState({required this.scheduleType,this.teamId,this.exitSchedule});
late TextEditingController _nameController;
late TextEditingController _contenController;
late TextEditingController _startWeekController;
late TextEditingController _endWeekController;
_AddScheduleFormWidgetState({required this.scheduleType,this.teamId});
final String scheduleType;//taskwork
final int? teamId ;
var exitSchedule;
TaskController taskController = TaskController();
// WorkController workController = WorkController();
TeamController teamController = TeamController();
WorkController workController = WorkController();
final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
ScheduleForm scheduleForm = ScheduleForm();
@ -49,7 +39,7 @@ class _AddScheduleFormWidgetState extends State<AddScheduleFormWidget> {
List<String> selectedDays = [];
static List<MultiSelectItem<String>> daysList = [
List<MultiSelectItem<String>> daysList = [
MultiSelectItem('周一', ''),
MultiSelectItem('周二', ''),
MultiSelectItem('周三', ''),
@ -69,29 +59,9 @@ class _AddScheduleFormWidgetState extends State<AddScheduleFormWidget> {
'周日': 7,
};
@override
void initState() {
super.initState();
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
Widget build(BuildContext context) {
return SingleChildScrollView(
child: Padding( //
padding: const EdgeInsets.all(16.0), // 16
@ -101,7 +71,6 @@ class _AddScheduleFormWidgetState extends State<AddScheduleFormWidget> {
crossAxisAlignment: CrossAxisAlignment.stretch, //
children: <Widget>[
TextFormField( //
controller: _nameController,
decoration: InputDecoration(labelText: '计划名称*'), //
onSaved: (value) => name = value ?? '', //
validator: (value) { //
@ -113,14 +82,12 @@ class _AddScheduleFormWidgetState extends State<AddScheduleFormWidget> {
),
SizedBox(height: 16.0),
TextFormField(
controller: _contenController,
decoration: InputDecoration(labelText: '内容'),
onSaved: (value) => content = value ?? '',
),
SizedBox(height: 16.0),
MultiSelectDialogField<String>(
items: daysList,
initialValue: selectedDays, //
title: Text('星期几*'),
validator: (values) {
if (values == null || values.isEmpty) {
@ -136,7 +103,6 @@ class _AddScheduleFormWidgetState extends State<AddScheduleFormWidget> {
),
SizedBox(height: 16.0),
TextFormField(
controller: _startWeekController,
decoration: InputDecoration(labelText: '开始周'),
onSaved: (value) => startWeek = value ?? '',
validator: (value) {
@ -148,7 +114,6 @@ class _AddScheduleFormWidgetState extends State<AddScheduleFormWidget> {
),
SizedBox(height: 16.0),
TextFormField(
controller: _endWeekController,
decoration: InputDecoration(labelText: '结束周'),
onSaved: (value) => endWeek = value ?? '',
validator: (value) {
@ -165,7 +130,7 @@ class _AddScheduleFormWidgetState extends State<AddScheduleFormWidget> {
),
controller: TextEditingController(
text: startTime != null
? '${startTime!.hour.toString().padLeft(2, '0')}:${startTime!.minute.toString().padLeft(2, '0')}'
? '${startTime!.hour}:${startTime!.minute}'
: '',
),
readOnly: true,
@ -194,7 +159,7 @@ class _AddScheduleFormWidgetState extends State<AddScheduleFormWidget> {
),
controller: TextEditingController(
text: endTime != null
? '${endTime!.hour.toString().padLeft(2, '0')}:${endTime!.minute.toString().padLeft(2, '0')}'
? '${endTime!.hour}:${endTime!.minute}'
: '',
),
readOnly: true,
@ -227,97 +192,45 @@ class _AddScheduleFormWidgetState extends State<AddScheduleFormWidget> {
},
child: Text('取消'),
),
ElevatedButton(
Selector<TimeProvider, TimeProvider>( // time
selector: (ctx, provider) => provider,
shouldRebuild: (pre, next) => false,
builder: (ctx, timePro, child) {
return ElevatedButton(
onPressed: () {
//
if (_formKey.currentState!.validate()&&startTime!=endTime!&&startTime.isBefore(endTime!)) {
if (_formKey.currentState!.validate()) {
_formKey.currentState!.save();
//
scheduleForm.name = name;
scheduleForm.content = content ;
scheduleForm.content = content;
scheduleForm.selectedDays = selectedDays.map((e) => weekdayMap[e]!).toList();
scheduleForm.startWeek = int.parse(startWeek);
scheduleForm.endWeek = int.parse(endWeek);
scheduleForm.startTime = startTime;
scheduleForm.endTime = endTime;
if(scheduleType == "task") {
if(exitSchedule != null){//
taskController.deleteTaskByTaskid(exitSchedule!.getTaskId).then((value){
taskController.addScheduleForm(scheduleForm).then(((value){
// Provider.of<TimeProvider>(context, listen: false).updateTimetable(); //
//
// Provider.of<TimeProvider>(context, listen: false).updateTimetable(); //
// timePro.updatTimtTablecount++;
Navigator.pop(context);
}));
});
}else{
taskController.addScheduleForm(scheduleForm).then(((value){
// Provider.of<TimeProvider>(context, listen: false).updateTimetable(); //
//
// Provider.of<TimeProvider>(context, listen: false).updateTimetable(); //
// timePro.updatTimtTablecount++;
Navigator.pop(context);
}));
}
taskController.addScheduleForm(scheduleForm).then(((value){
//
timePro.updateTimetable();
// timePro.updatTimtTablecount++;
Navigator.pop(context);
}));
}else{
if(exitSchedule != null){//
teamController.deleteWorkByWorkId(exitSchedule!.getWorkId).then((value){
teamController.addScheduleForm(scheduleForm,teamId!).then(((value){
// Provider.of<TimeProvider>(context, listen: false).updateTimetable(); //
//
// Provider.of<TimeProvider>(context, listen: false).updateTimetable(); //
// timePro.updatTimtTablecount++;
Navigator.pop(context);
}));
});
}else{
teamController.addScheduleForm(scheduleForm,teamId!).then(((value){
// Provider.of<TimeProvider>(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: <Widget>[
TextButton(
onPressed: () => Navigator.pop(context),
child: Text('确定'),
),
],
);
},
);
}else if(startTime!.isAfter(endTime!)){
showDialog(
context: context,
builder: (context) {
return AlertDialog(
title: Text('时间错误'),
content: Text('开始时间不能晚于结束时间'),
actions: <Widget>[
TextButton(
onPressed: () => Navigator.pop(context),
child: Text('确定'),
),
],
);
},
);
workController.addScheduleForm(scheduleForm,teamId!).then(((value){
//
timePro.updateTimetable();
// timePro.updatTimtTablecount++;
Navigator.pop(context);
}));
}
}
},
child: Text('确定'),
),
);
}
),
],
),
],

@ -1,19 +1,6 @@
import 'package:flutter/material.dart';
import 'package:timemanagerapp/controller/TeamController.dart';
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();
}
class _AddTeamWidgetState extends State<AddTeamWidget> {
TeamController teamController = TeamController();
class AddTeamWidget extends StatelessWidget {
TextEditingController teamNameController = TextEditingController();
TextEditingController teamDescriptionController = TextEditingController();
@ -45,14 +32,7 @@ class _AddTeamWidgetState extends State<AddTeamWidget> {
onPressed: () {
String teamName = teamNameController.text;
String teamDescription = teamDescriptionController.text;
teamController.insertTeam(Team(leaderId: Setting.user!.getId!, teamName: teamName,introduce: teamDescription, maxNumber: 1000));
//
//todo
// setState(() {
// teamNameController.text = teamName;
// teamDescriptionController.text = teamDescription;
// });
Navigator.pop(context);
},
child: Text('确定'),

@ -4,7 +4,6 @@ import 'package:timemanagerapp/controller/courseController.dart';
import '../entity/course.dart';
import '../provider/TimeProvider.dart';
import '../setting/Setting.dart';
class AutoImportWidget extends StatefulWidget {
@override
@ -12,138 +11,77 @@ class AutoImportWidget extends StatefulWidget {
}
class _AutoImportWidgetState extends State<AutoImportWidget> {
late CourseController courseController = CourseController.getInstance();
late TextEditingController stuIdController = TextEditingController();
late TextEditingController passwordController = TextEditingController();
late TextEditingController yearController = TextEditingController();
late TextEditingController termController = TextEditingController();
bool loading = false;
Future<void> handleAutoImport(context) async {
final CourseController courseController = CourseController.getInstance();
final TextEditingController stuIdController = TextEditingController();
final TextEditingController passwordController = TextEditingController();
final TextEditingController yearController = TextEditingController();
final TextEditingController termController = TextEditingController();
Future<void> handleAutoImport(BuildContext context) async {
int stuId = int.parse(stuIdController.text);
String password = passwordController.text;
int year = int.parse(yearController.text);
int term = int.parse(termController.text);
setState(() {
loading = true;
});
courseController.autoImportCours(stuId, password, year, term).then((res){
setState(() {
loading = false;
});
if (res != 0) {
// Provider.of<TimeProvider>(context, listen: false).updateTimetable(); //
// Setting.timetableWidgetKey!.currentState!.localFutureDo();
Navigator.pop(context);
} else {
showDialog(
context: context,
builder: (BuildContext context) {
return AlertDialog(
title: Text('结果'),
content: Text('用户名或密码错误'),
actions: [
TextButton(
child: Text('确定'),
onPressed: () {
Navigator.of(context).pop(); //
},
),
],
);
},
);
}
});
}
@override
void initState() {
super.initState();
yearController = TextEditingController(text:DateTime.now().year.toString());
if(DateTime.now().month<8) {
termController = TextEditingController(text: '2D:\Myprogramfile\Flutter\TimeManager\src\timemanagerapp\build\app\outputs\flutter-apk');
int res = await courseController.autoImportCours(stuId, password,year,term);
if(res!=0) {
Provider.of<TimeProvider>(context, listen: false).updateTimetable(); //
Navigator.pop(context);
}else{
termController = TextEditingController(text: '1');
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('用户名或密码错误'))
);
}
}
@override
Widget build(BuildContext context) {
if(loading){
return Scaffold(
appBar: AppBar(
title: Text('自动导入校园账号课程'),
),
body: Center(
child:CircularProgressIndicator(),
),
);
}else
if (Setting.user!.getId! == -1) {
return Scaffold(
appBar: AppBar(
title: Text('自动导入校园账号课程'),
),
body: Center(
child: Text('请先登录'),
),
);
} else {
return Scaffold(
appBar: AppBar(
title: Text('自动导入校园账号课程'),
),
body: Center(
child: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
TextFormField(
controller: stuIdController,
decoration: InputDecoration(
labelText: '账号',
),
),
SizedBox(height: 16.0),
TextFormField(
controller: passwordController,
obscureText: true, //
decoration: InputDecoration(
labelText: '密码',
),
return Scaffold(
appBar: AppBar(
title: Text('自动导入校园账号课程'),
),
body: Center(
child: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
TextFormField(
controller: stuIdController,
decoration: InputDecoration(
labelText: '账号',
),
SizedBox(height: 16.0),
TextFormField(
controller: yearController,
decoration: InputDecoration(
labelText: '学年',
),
),
SizedBox(height: 16.0),
TextFormField(
controller: passwordController,
obscureText: true, //
decoration: InputDecoration(
labelText: '密码',
),
SizedBox(height: 16.0),
TextFormField(
controller: termController,
decoration: InputDecoration(
labelText: '学期',
),
),
SizedBox(height: 16.0),
TextFormField(
controller: yearController,
decoration: InputDecoration(
labelText: '学年',
),
SizedBox(height: 24.0),
ElevatedButton(
onPressed: () => handleAutoImport(context), // context
child: Text('导入'),
),
SizedBox(height: 16.0),
TextFormField(
controller: termController,
decoration: InputDecoration(
labelText: '学期',
),
],
),
),
SizedBox(height: 24.0),
ElevatedButton(
onPressed: () => handleAutoImport(context), // context
child: Text('导入'),
),
],
),
),
);
}
),
);
}
}

@ -1,135 +0,0 @@
import 'package:flutter/material.dart';
import 'package:timemanagerapp/controller/UserController.dart';
import 'package:timemanagerapp/setting/Setting.dart';
import '../entity/User.dart';
class ChangeUserWidget extends StatefulWidget {
@override
_ChangeUserWidgetState createState() => _ChangeUserWidgetState();
}
class _ChangeUserWidgetState extends State<ChangeUserWidget> {
UserController userController = UserController.getInstance();
final TextEditingController usernameController = TextEditingController();
final TextEditingController passwordController = TextEditingController();
final TextEditingController confirmPasswordController = TextEditingController();
Future<void> handleRegister(context) async {
String username = usernameController.text;
String password = passwordController.text;
String confirmPassword = confirmPasswordController.text;
//
if (password == '' || confirmPassword == '') {
showDialog(
context: context,
builder: (BuildContext context) {
return AlertDialog(
title: Text('结果'),
content: Text('密码不能为空'),
actions: [
TextButton(
child: Text('确定'),
onPressed: () {
Navigator.of(context).pop(); //
},
),
],
);
},
);
return;
}else if (password != confirmPassword) {
showDialog(
context: context,
builder: (BuildContext context) {
return AlertDialog(
title: Text('结果'),
content: Text('两次输入的密码不一致'),
actions: [
TextButton(
child: Text('确定'),
onPressed: () {
Navigator.of(context).pop(); //
},
),
],
);
},
);
return;
}else{
bool res = await userController.updateUser(User(id:Setting.user!.getId!,username:username, password:password, role:0));
if(res){
Navigator.pop(context);
}else{
showDialog(
context: context,
builder: (BuildContext context) {
return AlertDialog(
title: Text('结果'),
content: Text('修改失败'),
actions: [
TextButton(
child: Text('确定'),
onPressed: () {
Navigator.of(context).pop(); //
},
),
],
);
},
);
}
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('修改帐户'),
),
body: Center(
child: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
TextFormField(
controller: usernameController,
decoration: InputDecoration(
labelText: '用户名',
),
),
SizedBox(height: 16.0),
TextFormField(
controller: passwordController,
obscureText: true,
decoration: InputDecoration(
labelText: '密码',
),
),
SizedBox(height: 16.0),
TextFormField(
controller: confirmPasswordController,
obscureText: true,
decoration: InputDecoration(
labelText: '确认密码',
),
),
SizedBox(height: 24.0),
ElevatedButton(
onPressed:()=> handleRegister(context),
child: Text('提交'),
),
],
),
),
),
);
}
}

@ -1,559 +0,0 @@
import 'dart:io';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
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({required Key key,required this.team}) : super(key: key);
final Team team;
@override
State<StatefulWidget> createState() =>
FreeTimetableWidgetState(team: team);
}
class FreeTimetableWidgetState extends State<FreeTimetableWidget> {
FreeTimetableWidgetState({required this.team});
int firstInit = 0;
final Team team;
//
late TimetableWidgetController timetableWidgetController =
TimetableWidgetController();
late TeamController teamController = TeamController();
late List freeTimeBlockList = [];
late Map<int,List> freeTimeBlockWeekMap = {};
//
var weekList = ['', '', '', '', '', '', ''];
//
//
var dateListstr = [];
//
var currentWeekDayIndex = 0;
//
int showWeek = 0;
int currentWeek = 0;
String showWeekstr = '第1周';
int showMonth = 0;
final double hourHeight = 60.0 * 1.5;
//DateTimePiexl
//Offset
var positions = [];
bool loading = true;
Future<void> serverFutureDo() async {
print('开始serverFutureDo');
//
freeTimeBlockList = await teamController.getFreeTime(team.getId!);
//
freeTimeBlockList = timetableWidgetController
.repairFreeTimeBlockList(freeTimeBlockList);
dataCaculateAfterFutherDo();
print('serverFutureDo 完成');
setState(() {});
}
//
@override
initState() {
super.initState();
//
freeTimeBlockWeekMap = {};
freeTimeBlockList = [];
//
currentWeek = TimetableWidgetController.getWeekCount();
showWeek = currentWeek;
currentWeekDayIndex = DateTime.now().weekday - 1;
// showWeek = 1;
//
showMonth = DateTime.now().month;
dataCaculateAfterFutherDo();
serverFutureDo();
}
dataCaculateAfterFutherDo() {
freeTimeBlockWeekMap = {};
freeTimeBlockWeekMap =
timetableWidgetController.transformTimeBlockMap(freeTimeBlockList);
var mondayTime = TimetableWidgetController.getmondayTime();
//showMon
showMonth = mondayTime.add(Duration(days: 7 * (showWeek - currentWeek))).month;
//
dateListstr = [];
for (int i = 0; i < 7; i++) {
dateListstr.add(mondayTime
.add(Duration(days: i + 7 * (showWeek - currentWeek)))
.day
.toString()
);
}
//
positions =
TimetableWidgetController.convertTimeList(TimetableWidgetController.timePoints);
}
@override
Widget build(BuildContext contexvoidt) {
return Scaffold(
appBar: AppBar(
title: Text(team.getTeamName+'的空闲时间表'),
),
body: Consumer<TimeProvider>(builder: (ctx, timePro, child) {
print('Rebuild timePro');
return RefreshIndicator(
onRefresh: () {
print('下拉refresh');
return serverFutureDo().then((value){
});
},
child: GestureDetector(
onHorizontalDragEnd: (details) {
serverFutureDo();
if (details.primaryVelocity! > 0) {
//
setState(() {
showWeek--;
currentWeekDayIndex -= 7;
dataCaculateAfterFutherDo();
});
} else if (details.primaryVelocity! < 0) {
//
setState(() {
showWeek++;
currentWeekDayIndex += 7;
dataCaculateAfterFutherDo();
});
}
},
child: Column(
mainAxisAlignment: MainAxisAlignment.start, //
children: [
SizedBox(
//
//
child: GridView.builder(
shrinkWrap: true,
//
physics: NeverScrollableScrollPhysics(),
//
itemCount: 8,
gridDelegate:
SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 8, childAspectRatio: 1 / 1),
//
itemBuilder: (BuildContext context, int index) {
//item
return Container(
color: index == this.currentWeekDayIndex
? Color(0xf7f7f7) //
: Colors.white,
child: Center(
child: index == 0
? Column(
//
mainAxisAlignment:
MainAxisAlignment.center,
children: [
if(showWeek>0 && showWeek<Setting.termAllWeekCout)
Container(
// height: 10,
// width: 6,
child: Text(
'' +
showWeek.toString() +
'', //
style: TextStyle(
fontSize: 12,
color: currentWeek ==
showWeek //
? Colors.amber
: Colors.black87)),
),
Container(
// height: 10,
// width: 6,
child: Text(
showMonth.toString() + '', //
style: TextStyle(
fontSize: 12,
color: currentWeek ==
showWeek //
? Colors.amber
: Colors.black87)),
),
],
)
: Column(
mainAxisAlignment:
MainAxisAlignment.center,
children: [
Text(weekList[index - 1], //
style: TextStyle(
fontSize: 14,
color: index ==
currentWeekDayIndex //
? Colors.lightBlue
: Colors.black87)),
SizedBox(
height: 5,
),
Text(dateListstr[index - 1], //
style: TextStyle(
fontSize: 12,
color: index ==
currentWeekDayIndex //
? Colors.lightBlue
: Colors.black87)),
],
),
),
);
}),
),
//stack
Expanded(
child: SingleChildScrollView(
child: Row(
children: [
//stack
Container(
width: Setting.deviceWidth,
height: 2000,
child: Stack(
alignment: Alignment.center,
children: [
// Stack
Positioned(
top: 0,
left: 0,
child: Container(
width: Setting.deviceWidth,
height: 2000,
child: Stack(
children: List.generate(
//
positions.length,
(index) => Positioned(
top: positions[index].dy,
left: positions[index].dx,
child: Row(
children: [
Text(
TimetableWidgetController.timePoints[index]
.hour
.toString()
.padLeft(2, '0') +
':' +
TimetableWidgetController.timePoints[index]
.minute
.toString()
.padLeft(2, '0'),
),
Container(
width: Setting.deviceWidth * 0.04,
height: 10,
decoration: BoxDecoration(
shape: BoxShape.circle,
border: Border.all(
color: Colors.amber,
width: 2,
),
),
),
Container(
width: Setting.deviceWidth * 0.84,
height: 2,
color: Colors.lightBlue
),
],
),
),
),
),
)),
//Stack
Container(
constraints: BoxConstraints
.expand(), // 使constraints
// width: 390,
// height: 2000,
child: Stack(
children: List.generate(
freeTimeBlockWeekMap
.containsKey(showWeek)
? freeTimeBlockWeekMap[showWeek]!
.length
: 0,
(index) {
var currentItem = freeTimeBlockWeekMap[
showWeek]![index];
return Positioned(
top: timetableWidgetController
.getdy(currentItem),
left: timetableWidgetController
.getdx(currentItem) +
Setting.deviceWidth * 0.15,
child: SingleChildScrollView(
child: Container(
width: Setting.deviceWidth * 0.115,
height:
timetableWidgetController
.getHeight(
currentItem),
decoration: BoxDecoration(
color: getItemColor(
currentItem),
borderRadius:
BorderRadius.all(
Radius.circular(10.0),
),
),
child: SingleChildScrollView(
child: Column(
children: [
FreeTimeBlockContenWidget(
currentItem:
currentItem,
team: team,
),
],
),
),
),
),
);
},
),
))
],
),
),
],
),
))
],
),
),
);
;
}),
);
}
//
Color getItemColor(dynamic item) {
return Colors.tealAccent; //
}
}
class ShowTimeTextWidget extends StatelessWidget{
const ShowTimeTextWidget({
super.key,
required this.currentItem
});
final currentItem;
@override
Widget build(BuildContext context) {
return
ListBody(
children: <Widget>[
Text(
'开始时间: ${currentItem.startTime.year}' +
'${currentItem.startTime.month}' +
'${currentItem.startTime.day.toString().padLeft(2, '0')}' +
'${currentItem.startTime.hour.toString().padLeft(2, '0')}' +
':${currentItem.startTime.minute.toString().padLeft(2, '0')}',
),
Text('结束时间: ${currentItem.endTime.year}' +
'${currentItem.endTime.month}' +
'${currentItem.endTime.day.toString().padLeft(2, '0')}' +
'${currentItem.endTime.hour.toString().padLeft(2, '0')}' +
':${currentItem.endTime.minute.toString().padLeft(2, '0')}',
)
],
);
}
}
class BlockGestureWidget extends StatelessWidget {
const BlockGestureWidget({
super.key,
required this.currentItem,
required this.blockGestureWidgetChilld,
required this.team,
});
final currentItem;
final blockGestureWidgetChilld;
final Team team;
@override
Widget build(BuildContext context) {
return GestureDetector(
onTap: () {
//
showDialog(
context: context,
builder: (BuildContext context) {
return AlertDialog(
// currentItem
title: Text('空闲时间'),
content: SingleChildScrollView(
child: ListBody(
children: <Widget>[
if (currentItem is FreeTime) ...{
ShowTimeTextWidget(currentItem: currentItem),
}
],
),
),
actions: <Widget>[
TextButton(
child: Text('关闭'),
onPressed: () {
Navigator.of(context).pop();
},
),
],
);
},
);
},
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,
);
}
}
class FreeTimeBlockContenWidget extends StatelessWidget {
const FreeTimeBlockContenWidget({
super.key,
required this.currentItem, required this.team,
});
final currentItem;
final Team team;
@override
Widget build(BuildContext context) {
return BlockGestureWidget(
currentItem: currentItem,
blockGestureWidgetChilld: Column(
children: [
Text(
(currentItem as FreeTime).startTime.hour.toString().padLeft(2, '0') +
':' +
(currentItem as FreeTime).startTime.minute.toString().padLeft(2, '0'),
style: TextStyle(
fontSize: 12,
color: Colors.black,
//
fontWeight: FontWeight.bold,
),
overflow: TextOverflow.clip,
),
Text(
(currentItem as FreeTime).endTime.hour.toString().padLeft(2, '0') +
':' +
(currentItem as FreeTime).endTime.minute.toString().padLeft(2, '0'),
style: TextStyle(
fontSize: 12,
color: Colors.black,
//
fontWeight: FontWeight.bold,
),
overflow: TextOverflow.clip,
),
],
),
team: team,
);
}
}

@ -1,24 +1,18 @@
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
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/AutoImportWidget.dart';
import 'package:timemanagerapp/widgets/ChangeUserWidget.dart';
import 'package:timemanagerapp/ruters/TomatoClockRoute.dart';
import 'package:timemanagerapp/widgets/RegisterWidget.dart';
import 'package:timemanagerapp/widgets/TimetableWidget.dart';
import '../provider/TimeProvider.dart';
import '../ruters/AddCourseRoute.dart';
import '../ruters/TomatoClockRoute.dart';
import '../ruters/UserSettingRoute.dart';
import '../setting/Setting.dart';
import 'LoginWidget.dart';
import 'UserSettingWidget.dart';
class HomeWidget extends StatefulWidget {
const HomeWidget({Key? key}) : super(key: key);
@ -28,26 +22,35 @@ class HomeWidget extends StatefulWidget {
}
class _HomeWidgetState extends State<HomeWidget> {
GlobalKey<TimetableWidgetState> timetableWidgetKey = GlobalKey(); //key
late UserController userController;
late CourseController courseController;
bool isLoggedIn = false; //
late Timer? _timer = null;
double selectedDuration=0;
String durationString='0.0';
@override
void initState() {
super.initState();
Setting.timetableWidgetKey = GlobalKey(); //key,,TimetableWidgetState;
userController = UserController();
userController = UserController.getInstance();
courseController = CourseController.getInstance();
}
void handleAddCourse() {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) {
return AddCourseRoute(onCourseAdded: () {
setState(() {
//
// timetableWidgetKey.currentState?.updateWhenDataChange();
});
});
},
),
);
}
void handleAddTask() {
// Implement the functionality for adding a task here
}
@ -66,7 +69,6 @@ class _HomeWidgetState extends State<HomeWidget> {
appBar: AppBar(
backgroundColor: Colors.blue,
actions: [
//
IconButton(
//addIconButton
icon: const Icon(Icons.add),
@ -81,42 +83,36 @@ class _HomeWidgetState extends State<HomeWidget> {
mainAxisSize: MainAxisSize.min,
children: [
ElevatedButton(
onPressed: () async {
Navigator.of(context).pop();//
onPressed: () {
// AddCourseFormWidget
await Navigator.push(
Navigator.push(
context,
MaterialPageRoute(
builder: (context) {
return AddCourseRoute();
return AddCourseRoute(onCourseAdded: () {
setState(() {
//
// timetableWidgetKey.currentState?.updateWhenDataChange();
});
});
},
),
);
// setState(() {
//
// });
//
// print("触发更新课程表");
Setting.timetableWidgetKey!.currentState!.localFutureDo();
},
child: Text('添加课程'),
),
ElevatedButton(
onPressed: () async {
Navigator.of(context).pop();//
onPressed: () {
// AddCourseFormWidget
await Navigator.push(
Navigator.push(
context,
MaterialPageRoute(
builder: (context) {
//todo
return AddScheduleRoute(
scheduleType: "task",
); //
return AddScheduleRoute(scheduleType: "task",); //
},
),
);
Setting.timetableWidgetKey!.currentState!.localFutureDo();
},
child: Text('添加个人计划'),
),
@ -130,97 +126,25 @@ class _HomeWidgetState extends State<HomeWidget> {
),
IconButton(
//todo 使
icon: const Icon(Icons.access_alarm),
icon: const Icon(Icons.more),
onPressed: () {
showDialog(
context: context,
builder: (BuildContext context) {
return AlertDialog(
title: Text('选择时长'),
content: Column(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
Row(
children: [
Text("$durationString 分钟"),
// Slider(
// value: selectedDuration,
// min: 0,
// max: 180,
// allowedInteraction: SliderInteraction.slideOnly,
// onChanged: (double value) {
// durationString=selectedDuration.toStringAsFixed(1);
// setState(() {
// selectedDuration = value;
// durationString=selectedDuration.toStringAsFixed(1);
// });
// },
// ),
],
),
SizedBox(height: 10),
Container(
height: 30,
child: TextField(
keyboardType: TextInputType.number,
decoration: InputDecoration(
labelText: '请输入时长(分钟)',
border: OutlineInputBorder(),
),
onChanged: (value) {
setState(() {
selectedDuration =double.parse(value);
durationString=selectedDuration.toStringAsFixed(1);
});
},
),
),
SizedBox(height: 10),
// Text('时长:$selectedDuration 分钟'),
Row(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: [
ElevatedButton(
child: Text('返回主界面'),
onPressed: () {
Navigator.of(context).pop();
},
),
ElevatedButton(
child: Text('进入番茄时钟'),
onPressed: () {
Navigator.of(context).pop();
Navigator.push(
context,
MaterialPageRoute(
builder: (context) {
//todo
return TomatoClockRoute(flag:0,selectedDuration:selectedDuration);
},
),
);
},
),
],
)
],
),
);
},
Navigator.push(
context,
MaterialPageRoute(
builder: (context) {
//todo
return TomatoClockRoute();
},
),
);
},
),
IconButton(
icon: const Icon(Icons.group_add),
onPressed: () async {
onPressed: () {
//
await Navigator.push(
Navigator.push(
context,
MaterialPageRoute(
builder: (context) {
@ -229,8 +153,7 @@ class _HomeWidgetState extends State<HomeWidget> {
},
),
);
Setting.timetableWidgetKey!.currentState!.serverFutureDo();
Setting.timetableWidgetKey!.currentState!.localFutureDo();
},
),
Builder(
@ -244,177 +167,108 @@ class _HomeWidgetState extends State<HomeWidget> {
),
],
),
endDrawer: Consumer<TimeProvider>(builder: (ctx, timePro, child) {
return Drawer(
//
child: Column(
children: [
UserAccountsDrawerHeader(
accountName: GestureDetector(
onTap: () async {
if (Setting.user!.getId! == -1) {
//
await Navigator.push(
context,
MaterialPageRoute(
builder: (context) {
return LoginWidget();
},
),
);
Setting.timetableWidgetKey!.currentState!.localFutureDo();
Setting.timetableWidgetKey!.currentState!.serverFutureDo();
} else {
//退
await Setting.saveUser(Setting.nullUser);
await Setting.saveInitFlag(true);
}
setState(() {});
Setting.timetableWidgetKey!.currentState!.localFutureDo();
},
child: Setting.user!.getId! != -1
? Text(Setting.user!.getUsername!)
: Text('未登录'),
),
accountEmail: GestureDetector(
onTap: () async {
if (Setting.user!.getId! == -1) {
//
await Navigator.push(
context,
MaterialPageRoute(
builder: (context) {
return LoginWidget(); //
},
),
);
Setting.timetableWidgetKey!.currentState!.localFutureDo();
Setting.timetableWidgetKey!.currentState!.serverFutureDo();
} else {
//退
await Setting.saveUser(Setting.nullUser);
await Setting.saveInitFlag(true);
}
setState(() {});
Setting.timetableWidgetKey!.currentState!.localFutureDo();
},
child: Setting.user!.getId! != -1
? Text('退出登录')
: SizedBox(), //
),
currentAccountPicture: CircleAvatar(
backgroundImage:
AssetImage('assets/images/userphoto.jpg'), //
),
),
ListTile(
title: Text('导入学校课程'),
onTap: () async {
//todo
//
await Navigator.push(
context,
MaterialPageRoute(
builder: (context) {
return AutoImportWidget();
},
),
);
Setting.timetableWidgetKey!.currentState!.localFutureDo();
},
),
GestureDetector(
//
onLongPressStart: (details) {
print('按下');
if (_timer == null) {
_timer = Timer(Duration(seconds: 10), () {
Setting.saveIsDeveloperButtonVisible(true).then((value) {
setState(() {
setState(() {
print('开发者模式开启');
});
});
});
});
}
},
onLongPressEnd: (details) {
print('抬起');
if (_timer != null) _timer!.cancel();
_timer = null;
},
child: ListTile(
title: Text('用户设置'),
onTap: () async {
//todo
// deng
await Navigator.push(
endDrawer: Drawer(
// Use endDrawer to place the drawer on the right side
child: Column(
children: [
UserAccountsDrawerHeader(
accountName: GestureDetector(
onTap: () {
if (Setting.user!.getId! == -1) {
//
Navigator.push(
context,
MaterialPageRoute(
builder: (context) {
return UserSettingWidget();
return LoginWidget(); //
},
),
);
Setting.timetableWidgetKey!.currentState!.localFutureDo();
},
),
}else{
//退
Setting.saveUser(Setting.nullUser);
setState(() {
});
}
},
child: Setting.user!.getId! != -1 ? Text(Setting.user!.getUsername!) : Text('未登录'),
),
if (Setting.user!.getId! == -1)
ListTile(
title: Text('注册'),
onTap: () async {
//todo
// UserSettingWight
await Navigator.push(
accountEmail: GestureDetector( //
onTap: () {
if (Setting.user!.getId! == -1) {
//
Navigator.push(
context,
MaterialPageRoute(
builder: (context) {
return RegisterWidget();
return LoginWidget(); //
},
),
);
}else{
//退
Setting.saveUser(Setting.nullUser);
setState(() {
});
},
),
if (Setting.user!.getId! != -1)//
ListTile(
title: Text('更改账号信息'),
onTap: () async {
await Navigator.push(
context,
MaterialPageRoute(
builder: (context) {
return ChangeUserWidget();
},
),
);
setState(() {});
},
),
if (Setting.isDeveloperButtonVisible&&Setting.user!.getRole! >=1 )
ListTile(
title: Text('开发者测试'),
onTap: () async {
await Navigator.push(
context,
MaterialPageRoute(
builder: (context) {
return TestRoute();
},
),
);
Setting.timetableWidgetKey!.currentState!.localFutureDo();
},
),
],
),
);
}),
body: TimetableWidget(key: Setting.timetableWidgetKey!),
}
},
child: Setting.user!.getId! != -1
? Text('退出登录')
: SizedBox(), //
),
currentAccountPicture: CircleAvatar(
backgroundImage: AssetImage(
'assets/images/userphoto.jpg'), //
),
),
ListTile(
title: Text('用户设置'),
onTap: () {
//todo
// deng
Navigator.push(
context,
MaterialPageRoute(
builder: (context) {
return UserSettingRoute();
},
),
);
},
),
ListTile(
title: Text('注册'),
onTap: () {
//todo
// UserSettingWight
Navigator.push(
context,
MaterialPageRoute(
builder: (context) {
return RegisterWidget();
},
),
);
},
),
ListTile(
title: Text('开发者测试'),
onTap: () {
// TestWidget
Navigator.push(
context,
MaterialPageRoute(
builder: (context) {
return TestRoute();
},
),
);
},
),
],
),
),
body: TimetableWidget(),
);
}
}

@ -1,80 +0,0 @@
import 'package:flutter/material.dart';
import 'package:timemanagerapp/controller/TeamController.dart';
import 'package:timemanagerapp/entity/Team.dart';
import '../setting/Setting.dart';
class JoinTeamWidget extends StatefulWidget {
const JoinTeamWidget({Key? key}) : super(key: key);
@override
_JoinTeamWidgetState createState() => _JoinTeamWidgetState();
}
class _JoinTeamWidgetState extends State<JoinTeamWidget> {
TeamController teamController = TeamController();
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: () async {
String teamName = teamNameController.text;
// String teamDescription = teamDescriptionController.text;
bool res = await teamController.joinTeam(teamName);
if(res==false){
showDialog(
context: context,
builder: (BuildContext context) {
return AlertDialog(
title: Text('结果'),
content: Text('团队不存在或已加入'),
actions: [
TextButton(
child: Text('确定'),
onPressed: () {
Navigator.of(context).pop(); //
},
),
],
);
},
);
}else{
Setting.teamWidgetKey!.currentState!.futureDo();
Navigator.pop(context);
}
},
child: Text('确定'),
),
],
),
),
);
}
}

@ -1,12 +1,7 @@
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:timemanagerapp/controller/TaskController.dart';
import 'package:timemanagerapp/controller/UserController.dart';
import 'package:timemanagerapp/controller/CourseController.dart';
import '../entity/User.dart';
import '../provider/TimeProvider.dart';
import '../setting/Setting.dart';
class LoginWidget extends StatefulWidget {
@override
@ -18,31 +13,15 @@ class _LoginWidgetState extends State<LoginWidget> {
final TextEditingController usernameController = TextEditingController();
final TextEditingController passwordController = TextEditingController();
Future<void> handleLogin(context) async {
Future<void> handleLogin() async {
String username = usernameController.text;
String password = passwordController.text;
bool res = await userController.login(User(username: username, password: password, role: 0));
if(res) {
Provider.of<TimeProvider>(context, listen: false).updateTimetable(); //
Navigator.pop(context);
}else{
showDialog(
context: context,
builder: (BuildContext context) {
return AlertDialog(
title: Text('结果'),
content: Text('用户名或密码错误'),
actions: [
TextButton(
child: Text('确定'),
onPressed: () {
Provider.of<TimeProvider>(context, listen: false).updateTimetable(); //
Navigator.of(context).pop(); //
},
),
],
);
},
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('用户名或密码错误'))
);
}
}
@ -75,7 +54,7 @@ class _LoginWidgetState extends State<LoginWidget> {
),
SizedBox(height: 24.0),
ElevatedButton(
onPressed: ()=>handleLogin(context),
onPressed: handleLogin,
child: Text('登录'),
),
],

@ -1,72 +1,31 @@
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:timemanagerapp/controller/TeamController.dart';
import 'package:timemanagerapp/provider/TeamProvider.dart';
import '../entity/Team.dart';
import '../entity/User.dart';
import '../setting/Setting.dart';
class ManageUserTeamWidget extends StatefulWidget {
const ManageUserTeamWidget({Key? key, required this.team}) : super(key: key);
final Team team;
const ManageUserTeamWidget({Key? key}) : super(key: key);
@override
_ManageUserTeamWidgetState createState() =>
_ManageUserTeamWidgetState(team: team);
_AddTeamWidgetState createState() => _AddTeamWidgetState();
}
class _ManageUserTeamWidgetState extends State<ManageUserTeamWidget> {
_ManageUserTeamWidgetState({required this.team});
final Team team;
int loading = 1;
TeamController teamController = TeamController();
int firstInit = 0;
List<User> memberList = [
User(id: 1, username: '成员1', password: '123', role: 0),
];
Future<void> futureDo() async {
//
memberList = await teamController.getTeamUserList(team.getId!);
setState(() {
loading = 0;
});
}
dataInitAfterFutherDo() {
//
}
updateAfterFutherDo() {
//
}
class _AddTeamWidgetState extends State<ManageUserTeamWidget> {
TextEditingController memberIdController = TextEditingController();
void handleInviteButton() {
String memberName = memberIdController.text;
String memberId = memberIdController.text;
//
teamController.insertTeamUser(team.id!, memberName);
//
showDialog(
context: context,
builder: (BuildContext context) {
return AlertDialog(
title: Text('成功发送邀请'),
content: Text('已成功发送邀请给成员: $memberName'),
content: Text('已成功发送邀请给成员ID: $memberId'),
actions: [
TextButton(
child: Text('确定'),
onPressed: () {
Navigator.of(context).pop(); //
futureDo().then((value) => {setState(() {})});
},
),
],
@ -75,115 +34,28 @@ class _ManageUserTeamWidgetState extends State<ManageUserTeamWidget> {
);
}
void removeMember(User member) {
//
teamController.deleteTeamUser(team, member.getId!).then((value) {
//
showDialog(
context: context,
builder: (BuildContext context) {
return AlertDialog(
title: Text('成功移除成员'),
content: Text('已成功移除成员: ' + member.getUsername),
actions: [
TextButton(
child: Text('确定'),
onPressed: () {
Navigator.of(context).pop(); //
futureDo().then((value) => {
setState(() {
// loading = 1;
})
});
// setState(() {
// loading = 1;
// futureDo();
// });
},
),
],
);
},
);
});
}
final memberIdController = TextEditingController();
@override
void initState() {
super.initState();
futureDo();
}
@override
Widget build(BuildContext context) {
if (loading == 1) {
loading = 0;
return Center(
child: CircularProgressIndicator(),
);
} else {
return
Scaffold(
resizeToAvoidBottomInset: false,
appBar: AppBar(
title: Text('团队成员'),
),
body: RefreshIndicator(
onRefresh: () {
print('下拉refresh');
return futureDo().then((value) => setState(() {}));
},
child: SingleChildScrollView(
child: Padding(
padding: EdgeInsets.all(16.0),
child: Column(
children: [
if (team.leaderId == Setting.user!.getId! || Setting.user!.getRole >= 2)
TextField(
controller: memberIdController,
decoration: InputDecoration(labelText: '成员ID'),
),
if (team.leaderId == Setting.user!.getId! || Setting.user!.getRole >= 2)
SizedBox(height: 20),
if (team.leaderId == Setting.user!.getId! || Setting.user!.getRole >= 2)
ElevatedButton(
onPressed: handleInviteButton,
child: Text('邀请'),
),
if (team.leaderId == Setting.user!.getId!)
SizedBox(height: 20),
ListView.builder(
shrinkWrap: true,
physics: NeverScrollableScrollPhysics(),
itemCount: memberList.length,
itemBuilder: (BuildContext context, int index) {
User member = memberList[index];
return ListTile(
title: Text(team.leaderId != member.getId! ?member.getUsername:member.getUsername+'(管理员)',
style: TextStyle(
color: team.leaderId != member.getId!
? Colors.black
: Colors.orange)
), //leader
trailing: team.leaderId == Setting.user!.getId! || (team.leaderId != member.getId! && Setting.user!.getRole >= 2)
? IconButton(
icon: Icon(Icons.delete),
onPressed: () {
removeMember(member);
},
)
: null,
);
},
),
],
),
),
)
),
);
}
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('邀请'),
),
],
),
),
);
}
}

@ -15,73 +15,18 @@ class _RegisterWidgetState extends State<RegisterWidget> {
final TextEditingController passwordController = TextEditingController();
final TextEditingController confirmPasswordController = TextEditingController();
Future<void> handleRegister(context) async {
void handleRegister() {
String username = usernameController.text;
String password = passwordController.text;
String confirmPassword = confirmPasswordController.text;
//
if (password == '' || confirmPassword == '') {
showDialog(
context: context,
builder: (BuildContext context) {
return AlertDialog(
title: Text('结果'),
content: Text('密码不能为空'),
actions: [
TextButton(
child: Text('确定'),
onPressed: () {
Navigator.of(context).pop(); //
},
),
],
);
},
);
return;
}else if(password != confirmPassword) {
showDialog(
context: context,
builder: (BuildContext context) {
return AlertDialog(
title: Text('结果'),
content: Text('两次输入的密码不一致'),
actions: [
TextButton(
child: Text('确定'),
onPressed: () {
Navigator.of(context).pop(); //
},
),
],
);
},
if (password != confirmPassword) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('两次输入的密码不一致'))
);
return;
}else{
bool res = await userController.register(User(username:username, password:password, role:0));
if(res){
Navigator.pop(context);
}else{
showDialog(
context: context,
builder: (BuildContext context) {
return AlertDialog(
title: Text('结果'),
content: Text('注册失败'),
actions: [
TextButton(
child: Text('确定'),
onPressed: () {
Navigator.of(context).pop(); //
},
),
],
);
},
);
}
userController.register(User(username:username, password:password, role:0)).then((value) => Navigator.pop(context));
}
}
@ -121,7 +66,7 @@ class _RegisterWidgetState extends State<RegisterWidget> {
),
SizedBox(height: 24.0),
ElevatedButton(
onPressed:()=> handleRegister(context),
onPressed: handleRegister,
child: Text('注册'),
),
],

@ -0,0 +1,27 @@
import 'package:flutter/material.dart';
/**
* @desc 线
* @author xiedong
* @date 2020-02-24.
*/
class SpaceWidget extends StatelessWidget {
double height, width;
SpaceWidget({
this.height = 1,
this.width = 1,
}) : super();
@override
Widget build(BuildContext context) {
return
Container(
height: height,
width: width,
color: Colors.transparent,
);
}
}

@ -1,344 +0,0 @@
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:timemanagerapp/controller/TeamController.dart';
import 'package:timemanagerapp/provider/TeamUserProvider.dart';
import 'package:timemanagerapp/ruters/AddScheduleRoute.dart';
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({required key}) : super(key: key);
@override
TeamWidgetState createState() => TeamWidgetState();
}
class TeamWidgetState extends State<TeamWidget> {
int firstInit = 0;
List<Team> myTeamList = [];
List<Team> joinTeamList = [];
// [
// Team(id:1, teamName: 'Team 1', leaderId: 1, maxNumber: 10),
// Team(id:2, teamName: 'Team 2', leaderId: 1, maxNumber: 10),
// Team(id:3, teamName: 'Team 3', leaderId: 1, maxNumber: 10)
// ];
TeamController teamController = TeamController();
Future<void> futureDo() async {
print('开始futureDo - TeamWidget');
//
myTeamList = await teamController.getMyTeamList();
joinTeamList = await teamController.getJoinedTeamList();
if(Setting.user!.role >= 2){
//
myTeamList.addAll(joinTeamList);
joinTeamList = [];
}
setState(() {
});
}
@override
initState() {
super.initState();
Setting.freeTimetableWidgeKey = GlobalKey();
futureDo();
//todo: get teamList from database
}
@override
Widget build(BuildContext context) {
print('Rebuild teamUserPro');
return RefreshIndicator(
onRefresh: () {
print('下拉refresh');
return futureDo();
},
child: CustomScrollView(
slivers: [
SliverList(
delegate: SliverChildBuilderDelegate(
(BuildContext context, int index) {
Team team = myTeamList[index];
return Column(
children: [
ListTile(
//
leading: Icon(Icons.group), // icon
title: GestureDetector(
onTap: () {
//
showDialog(
context: context,
builder: (BuildContext context) {
return AlertDialog(
title: Text(team.teamName),
content: SingleChildScrollView(
child: ListBody(
children: <Widget>[
Text(
'团队介绍:${team.introduce == "" ? "" : team.introduce}'),
// Add other information here if needed
],
),
),
actions: <Widget>[
TextButton(
child: Text('关闭'),
onPressed: () {
Navigator.of(context).pop();
},
),
],
);
},
);
},
onLongPress: () {
//
showDialog(
context: context,
builder: (BuildContext context) {
return AlertDialog(
title: Text(team.getTeamName),
content: Column(
mainAxisSize: MainAxisSize.min,
children: [
ElevatedButton(
onPressed: () {
//
Navigator.of(context).pop(); //
Navigator.push(
context,
MaterialPageRoute(
builder: (context) {
return FreeTimetableWidget(team: team,key:Setting.freeTimetableWidgeKey!);
},
),
);
},
child: Text('查看团队空闲时间'),
),
if (team.leaderId != Setting.user!.getId!)
SizedBox(height: 10),
if (team.leaderId != Setting.user!.getId!)
ElevatedButton(
onPressed: () {
// 退
Navigator.of(context).pop(); //
teamController.deleteTeamUser(team, Setting.user!.id!).then((value) {
futureDo();
});
},
child: Text('退出团队'),
),
],
),
);
},
);
},
child: Text(team.teamName), //
),
trailing: Row(
mainAxisSize: MainAxisSize.min,
children: [
IconButton(
icon: Icon(Icons.person_add), //
onPressed: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) {
return ManageUserTeamWidget(
team: team,
);
},
),
);
},
),
IconButton(
icon:
Icon(Icons.assignment), //
onPressed: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) {
return AddScheduleRoute(
scheduleType: "work",
teamId: team.id!
);
},
),
);
},
),
IconButton(
//
icon: Icon(Icons.delete),
onPressed: () async {
showDialog(
context: context,
builder: (BuildContext context) {
return AlertDialog(
title: Text('删除团队'),
content: Text('您确定要删除团队吗?'),
actions: <Widget>[
TextButton(
child: Text('取消'),
onPressed: () {
Navigator.of(context).pop();
},
),
TextButton(
child: Text('确定'),
onPressed: () async {
print('删除团队'+ team.getTeamName + ' ' + team.id.toString());
await teamController.deleteTeam(team);
futureDo();
Navigator.of(context).pop();
},
),
],
);
},
);
},
),
],
),
),
],
);
},
childCount: myTeamList.length,
),
),
SliverList(
delegate: SliverChildBuilderDelegate(
(BuildContext context, int index) {
Team team = joinTeamList[index];
return Column(
children: [
ListTile(
//
//
leading: Icon(Icons.group), // icon
title: GestureDetector(
onTap: () {
//
showDialog(
context: context,
builder: (BuildContext context) {
return AlertDialog(
title: Text(team.teamName),
content: SingleChildScrollView(
child: ListBody(
children: <Widget>[
Text(
'团队介绍:${team.introduce == "" ? "" : team.introduce}'),
// Add other information here if needed
],
),
),
actions: <Widget>[
TextButton(
child: Text('关闭'),
onPressed: () {
Navigator.of(context).pop();
},
),
],
);
},
);
},
onLongPress: () {
//
showDialog(
context: context,
builder: (BuildContext context) {
return AlertDialog(
title: Text(team.getTeamName),
content: Column(
mainAxisSize: MainAxisSize.min,
children: [
ElevatedButton(
onPressed: () async {
//
Navigator.of(context).pop(); //
await Navigator.push(
context,
MaterialPageRoute(
builder: (context) {
return FreeTimetableWidget(team: team,key:Setting.freeTimetableWidgeKey!);
},
),
);
},
child: Text('查看团队空闲时间'),
),
SizedBox(height: 10),
ElevatedButton(
onPressed: () {
//
Navigator.of(context).pop(); //
teamController.deleteTeamUser(team, Setting.user!.id!).then((value) {
futureDo();
});
},
child: Text('退出团队'),
),
],
),
);
},
);
},
child: Text(team.teamName), //
),
trailing: Row(
mainAxisSize: MainAxisSize.min,
children: [
IconButton(
icon: Icon(Icons.person_add), //
onPressed: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) {
return ManageUserTeamWidget(
team: team,
);
},
),
);
},
),
],
),
),
],
);
},
childCount: joinTeamList.length,
),
),
],
),
);
}
}

@ -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<TeamWidget> {
List<Team> 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,
);
},
),
);
},
),
],
),
),
],
);
},
),
);
}
}

@ -25,14 +25,10 @@ import 'package:flutter/material.dart';
import 'package:sqflite/sqflite.dart';
import 'package:timemanagerapp/controller/CourseController.dart';
import 'package:timemanagerapp/controller/NetWorkController.dart';
import 'package:timemanagerapp/controller/TeamController.dart';
import 'package:timemanagerapp/controller/UserController.dart';
import 'package:timemanagerapp/database/dao/WorkDao.dart';
import 'package:timemanagerapp/entity/Course.dart';
import 'package:timemanagerapp/entity/Team.dart';
import 'package:timemanagerapp/entity/User.dart';
import 'package:timemanagerapp/database/MyDatebase.dart';
import 'package:timemanagerapp/util/MyLogger.dart';
import '../controller/TaskController.dart';
import '../controller/WorkController.dart';
@ -51,7 +47,7 @@ class _TestWidgetState extends State<TestWidget> {
late UserController userController;
late CourseController courseController;
late TaskController taskController;
// Logger logger = Logger();
late WorkController WwrkController;
@override
void initState() {
@ -69,13 +65,6 @@ class _TestWidgetState extends State<TestWidget> {
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
ElevatedButton(
onPressed: () {
Setting.saveIsDeveloperButtonVisible(false);
print('关闭开发者模式');
},
child: Text('关闭开发者模式'),
),
ElevatedButton(
onPressed: () {
showDialog(
@ -95,121 +84,19 @@ class _TestWidgetState extends State<TestWidget> {
},
child: Text('当前用户信息'),
),
ElevatedButton(
onPressed: () {
UserController().getUserList().then((userList) {
showDialog(
context: context,
builder: (context) {
return AlertDialog(
title: Text('用户列表'),
content: SingleChildScrollView(
child: Column(
mainAxisSize: MainAxisSize.min,
children: userList
.map((user) => ListTile(
title: Text(user.getUsername),
subtitle: Text(user.toString()),
))
.toList(),
),
),
);
},
);
});
},
child: Text('显示所有用户'),
),
ElevatedButton(
onPressed: () {
showDialog(
context: context,
builder: (BuildContext context) {
return AlertDialog(
title: Text('删除所有用户'),
content: Text('您确定要删除所有的用户吗?'),
actions: <Widget>[
TextButton(
child: Text('取消'),
onPressed: () {
Navigator.of(context).pop();
},
),
TextButton(
child: Text('确定'),
onPressed: () {
NetWorkController()
.deleteAllUser();
Navigator.of(context).pop();
},
),
],
);
},
);
},
child: Text('!删除所有用户'),
),
ElevatedButton(
onPressed: courseController.deleteAllCourses,
child: Text('!删除所有课程'),
child: Text('删除所有课程'),
),
ElevatedButton(
onPressed: taskController.deleteAllTasks,
child: Text('!删除所有个人计划'),
),
ElevatedButton(
onPressed: () {
showDialog(
context: context,
builder: (BuildContext context) {
return AlertDialog(
title: Text('重置数据库'),
content: Text('您确定要重置数据库吗?'),
actions: <Widget>[
TextButton(
child: Text('取消'),
onPressed: () {
Navigator.of(context).pop();
},
),
TextButton(
child: Text('确定'),
onPressed: () {
MyDatabase.reBuildDatabase();
Navigator.of(context).pop();
},
),
],
);
},
);
},
child: Text('!重置数据库'),
child: Text('删除所有个人计划'),
),
// ElevatedButton(
// onPressed: () => courseController.autoImportCours(jsonstr),
// child: Text('导入课程(待开发)'),
// ),
ElevatedButton(
onPressed: () {
NetWorkController().getText().then((res) {
showDialog(
context: context,
builder: (context) {
return AlertDialog(
title: Text('结果'),
content: Text(res)
);
},
);
});
},
child: Text('番茄时钟文字获取'),
),
ElevatedButton(
onPressed: () => courseController.insertCourse(Course(
userId: 1,
@ -246,9 +133,9 @@ class _TestWidgetState extends State<TestWidget> {
mainAxisSize: MainAxisSize.min,
children: courses
.map((course) => ListTile(
title: Text(course.getName),
subtitle: Text(course.toString()),
))
title: Text(course.getName),
subtitle: Text(course.toString()),
))
.toList(),
),
),
@ -272,9 +159,9 @@ class _TestWidgetState extends State<TestWidget> {
mainAxisSize: MainAxisSize.min,
children: tasks
.map((task) => ListTile(
title: Text(task.getName),
subtitle: Text(task.toString()),
))
title: Text(task.getName),
subtitle: Text(task.toString()),
))
.toList(),
),
),
@ -285,171 +172,43 @@ class _TestWidgetState extends State<TestWidget> {
},
child: Text('显示个人计划列表'),
),
ElevatedButton(
onPressed: () {
TeamController().getWorks().then((works) {
showDialog(
context: context,
builder: (context) {
return AlertDialog(
title: Text('团队任务列表'),
content: SingleChildScrollView(
child: Column(
mainAxisSize: MainAxisSize.min,
children: works
.map((work) => ListTile(
title: Text(work.getName),
subtitle: Text(work.toString()),
))
.toList(),
),
),
);
},
);
});
},
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: () {
NetWorkController().getAllTeamList().then((teamList) {
showDialog(
context: context,
builder: (context) {
return AlertDialog(
title: Text('团队列表'),
content: SingleChildScrollView(
child: Column(
mainAxisSize: MainAxisSize.min,
children: teamList
.map((team) => ListTile(
title: Text(team.getTeamName),
subtitle: Text(team.toString()),
))
.toList(),
),
),
);
},
);
});
},
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: () {
User user = Setting.user!;
if(user.role == 1) user.role = 2;
else user.role = 1;
Setting.saveUser(user);
},
child: Text('修改role为2or!2(团队管理员)'),
),
ElevatedButton(
onPressed: () {
NetWorkController()
.updateTeam(Team(id:1,leaderId: 1, teamName: 'test改', maxNumber: 2))
.then((resTeam) {
.login(User(username: 'test', password: '123', role: 1))
.then((resUser) {
showDialog(
context: context,
builder: (context) {
return AlertDialog(
title: Text(''),
content: SingleChildScrollView(
child: Text(resTeam.toString())),
);
},
);
});
},
child: Text('更新团队'),
),
ElevatedButton(
onPressed: () {
CourseController()
.insertLocalCourse()
.then((res) {
showDialog(
context: context,
builder: (context) {
return AlertDialog(
title: Text('结果'),
content: SingleChildScrollView(
child: Text(res.toString())),
child: Text(resUser.body)),
);
},
);
});
},
child: Text('插入本地课程'),
),
ElevatedButton(
onPressed: () async => await Setting.saveInitFlag(true),
child: Text('重置initFlag'),
child: Text('录0'),
),
MyLogger(),
AddCourseButton(onCourseAdded: (jsonstr) {
// addCourse()
courseController.test_autoImportCours(jsonstr);
}),
// ElevatedButton(
// onPressed: () {
// // AddCourseFormWidget
// //
// showDialog(
// context: context,
// builder: (context) async {
// return AlertDialog(
// title: Text('数据库ID 生成器测试'),
// content: Text((await IdGenerator().generateId()).toString())
//
// },
// child: Text('数据库ID 生成器测试'),
// ),
],
),
),

@ -2,16 +2,11 @@ import 'dart:io';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:logger/logger.dart';
import 'package:provider/provider.dart';
import 'package:timemanagerapp/controller/CourseController.dart';
import 'package:timemanagerapp/controller/TaskController.dart';
import 'package:timemanagerapp/controller/TeamController.dart';
import 'package:timemanagerapp/controller/TimetableWidgetController.dart';
import 'package:timemanagerapp/ruters/AddCourseRoute.dart';
import 'package:timemanagerapp/ruters/AddScheduleRoute.dart';
import '../ruters/TomatoClockRoute.dart';
import '../controller/WorkController.dart';
import '../entity/Course.dart';
import '../entity/Task.dart';
import '../entity/Work.dart';
@ -19,13 +14,14 @@ import '../provider/TimeProvider.dart';
import '../setting/Setting.dart';
class TimetableWidget extends StatefulWidget {
TimetableWidget({required Key key}) : super(key: key);
final double deviceWidth = Setting.deviceWidth;
@override
State<StatefulWidget> createState() =>
TimetableWidgetState();
TimetableWidgetState(deviceWidth: deviceWidth);
}
class TimetableWidgetState extends State<TimetableWidget> {
late double deviceWidth;
int firstInit = 0;
//
@ -33,12 +29,9 @@ class TimetableWidgetState extends State<TimetableWidget> {
TimetableWidgetController();
late CourseController courseController = CourseController.getInstance();
late TaskController taskController = TaskController();
late TeamController teamController = TeamController();
// late WorkController workController = WorkController();
late List timeBlockList = [];
List taskList = [];
List workList = [];
Map<int, List> timeBlockWeekMap = {};
//
@ -53,103 +46,76 @@ class TimetableWidgetState extends State<TimetableWidget> {
var currentWeekDayIndex = 0;
//
int showWeek = 0;
int weekCount = 0;
int currentWeek = 0;
String showWeekstr = '第1周';
int showMonth = 0;
String weekCountstr = '第1周';
final double hourHeight = 60.0 * 1.5;
//DateTimePiexl
List<DateTime> 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, 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),
];
//Offset
var positions = [];
bool loading = true;
TimetableWidgetState();
TimetableWidgetState({required this.deviceWidth});
Future<void> localFutureDo() async {
print('开始localFutureDo');
updateDateByWeekCount() {}
Future<void> futureDo() async {
print('开始futureDo');
//
courseList = await courseController.getCourses();
taskList = await taskController.getTasks();
dataCaculateAfterFutherDo();
print('localFutureDo 完成');
setState(() {});
}
Future<void> serverFutureDo() async {
print('开始serverFutureDo');
//
workList = await teamController.getWorks();
dataCaculateAfterFutherDo();
print('serverFutureDo 完成');
setState(() {});
}
//
@override
initState() {
super.initState();
}
dataInitAfterFutherDo() {
//
timeBlockWeekMap = {};
timeBlockList = [];
//
currentWeek = TimetableWidgetController.getWeekCount();
showWeek = currentWeek;
currentWeekDayIndex = DateTime.now().weekday - 1;
// showWeek = 1;
//
showMonth = DateTime.now().month;
dataCaculateAfterFutherDo();
serverFutureDo();
localFutureDo();
}
currentWeek = timetableWidgetController.getWeekCount();
weekCount = currentWeek;
@override
dispose() {
super.dispose();
// Setting.saveInitFlag(false);
}
dataCaculateAfterFutherDo() {
timeBlockWeekMap = {};
timeBlockList = [];
timeBlockList.addAll(courseList);
timeBlockList.addAll(taskList);
timeBlockList.addAll(workList);
timeBlockWeekMap =
timetableWidgetController.transformTimeBlockMap(timeBlockList);
var mondayTime = TimetableWidgetController.getmondayTime();
//showMon
showMonth =
mondayTime.add(Duration(days: 7 * (showWeek - currentWeek))).month;
timetableWidgetController.transformCourseMap(timeBlockList);
//
var mondayTime = timetableWidgetController.getmondayTime();
//
dateListstr = [];
for (int i = 0; i < 7; i++) {
dateListstr.add(mondayTime
.add(Duration(days: i + 7 * (showWeek - currentWeek)))
.day
.toString());
dateListstr.add((mondayTime.day + i).toString());
if ((mondayTime.day + i) == DateTime.now().day) {
currentWeekDayIndex = i + 1;
}
}
//
positions = TimetableWidgetController.convertTimeList(
TimetableWidgetController.timePoints);
positions =
timetableWidgetController.convertTimeList(timePoints, deviceWidth);
}
updateAfterFutherDo() {
@ -158,270 +124,273 @@ class TimetableWidgetState extends State<TimetableWidget> {
timeBlockList.addAll(courseList);
timeBlockList.addAll(taskList);
timeBlockList.addAll(workList);
timeBlockWeekMap =
timetableWidgetController.transformTimeBlockMap(timeBlockList); //
var mondayTime = TimetableWidgetController.getmondayTime();
//showMon
showMonth =
mondayTime.add(Duration(days: 7 * (showWeek - currentWeek))).month;
timetableWidgetController.transformCourseMap(timeBlockList); //
var mondayTime = timetableWidgetController.getmondayTime();
//
for (int i = 0; i < 7; i++) {
dateListstr[i] = mondayTime
.add(Duration(days: i + 7 * (showWeek - currentWeek)))
.add(Duration(days: i + 7 * (weekCount - currentWeek)))
.day
.toString();
}
//
positions = TimetableWidgetController.convertTimeList(
TimetableWidgetController.timePoints);
// print('Recent monday '+DateTime.now().day.toString());
}
@override
Widget build(BuildContext contexvoidt) {
return RefreshIndicator(
onRefresh: () {
print('下拉refresh');
return serverFutureDo().then((value) {
// Provider.of<TimeProvider>(context, listen: false).updateTimetable(); //
});
},
child: GestureDetector(
onHorizontalDragEnd: (details) {
teamController.getWorks().then((value) {
workList = value;
setState(() {});
});
if (details.primaryVelocity! > 0) {
//
setState(() {
showWeek--;
currentWeekDayIndex -= 7;
dataCaculateAfterFutherDo();
// updateDateByWeekCount();
});
} else if (details.primaryVelocity! < 0) {
//
setState(() {
showWeek++;
currentWeekDayIndex += 7;
dataCaculateAfterFutherDo();
// updateDateByWeekCount();
});
}
},
child: Column(
mainAxisAlignment: MainAxisAlignment.start, //
children: [
SizedBox(
//
//
child: GridView.builder(
shrinkWrap: true,
//
physics: NeverScrollableScrollPhysics(),
//
itemCount: 8,
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 8, childAspectRatio: 1 / 1),
//
itemBuilder: (BuildContext context, int index) {
//item
return Container(
color: index == this.currentWeekDayIndex
? Color(0xf7f7f7) //
: Colors.white,
child: Center(
child: index == 0
? Column(
//
mainAxisAlignment: MainAxisAlignment.center,
children: [
if(showWeek>0 && showWeek<Setting.termAllWeekCout)
Container(
// height: 10,
// width: 6,
child: Text(
'' +
showWeek.toString() +
'', //
style: TextStyle(
fontSize: 12,
color: currentWeek ==
showWeek //
? Colors.amber
: Colors.black87)),
),
Container(
// height: 10,
// width: 6,
child: Text(
showMonth.toString() + '', //
style: TextStyle(
fontSize: 12,
color: currentWeek ==
showWeek //
? Colors.amber
: Colors.black87)),
),
],
)
: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(weekList[index - 1], //
style: TextStyle(
fontSize: 14,
color: index ==
currentWeekDayIndex //
? Colors.lightBlue
: Colors.black87)),
SizedBox(
height: 5,
),
Text(dateListstr[index - 1], //
style: TextStyle(
fontSize: 12,
color: index ==
currentWeekDayIndex //
? Colors.lightBlue
: Colors.black87)),
],
),
),
);
}),
),
//stack
Expanded(
child: SingleChildScrollView(
child: Row(
return Consumer<TimeProvider>(builder: (ctx, timePro, child) {
print('Rebuild timePro');
return FutureBuilder<void>(
future: futureDo(),
builder: (BuildContext context, AsyncSnapshot snapshot) {
//
if (snapshot.connectionState == ConnectionState.done) {
if (firstInit == 0) {
//
dataInitAfterFutherDo();
firstInit = 1;
} else {
//
updateAfterFutherDo();
}
return RefreshIndicator(
onRefresh: () {
print('下拉refresh');
return futureDo().then((value) => setState(() {}));
},
child: GestureDetector(
onHorizontalDragEnd: (details) {
if (details.primaryVelocity! > 0) {
//
setState(() {
weekCount--;
updateDateByWeekCount();
});
} else if (details.primaryVelocity! < 0) {
//
setState(() {
weekCount++;
updateDateByWeekCount();
});
}
},
child: Column(
mainAxisAlignment: MainAxisAlignment.start, //
children: [
//stack
Container(
width: Setting.deviceWidth,
height: 2000,
child: Stack(
alignment: Alignment.center,
children: [
// Stack
Positioned(
top: 0,
left: 0,
child: Container(
width: Setting.deviceWidth,
height: 2000,
child: Stack(
children: List.generate(
//
positions.length,
(index) => Positioned(
top: positions[index].dy,
left: positions[index].dx,
child: Row(
SizedBox(
//
//
child: GridView.builder(
shrinkWrap: true,
//
physics: NeverScrollableScrollPhysics(),
//
itemCount: 8,
gridDelegate:
SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 8, childAspectRatio: 1 / 1),
//
itemBuilder: (BuildContext context, int index) {
//item
return Container(
color: index == this.currentWeekDayIndex
? Color(0xf7f7f7) //
: Colors.white,
child: Center(
child: index == 0
? Column(
//
mainAxisAlignment:
MainAxisAlignment.center,
children: [
Text(
TimetableWidgetController
.timePoints[index].hour
.toString()
.padLeft(2, '0') +
':' +
TimetableWidgetController
.timePoints[index].minute
.toString()
.padLeft(2, '0'),
),
Container(
//
width: Setting.deviceWidth * 0.04,
height: 10,
decoration: BoxDecoration(
shape: BoxShape.circle,
border: Border.all(
color: Colors.amber,
width: 2,
),
),
// height: 10,
// width: 6,
child: Text(
'' +
weekCount.toString() +
'', //
style: TextStyle(
fontSize: 12,
color: currentWeek ==
weekCount //
? Colors.amber
: Colors.black87)),
),
Container(
//线
width: Setting.deviceWidth * 0.90,//old:0.84
height: 2,
color: Colors.lightBlue),
],
)
: Column(
mainAxisAlignment:
MainAxisAlignment.center,
children: [
Text(weekList[index - 1], //
style: TextStyle(
fontSize: 14,
color: index ==
currentWeekDayIndex //
? Colors.lightBlue
: Colors.black87)),
SizedBox(
height: 5,
),
Text(dateListstr[index - 1], //
style: TextStyle(
fontSize: 12,
color: index ==
currentWeekDayIndex //
? Colors.lightBlue
: Colors.black87)),
],
),
),
),
),
)),
//Stack
),
);
}),
),
//stack
Expanded(
child: SingleChildScrollView(
child: Row(
children: [
//stack
Container(
constraints:
BoxConstraints.expand(), // 使constraints
// width: 390,
// height: 2000,
child: Stack(
children: List.generate(
timeBlockWeekMap.containsKey(showWeek)
? timeBlockWeekMap[showWeek]!.length
: 0,
(index) {
var currentItem =
timeBlockWeekMap[showWeek]![index];
return Positioned(
top: timetableWidgetController
.getdy(currentItem),
left: timetableWidgetController
.getdx(currentItem) +
Setting.deviceWidth * 0.15,
child: SingleChildScrollView(
child: Container(
width: Setting.deviceWidth * 0.115,
height: timetableWidgetController
.getHeight(currentItem),
decoration: BoxDecoration(
color: getItemColor(currentItem),
borderRadius: BorderRadius.all(
Radius.circular(10.0),
),
),
child: SingleChildScrollView(
child: Column(
width: deviceWidth,
height: 2000,
child: Stack(
alignment: Alignment.center,
children: [
// Stack
Positioned(
top: 0,
left: 0,
child: Container(
width: deviceWidth,
height: 2000,
child: Stack(
children: List.generate(
//
positions.length,
(index) => Positioned(
top: positions[index].dy,
left: positions[index].dx,
child: Row(
children: [
if (currentItem is Course)
CouresBlockContenWidget(
currentItem: currentItem),
if (currentItem is Task)
TaskBlockContentWidget(
currentItem: currentItem),
if (currentItem is Work)
WorkBlockContentWidget(
currentItem: currentItem),
Text(
timePoints[index]
.hour
.toString()
.padLeft(2, '0') +
':' +
timePoints[index]
.minute
.toString()
.padLeft(2, '0'),
),
Container(
width: deviceWidth * 0.04,
height: 10,
decoration: BoxDecoration(
shape: BoxShape.circle,
border: Border.all(
color: Colors.amber,
width: 2,
),
),
),
Container(
width: deviceWidth * 0.84,
height: 2,
color: const Color.fromARGB(
255, 136, 61, 61),
),
],
),
),
),
),
);
},
),
))
)),
//Stack
Container(
constraints: BoxConstraints
.expand(), // 使constraints
// width: 390,
// height: 2000,
child: Stack(
children: List.generate(
timeBlockWeekMap
.containsKey(weekCount)
? timeBlockWeekMap[weekCount]!
.length
: 0,
(index) {
var currentItem = timeBlockWeekMap[
weekCount]![index];
return Positioned(
top: timetableWidgetController
.getdy(currentItem) +
10,
left: timetableWidgetController
.getdx(currentItem) +
deviceWidth * 0.15,
child: SingleChildScrollView(
child: Container(
width: deviceWidth * 0.115,
height:
timetableWidgetController
.getHeight(
currentItem),
decoration: BoxDecoration(
color: getItemColor(
currentItem),
borderRadius:
BorderRadius.all(
Radius.circular(10.0),
),
),
child: SingleChildScrollView(
child: Column(
children: [
if (currentItem
is Course)
CouresBlockContenWidget(
currentItem:
currentItem),
if (currentItem is Task)
TaskBlockContentWidget(
currentItem:
currentItem),
if (currentItem is Work)
WorkBlockContentWidget(
currentItem:
currentItem),
],
),
),
),
),
);
},
),
))
],
),
),
],
),
),
))
],
),
))
],
),
),
);
),
);
} else {
return Center(
child: CircularProgressIndicator(),
);
}
});
});
}
//
@ -437,36 +406,8 @@ class TimetableWidgetState extends State<TimetableWidget> {
}
}
class ShowTimeTextWidget extends StatelessWidget {
const ShowTimeTextWidget({super.key, required this.currentItem});
final currentItem;
@override
Widget build(BuildContext context) {
return ListBody(
children: <Widget>[
Text(
'开始时间: ${currentItem.startTime.year}' +
'${currentItem.startTime.month}' +
'${currentItem.startTime.day.toString().padLeft(2, '0')}' +
'${currentItem.startTime.hour.toString().padLeft(2, '0')}' +
':${currentItem.startTime.minute.toString().padLeft(2, '0')}',
),
Text(
'结束时间: ${currentItem.endTime.year}' +
'${currentItem.endTime.month}' +
'${currentItem.endTime.day.toString().padLeft(2, '0')}' +
'${currentItem.endTime.hour.toString().padLeft(2, '0')}' +
':${currentItem.endTime.minute.toString().padLeft(2, '0')}',
)
],
);
}
}
class BlockGestureWidget extends StatelessWidget {
BlockGestureWidget({
const BlockGestureWidget({
super.key,
required this.currentItem,
required this.blockGestureWidgetChilld,
@ -490,29 +431,19 @@ class BlockGestureWidget extends StatelessWidget {
child: ListBody(
children: <Widget>[
if (currentItem is Course) ...{
Text(
'老师: ${currentItem.teacher == '' || currentItem.teacher == null ? "" : currentItem.teacher}'),
Text(
'地点: ${currentItem.location == '' || currentItem.location == null ? "" : currentItem.location}'),
ShowTimeTextWidget(currentItem: currentItem),
Text(
'学分: ${currentItem.credit == -1 || currentItem.credit == null ? "" : currentItem.credit.toString()}'),
Text(
'备注: ${currentItem.remark == '' || currentItem.remark == null ? "" : currentItem.remark}'),
Text('老师: ${(currentItem as Course).teacher ?? ""}'),
Text('地点: ${(currentItem as Course).location ?? ""}'),
Text('开始时间: ${(currentItem as Course).startTime.toString()}'),
Text('结束时间: ${(currentItem as Course).endTime.toString()}'),
Text('备注: ${(currentItem as Course).remark ?? ""}'),
} else if (currentItem is Task) ...{
Text(
'内容: ${currentItem.content == "" || currentItem.content == null ? "" : currentItem.content}'),
ShowTimeTextWidget(currentItem: currentItem),
Text('内容: ${(currentItem as Task).content ?? ""}'),
Text('开始时间: ${(currentItem as Task).startTime.toString()}'),
Text('结束时间: ${(currentItem as Task).endTime.toString()}'),
} else if (currentItem is Work) ...{
//0
// Text('团队名: ${(currentItem as Work).ge ?? ""}'),
if ((currentItem as Work).teamName != null) ...{
Text(
'团队名: ${currentItem.teamName == "" || currentItem.teamName == null ? "" : currentItem.teamName}'),
},
Text(
'工作内容: ${currentItem.content == "" || currentItem.content == null ? "" : currentItem.content}'),
ShowTimeTextWidget(currentItem: currentItem),
Text('工作内容: ${(currentItem as Work).workContent ?? ""}'),
Text('开始时间: ${(currentItem as Work).startTime.toString()}'),
Text('结束时间: ${(currentItem as Work).endTime.toString()}'),
}
],
),
@ -540,53 +471,12 @@ class BlockGestureWidget extends StatelessWidget {
mainAxisSize: MainAxisSize.min,
children: [
ElevatedButton(
onPressed: () async {
//
Navigator.of(context).pop(); //
onPressed: () {
// TODO:
if (currentItem is Course) {
// AddCourseFormWidget
await Navigator.push(
context,
MaterialPageRoute(
builder: (context) {
return AddCourseRoute(exitCourse: currentItem);
},
),
);
Setting.timetableWidgetKey!.currentState!
.localFutureDo();
} else if (currentItem is Task) {
// AddTaskFormWidget
await Navigator.push(
context,
MaterialPageRoute(
builder: (context) {
return AddScheduleRoute(
exitSchedule: currentItem,
scheduleType: 'task');
},
),
);
Setting.timetableWidgetKey!.currentState!
.localFutureDo();
} else {
// AddWorkFormWidget
await Navigator.push(
context,
MaterialPageRoute(
builder: (context) {
return AddScheduleRoute(
exitSchedule: currentItem,
scheduleType: 'work',
teamId: (currentItem as Work).getTeamId);
},
),
);
Setting.timetableWidgetKey!.currentState!
.localFutureDo();
Setting.timetableWidgetKey!.currentState!
.serverFutureDo();
}
} else {}
Navigator.of(context).pop();
},
child: Text('编辑'),
),
@ -595,61 +485,16 @@ class BlockGestureWidget extends StatelessWidget {
// TODO:
if (currentItem is Course) {
CourseController()
.deleteCourse((currentItem as Course).getCourseId)
.then((value) {
// Provider.of<TimeProvider>(context, listen: false).updateTimetable(); //
// Navigator.of(context).pop()
Setting.timetableWidgetKey!.currentState!
.localFutureDo();
});
.deleteCourse((currentItem as Course).getCourseId);
} else if (currentItem is Task) {
TaskController()
.deleteTaskByTaskid((currentItem as Task).getTaskId)
.then((value) {
// Provider.of<TimeProvider>(context, listen: false).updateTimetable(); //
// Navigator.of(context).pop()
Setting.timetableWidgetKey!.currentState!
.localFutureDo();
});
} else {
TeamController()
.deleteWorkByWorkId((currentItem as Work).getWorkId)
.then((value) {
// Provider.of<TimeProvider>(context, listen: false).updateTimetable(); //
// Navigator.of(context).pop()
Setting.timetableWidgetKey!.currentState!
.localFutureDo();
Setting.timetableWidgetKey!.currentState!
.serverFutureDo();
});
}
TaskController().deleteTaskByTaskid(
(currentItem as Task).getTaskId);
} else {}
Navigator.of(context).pop();
},
child: Text('删除'),
),
Visibility(
visible: currentItem is Task,
child: ElevatedButton(
child:Text("进入番茄时钟"),
onPressed:(){
Navigator.of(context).pop();
Navigator.push(
context,
MaterialPageRoute(
builder: (context) {
int time=(currentItem as Task).getEndTime.difference((currentItem as Task).getStartTime).inMinutes;
double selectedDuration=time.toDouble();
return TomatoClockRoute(flag:(currentItem as Task).getId as int,selectedDuration:selectedDuration);
},
),
);
}
)
)
SizedBox(height: 10),
],
),
);
@ -698,38 +543,30 @@ class CouresBlockContenWidget extends StatelessWidget {
overflow: TextOverflow.clip,
),
Text(
(currentItem as Course).startTime.hour.toString().padLeft(2, '0') +
(currentItem as Course).startTime.hour.toString() +
':' +
(currentItem as Course)
.startTime
.minute
.toString()
.padLeft(2, '0'),
(currentItem as Course).startTime.minute.toString(),
style: TextStyle(
fontSize: 10,
),
overflow: TextOverflow.clip,
),
Text(
(currentItem as Course).endTime.hour.toString().padLeft(2, '0') +
(currentItem as Course).endTime.hour.toString() +
':' +
(currentItem as Course)
.endTime
.minute
.toString()
.padLeft(2, '0'),
(currentItem as Course).endTime.minute.toString(),
style: TextStyle(
fontSize: 10,
),
overflow: TextOverflow.clip,
),
Text(
(currentItem as Course).remark,
style: TextStyle(
fontSize: 10,
),
overflow: TextOverflow.clip,
),
// Text( //
// (currentItem as Course).remark,
// style: TextStyle(
// fontSize: 10,
// ),
// overflow: TextOverflow.clip,
// ),
],
),
);
@ -766,22 +603,14 @@ class TaskBlockContentWidget extends StatelessWidget {
overflow: TextOverflow.clip,
),
Text(
(currentItem as Task).startTime.hour.toString().padLeft(2, '0') +
':' +
(currentItem as Task)
.startTime
.minute
.toString()
.padLeft(2, '0'),
(currentItem as Task).startTime.toString(),
style: TextStyle(
fontSize: 10,
),
overflow: TextOverflow.clip,
),
Text(
(currentItem as Task).endTime.hour.toString().padLeft(2, '0') +
':' +
(currentItem as Task).endTime.minute.toString().padLeft(2, '0'),
(currentItem as Task).endTime.toString(),
style: TextStyle(
fontSize: 10,
),
@ -816,29 +645,21 @@ class WorkBlockContentWidget extends StatelessWidget {
overflow: TextOverflow.clip,
),
Text(
currentItem.content,
currentItem.workContent,
style: TextStyle(
fontSize: 8,
),
overflow: TextOverflow.clip,
),
Text(
(currentItem as Work).startTime.hour.toString().padLeft(2, '0') +
':' +
(currentItem as Work)
.startTime
.minute
.toString()
.padLeft(2, '0'),
currentItem.startTime.toString(),
style: TextStyle(
fontSize: 10,
),
overflow: TextOverflow.clip,
),
Text(
(currentItem as Work).endTime.hour.toString().padLeft(2, '0') +
':' +
(currentItem as Work).endTime.minute.toString().padLeft(2, '0'),
currentItem.endTime.toString(),
style: TextStyle(
fontSize: 10,
),

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save