From d60e305c23abcc2f1564c4ce08dfb103eba2e13e Mon Sep 17 00:00:00 2001 From: ChinaGamer <1742968988@qq.com> Date: Wed, 24 Nov 2021 17:32:08 +0800 Subject: [PATCH] =?UTF-8?q?=E8=8E=B7=E5=8F=96=E7=9A=84bug=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- images/g.png | Bin 0 -> 44521 bytes lib/common/get.dart | 84 +++---- lib/common/login.dart | 31 ++- lib/config.dart | 21 +- lib/data.dart | 11 + lib/main.dart | 1 - lib/pages/career.dart | 9 + lib/pages/home.dart | 56 ++++- lib/pages/info.dart | 6 +- lib/pages/init.dart | 2 +- lib/pages/mine.dart | 1 - lib/pages/query.dart | 413 ++++++++++++++++++++-------------- lib/pages/queryexam.dart | 211 ++++++++++------- lib/pages/schedulemanage.dart | 24 +- lib/pages/setting.dart | 56 ++++- lib/pages/update.dart | 90 ++++++-- lib/widget/bars.dart | 32 +++ lib/widget/dialog.dart | 166 ++++++++++++-- lib/widget/lists.dart | 30 ++- pubspec.yaml | 8 +- 20 files changed, 854 insertions(+), 398 deletions(-) create mode 100644 images/g.png diff --git a/images/g.png b/images/g.png new file mode 100644 index 0000000000000000000000000000000000000000..a1abc6c26e4d1182611f257e49b775f6b1eb4c13 GIT binary patch literal 44521 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%0Db}cx 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 literal 0 HcmV?d00001 diff --git a/lib/common/get.dart b/lib/common/get.dart index c92006d..9adebfb 100644 --- a/lib/common/get.dart +++ b/lib/common/get.dart @@ -7,14 +7,12 @@ import 'dart:io'; import 'package:gbk2utf8/gbk2utf8.dart'; import 'package:glutassistantn/common/cookie.dart'; import 'package:glutassistantn/common/io.dart'; -import 'package:glutassistantn/widget/lists.dart'; import 'package:html/dom.dart' as dom; import 'package:html/parser.dart'; import 'package:http/http.dart'; import '../config.dart'; import '../data.dart'; -import 'init.dart'; Future getWeek() async { try { @@ -47,7 +45,7 @@ Future getWeek() async { } } -Future getSchedule() async { +Future getSchedule() async { print("getSchedule..."); Map _schedule = schedule; Map _weekList = { @@ -68,7 +66,7 @@ Future getSchedule() async { .timeout(const Duration(seconds: 3)); if (response.body.contains("j_username")) { print("登录过期"); - return false; + return "fail"; } else { dom.Document document = parse(gbk .decode(response.bodyBytes) @@ -148,18 +146,16 @@ Future getSchedule() async { await writeSchedule(jsonEncode(_schedule)); } print("getSchedule End"); - return true; - } on SocketException catch (e) { - print("超时"); - return false; + return "success"; } on TimeoutException catch (e) { - print("网络错误"); - return false; + print("getExam Error"); + return Global.timeOutError; + } on SocketException catch (e) { + print("getExam Error"); + return Global.socketError; } } -getScheduleErrorR() {} - Future getName() async { print("getName..."); var response = await get(Global.getNameUrl, headers: {"cookie": mapCookieToString()}) @@ -177,7 +173,6 @@ int getLocalWeek(DateTime nowDate, DateTime pastDate) { List getSemester() { int y = DateTime.now().year; - int m = DateTime.now().month; return [ (y - 1980).toString(), ]; @@ -194,38 +189,50 @@ Future getScore() async { "sortColumn": "", "Submit": "查询" }; - var response = - await post(Global.getScoreUrl, body: postData, headers: {"cookie": mapCookieToString()}) - .timeout(const Duration(milliseconds: 6000)); - if (response.headers["location"] == "/academic/common/security/login.jsp") { - return ["登录过期"]; - } - dom.Document document = parse(response.body); - var dataList = document.querySelectorAll(".datalist > tbody >tr"); - List list = []; - for (int i = 1; i < dataList.length; i++) { - List _list = []; - _list.add(dataList[i].querySelectorAll("td")[0].text.trim()); - _list.add(dataList[i].querySelectorAll("td")[1].text.trim()); - _list.add(dataList[i].querySelectorAll("td")[3].text.trim()); - _list.add(dataList[i].querySelectorAll("td")[4].text.trim()); - _list.add(dataList[i].querySelectorAll("td")[5].text.trim()); - _list.add(dataList[i].querySelectorAll("td")[6].text.trim()); - list.add(_list); + try { + var response = + await post(Global.getScoreUrl, body: postData, headers: {"cookie": mapCookieToString()}) + .timeout(const Duration(seconds: 3)); + if (response.headers["location"] == "/academic/common/security/login.jsp") { + return ["登录过期"]; + } + dom.Document document = parse(response.body); + var dataList = document.querySelectorAll(".datalist > tbody >tr"); + List list = []; + for (int i = 1; i < dataList.length; i++) { + List _list = []; + _list.add(dataList[i].querySelectorAll("td")[0].text.trim()); + _list.add(dataList[i].querySelectorAll("td")[1].text.trim()); + _list.add(dataList[i].querySelectorAll("td")[3].text.trim()); + _list.add(dataList[i].querySelectorAll("td")[4].text.trim()); + _list.add(dataList[i].querySelectorAll("td")[5].text.trim()); + _list.add(dataList[i].querySelectorAll("td")[6].text.trim()); + list.add(_list); + } + print("getScore End"); + return list; + } on TimeoutException catch (e) { + print("getScore Error"); + return [Global.timeOutError]; + } on SocketException catch (e) { + print("getScore Error"); + return [Global.socketError]; } - print("getScore End"); - return list; } Future getExam() async { print("getExam"); try { var response = await post(Global.getExamUrl, headers: {"cookie": mapCookieToString()}) - .timeout(const Duration(milliseconds: 6000)); + .timeout(const Duration(seconds: 3)); dom.Document document = parse(gbk.decode(response.bodyBytes)); if (document.querySelector("title")!.text.contains("提示信息")) { return "fail"; } else { + examList = []; + examListC = []; + examListA = 0; + examListB = 0; document = parse(response.body); examList = []; var _row = document.querySelectorAll(".datalist> tbody > tr"); @@ -264,10 +271,10 @@ Future getExam() async { } } on TimeoutException catch (e) { print("getExam Error"); - return "超时" + e.toString(); + return Global.timeOutError; } on SocketException catch (e) { print("getExam Error"); - return "网络连接失败" + e.toString(); + return Global.socketError; } } @@ -275,16 +282,15 @@ Future getCareer() async { print("getCareer"); _next(url) async { var response = await get(Uri.http(Global.jwUrl, url), headers: {"cookie": mapCookieToString()}) - .timeout(const Duration(milliseconds: 6000)); + .timeout(const Duration(seconds: 3)); dom.Document document = parse(gbk.decode(response.bodyBytes)); print(document.querySelectorAll("tr").length); } var response = await get(Global.getCareerUrl, headers: {"cookie": mapCookieToString()}) - .timeout(const Duration(milliseconds: 6000)); + .timeout(const Duration(seconds: 3)); dom.Document document = parse(gbk.decode(response.bodyBytes)); if (gbk.decode(response.bodyBytes).contains("用户名不能为空!")) { - } else { String url = document .querySelectorAll("a")[3] diff --git a/lib/common/login.dart b/lib/common/login.dart index 2baee13..df6415e 100644 --- a/lib/common/login.dart +++ b/lib/common/login.dart @@ -1,3 +1,6 @@ +import 'dart:async'; +import 'dart:io'; + import 'package:glutassistantn/common/cookie.dart'; import 'package:http/http.dart'; @@ -9,11 +12,19 @@ Future codeCheck(String code) async { var postData = { "captchaCode": code, }; - var response = await post(_url, body: postData, headers: {"cookie": mapCookieToString()}) - .timeout(const Duration(milliseconds: 6000)); - String result = "success"; - if (response.body != "true") result = "fail"; - return result; + try { + var response = await post(_url, body: postData, headers: {"cookie": mapCookieToString()}) + .timeout(const Duration(seconds: 3)); + String result = "success"; + if (response.body != "true") result = "fail"; + return result; + } on TimeoutException catch (e) { + print("getExam Error"); + return Global.timeOutError; + } on SocketException catch (e) { + print("getExam Error"); + return Global.socketError; + } } Future login(String username, String password, String code) async { @@ -22,14 +33,18 @@ Future login(String username, String password, String code) async { var postData = {"j_username": username, "j_password": password, "j_captcha": code}; var response = await post(Global.loginUrl, body: postData, headers: {"cookie": mapCookieToString()}) - .timeout(const Duration(milliseconds: 6000)); + .timeout(const Duration(seconds: 3)); if (response.headers['location'] == "/academic/index_new.jsp") { parseRawCookies(response.headers['set-cookie']); return "success"; } else { return "fail"; } - } catch (e) { - return e.toString(); + } on TimeoutException catch (e) { + print("getExam Error"); + return Global.timeOutError; + } on SocketException catch (e) { + print("getExam Error"); + return Global.socketError; } } diff --git a/lib/config.dart b/lib/config.dart index d4d4abd..b9a06be 100644 --- a/lib/config.dart +++ b/lib/config.dart @@ -11,6 +11,8 @@ class Global { initialPage: 0, keepPage: true, ); + static String timeOutError = "连接教务超时,教务可能维护中"; + static String socketError = "网络连接失败"; static Map cookie = {}; static String jwUrl = "jw.glutnn.cn"; static Uri getCodeUrl = Uri.http(jwUrl, "/academic/getCaptcha.do"); @@ -21,7 +23,8 @@ class Global { static Uri getNameUrl = Uri.http(jwUrl, "/academic/student/studentinfo/studentInfoModifyIndex.do", {"frombase": "0", "wantTag": "0"}); static Uri getScoreUrl = Uri.http(jwUrl, "/academic/manager/score/studentOwnScore.do"); - static Uri getCareerUrl = Uri.http(jwUrl, "/academic/manager/studyschedule/studentSelfSchedule.jsdo"); + static Uri getCareerUrl = + Uri.http(jwUrl, "/academic/manager/studyschedule/studentSelfSchedule.jsdo"); static List getScheduleUrl = [jwUrl, "/academic/student/currcourse/currcourse.jsdo"]; static List codeCheckUrl = [jwUrl, "/academic/checkCaptcha.do"]; static double schedulePageTouchMovesMinValue = 70.0; @@ -35,7 +38,13 @@ readGradient() { begin: Alignment.centerLeft, end: Alignment.topRight, ); - } else if (writeData["color"] == "blue") { + } else if (writeData["color"] == "pink") { + return const LinearGradient( + colors: [Color(0xfffb7766), Color(0xfffc6caa)], + begin: Alignment.centerLeft, + end: Alignment.topRight, + ); + }else if (writeData["color"] == "blue") { return const LinearGradient( colors: [Color(0xff66cefb), Color(0xff4175f7)], begin: Alignment.centerLeft, @@ -65,6 +74,8 @@ readGradient() { readColor() { if (writeData["color"] == "blue") { return Colors.blue; + } else if (writeData["color"] == "pink") { + return Colors.pinkAccent[100]; } else if (writeData["color"] == "red") { return Colors.redAccent; } else if (writeData["color"] == "yellow") { @@ -77,7 +88,7 @@ readColor() { } readColorBegin() { - if (writeData["color"] == "red") { + if (writeData["color"] == "red"||writeData["color"] == "pink") { return const Color.fromARGB(42, 255, 229, 253); } else if (writeData["color"] == "blue") { return const Color.fromARGB(42, 199, 229, 253); @@ -93,7 +104,9 @@ readColorBegin() { readColorEnd() { if (writeData["color"] == "red") { return const Color.fromARGB(110, 253, 199, 199); - } else if (writeData["color"] == "blue") { + } else if (writeData["color"] == "pink") { + return const Color.fromARGB(110, 253, 199, 228); + }else if (writeData["color"] == "blue") { return const Color.fromARGB(110, 199, 229, 253); } else if (writeData["color"] == "yellow") { return const Color.fromARGB(110, 253, 246, 199); diff --git a/lib/data.dart b/lib/data.dart index 6f4a456..fe6d3e4 100644 --- a/lib/data.dart +++ b/lib/data.dart @@ -11,6 +11,17 @@ class SetPageIndex { SetPageIndex(this.index); } +class QueryExamRe { + int index; + + QueryExamRe(this.index); +} +class QueryScoreRe { + int index; + + QueryScoreRe(this.index); +} + class ReState { int index; diff --git a/lib/main.dart b/lib/main.dart index 01db811..f030066 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,4 +1,3 @@ -import 'dart:io'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; diff --git a/lib/pages/career.dart b/lib/pages/career.dart index f077385..45304dc 100644 --- a/lib/pages/career.dart +++ b/lib/pages/career.dart @@ -39,6 +39,15 @@ class _CareerPageState extends State { }, ), ), + SliverToBoxAdapter( + child: Container( + margin: const EdgeInsets.fromLTRB(16, 0, 16, 0), + child: const Text( + "你大学期间的全部课程都在这里", + style: TextStyle(color: Colors.grey), + ), + ), + ), SliverToBoxAdapter( child: SizedBox( height: MediaQuery.of(context).size.height - 125, diff --git a/lib/pages/home.dart b/lib/pages/home.dart index 0e9f7eb..33b662f 100644 --- a/lib/pages/home.dart +++ b/lib/pages/home.dart @@ -79,8 +79,8 @@ class HomePageState extends State with TickerProviderStateMixin { void _scrollControllerListener() { if (_timeOutBool) { int _offset = _scrollController.position.pixels.toInt(); - _offset < 0 ? iconKey.currentState!.onPressed((_offset / 25.0).abs() + offset_) : ""; if (_offset < 0) { + iconKey.currentState!.onPressed((_offset / 25.0).abs() + offset_); if ((_offset / 25.0).abs() >= 6.0) { final double __offset = (_offset / 25.0).abs(); if (__offset == (_offset / 25.0).abs() || __offset + 0.25 < (_offset / 25.0).abs()) { @@ -148,9 +148,9 @@ class HomePageState extends State with TickerProviderStateMixin { _time = Timer(const Duration(seconds: 1), () async { getWeek(); Scaffold.of(context).removeCurrentSnackBar(); - Scaffold.of(context).showSnackBar(jwSnackBar(true, "开始用户验证...", 10)); + Scaffold.of(context).showSnackBar(jwSnackBar(true, "获取教务数据...", 10)); await getSchedule().then((value) => { - if (!value) + if (value == "fail") { if (writeData["username"] == "") { @@ -171,8 +171,14 @@ class HomePageState extends State with TickerProviderStateMixin { _time2?.cancel() } } - else + else if (value == "success") {_next()} + else + { + Scaffold.of(context).removeCurrentSnackBar(), + Scaffold.of(context).showSnackBar(jwSnackBar(false, value, 4)), + _time2?.cancel() + } }); _timeOutBool = true; _goTopInitCount = 0; @@ -335,7 +341,26 @@ class HomePageState extends State with TickerProviderStateMixin { decoration: BoxDecoration( borderRadius: const BorderRadius.all(Radius.circular(6.0)), color: _animationForHomeCards2.value), - child: homeCard2, + child: Stack( + children: [ + Align( + child: Container( + margin: HomeCardsState.iconMargin, + child: Icon( + HomeCardsState.icons[1], + color: readColor(), + size: HomeCardsState.iconSize, + ), + ), + ), + Align( + child: Container( + margin: HomeCardsState.textMargin, + child: Text(HomeCardsState.iconTexts[1], style: HomeCardsState.textStyle), + ), + ), + ], + ), ), ), GestureDetector( @@ -364,7 +389,26 @@ class HomePageState extends State with TickerProviderStateMixin { decoration: BoxDecoration( borderRadius: const BorderRadius.all(Radius.circular(6.0)), color: _animationForHomeCards3.value), - child: homeCard3, + child: Stack( + children: [ + Align( + child: Container( + margin: HomeCardsState.iconMargin, + child: Icon( + HomeCardsState.icons[2], + color: readColor(), + size: HomeCardsState.iconSize, + ), + ), + ), + Align( + child: Container( + margin: HomeCardsState.textMargin, + child: Text(HomeCardsState.iconTexts[2], style: HomeCardsState.textStyle), + ), + ), + ], + ), ), ), ], diff --git a/lib/pages/info.dart b/lib/pages/info.dart index 5be93d9..238e5fb 100644 --- a/lib/pages/info.dart +++ b/lib/pages/info.dart @@ -123,7 +123,7 @@ class _InfoPageState extends State { Row( children: [ const Text( - "企鹅:", + "QQ:", style: TextStyle(color: Colors.grey), ), Builder( @@ -148,7 +148,7 @@ class _InfoPageState extends State { Row( children: [ const Text( - "微信:", + "WX:", style: TextStyle(color: Colors.grey), ), Builder(builder: (BuildContext context) { @@ -161,7 +161,7 @@ class _InfoPageState extends State { }, child: const Text( "13520944872", - style: TextStyle(color: Colors.blue), + style: TextStyle(color: Colors.green), ), ); }), diff --git a/lib/pages/init.dart b/lib/pages/init.dart index be690b0..b01cf70 100644 --- a/lib/pages/init.dart +++ b/lib/pages/init.dart @@ -88,7 +88,7 @@ class InitPageState extends State { _init() async { await readConfig(); - await getWeek(); + getWeek(); await readSchedule(); await initTodaySchedule(); await initTomorrowSchedule(); diff --git a/lib/pages/mine.dart b/lib/pages/mine.dart index 8ad1deb..40ada1a 100644 --- a/lib/pages/mine.dart +++ b/lib/pages/mine.dart @@ -5,7 +5,6 @@ import 'package:glutassistantn/pages/setting.dart'; import 'package:glutassistantn/pages/update.dart'; import 'package:glutassistantn/widget/bars.dart'; import 'package:glutassistantn/widget/icons.dart'; -import 'package:url_launcher/url_launcher.dart'; import '../config.dart'; import '../data.dart'; diff --git a/lib/pages/query.dart b/lib/pages/query.dart index 29952b9..d82222a 100644 --- a/lib/pages/query.dart +++ b/lib/pages/query.dart @@ -1,6 +1,7 @@ +import 'dart:async'; + import 'package:flutter/material.dart'; import 'package:glutassistantn/common/get.dart'; -import 'package:glutassistantn/common/io.dart'; import 'package:glutassistantn/pages/setting.dart'; import 'package:glutassistantn/widget/bars.dart'; import 'package:glutassistantn/widget/lists.dart'; @@ -19,17 +20,91 @@ class QueryPage extends StatefulWidget { } class _QueryPageState extends State { + @override + Widget build(BuildContext context) { + return Scaffold(backgroundColor: Colors.white, body: QueryBody()); + } +} + +class QueryBody extends StatefulWidget { + const QueryBody({Key? key}) : super(key: key); + + @override + State createState() => _QueryBodyState(); +} + +class _QueryBodyState extends State { double _gpa = gpa; double _avg = avg; double _weight = weight; + late StreamSubscription eventBusFn; @override void initState() { // TODO: implement initState super.initState(); + eventBusFn = pageBus.on().listen((event) async { + _next(List list) { + if (list.length == 0) { + Scaffold.of(context).removeCurrentSnackBar(); + Scaffold.of(context).showSnackBar(jwSnackBar(true, "无结果...", 5)); + } else { + Scaffold.of(context).removeCurrentSnackBar(); + Scaffold.of(context).showSnackBar(jwSnackBar(true, "数据已经更新...", 1)); + + queryScore = list; + double sum = 0.0; + double _q = 0.0; + double _xf = 0.0; + int no = 0; + for (int i = 0; i < list.length; i++) { + if (list[i][2].toString().contains("慕") && list[i][3] == "") { + no++; + } else { + if (list[i].length > 5) { + _q += (int.parse(levelToNumber(list[i]![4])) * double.parse(list[i]![5])); + _xf += double.parse(levelToNumber(list[i][5])); + } + if (list[i].length > 4) { + sum += int.parse(levelToNumber(list[i][4])); + } + } + } + _avg = double.parse((sum / (list.length - no)).toStringAsFixed(1)); + _weight = double.parse((_q / _xf).toStringAsFixed(1)); + + if (_weight >= 90) { + _gpa = 4.0; + } else if (_weight >= 85) { + _gpa = 3.7; + } else if (_weight >= 82) { + _gpa = 3.3; + } else if (_weight >= 78) { + _gpa = 3.0; + } else if (_weight >= 75) { + _gpa = 2.7; + } else if (_weight >= 72) { + _gpa = 2.3; + } else if (_weight >= 68) { + _gpa = 2.0; + } else if (_weight >= 64) { + _gpa = 1.5; + } else if (_weight >= 60) { + _gpa = 1.0; + } else {} + weight = _weight; + gpa = _gpa; + avg = _avg; + setState(() {}); + } + } + + await getScore().then((value) => _next(value)); + }); } - _query(BuildContext context) async { + _query() async { + _next(List list) { if (list.length == 1 && list[0] == "登录过期") { Scaffold.of(context).removeCurrentSnackBar(); @@ -39,56 +114,61 @@ class _QueryPageState extends State { context, 10, )); + } else if (list.length == 1 && list[0] == Global.socketError || + list[0] == Global.timeOutError) { + Scaffold.of(context).removeCurrentSnackBar(); + Scaffold.of(context).showSnackBar(jwSnackBar(false, list[0], 4)); } else if (list.length == 0) { Scaffold.of(context).removeCurrentSnackBar(); Scaffold.of(context).showSnackBar(jwSnackBar(true, "无结果...", 5)); } else { Scaffold.of(context).removeCurrentSnackBar(); - } - queryScore = list; - double sum = 0.0; - double _q = 0.0; - double _xf = 0.0; - int no = 0; - for (int i = 0; i < list.length; i++) { - if (list[i][2].toString().contains("慕") && list[i][3] == "") { - no++; - } else { - if (list[i].length > 5) { - _q += (int.parse(levelToNumber(list[i]![4])) * double.parse(list[i]![5])); - _xf += double.parse(levelToNumber(list[i][5])); - } - if (list[i].length > 4) { - sum += int.parse(levelToNumber(list[i][4])); + Scaffold.of(context).showSnackBar(jwSnackBar(true, "数据已经更新...", 1)); + queryScore = list; + double sum = 0.0; + double _q = 0.0; + double _xf = 0.0; + int no = 0; + for (int i = 0; i < list.length; i++) { + if (list[i][2].toString().contains("慕") && list[i][3] == "") { + no++; + } else { + if (list[i].length > 5) { + _q += (int.parse(levelToNumber(list[i]![4])) * double.parse(list[i]![5])); + _xf += double.parse(levelToNumber(list[i][5])); + } + if (list[i].length > 4) { + sum += int.parse(levelToNumber(list[i][4])); + } } } + _avg = double.parse((sum / (list.length - no)).toStringAsFixed(1)); + _weight = double.parse((_q / _xf).toStringAsFixed(1)); + + if (_weight >= 90) { + _gpa = 4.0; + } else if (_weight >= 85) { + _gpa = 3.7; + } else if (_weight >= 82) { + _gpa = 3.3; + } else if (_weight >= 78) { + _gpa = 3.0; + } else if (_weight >= 75) { + _gpa = 2.7; + } else if (_weight >= 72) { + _gpa = 2.3; + } else if (_weight >= 68) { + _gpa = 2.0; + } else if (_weight >= 64) { + _gpa = 1.5; + } else if (_weight >= 60) { + _gpa = 1.0; + } else {} + weight = _weight; + gpa = _gpa; + avg = _avg; + setState(() {}); } - _avg = double.parse((sum / (list.length - no)).toStringAsFixed(1)); - _weight = double.parse((_q / _xf).toStringAsFixed(1)); - - if (_weight >= 90) { - _gpa = 4.0; - } else if (_weight >= 85) { - _gpa = 3.7; - } else if (_weight >= 82) { - _gpa = 3.3; - } else if (_weight >= 78) { - _gpa = 3.0; - } else if (_weight >= 75) { - _gpa = 2.7; - } else if (_weight >= 72) { - _gpa = 2.3; - } else if (_weight >= 68) { - _gpa = 2.0; - } else if (_weight >= 64) { - _gpa = 1.5; - } else if (_weight >= 60) { - _gpa = 1.0; - } else {} - weight = _weight; - gpa = _gpa; - avg = _avg; - setState(() {}); } print(writeData["username"]); @@ -109,136 +189,133 @@ class _QueryPageState extends State { @override Widget build(BuildContext context) { - return Scaffold( - backgroundColor: Colors.white, - body: Container( - color: Colors.white, - margin: const EdgeInsets.fromLTRB(0, 0, 0, 0), - child: CustomScrollView( - physics: const AlwaysScrollableScrollPhysics(parent: BouncingScrollPhysics()), - slivers: [ - publicTopBar( - "成绩查询", - InkWell( - child: const Icon( - Icons.close_outlined, - size: 24, - color: Colors.white, - ), - onTap: () { - Navigator.of(context).pop(); - }, + // TODO: implement build + return Container( + color: Colors.white, + margin: const EdgeInsets.fromLTRB(0, 0, 0, 0), + child: CustomScrollView( + physics: const AlwaysScrollableScrollPhysics(parent: BouncingScrollPhysics()), + slivers: [ + publicTopBar( + "成绩查询", + InkWell( + child: const Icon( + Icons.close_outlined, + size: 24, + color: Colors.white, ), - readColor(), - Colors.white, - 0), - SliverToBoxAdapter( - child: Container( - padding: const EdgeInsets.fromLTRB(16, 8, 16, 16), - color: readColor(), - margin: const EdgeInsets.fromLTRB(0, 0, 0, 16), - child: Column( - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Row( - children: [ - DropdownButton( - iconEnabledColor: Colors.white, - elevation: 0, - hint: Text( - writeData["queryYear"], - style: TextStyle( - color: Colors.white, - ), + onTap: () { + Navigator.of(context).pop(); + }, + ), + readColor(), + Colors.white, + 0), + SliverToBoxAdapter( + child: Container( + padding: const EdgeInsets.fromLTRB(16, 8, 16, 16), + color: readColor(), + margin: const EdgeInsets.fromLTRB(0, 0, 0, 16), + child: Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Row( + children: [ + DropdownButton( + iconEnabledColor: Colors.white, + elevation: 0, + hint: Text( + writeData["queryYear"], + style: TextStyle( + color: Colors.white, ), - items: yearList(), - underline: Container(height: 0), - onChanged: (value) { - setState(() { - writeData["queryYear"] = value; - }); - }, - ), - SizedBox( - width: 25, - ), - DropdownButton( - iconEnabledColor: Colors.white, - isDense: true, - elevation: 0, - hint: Text(writeData["querySemester"], - style: TextStyle( - color: Colors.white, - )), - underline: Container(height: 0), - items: const [ - DropdownMenuItem(child: Text("春"), value: "春"), - DropdownMenuItem(child: Text("秋"), value: "秋"), - ], - onChanged: (value) { - setState(() { - writeData["querySemester"] = value; - }); - }, ), - ], - ), - Builder(builder: (BuildContext context) { - return InkWell( - onTap: () { - _query(context); - }, - child: Container( - decoration: const BoxDecoration( - borderRadius: BorderRadius.all(Radius.circular(6.0)), - color: Color(0x1ff1f1f1), - ), - padding: const EdgeInsets.fromLTRB(16, 8, 16, 8), - child: Text( - "查询", - style: TextStyle(color: Colors.white), - ), - )); - }) - ], - ), - SizedBox( - height: 8, - ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Text( - "GPA绩点: $_gpa", - style: TextStyle(color: Colors.white), - ), - Text( - "|", - style: TextStyle(color: readColor()), - ), - Text( - "算术平均分: $_avg", - style: TextStyle(color: Colors.white), - ), - Text( - "|", - style: TextStyle(color: readColor()), + items: yearList(), + underline: Container(height: 0), + onChanged: (value) { + setState(() { + writeData["queryYear"] = value; + }); + }, + ), + SizedBox( + width: 25, + ), + DropdownButton( + iconEnabledColor: Colors.white, + isDense: true, + elevation: 0, + hint: Text(writeData["querySemester"], + style: TextStyle( + color: Colors.white, + )), + underline: Container(height: 0), + items: const [ + DropdownMenuItem(child: Text("春"), value: "春"), + DropdownMenuItem(child: Text("秋"), value: "秋"), + ], + onChanged: (value) { + setState(() { + writeData["querySemester"] = value; + }); + }, + ), + ], + ), + InkWell( + onTap: () { + _query(); + }, + child: Container( + decoration: const BoxDecoration( + borderRadius: BorderRadius.all(Radius.circular(6.0)), + color: Color(0x1ff1f1f1), + ), + padding: const EdgeInsets.fromLTRB(16, 8, 16, 8), + child: Text( + "查询", + style: TextStyle(color: Colors.white), + ), ), - Text( - "加权平均分: $_weight", - style: TextStyle(color: Colors.white), - ) - ], - ) - ], - ), + ), + ], + ), + SizedBox( + height: 8, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + "GPA绩点: $_gpa", + style: TextStyle(color: Colors.white), + ), + Text( + "|", + style: TextStyle(color: readColor()), + ), + Text( + "算术平均分: $_avg", + style: TextStyle(color: Colors.white), + ), + Text( + "|", + style: TextStyle(color: readColor()), + ), + Text( + "加权平均分: $_weight", + style: TextStyle(color: Colors.white), + ) + ], + ) + ], ), ), - ScoreList() - ], - ), + ), + ScoreList() + ], ), ); } diff --git a/lib/pages/queryexam.dart b/lib/pages/queryexam.dart index 47ae350..571a217 100644 --- a/lib/pages/queryexam.dart +++ b/lib/pages/queryexam.dart @@ -1,12 +1,12 @@ +import 'dart:async'; + import 'package:flutter/material.dart'; import 'package:glutassistantn/common/get.dart'; import 'package:glutassistantn/config.dart'; -import 'package:glutassistantn/pages/home.dart'; import 'package:glutassistantn/widget/bars.dart'; import 'package:glutassistantn/widget/lists.dart'; import '../data.dart'; -import 'login.dart'; class QueryExamPage extends StatefulWidget { final String title; @@ -18,116 +18,157 @@ class QueryExamPage extends StatefulWidget { } class _QueryExamPageState extends State { + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: Colors.white, + body: QueryExamBody(), + ); + } +} + +class QueryExamBody extends StatefulWidget { + const QueryExamBody({Key? key}) : super(key: key); + + @override + State createState() => _QueryExamBodyState(); +} + +class _QueryExamBodyState extends State { bool login = true; + late StreamSubscription eventBusFn; @override void initState() { - // TODO: implement initState super.initState(); + eventBusFn = pageBus.on().listen((event) { + getExam().then((value) => process(value)); + // getCareer(); + }); getExam().then((value) => process(value)); - getCareer(); + // getCareer(); } process(String value) { if (value == "success") { + login = false; + Scaffold.of(context).removeCurrentSnackBar(); + Scaffold.of(context).showSnackBar(jwSnackBar(true, "处理返回数据...", 10)); setState(() {}); + Scaffold.of(context).removeCurrentSnackBar(); + Scaffold.of(context).showSnackBar(jwSnackBar(true, "数据已经更新", 1)); } else if (value == "fail") { - Navigator.of(context).push( - // 在FormPage()里传入参数 - MaterialPageRoute(builder: (context) => const LoginPage())); + Scaffold.of(context).removeCurrentSnackBar(); + Scaffold.of(context).showSnackBar(jwSnackBarActionQ2( + false, + "需要验证", + context, + 10, + )); } else { print(value); + Scaffold.of(context).removeCurrentSnackBar(); + Scaffold.of(context).showSnackBar(jwSnackBar(false, value, 4)); } } @override Widget build(BuildContext context) { - return Scaffold( - backgroundColor: Colors.white, - body: Container( - color: Colors.white, - margin: const EdgeInsets.fromLTRB(0, 0, 0, 0), - child: CustomScrollView( - physics: const AlwaysScrollableScrollPhysics(parent: BouncingScrollPhysics()), - slivers: [ - publicTopBar( - "我的考试", - InkWell( - child: const Icon( - Icons.close_outlined, - size: 24, - color: Colors.white, - ), - onTap: () { - Navigator.of(context).pop(); - }, + Future.delayed(const Duration(seconds: 0), () { + if (login) { + Scaffold.of(context).removeCurrentSnackBar(); + Scaffold.of(context).showSnackBar(jwSnackBar(true, "获取教务数据...", 6)); + } + }); + return Container( + color: Colors.white, + margin: const EdgeInsets.fromLTRB(0, 0, 0, 0), + child: CustomScrollView( + physics: const AlwaysScrollableScrollPhysics(parent: BouncingScrollPhysics()), + slivers: [ + publicTopBar( + "我的考试", + InkWell( + child: const Icon( + Icons.close_outlined, + size: 24, + color: Colors.white, ), - readColor(), - Colors.white, - 0), - SliverToBoxAdapter( - child: Container( - padding: const EdgeInsets.fromLTRB(16, 8, 16, 16), - color: readColor(), - margin: const EdgeInsets.fromLTRB(0, 0, 0, 16), - child: Column( - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Container( - width: 50, - child: Text( - "$examListA", - textAlign: TextAlign.center, - style: TextStyle(color: Colors.white, fontSize: 24), - ), - ), - Container( - width: 50, - child: Text( - "$examListB", - textAlign: TextAlign.center, - style: TextStyle(color: Colors.white, fontSize: 24), - ), - ), - Container( - width: 50, - child: Text( - "NaN", - textAlign: TextAlign.center, - style: TextStyle(color: Colors.white, fontSize: 24), - ), - ), - ], - ), - SizedBox( - height: 8, - ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, + onTap: () { + Navigator.of(context).pop(); + }, + ), + readColor(), + Colors.white, + 0), + SliverToBoxAdapter( + child: Container( + padding: const EdgeInsets.fromLTRB(16, 8, 16, 16), + color: readColor(), + margin: const EdgeInsets.fromLTRB(0, 0, 0, 16), + child: Row( + children: [ + Expanded( + child: Column( children: [ - Text( - "已经历的", - style: TextStyle(color: Colors.white), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Container( + width: 50, + child: Text( + "$examListA", + textAlign: TextAlign.center, + style: TextStyle(color: Colors.white, fontSize: 24), + ), + ), + Container( + width: 50, + child: Text( + "$examListB", + textAlign: TextAlign.center, + style: TextStyle(color: Colors.white, fontSize: 24), + ), + ), + Container( + width: 50, + child: Text( + "NaN", + textAlign: TextAlign.center, + style: TextStyle(color: Colors.white, fontSize: 24), + ), + ), + ], ), - Text( - "即将到来", - style: TextStyle(color: Colors.white), + SizedBox( + height: 8, ), - Text( - "生涯预估", - style: TextStyle(color: Colors.white), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + "已经历的", + style: TextStyle(color: Colors.white), + ), + Text( + "即将到来", + style: TextStyle(color: Colors.white), + ), + Text( + "生涯预估", + style: TextStyle(color: Colors.white), + ) + ], ) ], - ) - ], - ), + ), + ), + ], ), ), - ExamList(), - ], - ), + ), + ExamList(), + ], ), ); } diff --git a/lib/pages/schedulemanage.dart b/lib/pages/schedulemanage.dart index d4b12de..b0bbb61 100644 --- a/lib/pages/schedulemanage.dart +++ b/lib/pages/schedulemanage.dart @@ -40,17 +40,19 @@ class _ScheduleManagePageState extends State { ), ), SliverToBoxAdapter( - child: SizedBox( - height: MediaQuery.of(context).size.height - 125, - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Text( - "敬请期待...", - style: TextStyle(fontSize: 18, color: readColor()), - ), - ], - ))), + child: SizedBox( + height: MediaQuery.of(context).size.height - 125, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + "敬请期待...", + style: TextStyle(fontSize: 18, color: readColor()), + ), + ], + ), + ), + ), ], ), ), diff --git a/lib/pages/setting.dart b/lib/pages/setting.dart index 70bc9ab..c4dbf97 100644 --- a/lib/pages/setting.dart +++ b/lib/pages/setting.dart @@ -169,20 +169,56 @@ class _SettingPageState extends State with WidgetsBindingObserver { writeData["color"], style: TextStyle(color: readColor()), ), - items: const [ - DropdownMenuItem(child: Text("red"), value: "red"), - DropdownMenuItem(child: Text("blue"), value: "blue"), - DropdownMenuItem(child: Text("cyan"), value: "cyan"), - DropdownMenuItem(child: Text("yellow"), value: "yellow"), + items: [ + DropdownMenuItem( + child: Text( + "red", + style: TextStyle(color: Colors.redAccent), + ), + value: "red"), + DropdownMenuItem( + child: Text( + "blue", + style: TextStyle(color: Colors.blue), + ), + value: "blue"), + DropdownMenuItem( + child: Text( + "cyan", + style: TextStyle(color: Colors.cyan[400]), + ), + value: "cyan"), + DropdownMenuItem( + child: Text( + "pink", + style: TextStyle(color: Colors.pinkAccent[100]), + ), + value: "pink"), + DropdownMenuItem( + child: Text( + "yellow", + style: TextStyle(color: Colors.yellow[600]), + ), + value: "yellow"), ], underline: Container(height: 0), onChanged: (value) { setState(() { writeData["color"] = value; }); - Scaffold.of(context).removeCurrentSnackBar(); - Scaffold.of(context).showSnackBar(jwSnackBar(true, "重新启动后APP生效", 10)); + // Scaffold.of(context).removeCurrentSnackBar(); + // Scaffold.of(context).showSnackBar(jwSnackBar(true, "重新启动后APP生效", 10)); writeConfig(); + pageBus.fire(SetPageIndex(0)); + Navigator.pushAndRemoveUntil( + context, + CustomRouteMs300( + const Index( + type: 0, + ), + ), + (route) => false, + ); }, ); }) @@ -191,15 +227,15 @@ class _SettingPageState extends State with WidgetsBindingObserver { InkWell( onTap: () { Navigator.of(context).push( - MaterialPageRoute(builder: (context) => const ScheduleManagePage())); + MaterialPageRoute(builder: (context) => const ScheduleManagePage())); }, child: mineItem(Icons.grid_view_outlined, const EdgeInsets.fromLTRB(16, 14, 0, 14), "课程管理", readColor()), ), InkWell( onTap: () { - Navigator.of(context).push( - MaterialPageRoute(builder: (context) => const TimeManagePage())); + Navigator.of(context) + .push(MaterialPageRoute(builder: (context) => const TimeManagePage())); }, child: mineItem(Icons.more_time_outlined, const EdgeInsets.fromLTRB(16, 14, 0, 14), "课节时间", readColor()), diff --git a/lib/pages/update.dart b/lib/pages/update.dart index 8730e46..8753472 100644 --- a/lib/pages/update.dart +++ b/lib/pages/update.dart @@ -1,8 +1,8 @@ import 'package:flutter/material.dart'; import 'package:glutassistantn/widget/bars.dart'; import 'package:url_launcher/url_launcher.dart'; - -import '../config.dart'; +import 'package:package_info/package_info.dart'; +import 'mine.dart'; class UpdatePage extends StatefulWidget { final String title; @@ -14,11 +14,25 @@ class UpdatePage extends StatefulWidget { } class _UpdatePageState extends State { + String appName = ""; + + String packageName = ""; + + String version = ""; + + String buildNumber = ""; + @override void initState() { - // TODO: implement initState super.initState(); - // getScore(); + PackageInfo.fromPlatform().then((PackageInfo packageInfo) { + print(packageInfo.appName); + appName = packageInfo.appName; + packageName = packageInfo.packageName; + version = packageInfo.version; + buildNumber = packageInfo.buildNumber; + setState(() {}); + }); } @override @@ -40,32 +54,58 @@ class _UpdatePageState extends State { }, ), ), + + SliverToBoxAdapter( + child: SizedBox( + height: 64, + ), + ), SliverToBoxAdapter( child: Container( - margin: const EdgeInsets.fromLTRB(16, 0, 16, 0), - child: const Text( - "会调用浏览器访问", - style: TextStyle(color: Colors.grey), + padding: const EdgeInsets.fromLTRB(16, 0, 16, 0), + child: Column( + children: [ + Image.asset( + 'images/g.png', + width: 72, + ), + SizedBox( + height: 16, + ), + Text( + appName, + style: TextStyle(fontSize: 20), + ), + Text( + version, + style: TextStyle(fontSize: 14, color: Colors.grey), + ), + Container( + width: double.infinity, + margin: const EdgeInsets.fromLTRB(0, 64, 0, 16), + child: Text( + "选择以下渠道获取更新", + style: TextStyle(color: Colors.grey), + ), + ), + InkWell( + onTap: () { + launch("https://www.coolapk.com/apk/289253"); + }, + child: mineItem(Icons.local_mall, const EdgeInsets.fromLTRB(16, 14, 0, 14), + "酷安", Colors.green), + ), + InkWell( + onTap: () { + launch("https://github.com/ChinaGamer/GlutAssistantN/releases/latest"); + }, + child: mineItem(Icons.face, const EdgeInsets.fromLTRB(16, 14, 0, 14), + "Github", Colors.blueGrey), + ), + ], ), ), ), - SliverToBoxAdapter( - child: SizedBox( - height: MediaQuery.of(context).size.height - 125, - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - TextButton( - onPressed: () { - launch("https://github.com/ChinaGamer/GlutAssistantN/releases/latest"); - }, - child: Text( - "点我获取更新", - style: TextStyle(fontSize: 18, color: readColor()), - ), - ) - ], - ))), ], ), ), diff --git a/lib/widget/bars.dart b/lib/widget/bars.dart index 8dcd2ef..632817a 100644 --- a/lib/widget/bars.dart +++ b/lib/widget/bars.dart @@ -308,3 +308,35 @@ SnackBar jwSnackBarActionQ( ), ); } + +SnackBar jwSnackBarActionQ2( + bool result, + String text, + BuildContext context, [ + int hideSnackBarSeconds = 2, +]) { + Widget resultIcon = result + ? const Icon( + Icons.mood, + color: Colors.green, + ) + : const Icon( + Icons.mood_bad, + color: Colors.red, + ); + return SnackBar( + elevation: 2, + duration: Duration(seconds: hideSnackBarSeconds), + content: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [resultIcon], + ), + behavior: SnackBarBehavior.floating, + action: SnackBarAction( + label: text, + onPressed: () { + codeCheckDialogQ2(context); + }, + ), + ); +} diff --git a/lib/widget/dialog.dart b/lib/widget/dialog.dart index 8faba53..7cc8511 100644 --- a/lib/widget/dialog.dart +++ b/lib/widget/dialog.dart @@ -17,10 +17,10 @@ class CodeCheckDialog { codeCheckDialog(BuildContext context) async { TextEditingController textFieldController = TextEditingController(); - var response = await get(Global.getCodeUrl).timeout(const Duration(milliseconds: 6000)); + var response = await get(Global.getCodeUrl).timeout(const Duration(seconds: 3)); bool clicked = false; getCode(Function fn) async { - response = await get(Global.getCodeUrl).timeout(const Duration(milliseconds: 6000)); + response = await get(Global.getCodeUrl).timeout(const Duration(seconds: 3)); parseRawCookies(response.headers['set-cookie']); fn(() {}); } @@ -30,7 +30,7 @@ codeCheckDialog(BuildContext context) async { Future _next2(String value) async { if (value == "success") { await getSchedule().then((value) => { - if (value) + if (value == "success") { Navigator.pushAndRemoveUntil( context, @@ -84,8 +84,11 @@ codeCheckDialog(BuildContext context) async { Expanded( child: TextField( controller: textFieldController, - decoration: const InputDecoration( - icon: Icon(Icons.code_outlined), + decoration: InputDecoration( + icon: Icon( + Icons.code_outlined, + color: readColor(), + ), border: InputBorder.none, hintText: "验证码", //类似placeholder效果 ), @@ -109,7 +112,7 @@ codeCheckDialog(BuildContext context) async { }, child: Text( !clicked ? "取消" : "", - style: TextStyle(color: Colors.blue), + style: TextStyle(color: readColor()), ), ), TextButton( @@ -118,7 +121,7 @@ codeCheckDialog(BuildContext context) async { }, child: Text( !clicked ? "继续" : "稍等...", - style: TextStyle(color: Colors.blue), + style: TextStyle(color: readColor()), ), ), ]), @@ -130,11 +133,12 @@ codeCheckDialog(BuildContext context) async { } codeCheckDialogQ(BuildContext context) async { + print("codeCheckDialogQ"); TextEditingController textFieldController = TextEditingController(); - var response = await get(Global.getCodeUrl).timeout(const Duration(milliseconds: 6000)); + var response = await get(Global.getCodeUrl).timeout(const Duration(seconds: 3)); bool clicked = false; getCode(Function fn) async { - response = await get(Global.getCodeUrl).timeout(const Duration(milliseconds: 6000)); + response = await get(Global.getCodeUrl).timeout(const Duration(seconds: 3)); parseRawCookies(response.headers['set-cookie']); fn(() {}); } @@ -143,14 +147,14 @@ codeCheckDialogQ(BuildContext context) async { void _codeCheck(Function fn) async { Future _next2(String value) async { if (value == "success") { - await getSchedule().then((value) => { - if (value) - { - Scaffold.of(context).removeCurrentSnackBar(), - Scaffold.of(context).showSnackBar(jwSnackBar(true, "验证完成,请再次点击查询")), - Navigator.pop(context) - } - }); + Scaffold.of(context).removeCurrentSnackBar(); + // Scaffold.of(context).showSnackBar(jwSnackBar(true, "验证完成,请再次点击查询")), + pageBus.fire(QueryScoreRe(1)); + Navigator.pop(context); + } else { + Scaffold.of(context).removeCurrentSnackBar(); + Scaffold.of(context).showSnackBar(jwSnackBar(false, value, 4)); + Navigator.pop(context); } } @@ -159,12 +163,127 @@ codeCheckDialogQ(BuildContext context) async { if (value == "success") { await login(writeData["username"], writeData["password"], textFieldController.text) .then((String value) => _next2(value)); - } else { + } else if (value == "fail") { + Scaffold.of(context).removeCurrentSnackBar(); + Scaffold.of(context).showSnackBar(jwSnackBar(false, "验证码错误")); + fn(() { + clicked = !clicked; + }); + }else{ + Scaffold.of(context).removeCurrentSnackBar(); + Scaffold.of(context).showSnackBar(jwSnackBar(false, value, 4)); + Navigator.pop(context); + } + } + + if (!clicked) { + fn(() { + clicked = !clicked; + }); + print(textFieldController.text); + await codeCheck(textFieldController.text).then((String value) => _next(value)); + } + } + + showDialog( + context: context, + builder: (BuildContext context) { + return StatefulBuilder(builder: (context, setState) { + return SimpleDialog( + children: [ + Container( + margin: const EdgeInsets.fromLTRB(16, 0, 16, 0), + padding: const EdgeInsets.fromLTRB(0, 0, 0, 0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Expanded( + child: TextField( + controller: textFieldController, + decoration: InputDecoration( + icon: Icon( + Icons.code_outlined, + color: readColor(), + ), + border: InputBorder.none, + hintText: "验证码", //类似placeholder效果 + ), + ), + ), + InkWell( + child: Image.memory(response.bodyBytes, height: 25), + onTap: () { + getCode(setState); + }, + ), + ], + ), + ), + Container( + margin: const EdgeInsets.fromLTRB(16, 0, 16, 0), + child: Row(mainAxisAlignment: MainAxisAlignment.end, children: [ + TextButton( + onPressed: () { + Navigator.pop(context); + }, + child: Text( + !clicked ? "取消" : "", + style: TextStyle(color: readColor()), + ), + ), + TextButton( + onPressed: () { + _codeCheck(setState); + }, + child: Text( + !clicked ? "继续" : "稍等...", + style: TextStyle(color: readColor()), + ), + ), + ]), + ), + ], + ); + }); + }); +} + +codeCheckDialogQ2(BuildContext context) async { + TextEditingController textFieldController = TextEditingController(); + var response = await get(Global.getCodeUrl).timeout(const Duration(seconds: 3)); + bool clicked = false; + getCode(Function fn) async { + response = await get(Global.getCodeUrl).timeout(const Duration(seconds: 3)); + parseRawCookies(response.headers['set-cookie']); + fn(() {}); + } + + parseRawCookies(response.headers['set-cookie']); + void _codeCheck(Function fn) async { + Future _next2(String value) async { + if (value == "success") { + Scaffold.of(context).removeCurrentSnackBar(); + // Scaffold.of(context).showSnackBar(jwSnackBar(true, "验证完成,请再次点击查询")), + pageBus.fire(QueryExamRe(1)); + Navigator.pop(context); + } + } + + Future _next(String value) async { + print(value); + if (value == "success") { + await login(writeData["username"], writeData["password"], textFieldController.text) + .then((String value) => _next2(value)); + } else if (value == "fail") { Scaffold.of(context).removeCurrentSnackBar(); Scaffold.of(context).showSnackBar(jwSnackBar(false, "验证码错误")); fn(() { clicked = !clicked; }); + } else { + Scaffold.of(context).removeCurrentSnackBar(); + Scaffold.of(context).showSnackBar(jwSnackBar(false, value, 4)); + Navigator.pop(context); } } @@ -192,8 +311,11 @@ codeCheckDialogQ(BuildContext context) async { Expanded( child: TextField( controller: textFieldController, - decoration: const InputDecoration( - icon: Icon(Icons.code_outlined), + decoration: InputDecoration( + icon: Icon( + Icons.code_outlined, + color: readColor(), + ), border: InputBorder.none, hintText: "验证码", //类似placeholder效果 ), @@ -217,7 +339,7 @@ codeCheckDialogQ(BuildContext context) async { }, child: Text( !clicked ? "取消" : "", - style: TextStyle(color: Colors.blue), + style: TextStyle(color: readColor()), ), ), TextButton( @@ -226,7 +348,7 @@ codeCheckDialogQ(BuildContext context) async { }, child: Text( !clicked ? "继续" : "稍等...", - style: TextStyle(color: Colors.blue), + style: TextStyle(color: readColor()), ), ), ]), diff --git a/lib/widget/lists.dart b/lib/widget/lists.dart index 32a8e77..92c3a34 100644 --- a/lib/widget/lists.dart +++ b/lib/widget/lists.dart @@ -11,11 +11,21 @@ List _getStartTime(index) { var endH = endTimeList[index - 1][0]; var startM = startTimeList[index - 1][1]; var endM = endTimeList[index - 1][1]; - var y = DateTime.now().year; - var m = DateTime.now().month; - var d = DateTime.now().day; - var h = DateTime.now().hour; - var mm = DateTime.now().minute; + var y = DateTime + .now() + .year; + var m = DateTime + .now() + .month; + var d = DateTime + .now() + .day; + var h = DateTime + .now() + .hour; + var mm = DateTime + .now() + .minute; var difference = DateTime(y, m, d, startH, startM).difference(DateTime(y, m, d, h, mm)); var difference2 = DateTime(y, m, d, endH, endM).difference(DateTime(y, m, d, h, mm)); bool studying = false; @@ -161,7 +171,9 @@ class TodayCourseListItemState extends State { Future.delayed(const Duration(seconds: 1), () { List list = _timeText2(index); if (list[0] != "0" || list[1] != "0") { - print("$index : ${DateTime.now().second}"); + print("$index : ${DateTime + .now() + .second}"); setState(() {}); } }); @@ -184,7 +196,7 @@ class TodayCourseListItemState extends State { Color _timeColors(int index) { String result = _getStartTime(int.parse(todaySchedule[index][3]))[3]; if (result == "before") { - return Colors.blue; + return readColor(); } else { if (_timeText(index).contains("下课")) { return Colors.teal; @@ -508,8 +520,6 @@ class ExamListState extends State { return Icons.panorama_fish_eye; } - process() {} - @override Widget build(BuildContext context) { return SliverList( @@ -531,7 +541,7 @@ class ExamListState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - examList[index][0], + courseLongText2ShortName(examList[index][0]), style: TextStyle( fontSize: 16, fontWeight: FontWeight.bold, color: _getColor2(index)), ), diff --git a/pubspec.yaml b/pubspec.yaml index 2acdc8c..8542cfd 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -33,6 +33,7 @@ dependencies: path_provider: ^2.0.6 event_bus: ^2.0.0 url_launcher: ^6.0.12 + package_info: ^2.0.2 flutter: sdk: flutter @@ -62,11 +63,10 @@ flutter: # included with your application, so that you can use the icons in # the material Icons class. uses-material-design: true - + assets: + - images/g.png # To add assets to your application, add an assets section, like this: - # assets: - # - images/a_dot_burr.jpeg - # - images/a_dot_ham.jpeg + # An image asset can refer to one or more resolution-specific "variants", see # https://flutter.dev/assets-and-images/#resolution-aware.