x1ongzhu 6 lat temu
rodzic
commit
a29b046e18

+ 27 - 0
lib/model/AppealInfo.dart

@@ -0,0 +1,27 @@
+import 'package:json_annotation/json_annotation.dart';
+part 'AppealInfo.g.dart';
+
+@JsonSerializable()
+class AppealInfo {
+  AppealInfo.empty();
+  AppealInfo(this.id, this.delFlag, this.userId, this.playerInfoId, this.competitionId, this.houseId, this.pic, this.status, this.points, this.createTime);
+
+  int id;
+  String delFlag;
+  int userId;
+  int playerInfoId;
+  int competitionId;
+  int houseId;
+  String pic;
+  int status;
+  int points;
+  int createTime;
+
+  factory AppealInfo.fromJson(Map<String, dynamic> json) => _$AppealInfoFromJson(json);
+
+  Map<String, dynamic> toJson() => _$AppealInfoToJson(this);
+  @override
+  String toString() {
+    return _$AppealInfoToJson(this).toString();
+  }
+}

+ 35 - 0
lib/model/AppealInfo.g.dart

@@ -0,0 +1,35 @@
+// GENERATED CODE - DO NOT MODIFY BY HAND
+
+part of 'AppealInfo.dart';
+
+// **************************************************************************
+// JsonSerializableGenerator
+// **************************************************************************
+
+AppealInfo _$AppealInfoFromJson(Map<String, dynamic> json) {
+  return AppealInfo(
+      json['id'] as int,
+      json['delFlag'] as String,
+      json['userId'] as int,
+      json['playerInfoId'] as int,
+      json['competitionId'] as int,
+      json['houseId'] as int,
+      json['pic'] as String,
+      json['status'] as int,
+      json['points'] as int,
+      json['createTime'] as int);
+}
+
+Map<String, dynamic> _$AppealInfoToJson(AppealInfo instance) =>
+    <String, dynamic>{
+      'id': instance.id,
+      'delFlag': instance.delFlag,
+      'userId': instance.userId,
+      'playerInfoId': instance.playerInfoId,
+      'competitionId': instance.competitionId,
+      'houseId': instance.houseId,
+      'pic': instance.pic,
+      'status': instance.status,
+      'points': instance.points,
+      'createTime': instance.createTime
+    };

+ 3 - 6
lib/model/BindGameInfo.g.dart

@@ -12,14 +12,11 @@ BindGameInfo _$BindGameInfoFromJson(Map<String, dynamic> json) {
       json['gameId'] as int,
       json['userId'] as int,
       json['nickName'] as String,
-      GameInfo.fromJson(json['gameInfo'] as Map));
+      json['gameInfo'] == null
+          ? null
+          : GameInfo.fromJson(json['gameInfo'] as Map<String, dynamic>));
 }
 
-// int id;
-// int gameId;//游戏ID
-// int userId;//用户ID
-// String nickName;//用户昵称
-//  GameInfo gameInfo;//游戏信息
 Map<String, dynamic> _$BindGameInfoToJson(BindGameInfo instance) =>
     <String, dynamic>{
       'id': instance.id,

+ 8 - 14
lib/model/CompetitionSeason.g.dart

@@ -16,20 +16,14 @@ CompetitionSeason _$CompetitionSeasonFromJson(Map<String, dynamic> json) {
       json['bonus'] as int,
       json['statusFlag'] as int,
       json['gameId'] as int,
-
-      json['gameInfo']!=null?GameInfo.fromJson(json['gameInfo']):GameInfo.empty(),
-      json['playerInfo']!=null?PlayerInfo.fromJson(json['playerInfo']):PlayerInfo.empty()
-      );
+      json['gameInfo'] == null
+          ? null
+          : GameInfo.fromJson(json['gameInfo'] as Map<String, dynamic>),
+      json['playerInfo'] == null
+          ? null
+          : PlayerInfo.fromJson(json['playerInfo'] as Map<String, dynamic>));
 }
 
-//  int id;
-//   String season;//名称
-//   String shortName;//简称
-//   int beginTime;//开始时间
-//   int endTime;//结束时间
-//   int bonus;//奖金数
-//   int statusFlag;//状态
-//   int gameId; //游戏ID
 Map<String, dynamic> _$CompetitionSeasonToJson(CompetitionSeason instance) =>
     <String, dynamic>{
       'id': instance.id,
@@ -40,6 +34,6 @@ Map<String, dynamic> _$CompetitionSeasonToJson(CompetitionSeason instance) =>
       'bonus': instance.bonus,
       'statusFlag': instance.statusFlag,
       'gameId': instance.gameId,
-      'gameInfo':instance.gameInfo,
-      'playerInfo':instance.playerInfo
+      'gameInfo': instance.gameInfo,
+      'playerInfo': instance.playerInfo
     };

+ 0 - 6
lib/model/GameInfo.g.dart

@@ -16,12 +16,6 @@ GameInfo _$GameInfoFromJson(Map<String, dynamic> json) {
       json['profile'] as String);
 }
 
-//  int id;
-//   String gameName;//名称
-//   String icon;//图标
-//   int typeFlag;//类型
-// String shortName;//简称
-// String profile;//简介
 Map<String, dynamic> _$GameInfoToJson(GameInfo instance) => <String, dynamic>{
       'id': instance.id,
       'gameName': instance.gameName,

+ 4 - 7
lib/model/GameInfoSeasons.g.dart

@@ -11,15 +11,12 @@ GameInfoSeasons _$GameInfoSeasonsFromJson(Map<String, dynamic> json) {
       json['id'] as int,
       json['gameName'] as String,
       json['typeFlag'] as int,
-      json['competitionSeason'] != null
-          ? CompetitionSeason.fromJson(json['competitionSeason'])
-          : CompetitionSeason.empty());
+      json['competitionSeason'] == null
+          ? null
+          : CompetitionSeason.fromJson(
+              json['competitionSeason'] as Map<String, dynamic>));
 }
 
-// int id;
-// String gameName; //名称
-// int typeFlag; //类型
-// CompetitionSeason competitionSeason;
 Map<String, dynamic> _$GameInfoSeasonsToJson(GameInfoSeasons instance) =>
     <String, dynamic>{
       'id': instance.id,

+ 1 - 0
lib/model/HouseInfo.dart

@@ -39,6 +39,7 @@ class HouseInfo {
   int maxNumber; //最大加入人数
   int bonus; //奖金
   int houseType; //0为个人1为官方
+   @JsonKey(name: 'houseLevelInfo')
   HouseLevel houseLevel;
   String gameHouseId; //游戏房间号
   String gameHousePassword; //游戏密码

+ 7 - 21
lib/model/HouseInfo.g.dart

@@ -15,14 +15,16 @@ HouseInfo _$HouseInfoFromJson(Map<String, dynamic> json) {
       json['houseName'] as String,
       json['houseAbstract'] as String,
       json['video'] as String,
-      json['gameInfo'] != null ? GameInfo.fromJson(json['gameInfo']) : null,
+      json['gameInfo'] == null
+          ? null
+          : GameInfo.fromJson(json['gameInfo'] as Map<String, dynamic>),
       json['playerNumber'] as int,
       json['maxNumber'] as int,
       json['bonus'] as int,
       json['houseType'] as int,
-      json['houseLevelInfo'] != null
-          ? HouseLevel.fromJson(json['houseLevelInfo'])
-          : null,
+      json['houseLevelInfo'] == null
+          ? null
+          : HouseLevel.fromJson(json['houseLevelInfo'] as Map<String, dynamic>),
       json['gameHouseId'] as String,
       json['gameHousePassword'] as String,
       json['statusFlag'] as int,
@@ -33,22 +35,6 @@ HouseInfo _$HouseInfoFromJson(Map<String, dynamic> json) {
       json['houseCode'] as String);
 }
 
-//  int id;
-//   int gameId; //游戏ID
-//   int userId; //用户ID
-//   int seasonId; //赛季ID
-//   String houseName; //房间名称
-//   String houseAbstract; //房间描述
-//   String video; //视频
-//   GameInfo gameInfo; //游戏信息
-// int playerNumber;//加入人数
-//   int maxNumber; //最大加入人数
-//   int bonus; //奖金
-//   int houseType; //0为个人1为官方
-//   HouseLevel houseLevel;
-//   String gameHouseId; //游戏房间号
-//   String gameHousePassword; //游戏密码
-//   int statusFlag; //状态
 Map<String, dynamic> _$HouseInfoToJson(HouseInfo instance) => <String, dynamic>{
       'id': instance.id,
       'gameId': instance.gameId,
@@ -62,7 +48,7 @@ Map<String, dynamic> _$HouseInfoToJson(HouseInfo instance) => <String, dynamic>{
       'maxNumber': instance.maxNumber,
       'bonus': instance.bonus,
       'houseType': instance.houseType,
-      'houseLevel': instance.houseLevel,
+      'houseLevelInfo': instance.houseLevel,
       'gameHouseId': instance.gameHouseId,
       'gameHousePassword': instance.gameHousePassword,
       'statusFlag': instance.statusFlag,

+ 0 - 6
lib/model/HouseLevel.g.dart

@@ -20,12 +20,6 @@ HouseLevel _$HouseLevelFromJson(Map<String, dynamic> json) {
       json['avgRatio'] as num);
 }
 
-// String levelName;//名称
-// String icon;//图标
-// int entryCoin;//加入金额
-// num feeRatio;//服务费
-// num poolRatio;//奖金池
-// num avgRatio;//平均分比例
 Map<String, dynamic> _$HouseLevelToJson(HouseLevel instance) =>
     <String, dynamic>{
       'id': instance.id,

+ 1 - 8
lib/model/MemberHouseCard.g.dart

@@ -18,13 +18,6 @@ MemberHouseCard _$MemberHouseCardFromJson(Map<String, dynamic> json) {
       json['createTime'] as int);
 }
 
-// int id;
-// int gameId; //游戏ID
-// int houseId; //房间ID
-// int userId; //用户ID
-// String remark; //备注
-// int money; //消费金额
-// int typeFlag; //类型
 Map<String, dynamic> _$MemberHouseCardToJson(MemberHouseCard instance) =>
     <String, dynamic>{
       'id': instance.id,
@@ -34,5 +27,5 @@ Map<String, dynamic> _$MemberHouseCardToJson(MemberHouseCard instance) =>
       'remark': instance.remark,
       'money': instance.money,
       'typeFlag': instance.typeFlag,
-      'createTime':instance.createTime
+      'createTime': instance.createTime
     };

+ 15 - 17
lib/model/PlayerInfo.g.dart

@@ -12,30 +12,28 @@ PlayerInfo _$PlayerInfoFromJson(Map<String, dynamic> json) {
       json['houseId'] as int,
       json['userId'] as int,
       json['statusFlag'] as int,
-      json['userInfo'] != null ? UserInfo.fromJson(json['userInfo']) : null,
+      json['userInfo'] == null
+          ? null
+          : UserInfo.fromJson(json['userInfo'] as Map<String, dynamic>),
       json['bonus'] as int,
-      json['gameInfo'] != null ? GameInfo.fromJson(json['gameInfo']) : null,
-      json['houseInfo'] != null ? HouseInfo.fromJson(json['houseInfo']) : null,
-      json['rank'] ?? null,
-      json['houseRank'] ?? null,
-      json['video'] ?? '',
+      json['gameInfo'] == null
+          ? null
+          : GameInfo.fromJson(json['gameInfo'] as Map<String, dynamic>),
+      json['houseInfo'] == null
+          ? null
+          : HouseInfo.fromJson(json['houseInfo'] as Map<String, dynamic>),
+      json['rank'] as int,
+      json['houseRank'] as int,
+      json['video'] as String,
       json['platinum'] as int,
       json['gold'] as int,
       json['silver'] as int,
       json['bronze'] as int,
-      json['medal'] != null ? json['medal'] as String : '');
+      json['medal'] as String);
 }
 
-//  int id;
-//   int houseId;//房间id
-//   int userId;//用户id
-//   int statusFlag;//状态 0加入 1准备 2开始 3结束 6未比赛
-//   UserInfo userInfo;
-// int platinum; //铂金
-// int gold;//金牌
-// int  silver;//银牌
-// int bronze;//铜牌
-Map<String, dynamic> _$PlayerInfoToJson(PlayerInfo instance) => <String, dynamic>{
+Map<String, dynamic> _$PlayerInfoToJson(PlayerInfo instance) =>
+    <String, dynamic>{
       'id': instance.id,
       'houseId': instance.houseId,
       'userId': instance.userId,

+ 4 - 10
lib/model/ProductInfo.g.dart

@@ -7,18 +7,12 @@ part of 'ProductInfo.dart';
 // **************************************************************************
 
 ProductInfo _$ProductInfoFromJson(Map<String, dynamic> json) {
-  return ProductInfo(
-      json['id'] as int,
-      json['productName'] as String,
-      json['money'] as int,
-      json['typeFlag'] as int);
+  return ProductInfo(json['id'] as int, json['productName'] as String,
+      json['money'] as int, json['typeFlag'] as int);
 }
 
-//  int id;
-//  String productName;//名称
-//   int money;//钱
-//   int typeFlag;//类型
-Map<String, dynamic> _$ProductInfoToJson(ProductInfo instance) => <String, dynamic>{
+Map<String, dynamic> _$ProductInfoToJson(ProductInfo instance) =>
+    <String, dynamic>{
       'id': instance.id,
       'productName': instance.productName,
       'money': instance.money,

+ 20 - 26
lib/model/SystemNotice.g.dart

@@ -19,39 +19,33 @@ SystemNotice _$SystemNoticeFromJson(Map<String, dynamic> json) {
       json['statusFlag'] as int,
       json['createTime'] as int,
       json['playerId'] as int,
-      json['gameInfo'] != null ? GameInfo.fromJson(json['gameInfo']) : null,
-      json['houseInfo'] != null ? HouseInfo.fromJson(json['houseInfo']) : null,
-      json['playerInfo']!=null?PlayerInfo.fromJson(json['playerInfo']):null,
-      json['bonus']??0);
+      json['gameInfo'] == null
+          ? null
+          : GameInfo.fromJson(json['gameInfo'] as Map<String, dynamic>),
+      json['houseInfo'] == null
+          ? null
+          : HouseInfo.fromJson(json['houseInfo'] as Map<String, dynamic>),
+      json['playerInfo'] == null
+          ? null
+          : PlayerInfo.fromJson(json['playerInfo'] as Map<String, dynamic>),
+      json['bonus'] as int);
 }
 
-// int id;
-//   int gameId;//游戏ID
-//   int houseId;//房间ID
-//   int userId;//用户ID
-//   int seasonId;//赛季ID
-//   String content;//内容
-//   String icon;//图标
-//   in typeFlag;//0.普通1.比赛结果2.领取奖励
-//   int statusFlag;//状态 0.未读1.已读
-//   int createTime;//创建时间
-// GameInfo gameInfo;//游戏信息
-// HouseInfo houseInfo;//房间信息
 Map<String, dynamic> _$SystemNoticeToJson(SystemNotice instance) =>
     <String, dynamic>{
       'id': instance.id,
-      'gameId': instance.gameId != null ? instance.gameId : 0,
-      'houseId': instance.houseId != null ? instance.houseId : 0,
+      'gameId': instance.gameId,
+      'houseId': instance.houseId,
       'userId': instance.userId,
-      'seasonId': instance.seasonId != null ? instance.seasonId : 0,
-      'icon': instance.icon != null ? instance.icon : '',
-      'typeFlag': instance.typeFlag,
+      'seasonId': instance.seasonId,
       'content': instance.content,
+      'icon': instance.icon,
+      'typeFlag': instance.typeFlag,
       'statusFlag': instance.statusFlag,
       'createTime': instance.createTime,
-      'playerId': instance.playerId != null ? instance.playerId : 0,
-      'gameInfo': instance.gameInfo != null ? instance.gameInfo : {},
-      'HouseInfo': instance.houseInfo != null ? instance.houseInfo : {},
-      'playerInfo':instance.playerInfo,
-      'bonus':instance.bonus
+      'playerId': instance.playerId,
+      'gameInfo': instance.gameInfo,
+      'houseInfo': instance.houseInfo,
+      'playerInfo': instance.playerInfo,
+      'bonus': instance.bonus
     };

+ 5 - 5
lib/model/UserInfo.g.dart

@@ -14,15 +14,15 @@ UserInfo _$UserInfoFromJson(Map<String, dynamic> json) {
       json['icon'] as String,
       json['phone'] as String,
       json['sex'] as String,
-      (json['moneyCoin'] as num)?.toInt(),
+      json['moneyCoin'] as int,
       (json['moneyPoint'] as num)?.toDouble(),
       json['birthday'] as int,
       json['noticeFlag'] == 'Y',
       json['remindFlag'] == 'Y',
       json['createFlag'] == 'Y',
-      json['houseCard'] != null ? json['houseCard'] as int : 0,
-      json['recommender'] != null ? json['recommender'] as int : null,
-      json['levelId'] != null ? json['levelId'] as int : 0,
+      json['houseCard'] as int,
+      json['recommender'] as int,
+      json['levelId'] as int,
       json['moneyTicket'] as int);
 }
 
@@ -42,5 +42,5 @@ Map<String, dynamic> _$UserInfoToJson(UserInfo instance) => <String, dynamic>{
       'houseCard': instance.houseCard,
       'recommender': instance.recommender,
       'levelId': instance.levelId,
-      'moneyTicket':instance.moneyTicket
+      'moneyTicket': instance.moneyTicket
     };

+ 3 - 14
lib/model/UserLevel.g.dart

@@ -7,19 +7,8 @@ part of 'UserLevel.dart';
 // **************************************************************************
 
 UserLevel _$UserLevelFromJson(Map<String, dynamic> json) {
-  return UserLevel(
-    json['id'] as int,
-    json['name'] as String,
-  );
+  return UserLevel(json['id'] as int, json['name'] as String);
 }
 
-//  int id;
-//   String gameName;//名称
-//   String icon;//图标
-//   int typeFlag;//类型
-// String shortName;//简称
-// String profile;//简介
-Map<String, dynamic> _$UserLevelToJson(UserLevel instance) => <String, dynamic>{
-      'id': instance.id,
-      'name': instance.name,
-    };
+Map<String, dynamic> _$UserLevelToJson(UserLevel instance) =>
+    <String, dynamic>{'id': instance.id, 'name': instance.name};

+ 201 - 0
lib/pages/Appeal.dart

@@ -0,0 +1,201 @@
+import 'dart:io';
+
+import 'package:cached_network_image/cached_network_image.dart';
+import 'package:dio/dio.dart';
+import 'package:file_picker/file_picker.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter/widgets.dart';
+import 'package:flutter_redux/flutter_redux.dart';
+import 'package:image_picker/image_picker.dart';
+import 'package:wanna_battle/model/PlayerInfo.dart';
+import 'package:wanna_battle/net/HttpManager.dart';
+import 'package:wanna_battle/net/Result.dart';
+import 'package:wanna_battle/redux/AppState.dart';
+import 'package:wanna_battle/styles/colors.dart';
+import 'package:wanna_battle/styles/totast.dart';
+
+class Appeal extends StatefulWidget {
+  final PlayerInfo playerInfo;
+  const Appeal(this.playerInfo, {Key key}) : super(key: key);
+  @override
+  State<StatefulWidget> createState() {
+    return AppealState();
+  }
+}
+
+class AppealState extends State<Appeal> {
+  String img1;
+  String img2;
+  @override
+  Widget build(BuildContext context) {
+    return WillPopScope(
+      onWillPop: () {
+        return Future.value(true);
+      },
+      child: Scaffold(
+        appBar: AppBar(
+          title: Text('上传比赛结果'),
+          centerTitle: true,
+        ),
+        body: Column(
+          children: <Widget>[
+            Expanded(
+              child: ListView(
+                padding: EdgeInsets.only(left: 15, top: 18, right: 15, bottom: 18),
+                children: <Widget>[
+                  Container(
+                    padding: EdgeInsets.all(3),
+                    child: Text(
+                      '很遗憾,因为部分手机系统性能问题导致比赛结果上传失败,请你按照下图所示方式上传历史战绩以及本次游戏比赛详情战绩,工作人员审核后会根据实际情况进行名次的排序以及奖励的发放',
+                      style: TextStyle(color: Colors.white, fontSize: 14),
+                    ),
+                  ),
+                  Container(
+                    margin: EdgeInsets.only(top: 20),
+                    child: Row(
+                      children: <Widget>[
+                        Expanded(
+                          child: Container(
+                            padding: EdgeInsets.only(right: 7),
+                            child: imgUpload('点击上传历史战绩截图', img1, (img) {
+                              setState(() {
+                                img1 = img;
+                              });
+                            }),
+                          ),
+                        ),
+                        Expanded(
+                          child: Container(
+                            padding: EdgeInsets.only(left: 7),
+                            child: imgUpload('点击上传战绩详情截图', img2, (img) {
+                              setState(() {
+                                img2 = img;
+                              });
+                            }),
+                          ),
+                        ),
+                      ],
+                    ),
+                  ),
+                  Container(
+                    margin: EdgeInsets.only(top: 30),
+                    child: Text(
+                      '历史战绩-图片示例',
+                      textAlign: TextAlign.center,
+                      style: TextStyle(color: Colors.white, fontSize: 14),
+                    ),
+                  ),
+                  Container(
+                    margin: EdgeInsets.only(top: 10),
+                    child: Image.asset(
+                      'images/shili_img_01.png',
+                      fit: BoxFit.cover,
+                    ),
+                  ),
+                  Container(
+                    margin: EdgeInsets.only(top: 20),
+                    child: Text(
+                      '战绩详情-图片示例',
+                      textAlign: TextAlign.center,
+                      style: TextStyle(color: Colors.white, fontSize: 14),
+                    ),
+                  ),
+                  Container(
+                    margin: EdgeInsets.only(top: 10),
+                    child: Image.asset(
+                      'images/shili_img_02.png',
+                      fit: BoxFit.cover,
+                    ),
+                  ),
+                ],
+              ),
+            ),
+            SafeArea(
+              child: Container(
+                height: 68,
+                width: double.infinity,
+                padding: EdgeInsets.fromLTRB(15, 10, 15, 10),
+                child: FlatButton(
+                  color: PRIMARY_COLOR,
+                  child: Text(
+                    '提交',
+                    style: TextStyle(color: Colors.white, fontSize: 16, fontWeight: FontWeight.bold),
+                  ),
+                  onPressed: () async {
+                    if (img1 == null || img1.isEmpty) {
+                      Toast.show(context, '请上传历史战绩截图', 1500, 'info');
+                    } else if (img2 == null || img2.isEmpty) {
+                      Toast.show(context, '请上传战绩详情截图', 1500, 'info');
+                    } else {
+                      Toast.show(context, '加载中', -1, 'loading');
+                      final res = await HttpManager.post('appealInfo/save', data: {
+                        'userId': StoreProvider.of<AppState>(context).state.userInfo.id,
+                        'playerInfoId': widget.playerInfo.id,
+                        'houseId': widget.playerInfo.houseId,
+                        'pic': img1 + ',' + img2,
+                      });
+                      Toast.hide();
+                      if (res.success) {
+                        Navigator.of(context).pop(true);
+                      } else {
+                        Toast.show(context, '提交失败,请稍后再试', 1500, 'info');
+                      }
+                    }
+                  },
+                ),
+              ),
+            )
+          ],
+        ),
+      ),
+    );
+  }
+
+  Widget imgUpload(String txt, String img, Function(String img) onUploadSuccess) {
+    return GestureDetector(
+      child: img != null && img.isNotEmpty
+          ? Container(
+              height: 111,
+              decoration: BoxDecoration(border: Border.all(width: 1, color: Color(0x5C1990F8)), color: Color(0xFF293354)),
+              child: CachedNetworkImage(
+                imageUrl: img,
+                height: 111,
+                fit: BoxFit.contain,
+              ),
+            )
+          : Container(
+              height: 111,
+              decoration: BoxDecoration(border: Border.all(width: 1, color: Color(0x5C1990F8)), color: Color(0xFF293354)),
+              child: Column(
+                mainAxisSize: MainAxisSize.max,
+                mainAxisAlignment: MainAxisAlignment.center,
+                children: <Widget>[
+                  Image.asset('images/icon_shangchuan.png', width: 34),
+                  Container(
+                    margin: EdgeInsets.only(top: 10),
+                    child: Text(
+                      txt,
+                      style: TextStyle(color: PRIMARY_COLOR, fontSize: 13),
+                    ),
+                  )
+                ],
+              ),
+            ),
+      onTap: () async {
+        File file = await ImagePicker.pickImage(source: ImageSource.gallery, maxWidth: 1000);
+        if (file == null) {
+          return;
+        }
+        Toast.show(context, '加载中', -1, 'loading');
+        Result res = await HttpManager.post('assets/uploadFile', data: {
+          'file': UploadFileInfo(file, file.path),
+        });
+        Toast.hide();
+        print(res.toJson());
+        if (res.success) {
+          onUploadSuccess(res.data[0]);
+        }
+      },
+    );
+  }
+}

+ 22 - 1
lib/pages/HomePage.dart

@@ -1,5 +1,7 @@
 import 'package:flutter/material.dart';
+import 'package:wanna_battle/model/PlayerInfo.dart';
 import '../widget/HomeDrawer.dart';
+import 'Appeal.dart';
 import 'CreateRoom.dart';
 import 'RoomList.dart';
 import 'RankList.dart';
@@ -101,6 +103,21 @@ class _HomePageState extends State<HomePage> with WidgetsBindingObserver {
     }
   }
 
+  Future<void> checkErrorPlayerInfo() async {
+    final Result res = await HttpManager.get('playerInfo/getErrorPlayerInfo');
+    if (res.success) {
+      final PlayerInfo playerInfo = PlayerInfo.fromJson(res.data);
+      MyDialog.showDialog(
+        context,
+        '由于系统性能安全策略问题导致本次比赛结果上传失败,你可以上传本次比赛结果照片进行结果申诉',
+        isCancel: true,
+        onsubmit: () {
+          Navigator.push(context, CupertinoPageRoute(builder: (context) => Appeal(playerInfo)));
+        },
+      );
+    }
+  }
+
   @override
   void initState() {
     super.initState();
@@ -109,6 +126,7 @@ class _HomePageState extends State<HomePage> with WidgetsBindingObserver {
     Future.delayed(Duration.zero, () {
       getSeasonInfo();
       getUnreadMsg();
+      checkErrorPlayerInfo();
     });
   }
 
@@ -235,7 +253,10 @@ class _HomePageState extends State<HomePage> with WidgetsBindingObserver {
                                   Column(
                                     children: <Widget>[
                                       Text('当前排名', style: TextStyle(color: Color(0xFFFFFFFF), fontSize: 13)),
-                                      Text(seasonList[index].competitionSeason.playerInfo.rank!=null?seasonList[index].competitionSeason.playerInfo.rank.toString():'无排名',
+                                      Text(
+                                          seasonList[index].competitionSeason.playerInfo.rank != null
+                                              ? seasonList[index].competitionSeason.playerInfo.rank.toString()
+                                              : '无排名',
                                           style: TextStyle(color: Color(0xFFFFFFFF), fontSize: 13))
                                     ],
                                   )

+ 13 - 5
lib/pages/RoomInfo.dart

@@ -1,23 +1,24 @@
+import 'dart:async';
+import 'dart:ui';
 import 'package:flutter/material.dart';
 import 'package:flutter_screenutil/flutter_screenutil.dart';
 import 'package:url_launcher/url_launcher.dart';
+import 'package:battery/battery.dart';
+import 'package:flutter_redux/flutter_redux.dart';
+import 'package:flutter/cupertino.dart';
 import '../styles/colors.dart';
-import 'dart:ui';
 import '../plugins/ScreenStramPlugin.dart';
 import '../net/HttpManager.dart';
 import '../net/Result.dart';
-import 'package:flutter_redux/flutter_redux.dart';
 import '../redux/AppState.dart';
 import '../model/HouseInfo.dart';
 import '../styles/totast.dart';
 import 'StartWindow.dart';
 import '../model/PlayerInfo.dart';
 import '../widget/VideoWidget.dart';
-import 'dart:async';
 import '../widget/Dialog.dart';
 import 'CompetitionInformation.dart';
 import 'SecondRoomInfo.dart';
-import 'package:flutter/cupertino.dart';
 import 'VideoPlayer.dart';
 import '../model/UserInfo.dart';
 import '../widget/LinearButton.dart';
@@ -119,11 +120,14 @@ class RoomInfoState extends State<RoomInfo> with SingleTickerProviderStateMixin
       success = await ScreenStreamPlugin.start(playerInfo.id.toString());
       if (success) {
         data['statusFlag'] = 2;
+        data['played'] = true;
       } else {
         data['statusFlag'] = 6;
+        data['played'] = false;
       }
     } else {
       data['statusFlag'] = 6;
+      data['played'] = false;
     }
     Toast.show(context, '加载中', -1, 'loading');
     Result res = await HttpManager.post('playerInfo/update', data: data);
@@ -363,7 +367,11 @@ class RoomInfoState extends State<RoomInfo> with SingleTickerProviderStateMixin
       '青铜': Color(0xFFE18D50),
     };
 
-    Future.delayed(Duration.zero, () {
+    Future.delayed(Duration.zero, () async {
+      final battery = Battery();
+      final batteryLevel = await battery.batteryLevel;
+      await MyDialog.showDialog(context, (batteryLevel < 50 ? '系统检测到你的电量低于50%' : '') + ' 为了正常上传比赛结果,建议插上电源线保持电量充足', submitText: '知道了');
+
       getRoomInfo();
       userInfo = StoreProvider.of<AppState>(context).state.userInfo;
       // showStart();

+ 20 - 53
lib/widget/Dialog.dart

@@ -6,31 +6,19 @@ import 'LinearButton.dart';
 //   }
 
 class MyDialog {
-  static void showDialog(context, text,
-      {String title,
-      bool isCancel = false,
-      String submitText = '确认',
-      OnTapHomeMenu onsubmit,
-      OnTapHomeMenu oncancel}) {
-    Navigator.of(context).push(
+  static Future showDialog(context, text, {String title, bool isCancel = false, String submitText = '确认', OnTapHomeMenu onsubmit, OnTapHomeMenu oncancel}) {
+    return Navigator.of(context).push(
       PageRouteBuilder(
         opaque: false,
         transitionDuration: Duration(milliseconds: 300),
-        transitionsBuilder: (BuildContext context, Animation<double> animation,
-            Animation<double> secondaryAnimation, Widget child) {
+        transitionsBuilder: (BuildContext context, Animation<double> animation, Animation<double> secondaryAnimation, Widget child) {
           return FadeTransition(
             opacity: CurvedAnimation(parent: animation, curve: Curves.linear),
             child: child,
           );
         },
         pageBuilder: (BuildContext context, _, __) {
-          return LoadingDialog(
-              title: title,
-              text: text,
-              submitText: submitText,
-              cancel: isCancel,
-              onsubmit: onsubmit,
-              oncancel: oncancel);
+          return LoadingDialog(title: title, text: text, submitText: submitText, cancel: isCancel, onsubmit: onsubmit, oncancel: oncancel);
         },
       ),
     );
@@ -48,15 +36,7 @@ class LoadingDialog extends Dialog {
   OnTapHomeMenu onsubmit = () {};
   OnTapHomeMenu oncancel = () {};
 
-  LoadingDialog(
-      {Key key,
-      @required this.text,
-      this.cancel,
-      this.onsubmit,
-      this.oncancel,
-      this.title,
-      this.submitText})
-      : super(key: key);
+  LoadingDialog({Key key, @required this.text, this.cancel, this.onsubmit, this.oncancel, this.title, this.submitText}) : super(key: key);
 
   @override
   Widget build(BuildContext context) {
@@ -69,43 +49,31 @@ class LoadingDialog extends Dialog {
               child: Container(
                 width: 270,
                 // padding: EdgeInsets.symmetric(horizontal: 20, vertical: 25),
-                decoration: BoxDecoration(
-                    color: Color(0xFF15151D),
-                    border: Border.all(width: 1, color: Theme.of(context).primaryColor)),
+                decoration: BoxDecoration(color: Color(0xFF15151D), border: Border.all(width: 1, color: Theme.of(context).primaryColor)),
                 child: Stack(
                   children: <Widget>[
                     Padding(
-                      padding:
-                          EdgeInsets.symmetric(horizontal: 20, vertical: 25),
+                      padding: EdgeInsets.symmetric(horizontal: 20, vertical: 25),
                       child: Column(
                         mainAxisAlignment: MainAxisAlignment.center,
                         children: <Widget>[
-                          Text(title ?? '提示',
-                              style: TextStyle(
-                                  color: Colors.white,
-                                  fontSize: 18,
-                                  fontWeight: FontWeight.w600)),
+                          Text(title ?? '提示', style: TextStyle(color: Colors.white, fontSize: 18, fontWeight: FontWeight.w600)),
                           Container(
                             height: 20,
                           ),
-                          Text(text,
-                              style:
-                                  TextStyle(color: Colors.white, fontSize: 14),
-                              textAlign: TextAlign.center),
+                          Text(text, style: TextStyle(color: Colors.white, fontSize: 14), textAlign: TextAlign.center),
                           Container(
                             height: 30,
                           ),
                           cancel
                               ? Row(
-                                  mainAxisAlignment:
-                                      MainAxisAlignment.spaceBetween,
+                                  mainAxisAlignment: MainAxisAlignment.spaceBetween,
                                   children: <Widget>[
                                     Container(
                                       width: 100,
                                       child: RaisedButton(
                                         color: Color(0xFF3A3D5C),
-                                        highlightColor:
-                                            Color(0xFF3A3D5C).withOpacity(0.8),
+                                        highlightColor: Color(0xFF3A3D5C).withOpacity(0.8),
                                         textColor: Colors.white,
                                         child: Text('取消'),
                                         onPressed: () {
@@ -137,15 +105,14 @@ class LoadingDialog extends Dialog {
                                 )
                               : Container(
                                   width: double.infinity,
-                                  child:
-                                   LinearButton(
-                                          btntext: submitText,
-                                          btnHeight: 36.0,
-                                          onTapHomeMenu: () {
-                                            Navigator.of(context).pop();
-                                            onsubmit();
-                                          },
-                                        )
+                                  child: LinearButton(
+                                    btntext: submitText,
+                                    btnHeight: 36.0,
+                                    onTapHomeMenu: () {
+                                      Navigator.of(context).pop();
+                                      onsubmit();
+                                    },
+                                  )
                                   //  RaisedButton(
                                   //   textColor: Colors.white,
                                   //   child: Text(submitText),
@@ -154,7 +121,7 @@ class LoadingDialog extends Dialog {
                                   //     onsubmit();
                                   //   },
                                   // ),
-                                ),
+                                  ),
                           Container(
                             height: 5,
                           )

+ 43 - 1
pubspec.lock

@@ -22,6 +22,13 @@ packages:
       url: "https://pub.dartlang.org"
     source: hosted
     version: "2.1.0"
+  battery:
+    dependency: "direct main"
+    description:
+      name: battery
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "0.3.0+5"
   boolean_selector:
     dependency: transitive
     description:
@@ -85,6 +92,13 @@ packages:
       url: "https://pub.dartlang.org"
     source: hosted
     version: "6.6.0"
+  cached_network_image:
+    dependency: "direct main"
+    description:
+      name: cached_network_image
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "0.8.0"
   charcode:
     dependency: transitive
     description:
@@ -161,7 +175,7 @@ packages:
       name: file_picker
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "1.3.6"
+    version: "1.3.7"
   fixnum:
     dependency: transitive
     description:
@@ -181,6 +195,13 @@ packages:
       url: "https://pub.dartlang.org"
     source: hosted
     version: "0.2.2"
+  flutter_cache_manager:
+    dependency: transitive
+    description:
+      name: flutter_cache_manager
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "0.3.2"
   flutter_localizations:
     dependency: "direct main"
     description: flutter
@@ -282,6 +303,13 @@ packages:
       url: "https://pub.dartlang.org"
     source: hosted
     version: "1.0.2"
+  image_picker:
+    dependency: "direct main"
+    description:
+      name: image_picker
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "0.6.0+12"
   intl:
     dependency: "direct main"
     description:
@@ -532,6 +560,13 @@ packages:
       url: "https://pub.dartlang.org"
     source: hosted
     version: "1.5.5"
+  sqflite:
+    dependency: transitive
+    description:
+      name: sqflite
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "1.1.6+1"
   stack_trace:
     dependency: transitive
     description:
@@ -609,6 +644,13 @@ packages:
       url: "https://pub.dartlang.org"
     source: hosted
     version: "5.0.3"
+  uuid:
+    dependency: transitive
+    description:
+      name: uuid
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "2.0.2"
   vector_math:
     dependency: transitive
     description:

+ 4 - 1
pubspec.yaml

@@ -23,7 +23,7 @@ dependencies:
   redux_persist_flutter: ^0.8.1
   flutter_picker: ^1.0.9
   intl: "^0.15.6"
-  file_picker: ^1.3.1
+  file_picker: ^1.3.7
   json_serializable: ^2.0.2
   shared_preferences: ^0.5.1
   package_info: ^0.4.0
@@ -38,6 +38,9 @@ dependencies:
   screen_stream_plugin:
     path: ./screen_stream_plugin
   flutter_bugly: ^0.2.2
+  battery: ^0.3.0+4
+  cached_network_image: ^0.8.0
+  image_picker: ^0.6.0+4
 
 dev_dependencies:
   build_runner: ^1.1.1

+ 1 - 1
screen_stream_plugin/android/src/main/java/com/izouma/screen_stream_plugin/ImageAvailableListener.java

@@ -74,7 +74,7 @@ public class ImageAvailableListener implements ImageReader.OnImageAvailableListe
 
                 Bitmap bitmap = Bitmap.createBitmap(1280, 720, Bitmap.Config.ARGB_8888);
                 bitmap.copyPixelsFromBuffer(buffer);
-                if (frameCount % 2 == 0) {
+                if (frameCount % 3 != 0) {
                     bitmap.recycle();
                     return;
                 }