时间表日期延迟解决

develop
LRC 3 years ago
parent b65c9fa3b4
commit 4f45779972

@ -5,14 +5,15 @@ import 'package:timemanagerapp/entity/Task.dart';
import '../entity/Course.dart';
import '../entity/Course.dart';
import '../entity/FreeTime.dart';
import '../entity/Team.dart';
import '../entity/User.dart';
import '../entity/Work.dart';
class NetWorkController {
String baseUrl = "http://192.168.111.226:3000/";
// String baseUrl = "http://5902e9v900.zicp.fun:30002/";
// String baseUrl = "http://192.168.111.226:3000/";
String baseUrl = "http://5902e9v900.zicp.fun:30002/";
// String baseUrl = "http://5902e9v900.zicp.fun:3000/";
//--------------------------------------------------
@ -309,9 +310,9 @@ class NetWorkController {
}
//server todo
Future<List<Work>?> getSameFreeWork(int teamid) async {
Future<List<FreeTime>?> getFreeTime(int teamid) async {
final response = await http.get(
Uri.parse(baseUrl + 'same_free_work').replace(queryParameters: {'teamid': teamid.toString()}),
Uri.parse(baseUrl + 'get_freeTime').replace(queryParameters: {'teamId': teamid.toString()}),
headers: <String, String>{
'Content-Type': 'application/json; charset=UTF-8',
},
@ -319,10 +320,10 @@ class NetWorkController {
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>))
List<FreeTime> freeTimeList = (jsonResponse['data'] as List)
.map((freeTime) => FreeTime.fromJson(freeTime as Map<String, dynamic>))
.toList();
return teamWorkList;
return freeTimeList;
} else {
return null;
}

@ -1,6 +1,7 @@
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';
@ -90,6 +91,10 @@ class TeamController {
// }
Future<bool> deleteTeam(int teamid) async {
List<User> memberList = await getTeamUserList(teamid);
for(User user in memberList){
deleteTeamUser(teamid, user.getId!);
}
return await netWorkController.deleteTeam(teamid);
}
@ -230,8 +235,8 @@ class TeamController {
// await netWorkController.u(work);
// }
Future<List<Work>> getSameFreeWork(int teamid)async{
var res = await netWorkController.getSameFreeWork(teamid);
Future<List<FreeTime>> getFreeTime(int teamid)async{
var res = await netWorkController.getFreeTime(teamid);
if(res == null){
return [];
}else{

@ -9,6 +9,26 @@ class TimetableWidgetController {
late int weekCount;
late DateTime termStartDate;
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),
];
TimetableWidgetController() {
mondayTime = getmondayTime();
termStartDate = Setting.startdate;
@ -49,7 +69,7 @@ class TimetableWidgetController {
return mondayTime;
}
Map<int, List> transformCourseMap(List blockList) {
Map<int, List> transformTimeBlockMap(List blockList) {
Map<int, List> timeblockMap = {};
for (var timeBlock in blockList) {
int weekCount = timeBlock.startTime.difference(termStartDate).inDays ~/ 7 + 1; //

@ -2,9 +2,12 @@ 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';
/**
*
@ -38,6 +41,17 @@ class UserController {
return false;
}
await Setting.saveUser(user);
//
if(Setting.initFlag) {
//
await MyDatabase.reBuildDatabase();
print('从服务器初始化');
await CourseController().init();
await TaskController().init();
await Setting.saveInitFlag(false);
}
return true;
}
@ -51,7 +65,8 @@ class UserController {
print('注册失败');
return false;
}
await Setting.saveUser(postUser);
//
// await Setting.saveUser(postUser);
//todo:
return true;
}

@ -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,512 @@
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 '../provider/TimeProvider.dart';
import '../setting/Setting.dart';
class FreeTimetableWidget extends StatefulWidget {
FreeTimetableWidget({Key ? key,required this.team}) : super(key: key);
final double deviceWidth = Setting.deviceWidth;
final Team team;
@override
State<StatefulWidget> createState() =>
FreeTimetableWidgetState(deviceWidth: deviceWidth,team: team);
}
class FreeTimetableWidgetState extends State<FreeTimetableWidget> {
FreeTimetableWidgetState({required this.deviceWidth,required this.team});
late double deviceWidth;
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
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, 12, 30),
DateTime(2023, 9, 22, 13, 30),
DateTime(2023, 9, 22, 15, 5), // 8:00 AM
DateTime(2023, 9, 22, 15, 35), // 12:30 PM
DateTime(2023, 9, 22, 17, 10),
DateTime(2023, 9, 22, 18, 30),
DateTime(2023, 9, 22, 19, 15), // 8:00 AM
DateTime(2023, 9, 22, 20, 5), // 12:30 PM
DateTime(2023, 9, 22, 20, 55),
DateTime(2023, 9, 22, 21, 40),
];
//Offset
var positions = [];
bool loading = true;
Future<void> serverFutureDo() async {
print('开始serverFutureDo');
//
freeTimeBlockList = await teamController.getFreeTime(team.getId!);
dataCaculateAfterFutherDo();
print('serverFutureDo 完成');
setState(() {});
}
//
@override
initState() {
super.initState();
//
freeTimeBlockWeekMap = {};
freeTimeBlockList = [];
//
currentWeek = timetableWidgetController.getWeekCount();
showWeek = currentWeek;
// 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(timePoints, deviceWidth);
}
@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){
// Provider.of<TimeProvider>(context, listen: false).updateTimetable(); //
});
},
child: GestureDetector(
onHorizontalDragEnd: (details) {
// teamController.getFreeTime(tea).then((value){
// workList = value;
// setState(() {
//
// });
// });
serverFutureDo();
if (details.primaryVelocity! > 0) {
//
setState(() {
showWeek--;
});
} else if (details.primaryVelocity! < 0) {
//
setState(() {
showWeek++;
});
}
},
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: [
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: 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: [
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: 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) +
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: [
FreeTimeBlockContenWidget(
currentItem:
currentItem),
],
),
),
),
),
);
},
),
))
],
),
),
],
),
))
],
),
),
);
;
}),
);
}
//
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,
});
final currentItem;
final blockGestureWidgetChilld;
@override
Widget build(BuildContext context) {
return GestureDetector(
onTap: () {
//
showDialog(
context: context,
builder: (BuildContext context) {
return AlertDialog(
// currentItem
title: Text(currentItem.name),
content: SingleChildScrollView(
child: ListBody(
children: <Widget>[
if (currentItem is FreeTime) ...{
ShowTimeTextWidget(currentItem: currentItem),
}
],
),
),
actions: <Widget>[
TextButton(
child: Text('关闭'),
onPressed: () {
Navigator.of(context).pop();
},
),
],
);
},
);
},
child: blockGestureWidgetChilld,
);
}
}
class FreeTimeBlockContenWidget extends StatelessWidget {
const FreeTimeBlockContenWidget({
super.key,
required this.currentItem,
});
final currentItem;
@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: 10,
),
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: 10,
),
overflow: TextOverflow.clip,
),
],
),
);
}
}

@ -184,7 +184,8 @@ class _HomeWidgetState extends State<HomeWidget> {
);
} else {
//退
Setting.saveUser(Setting.nullUser);
await Setting.saveUser(Setting.nullUser);
await Setting.saveInitFlag(true);
}
setState(() {});
timetableWidgetKey.currentState!.localFutureDo();
@ -207,7 +208,8 @@ class _HomeWidgetState extends State<HomeWidget> {
);
} else {
//退
Setting.saveUser(Setting.nullUser);
await Setting.saveUser(Setting.nullUser);
await Setting.saveInitFlag(true);
}
setState(() {});
timetableWidgetKey.currentState!.localFutureDo();

@ -23,15 +23,7 @@ class _LoginWidgetState extends State<LoginWidget> {
String password = passwordController.text;
bool res = await userController.login(User(username: username, password: password, role: 0));
if(res) {
//
if(Setting.initFlag) {
print('从服务器初始化');
await Setting.saveInitFlag(false);
await CourseController().init();
await TaskController().init();
Provider.of<TimeProvider>(context, listen: false).updateTimetable(); //
}
Provider.of<TimeProvider>(context, listen: false).updateTimetable(); //
Navigator.pop(context);
}else{
showDialog(

@ -3,6 +3,7 @@ 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';
@ -93,6 +94,37 @@ class TeamWidgetState extends State<TeamWidget> {
},
);
},
onLongPress: () {
//
showDialog(
context: context,
builder: (BuildContext context) {
return AlertDialog(
title: Text(team.getTeamName),
content: Column(
mainAxisSize: MainAxisSize.min,
children: [
ElevatedButton(
onPressed: () {
//
Navigator.push(
context,
MaterialPageRoute(
builder: (context) {
return FreeTimetableWidget(team: team);
},
),
);
},
child: Text('查看团队空闲时间'),
),
SizedBox(height: 10),
],
),
);
},
);
},
child: Text(team.teamName), //
),
trailing: Row(
@ -159,6 +191,7 @@ class TeamWidgetState extends State<TeamWidget> {
children: [
ListTile(
//
//
leading: Icon(Icons.group), // icon
title: GestureDetector(
onTap: () {
@ -189,6 +222,37 @@ class TeamWidgetState extends State<TeamWidget> {
},
);
},
onLongPress: () {
//
showDialog(
context: context,
builder: (BuildContext context) {
return AlertDialog(
title: Text(team.getTeamName),
content: Column(
mainAxisSize: MainAxisSize.min,
children: [
ElevatedButton(
onPressed: () {
//
Navigator.push(
context,
MaterialPageRoute(
builder: (context) {
return FreeTimetableWidget(team: team);
},
),
);
},
child: Text('查看团队空闲时间'),
),
SizedBox(height: 10),
],
),
);
},
);
},
child: Text(team.teamName), //
),
trailing: Row(

@ -62,23 +62,7 @@ class TimetableWidgetState extends State<TimetableWidget> {
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, 12, 30),
DateTime(2023, 9, 22, 13, 30),
DateTime(2023, 9, 22, 15, 5), // 8:00 AM
DateTime(2023, 9, 22, 15, 35), // 12:30 PM
DateTime(2023, 9, 22, 17, 10),
DateTime(2023, 9, 22, 18, 30),
DateTime(2023, 9, 22, 19, 15), // 8:00 AM
DateTime(2023, 9, 22, 20, 5), // 12:30 PM
DateTime(2023, 9, 22, 20, 55),
DateTime(2023, 9, 22, 21, 40),
];
//Offset
var positions = [];
@ -149,7 +133,7 @@ class TimetableWidgetState extends State<TimetableWidget> {
timeBlockList.addAll(taskList);
timeBlockList.addAll(workList);
timeBlockWeekMap =
timetableWidgetController.transformCourseMap(timeBlockList);
timetableWidgetController.transformTimeBlockMap(timeBlockList);
@ -169,7 +153,7 @@ class TimetableWidgetState extends State<TimetableWidget> {
}
//
positions =
timetableWidgetController.convertTimeList(timePoints, deviceWidth);
timetableWidgetController.convertTimeList(TimetableWidgetController.timePoints, deviceWidth);
}
@ -182,7 +166,7 @@ class TimetableWidgetState extends State<TimetableWidget> {
timeBlockList.addAll(workList);
timeBlockWeekMap =
timetableWidgetController.transformCourseMap(timeBlockList); //
timetableWidgetController.transformTimeBlockMap(timeBlockList); //
var mondayTime = timetableWidgetController.getmondayTime();
@ -198,7 +182,7 @@ class TimetableWidgetState extends State<TimetableWidget> {
}
//
positions =
timetableWidgetController.convertTimeList(timePoints, deviceWidth);
timetableWidgetController.convertTimeList(TimetableWidgetController.timePoints, deviceWidth);
// print('Recent monday '+DateTime.now().day.toString());
}
@ -238,12 +222,14 @@ class TimetableWidgetState extends State<TimetableWidget> {
//
setState(() {
showWeek--;
dataCaculateAfterFutherDo();
// updateDateByWeekCount();
});
} else if (details.primaryVelocity! < 0) {
//
setState(() {
showWeek++;
dataCaculateAfterFutherDo();
// updateDateByWeekCount();
});
}
@ -361,12 +347,12 @@ class TimetableWidgetState extends State<TimetableWidget> {
child: Row(
children: [
Text(
timePoints[index]
TimetableWidgetController.timePoints[index]
.hour
.toString()
.padLeft(2, '0') +
':' +
timePoints[index]
TimetableWidgetController.timePoints[index]
.minute
.toString()
.padLeft(2, '0'),
@ -624,7 +610,7 @@ class BlockGestureWidget extends StatelessWidget {
if (currentItem is Course) {
CourseController()
.deleteCourse((currentItem as Course).getCourseId).then((value){
Provider.of<TimeProvider>(context, listen: false).updateTimetable(); //
// Provider.of<TimeProvider>(context, listen: false).updateTimetable(); //
// Navigator.of(context).pop()
});

Loading…
Cancel
Save