Compare commits
3 Commits
zhangrensh
...
master
| Author | SHA1 | Date |
|---|---|---|
|
|
8e3b8b4fe9 | 2 years ago |
|
|
6247772218 | 2 years ago |
|
|
b030002cfb | 2 years ago |
@ -1,54 +0,0 @@
|
||||
# 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
|
||||
|
||||
|
||||
|
After Width: | Height: | Size: 64 KiB |
|
After Width: | Height: | Size: 10 KiB |
|
After Width: | Height: | Size: 10 KiB |
|
After Width: | Height: | Size: 10 KiB |
|
After Width: | Height: | Size: 10 KiB |
|
After Width: | Height: | Size: 10 KiB |
|
After Width: | Height: | Size: 7.1 KiB |
|
After Width: | Height: | Size: 372 KiB |
|
After Width: | Height: | Size: 90 KiB |
|
After Width: | Height: | Size: 266 KiB |
|
After Width: | Height: | Size: 1.2 MiB |
|
After Width: | Height: | Size: 192 KiB |
|
After Width: | Height: | Size: 1.4 MiB |
|
After Width: | Height: | Size: 1.9 MiB |
@ -0,0 +1,134 @@
|
||||
/*
|
||||
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;
|
||||
|
After Width: | Height: | Size: 243 KiB |
|
After Width: | Height: | Size: 179 KiB |
|
After Width: | Height: | Size: 279 KiB |
|
After Width: | Height: | Size: 61 KiB |
|
After Width: | Height: | Size: 61 KiB |
|
After Width: | Height: | Size: 61 KiB |
|
After Width: | Height: | Size: 61 KiB |
|
After Width: | Height: | Size: 61 KiB |
|
After Width: | Height: | Size: 1.0 MiB |
@ -1,105 +1,133 @@
|
||||
import 'package:timemanagerapp/entity/ScheduleForm.dart';
|
||||
|
||||
import '../database/dao/WorkDao.dart';
|
||||
import '../entity/Work.dart';
|
||||
import '../setting/Setting.dart';
|
||||
import '../util/dataUtil.dart';
|
||||
import 'NetWorkController.dart';
|
||||
|
||||
class WorkController {
|
||||
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) {
|
||||
// // 使用Work类的构造函数从Map创建Work对象
|
||||
// Work work = Work(
|
||||
// id: WorkMap['id'],
|
||||
// userId: WorkMap['userId'],
|
||||
// content: WorkMap['content'],
|
||||
// WorkId: WorkMap['WorkId'],
|
||||
// name: WorkMap['name'],
|
||||
// startTime: DateTime.parse(WorkMap['startTime']),
|
||||
// endTime: DateTime.parse(WorkMap['endTime']),
|
||||
// );
|
||||
// Works.add(Work);
|
||||
// }
|
||||
// WorkList = Works; // 将Work对象添加到列表中
|
||||
return WorkList;
|
||||
}
|
||||
|
||||
//addscheduleForm
|
||||
Future<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);
|
||||
// }
|
||||
|
||||
}
|
||||
// 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) {
|
||||
// // 使用Work类的构造函数从Map创建Work对象
|
||||
// Work work = Work(
|
||||
// id: workMap['id'],
|
||||
// userId: workMap['userId'],
|
||||
// content: workMap['content'],
|
||||
// workId: workMap['workId'],
|
||||
// name: workMap['name'],
|
||||
// startTime: DateTime.parse(workMap['startTime']),
|
||||
// endTime: DateTime.parse(workMap['endTime']),
|
||||
// status: workMap['status'],
|
||||
// teamId: workMap['teamId'],
|
||||
// );
|
||||
// Works.add(work);
|
||||
// }
|
||||
// WorkList = Works; // 将Work对象添加到列表中
|
||||
// return WorkList;
|
||||
// }
|
||||
//
|
||||
// //addscheduleForm
|
||||
// Future<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;
|
||||
// }
|
||||
//
|
||||
// //模仿Task的数数据操作写work
|
||||
// //query
|
||||
// Future<List<Work>> getWorkList() async {
|
||||
// List<Map<String, dynamic>> workMaps = await WorkDao().getWorks();
|
||||
// List<Work> workList = []; // 用于存储转换后的Work对象列表
|
||||
//
|
||||
// for (var workMap in workMaps) {
|
||||
// // 使用Work类的构造函数从Map创建Work对象
|
||||
// Work work = Work(
|
||||
// id: workMap['id'],
|
||||
// userId: workMap['userId'],
|
||||
// content: workMap['content'],
|
||||
// workId: workMap['workId'],
|
||||
// name: workMap['name'],
|
||||
// startTime: DateTime.parse(workMap['startTime']),
|
||||
// endTime: DateTime.parse(workMap['endTime']),
|
||||
// status: workMap['status'],
|
||||
// teamId: workMap['teamId'],
|
||||
// );
|
||||
// workList.add(work);
|
||||
// }
|
||||
// WorkList = workList; // 将Work对象添加到列表中
|
||||
// return WorkList;
|
||||
// }
|
||||
//
|
||||
// // //delete 模仿Task的数数据操作
|
||||
// // Future<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);
|
||||
// }
|
||||
//
|
||||
//
|
||||
//
|
||||
// }
|
||||
@ -0,0 +1,83 @@
|
||||
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)';
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,20 @@
|
||||
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();
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,20 @@
|
||||
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();
|
||||
}
|
||||
}
|
||||
@ -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,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: UserSettingWidgt(),
|
||||
);
|
||||
}
|
||||
}
|
||||
// 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(),
|
||||
// );
|
||||
// }
|
||||
// }
|
||||
@ -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(),
|
||||
// ),
|
||||
// );
|
||||
// }
|
||||
// }
|
||||
|
||||
@ -0,0 +1,132 @@
|
||||
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();
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,135 @@
|
||||
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('提交'),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,80 @@
|
||||
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,27 +0,0 @@
|
||||
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,89 +0,0 @@
|
||||
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,
|
||||
);
|
||||
},
|
||||
),
|
||||
);
|
||||
},
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
],
|
||||
);
|
||||
},
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||