From a1a0e3caf8e1f96ccea03c6364d3970cef6d1707 Mon Sep 17 00:00:00 2001 From: laiiihz Date: Thu, 5 Nov 2020 16:33:29 +0800 Subject: [PATCH 01/13] update icon --- lib/ui/home/application/applications_page.dart | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/lib/ui/home/application/applications_page.dart b/lib/ui/home/application/applications_page.dart index 44b10e8..235cc7e 100644 --- a/lib/ui/home/application/applications_page.dart +++ b/lib/ui/home/application/applications_page.dart @@ -1,6 +1,7 @@ import 'package:aku_community_manager/ui/manage_pages/green_manage/green_manage_page.dart'; import 'package:aku_community_manager/ui/manage_pages/inspection_manage/inspection_manage_page.dart'; import 'package:aku_community_manager/ui/sub_pages/activity_manager/activity_manager_page.dart'; +import 'package:aku_community_manager/ui/sub_pages/business_and_fix/business_and_fix_page.dart'; import 'package:aku_community_manager/ui/sub_pages/decoration_manager/decoration_manager_page.dart'; import 'package:aku_community_manager/ui/sub_pages/items_outdoor/items_outdoor_page.dart'; import 'package:aku_community_manager/ui/sub_pages/visitor_manager/visitor_manager_page.dart'; @@ -45,19 +46,20 @@ class _ApplicationPageState extends State AppApplication( '活动管理', R.ASSETS_HOME_IC_ACTIVITY_PNG, ActivityManagerPage()), AppApplication('访客管理', R.ASSETS_HOME_IC_VISITORS_PNG, VisitorManagerPage()), - AppApplication('便民电话', '', Scaffold()), AppApplication('借还管理', R.ASSETS_HOME_IC_BORROW_PNG, Scaffold()), - AppApplication('工单管理', '', Scaffold()), - AppApplication('语音管家', '', Scaffold()), AppApplication('一键报警', R.ASSETS_HOME_IC_POLICE_PNG, Scaffold()), - AppApplication('问卷调查', '', Scaffold()), ]; List _wisdomApplications = [ - AppApplication('绿化管理', R.ASSETS_HOME_IC_GREENING_PNG, GreenManagePage()), - AppApplication('巡检管理', R.ASSETS_HOME_IC_PATROL_PNG, InspectionManagePage()), + AppApplication('一键报警', R.ASSETS_HOME_IC_POLICE_PNG, Scaffold()), + AppApplication('访客管理', R.ASSETS_HOME_IC_VISITORS_PNG, VisitorManagerPage()), + AppApplication('报事报修', R.ASSETS_HOME_IC_SERVICE_PNG, BusinessAndFixPage()), + AppApplication('物品出户', R.ASSETS_HOME_IC_ARTICLE_PNG, ItemsOutdoorPage()), AppApplication( '装修管理', R.ASSETS_HOME_IC_DECORATION_PNG, DecorationManagerPage()), - AppApplication('物品出户', R.ASSETS_HOME_IC_ARTICLE_PNG, ItemsOutdoorPage()), + AppApplication('活动管理', R.ASSETS_HOME_IC_ACTIVITY_PNG, Scaffold()), + AppApplication('借还管理', R.ASSETS_HOME_IC_BORROW_PNG, Scaffold()), + AppApplication('巡检管理', R.ASSETS_HOME_IC_PATROL_PNG, InspectionManagePage()), + AppApplication('绿化管理', R.ASSETS_HOME_IC_GREENING_PNG, GreenManagePage()), ]; @override From c4af167c672eefb6d177559f65b33ce0d3c8dd14 Mon Sep 17 00:00:00 2001 From: laiiihz Date: Thu, 5 Nov 2020 16:47:34 +0800 Subject: [PATCH 02/13] application ui update --- lib/ui/home/application/applications_page.dart | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/ui/home/application/applications_page.dart b/lib/ui/home/application/applications_page.dart index 235cc7e..a470a76 100644 --- a/lib/ui/home/application/applications_page.dart +++ b/lib/ui/home/application/applications_page.dart @@ -56,7 +56,8 @@ class _ApplicationPageState extends State AppApplication('物品出户', R.ASSETS_HOME_IC_ARTICLE_PNG, ItemsOutdoorPage()), AppApplication( '装修管理', R.ASSETS_HOME_IC_DECORATION_PNG, DecorationManagerPage()), - AppApplication('活动管理', R.ASSETS_HOME_IC_ACTIVITY_PNG, Scaffold()), + AppApplication( + '活动管理', R.ASSETS_HOME_IC_ACTIVITY_PNG, ActivityManagerPage()), AppApplication('借还管理', R.ASSETS_HOME_IC_BORROW_PNG, Scaffold()), AppApplication('巡检管理', R.ASSETS_HOME_IC_PATROL_PNG, InspectionManagePage()), AppApplication('绿化管理', R.ASSETS_HOME_IC_GREENING_PNG, GreenManagePage()), From 96a5588bc0ee66a0f0b2914f265c0cd21e98d0b5 Mon Sep 17 00:00:00 2001 From: laiiihz Date: Thu, 5 Nov 2020 17:25:04 +0800 Subject: [PATCH 03/13] =?UTF-8?q?=E8=A3=85=E4=BF=AE=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E5=BA=95=E9=83=A8=E6=8C=89=E9=92=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../decoration/decoration_model.dart | 8 +++- .../decoration_manager_detail_page.dart | 37 ++++++++++++++++++- lib/ui/widgets/inner/aku_bottom_button.dart | 34 +++++++++++++++++ 3 files changed, 77 insertions(+), 2 deletions(-) create mode 100644 lib/ui/widgets/inner/aku_bottom_button.dart diff --git a/lib/mock_models/decoration/decoration_model.dart b/lib/mock_models/decoration/decoration_model.dart index 5ebf0eb..1dbd68e 100644 --- a/lib/mock_models/decoration/decoration_model.dart +++ b/lib/mock_models/decoration/decoration_model.dart @@ -112,7 +112,13 @@ class CycleCheck { ///check cycle in days int checkCycle; - List checkDetails; + List checkDetails = [ + CHECK_TYPE.ELECTRIC, + CHECK_TYPE.WATER, + CHECK_TYPE.WALL, + CHECK_TYPE.DOOR_AND_WINDOWS, + CHECK_TYPE.SECURITY, + ]; CycleCheck({ this.authPerson, this.startDate, diff --git a/lib/ui/sub_pages/decoration_manager/decoration_manager_detail_page.dart b/lib/ui/sub_pages/decoration_manager/decoration_manager_detail_page.dart index e44f94b..1525299 100644 --- a/lib/ui/sub_pages/decoration_manager/decoration_manager_detail_page.dart +++ b/lib/ui/sub_pages/decoration_manager/decoration_manager_detail_page.dart @@ -1,4 +1,6 @@ import 'package:aku_community_manager/mock_models/decoration/decoration_model.dart'; +import 'package:aku_community_manager/mock_models/users/user_info_model.dart'; +import 'package:aku_community_manager/provider/user_provider.dart'; import 'package:aku_community_manager/style/app_style.dart'; import 'package:aku_community_manager/tools/widget_tool.dart'; import 'package:aku_community_manager/ui/sub_pages/decoration_manager/decoration_check_row.dart'; @@ -7,6 +9,7 @@ import 'package:aku_community_manager/ui/sub_pages/decoration_manager/decoration import 'package:aku_community_manager/ui/sub_pages/decoration_manager/decoration_util.dart'; import 'package:aku_community_manager/ui/widgets/common/aku_back_button.dart'; import 'package:aku_community_manager/ui/widgets/common/aku_scaffold.dart'; +import 'package:aku_community_manager/ui/widgets/inner/aku_bottom_button.dart'; import 'package:aku_community_manager/ui/widgets/inner/aku_title_box.dart'; import 'package:aku_community_manager/tools/screen_tool.dart'; import 'package:aku_community_manager/const/resource.dart'; @@ -17,6 +20,7 @@ import 'package:expandable/expandable.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; +import 'package:provider/provider.dart'; class DecorationManagerDetailPage extends StatefulWidget { final DecorationModel model; @@ -31,6 +35,8 @@ class DecorationManagerDetailPage extends StatefulWidget { class _DecorationManagerDetailStatePage extends State { bool get isWaitHandOut => widget.model.type == DecorationType.WAIT_HAND_OUT; + USER_ROLE get role => + Provider.of(context, listen: false).userInfoModel.role; @override Widget build(BuildContext context) { return AkuScaffold( @@ -43,11 +49,40 @@ class _DecorationManagerDetailStatePage ? SizedBox() : _buildFinishWorkCheck(), _buildCycleCheck(), - widget.model.type == DecorationType.WAIT_HAND_OUT + widget.model.type == DecorationType.WAIT_HAND_OUT || + widget.model.type == DecorationType.HAND_OUT ? SizedBox() : _buildCheckDetail(), ], ), + bottom: Builder(builder: (context) { + final CycleCheck cycleCheck = widget.model.cycleCheck; + if (role == USER_ROLE.MANAGER) { + switch (widget.model.type) { + case DecorationType.WAIT_HAND_OUT: + return AkuBottomButton( + title: '立即安排', + onTap: cycleCheck.authPerson != null && + cycleCheck.checkCycle != null && + cycleCheck.startDate != null + ? () { + widget.model.type = DecorationType.HAND_OUT; + setState(() {}); + } + : null, + ); + break; + default: + return SizedBox(); + break; + } + + // else if(widget.model.type) + } else if (role == USER_ROLE.PROPERTY) { + // return + } + // return + }), ); } diff --git a/lib/ui/widgets/inner/aku_bottom_button.dart b/lib/ui/widgets/inner/aku_bottom_button.dart new file mode 100644 index 0000000..482e01b --- /dev/null +++ b/lib/ui/widgets/inner/aku_bottom_button.dart @@ -0,0 +1,34 @@ +import 'package:aku_community_manager/style/app_style.dart'; +import 'package:aku_ui/common_widgets/aku_material_button.dart'; +import 'package:flutter/material.dart'; + +class AkuBottomButton extends StatefulWidget { + final VoidCallback onTap; + final String title; + AkuBottomButton({Key key, this.onTap, @required this.title}) + : super(key: key); + + @override + _AkuBottomButtonState createState() => _AkuBottomButtonState(); +} + +class _AkuBottomButtonState extends State { + @override + Widget build(BuildContext context) { + return AkuMaterialButton( + height: 98.w, + color: AppStyle.primaryColor, + nullColor: AppStyle.minorColor, + onPressed: widget.onTap, + child: Text( + widget.title, + style: TextStyle( + fontWeight: FontWeight.bold, + color: widget.onTap == null + ? AppStyle.minorTextColor + : AppStyle.primaryTextColor, + ), + ), + ); + } +} From be54a30b2dcfe7f6503e6009f3e63c797ef731b9 Mon Sep 17 00:00:00 2001 From: laiiihz Date: Thu, 5 Nov 2020 20:23:40 +0800 Subject: [PATCH 04/13] =?UTF-8?q?=09=E6=B7=BB=E5=8A=A0=E4=BB=B7=E6=A0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/mock_models/fix/fix_model.dart | 31 +++--- .../fix_work_finish_page.dart | 95 ++++++++++++++++++- 2 files changed, 114 insertions(+), 12 deletions(-) diff --git a/lib/mock_models/fix/fix_model.dart b/lib/mock_models/fix/fix_model.dart index 333ec11..6288538 100644 --- a/lib/mock_models/fix/fix_model.dart +++ b/lib/mock_models/fix/fix_model.dart @@ -1,6 +1,7 @@ -import 'package:aku_community_manager/const/resource.dart'; import 'package:flutter/material.dart'; +import 'package:aku_community_manager/const/resource.dart'; + enum FIX_ENUM { ///待派单 HAND_OUT, @@ -110,15 +111,6 @@ class FixModel { title: '分派给李保国师傅', date: DateTime(2020, 10, 23, 10, 32, 14)), FixStatus(title: '师傅已接单', date: DateTime(2020, 10, 23, 10, 38, 26)), ], - result: FixResult( - detail: '电饭煲插头没插', - material: '无', - imgs: [R.ASSETS_STATIC_FIX_FOOD_PNG], - ), - review: UserReviewInfo( - rate: 5, - content: '师傅太用心了', - ), ), ), FixModel( @@ -130,7 +122,7 @@ class FixModel { userName: '杨建', userPhoneNumber: '18882929292', fixArea: 'A区', - type: FIX_PAYMENT_TYPE.FREE, + type: FIX_PAYMENT_TYPE.PAY, limit: FIX_DATE_LIMIT.HOUR_24, subType: FIX_SUB_TYPE.NORMAL, fixStatuses: [ @@ -149,6 +141,10 @@ class FixModel { rate: 5, content: '师傅太用心了', ), + priceDetail: FixPriceDetail( + humanPrice: 10, + materialPrice: 0, + ), ), ), ]; @@ -228,6 +224,8 @@ class FixDetailModel { FixResult result; UserReviewInfo review; + + FixPriceDetail priceDetail; FixDetailModel({ this.userName, this.userPhoneNumber, @@ -238,6 +236,7 @@ class FixDetailModel { this.fixStatuses, this.result, this.review, + this.priceDetail, }); } @@ -271,3 +270,13 @@ class UserReviewInfo { this.content, }); } + +class FixPriceDetail { + double humanPrice; + double materialPrice; + FixPriceDetail({ + this.humanPrice, + this.materialPrice, + }); + double get allPrice => humanPrice + materialPrice; +} diff --git a/lib/ui/sub_pages/business_and_fix/fix_work_finish_page.dart b/lib/ui/sub_pages/business_and_fix/fix_work_finish_page.dart index d4452a2..54b3a71 100644 --- a/lib/ui/sub_pages/business_and_fix/fix_work_finish_page.dart +++ b/lib/ui/sub_pages/business_and_fix/fix_work_finish_page.dart @@ -8,6 +8,7 @@ import 'package:aku_community_manager/tools/screen_tool.dart'; import 'package:aku_community_manager/ui/widgets/inner/aku_title_box.dart'; import 'package:aku_community_manager/ui/widgets/inner/pick_image.dart'; import 'package:aku_ui/common_widgets/aku_material_button.dart'; +import 'package:common_utils/common_utils.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; @@ -24,6 +25,18 @@ class _FixWorkFinishPageState extends State { List _imgs = []; TextEditingController _descriptionController = TextEditingController(); TextEditingController _materialController = TextEditingController(); + + TextEditingController _humanController = TextEditingController(); + TextEditingController _materialPriceController = TextEditingController(); + @override + void dispose() { + _descriptionController?.dispose(); + _materialController?.dispose(); + _materialPriceController?.dispose(); + _materialPriceController?.dispose(); + super.dispose(); + } + @override Widget build(BuildContext context) { return AkuScaffold( @@ -243,10 +256,85 @@ class _FixWorkFinishPageState extends State { ) ], ), + // widget.model.detail.type == FIX_PAYMENT_TYPE.FREE + // ? SizedBox() + // : AkuTitleBox( title: '费用明细', + spacing: 16, children: [ - + Row( + children: [ + AkuBox.h(96), + Text('人工费'), + Expanded( + child: TextField( + controller: _humanController, + onChanged: (_) => setState(() {}), + keyboardType: TextInputType.number, + textAlign: TextAlign.end, + decoration: InputDecoration( + border: InputBorder.none, + hintText: '请输入', + hintStyle: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 28.sp, + color: AppStyle.minorTextColor, + ), + ), + ), + ), + ], + ), + Divider(height: 1.w), + Row( + children: [ + AkuBox.h(96), + Text('材料费'), + Expanded( + child: TextField( + onChanged: (_) => setState(() {}), + controller: _materialPriceController, + textAlign: TextAlign.end, + keyboardType: TextInputType.number, + decoration: InputDecoration( + border: InputBorder.none, + hintText: '请输入', + hintStyle: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 28.sp, + color: AppStyle.minorTextColor, + ), + ), + ), + ), + ], + ), + Divider(height: 1.w), + Row( + children: [ + AkuBox.h(96), + Text('总计费用'), + Spacer(), + Builder( + builder: (context) { + double humanPrice = + double.tryParse(_humanController.text); + double materialPrice = + double.tryParse(_materialPriceController.text); + + if (TextUtil.isEmpty(_humanController.text) || + TextUtil.isEmpty(_materialPriceController.text)) { + return Text('人工费或材料费不能为空'); + } else if (humanPrice == null || materialPrice == null) + return Text('输入有误'); + else + return Text( + '¥${(humanPrice + materialPrice).toStringAsFixed(2)}'); + }, + ), + ], + ), ], ), ], @@ -269,6 +357,11 @@ class _FixWorkFinishPageState extends State { imgs: _imgs, ); widget.model.type = FIX_ENUM.DONE; + if (widget.model.detail.type == FIX_PAYMENT_TYPE.PAY) + widget.model.detail.priceDetail = FixPriceDetail( + humanPrice: double.parse(_humanController.text), + materialPrice: double.parse(_materialController.text), + ); Get.back(); }, ), From 4cd42d56f6e577a031c0c953747333071ecae9d6 Mon Sep 17 00:00:00 2001 From: laiiihz Date: Thu, 5 Nov 2020 21:31:50 +0800 Subject: [PATCH 05/13] =?UTF-8?q?=E8=A3=85=E4=BF=AE=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../decoration/decoration_data.dart | 95 ++++++ .../decoration_follow_check.dart | 270 ++++++++++++++++++ .../decoration_manager_detail_page.dart | 22 +- .../decoration_success_page.dart | 71 +++++ 4 files changed, 453 insertions(+), 5 deletions(-) create mode 100644 lib/ui/sub_pages/decoration_manager/decoration_follow_check.dart create mode 100644 lib/ui/sub_pages/decoration_manager/decoration_success_page.dart diff --git a/lib/mock_models/decoration/decoration_data.dart b/lib/mock_models/decoration/decoration_data.dart index e607017..e5a11e7 100644 --- a/lib/mock_models/decoration/decoration_data.dart +++ b/lib/mock_models/decoration/decoration_data.dart @@ -20,6 +20,101 @@ class DecorationData { ), cycleCheck: CycleCheck(), ), + DecorationModel( + decorationDate: DateTime(2020, 1, 23, 12, 23, 0), + type: DecorationType.HAND_OUT, + statusType: DecorationStatusType.DONE, + userHomeModel: UserHomeModel( + userName: '李慧珍', + plot: '深圳华茂悦峰', + detailAddr: '1幢-1单元-302室', + phone: '18201939840', + ), + decorationTeamModel: DecorationTeamModel( + name: '深圳莫川装修有限公司', + userName: '李惠政', + phone: '19298540192', + ), + cycleCheck: CycleCheck( + authPerson: FixerModel(name: '林鸿章', phone: '18294859301'), + startDate: DateTime(2020, 1, 23, 20, 23, 0), + checkCycle: 7, + checkDetails: [ + CHECK_TYPE.ELECTRIC, + CHECK_TYPE.WATER, + CHECK_TYPE.WALL, + CHECK_TYPE.DOOR_AND_WINDOWS, + ], + ), + workFinishCheck: WorkFinishCheck( + authPerson: FixerModel(name: '林鸿章', phone: '18294859301'), + startDate: DateTime(2020, 1, 23, 20, 23, 0), + checkDetails: [ + CHECK_TYPE.ELECTRIC, + CHECK_TYPE.WATER, + CHECK_TYPE.WALL, + CHECK_TYPE.DOOR_AND_WINDOWS, + CHECK_TYPE.SECURITY, + ], + ), + checkInfomations: [ + CheckInfomation( + checkDate: DateTime(2020, 3, 20, 12, 00), + info: '正常', + checkType: '完工检查', + details: [ + CheckDetail(type: CHECK_TYPE.ELECTRIC), + CheckDetail(type: CHECK_TYPE.WATER), + CheckDetail(type: CHECK_TYPE.WALL), + CheckDetail(type: CHECK_TYPE.DOOR_AND_WINDOWS), + ], + ), + CheckInfomation( + checkDate: DateTime(2020, 2, 14, 12, 00), + info: '正常', + checkType: '周期检查', + details: [ + CheckDetail(type: CHECK_TYPE.ELECTRIC), + CheckDetail(type: CHECK_TYPE.WATER), + CheckDetail(type: CHECK_TYPE.WALL), + CheckDetail(type: CHECK_TYPE.DOOR_AND_WINDOWS), + ], + ), + CheckInfomation( + checkDate: DateTime(2020, 2, 7, 12, 00), + info: '厨房水路异常', + checkType: '周期检查', + details: [ + CheckDetail(type: CHECK_TYPE.ELECTRIC), + CheckDetail(type: CHECK_TYPE.WATER, status: false), + CheckDetail(type: CHECK_TYPE.WALL), + CheckDetail(type: CHECK_TYPE.DOOR_AND_WINDOWS), + ], + ), + CheckInfomation( + checkDate: DateTime(2020, 1, 30, 12, 00), + info: '正常', + checkType: '周期检查', + details: [ + CheckDetail(type: CHECK_TYPE.ELECTRIC), + CheckDetail(type: CHECK_TYPE.WATER), + CheckDetail(type: CHECK_TYPE.WALL), + CheckDetail(type: CHECK_TYPE.DOOR_AND_WINDOWS), + ], + ), + CheckInfomation( + checkDate: DateTime(2020, 1, 23, 12, 00), + info: '正常', + checkType: '周期检查', + details: [ + CheckDetail(type: CHECK_TYPE.ELECTRIC), + CheckDetail(type: CHECK_TYPE.WATER), + CheckDetail(type: CHECK_TYPE.WALL), + CheckDetail(type: CHECK_TYPE.DOOR_AND_WINDOWS), + ], + ), + ], + ), DecorationModel( decorationDate: DateTime(2020, 1, 23, 12, 23, 0), type: DecorationType.DONE, diff --git a/lib/ui/sub_pages/decoration_manager/decoration_follow_check.dart b/lib/ui/sub_pages/decoration_manager/decoration_follow_check.dart new file mode 100644 index 0000000..6b75ea0 --- /dev/null +++ b/lib/ui/sub_pages/decoration_manager/decoration_follow_check.dart @@ -0,0 +1,270 @@ +import 'package:aku_community_manager/mock_models/decoration/decoration_model.dart'; +import 'package:aku_community_manager/style/app_style.dart'; +import 'package:aku_community_manager/tools/widget_tool.dart'; +import 'package:aku_community_manager/ui/sub_pages/decoration_manager/decoration_checkbox.dart'; +import 'package:aku_community_manager/ui/sub_pages/decoration_manager/decoration_success_page.dart'; +import 'package:aku_community_manager/ui/widgets/common/aku_scaffold.dart'; +import 'package:aku_community_manager/ui/widgets/inner/aku_bottom_button.dart'; +import 'package:common_utils/common_utils.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +class DecorationFollowCheck extends StatefulWidget { + final DecorationModel model; + DecorationFollowCheck({Key key, @required this.model}) : super(key: key); + + @override + _DecorationFollowCheckState createState() => _DecorationFollowCheckState(); +} + +class _DecorationFollowCheckState extends State { + Map checkStatus = { + CHECK_TYPE.ELECTRIC: true, + CHECK_TYPE.WATER: true, + CHECK_TYPE.WALL: true, + CHECK_TYPE.DOOR_AND_WINDOWS: true, + CHECK_TYPE.SECURITY: true, + }; + + bool get success { + for (var item in checkStatus.keys) { + if (checkStatus[item] == false) return false; + } + return true; + } + + TextEditingController _textEditingController = TextEditingController(); + @override + void dispose() { + _textEditingController?.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return AkuScaffold( + title: '跟踪检查', + body: ListView( + padding: EdgeInsets.symmetric(vertical: 16.w), + children: [ + Container( + color: Colors.white, + padding: EdgeInsets.symmetric( + horizontal: 32.w, + vertical: 16.w, + ), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Container( + child: Row( + children: [ + Container( + height: 56.w, + width: 56.w, + alignment: Alignment.center, + child: Text( + '家', + style: TextStyle( + color: AppStyle.secondaryColor, + fontSize: 24.sp, + fontWeight: FontWeight.bold, + ), + ), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(28.w), + color: Color(0xFFE9F2FF), + ), + ), + AkuBox.w(30), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + widget.model.userHomeModel.plot, + style: TextStyle( + fontWeight: FontWeight.bold, + color: AppStyle.primaryTextColor, + fontSize: 24.sp, + ), + ), + Text( + widget.model.userHomeModel.detailAddr, + style: TextStyle( + fontWeight: FontWeight.bold, + color: AppStyle.primaryTextColor, + fontSize: 24.sp, + ), + ), + ], + ), + ), + ], + ), + padding: EdgeInsets.symmetric( + vertical: 26.w, + horizontal: 32.w, + ), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8.w), + color: Color(0xFFF9F9F9), + ), + ), + AkuBox.h(16), + Container( + child: Row( + children: [ + Container( + height: 56.w, + width: 56.w, + alignment: Alignment.center, + child: Text( + '装', + style: TextStyle( + color: AppStyle.secondaryColor, + fontSize: 24.sp, + fontWeight: FontWeight.bold, + ), + ), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(28.w), + color: Color(0xFFE9F2FF), + ), + ), + AkuBox.w(30), + Expanded( + child: Text( + widget.model.decorationTeamModel.name, + style: TextStyle( + fontWeight: FontWeight.bold, + color: AppStyle.primaryTextColor, + fontSize: 24.sp, + ), + ), + ), + ], + ), + padding: EdgeInsets.symmetric( + vertical: 26.w, + horizontal: 32.w, + ), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8.w), + color: Color(0xFFF9F9F9), + ), + ), + AkuBox.h(16), + Row( + children: [ + Text( + '${DateUtil.formatDate( + DateTime.now(), + format: 'yyyy-MM-dd', + )} 周期检查', + style: TextStyle( + color: AppStyle.primaryTextColor, + fontSize: 28.w, + fontWeight: FontWeight.bold, + ), + ), + Spacer(), + AkuBox.h(96), + Text( + success ? '正常' : '异常', + style: TextStyle( + color: success + ? AppStyle.successColor + : AppStyle.failColor, + fontSize: 28.w, + fontWeight: FontWeight.bold, + ), + ), + ], + ), + _buildRow(CHECK_TYPE.ELECTRIC), + _buildRow(CHECK_TYPE.WATER), + _buildRow(CHECK_TYPE.WALL), + _buildRow(CHECK_TYPE.DOOR_AND_WINDOWS), + _buildRow(CHECK_TYPE.SECURITY), + TextField( + minLines: 3, + maxLines: 99, + controller: _textEditingController, + decoration: InputDecoration( + contentPadding: EdgeInsets.symmetric( + vertical: 16.w, + horizontal: 24.w, + ), + hintText: '请输入检查描述', + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(8.w), + borderSide: BorderSide( + width: 2.w, + color: Color(0xFFE8E8E8), + ), + ), + focusedBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(8.w), + borderSide: BorderSide( + width: 2.w, + color: Color(0xFFE8E8E8), + ), + ), + ), + ), + ], + ), + ), + ], + ), + bottom: AkuBottomButton( + onTap: () { + widget.model.checkInfomations.add( + CheckInfomation( + checkDate: DateTime.now(), + checkType: '周期检查', + info: _textEditingController.text, + details: checkStatus.entries.map((e) { + return CheckDetail(type: e.key, status: e.value); + }).toList(), + ), + ); + widget.model.type = DecorationType.DONE; + Get.off(DecorationSuccessPage()); + }, + title: '确认提交', + ), + ); + } + + _buildRow( + CHECK_TYPE type, + ) { + return Row( + children: [ + Image.asset( + checkAssetMap[type], + height: 40.w, + width: 40.w, + ), + Text( + checkTypeMap[type], + style: TextStyle( + fontSize: 28.w, + color: AppStyle.primaryTextColor, + ), + ), + Spacer(), + DecorationCheckBox( + initValue: checkStatus[type], + onChange: (state) { + checkStatus[type] = state; + setState(() {}); + }, + ), + Spacer(), + ], + ); + } +} diff --git a/lib/ui/sub_pages/decoration_manager/decoration_manager_detail_page.dart b/lib/ui/sub_pages/decoration_manager/decoration_manager_detail_page.dart index 1525299..b2679ed 100644 --- a/lib/ui/sub_pages/decoration_manager/decoration_manager_detail_page.dart +++ b/lib/ui/sub_pages/decoration_manager/decoration_manager_detail_page.dart @@ -6,6 +6,7 @@ import 'package:aku_community_manager/tools/widget_tool.dart'; import 'package:aku_community_manager/ui/sub_pages/decoration_manager/decoration_check_row.dart'; import 'package:aku_community_manager/ui/sub_pages/decoration_manager/decoration_checkbox.dart'; import 'package:aku_community_manager/ui/sub_pages/decoration_manager/decoration_department_page.dart'; +import 'package:aku_community_manager/ui/sub_pages/decoration_manager/decoration_follow_check.dart'; import 'package:aku_community_manager/ui/sub_pages/decoration_manager/decoration_util.dart'; import 'package:aku_community_manager/ui/widgets/common/aku_back_button.dart'; import 'package:aku_community_manager/ui/widgets/common/aku_scaffold.dart'; @@ -49,8 +50,7 @@ class _DecorationManagerDetailStatePage ? SizedBox() : _buildFinishWorkCheck(), _buildCycleCheck(), - widget.model.type == DecorationType.WAIT_HAND_OUT || - widget.model.type == DecorationType.HAND_OUT + widget.model.checkInfomations == null ? SizedBox() : _buildCheckDetail(), ], @@ -79,9 +79,21 @@ class _DecorationManagerDetailStatePage // else if(widget.model.type) } else if (role == USER_ROLE.PROPERTY) { - // return - } - // return + switch (widget.model.type) { + case DecorationType.HAND_OUT: + return AkuBottomButton( + title: '立即执行', + onTap: () { + Get.to(DecorationFollowCheck(model: widget.model)); + }, + ); + break; + default: + return SizedBox(); + break; + } + } else + return SizedBox(); }), ); } diff --git a/lib/ui/sub_pages/decoration_manager/decoration_success_page.dart b/lib/ui/sub_pages/decoration_manager/decoration_success_page.dart new file mode 100644 index 0000000..28f6ba6 --- /dev/null +++ b/lib/ui/sub_pages/decoration_manager/decoration_success_page.dart @@ -0,0 +1,71 @@ +import 'package:aku_community_manager/style/app_style.dart'; +import 'package:aku_community_manager/tools/widget_tool.dart'; +import 'package:aku_community_manager/ui/widgets/common/aku_scaffold.dart'; +import 'package:aku_ui/common_widgets/aku_material_button.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +class DecorationSuccessPage extends StatefulWidget { + DecorationSuccessPage({Key key}) : super(key: key); + + @override + _DecorationSuccessPageState createState() => _DecorationSuccessPageState(); +} + +class _DecorationSuccessPageState extends State { + @override + Widget build(BuildContext context) { + return AkuScaffold( + title: '跟踪检查', + backgroundColor: Color(0xFFF9F9F9), + body: Center( + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + SizedBox( + height: 100.w, + width: 100.w, + child: Placeholder(), + ), + Text( + '提交成功', + style: TextStyle( + fontWeight: FontWeight.bold, + color: AppStyle.primaryTextColor, + fontSize: 40.sp, + ), + ), + Text( + '你的装修跟踪检查记录已提交', + style: TextStyle( + fontWeight: FontWeight.bold, + color: AppStyle.minorTextColor, + fontSize: 26.sp, + ), + ), + AkuBox.h(80), + AkuMaterialButton( + height: 88.w, + minWidth: 280.w, + radius: 8.w, + onPressed: () { + Get.back(); + Get.back(); + }, + color: AppStyle.primaryColor, + child: Text( + '查看', + style: TextStyle( + color: AppStyle.primaryTextColor, + fontSize: 32.w, + fontWeight: FontWeight.bold, + ), + ), + ), + ], + ), + ), + ); + } +} From a2f8e554b6e58b44cdb0e0ef0fe30648933a1aca Mon Sep 17 00:00:00 2001 From: laiiihz Date: Thu, 5 Nov 2020 22:03:07 +0800 Subject: [PATCH 06/13] update login --- lib/ui/agreements/agreement_page.dart | 13 ++++ lib/ui/agreements/privacy_page.dart | 13 ++++ lib/ui/home/personal_draw.dart | 98 ++++++++++++++------------- lib/ui/login/login_page.dart | 8 +++ lib/ui/settings/settings_page.dart | 9 ++- 5 files changed, 93 insertions(+), 48 deletions(-) create mode 100644 lib/ui/agreements/agreement_page.dart create mode 100644 lib/ui/agreements/privacy_page.dart diff --git a/lib/ui/agreements/agreement_page.dart b/lib/ui/agreements/agreement_page.dart new file mode 100644 index 0000000..d6a3817 --- /dev/null +++ b/lib/ui/agreements/agreement_page.dart @@ -0,0 +1,13 @@ +import 'package:aku_community_manager/ui/widgets/common/aku_scaffold.dart'; +import 'package:flutter/material.dart'; + +class AgreementPage extends StatelessWidget { + const AgreementPage({Key key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return AkuScaffold( + title: '服务协议', + ); + } +} diff --git a/lib/ui/agreements/privacy_page.dart b/lib/ui/agreements/privacy_page.dart new file mode 100644 index 0000000..e25871d --- /dev/null +++ b/lib/ui/agreements/privacy_page.dart @@ -0,0 +1,13 @@ +import 'package:aku_community_manager/ui/widgets/common/aku_scaffold.dart'; +import 'package:flutter/material.dart'; + +class PrivacyPage extends StatelessWidget { + const PrivacyPage({Key key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return AkuScaffold( + title: '隐私协议', + ); + } +} diff --git a/lib/ui/home/personal_draw.dart b/lib/ui/home/personal_draw.dart index 7d38a43..99129dd 100644 --- a/lib/ui/home/personal_draw.dart +++ b/lib/ui/home/personal_draw.dart @@ -56,56 +56,62 @@ class _PersonalDrawState extends State { child: ListView( children: [ SizedBox( - height: 80.w - 40.w + ScreenUtil().statusBarHeight, + height: ScreenUtil().statusBarHeight, ), //leading - Container( - margin: EdgeInsets.only(bottom: 80.w), - width: double.infinity, - child: Row( - children: [ - SizedBox(width: 32.w), - //头像按钮 - AkuRoundButton( - height: 72.w, - onPressed: () {}, - child: CircleAvatar( - radius: 36.w, - backgroundImage: userProvider.userInfoModel.avatar == null - ? null - : FileImage(userProvider.userInfoModel.avatar), - backgroundColor: Colors.white, - child: userProvider.isSigned - ? userProvider.userInfoModel.avatar == null - ? Icon(Icons.person_outline) - : null - : Icon(Icons.person), - ), - ), - SizedBox(width: 24.w), - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - //登录按钮 - InkWell( - onTap: () {}, + InkWell( + onTap: () { + if (!userProvider.isSigned) { + Get.to(LoginPage()); + } + }, + child: Container( + margin: EdgeInsets.only(bottom: 80.w, top: 40.w), + width: double.infinity, + child: Row( + children: [ + SizedBox(width: 32.w), + //头像按钮 + AkuRoundButton( + height: 72.w, + onPressed: () {}, + child: CircleAvatar( + radius: 36.w, + backgroundImage: + userProvider.userInfoModel.avatar == null + ? null + : FileImage(userProvider.userInfoModel.avatar), + backgroundColor: Colors.white, child: userProvider.isSigned + ? userProvider.userInfoModel.avatar == null + ? Icon(Icons.person_outline) + : null + : Icon(Icons.person), + ), + ), + SizedBox(width: 24.w), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + //登录按钮 + userProvider.isSigned ? Text( userProvider.userInfoModel.nickName, style: TextStyle( - color: AppStyle.primaryTextColor, - fontSize: 28.sp, - fontWeight: FontWeight.bold), + color: AppStyle.primaryTextColor, + fontSize: 28.sp, + fontWeight: FontWeight.bold, + ), ) - : Text('登录', + : Text( + '登录', style: TextStyle( - color: AppStyle.primaryTextColor, - fontSize: 28.sp, - fontWeight: FontWeight.bold)), - ), - InkWell( - onTap: () {}, - child: Row( + color: AppStyle.primaryTextColor, + fontSize: 28.sp, + fontWeight: FontWeight.bold, + ), + ), + Row( children: [ Icon(Icons.location_on_outlined, size: 33.w), Text( @@ -116,10 +122,10 @@ class _PersonalDrawState extends State { ), ], ), - ), - ], - ), - ], + ], + ), + ], + ), ), ), _myListTile( diff --git a/lib/ui/login/login_page.dart b/lib/ui/login/login_page.dart index 4afa613..47e1dff 100644 --- a/lib/ui/login/login_page.dart +++ b/lib/ui/login/login_page.dart @@ -2,6 +2,8 @@ import 'dart:ui'; import 'package:aku_community_manager/style/app_style.dart'; import 'package:aku_community_manager/tools/widget_tool.dart'; +import 'package:aku_community_manager/ui/agreements/agreement_page.dart'; +import 'package:aku_community_manager/ui/agreements/privacy_page.dart'; import 'package:aku_community_manager/ui/login/login_sms_page.dart'; import 'package:aku_community_manager/ui/widgets/common/aku_back_button.dart'; import 'package:aku_community_manager/ui/widgets/common/aku_scaffold.dart'; @@ -148,6 +150,9 @@ class _LoginPageState extends State { ), ExtendedWidgetSpan( child: GestureDetector( + onTap: () { + Get.to(AgreementPage()); + }, child: Text( '《服务协议》', style: TextStyle( @@ -162,6 +167,9 @@ class _LoginPageState extends State { ), ExtendedWidgetSpan( child: GestureDetector( + onTap: () { + Get.to(PrivacyPage()); + }, child: Text( '《隐私政策》', style: TextStyle( diff --git a/lib/ui/settings/settings_page.dart b/lib/ui/settings/settings_page.dart index e264d03..c63a63b 100644 --- a/lib/ui/settings/settings_page.dart +++ b/lib/ui/settings/settings_page.dart @@ -21,6 +21,7 @@ class SettingsPage extends StatefulWidget { } class _SettingsPageState extends State { + bool _info = false; @override Widget build(BuildContext context) { final userProvider = Provider.of(context); @@ -35,8 +36,12 @@ class _SettingsPageState extends State { title: Text('是否接受信息通知'), arrow: false, suffix: CupertinoSwitch( - value: false, - onChanged: (value) {}, + value: _info, + onChanged: (value) { + setState(() { + _info = value; + }); + }, ), ), Divider(height: 1.w), From 88148a522724ce6556af1ed359e6b6a7899864f5 Mon Sep 17 00:00:00 2001 From: laiiihz Date: Fri, 6 Nov 2020 08:34:37 +0800 Subject: [PATCH 07/13] update homepage detail --- lib/ui/home/home_page.dart | 7 +++++-- lib/ui/login/login_page.dart | 1 - .../sub_pages/business_and_fix/fix_work_finish_page.dart | 2 +- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/lib/ui/home/home_page.dart b/lib/ui/home/home_page.dart index a2b4bfc..a900a26 100644 --- a/lib/ui/home/home_page.dart +++ b/lib/ui/home/home_page.dart @@ -1,4 +1,5 @@ import 'package:aku_community_manager/const/resource.dart'; +import 'package:aku_community_manager/provider/app_provider.dart'; import 'package:aku_community_manager/provider/user_provider.dart'; import 'package:aku_community_manager/style/app_style.dart'; import 'package:aku_community_manager/tools/screen_tool.dart'; @@ -30,6 +31,7 @@ class HomePage extends StatefulWidget { class _HomePageState extends State { ///自定义bar的菜单按钮 Widget _menuButton(String assetPath, String text, Widget page) { + final appProvider = Provider.of(context); return Expanded( child: AkuButton( radius: 8.w, @@ -37,9 +39,10 @@ class _HomePageState extends State { onPressed: () { final userProvider = Provider.of(context, listen: false); - if (userProvider.isSigned) + if (userProvider.isSigned) { Get.to(page); - else + appProvider.addRecentApp(AppApplication(text, assetPath, page)); + } else Get.to(LoginPage()); }, child: Column( diff --git a/lib/ui/login/login_page.dart b/lib/ui/login/login_page.dart index 47e1dff..70705cf 100644 --- a/lib/ui/login/login_page.dart +++ b/lib/ui/login/login_page.dart @@ -69,7 +69,6 @@ class _LoginPageState extends State { Container( width: double.infinity, child: TextField( - autofocus: true, controller: _textController, onChanged: (text) { setState(() {}); diff --git a/lib/ui/sub_pages/business_and_fix/fix_work_finish_page.dart b/lib/ui/sub_pages/business_and_fix/fix_work_finish_page.dart index 54b3a71..53a909d 100644 --- a/lib/ui/sub_pages/business_and_fix/fix_work_finish_page.dart +++ b/lib/ui/sub_pages/business_and_fix/fix_work_finish_page.dart @@ -33,7 +33,7 @@ class _FixWorkFinishPageState extends State { _descriptionController?.dispose(); _materialController?.dispose(); _materialPriceController?.dispose(); - _materialPriceController?.dispose(); + _humanController?.dispose(); super.dispose(); } From 5d5147ea0be4df7cf37c78badd4f2aaca914ac2b Mon Sep 17 00:00:00 2001 From: laiiihz Date: Fri, 6 Nov 2020 10:52:35 +0800 Subject: [PATCH 08/13] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E7=89=A9=E5=93=81=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assets/manage/article.png | Bin 0 -> 2171 bytes assets/manage/borrow.png | Bin 0 -> 1885 bytes assets/manage/remaining.png | Bin 0 -> 807 bytes assets/static_temp/drill.png | Bin 0 -> 26581 bytes assets/static_temp/hammer.png | Bin 0 -> 21505 bytes assets/static_temp/ladder.png | Bin 0 -> 32325 bytes lib/mock_models/borrow/borrow_data.dart | 32 +++ lib/mock_models/borrow/borrow_model.dart | 78 +++++++ lib/style/app_style.dart | 1 + .../home/application/applications_page.dart | 5 +- .../borrow_manager/add_borrow_item_page.dart | 174 +++++++++++++++ .../add_borrow_object_page.dart | 185 +++++++++++++++ .../borrow_manager/all_borrow_goods.dart | 124 ++++++++++ .../borrow_item_detail_page.dart | 148 ++++++++++++ .../borrow_manager/borrow_items_page.dart | 211 ++++++++++++++++++ .../borrow_manager/borrow_manager_page.dart | 45 ++++ lib/ui/widgets/common/aku_scaffold.dart | 6 +- 17 files changed, 1006 insertions(+), 3 deletions(-) create mode 100644 assets/manage/article.png create mode 100644 assets/manage/borrow.png create mode 100644 assets/manage/remaining.png create mode 100644 assets/static_temp/drill.png create mode 100644 assets/static_temp/hammer.png create mode 100644 assets/static_temp/ladder.png create mode 100644 lib/mock_models/borrow/borrow_data.dart create mode 100644 lib/mock_models/borrow/borrow_model.dart create mode 100644 lib/ui/sub_pages/borrow_manager/add_borrow_item_page.dart create mode 100644 lib/ui/sub_pages/borrow_manager/add_borrow_object_page.dart create mode 100644 lib/ui/sub_pages/borrow_manager/all_borrow_goods.dart create mode 100644 lib/ui/sub_pages/borrow_manager/borrow_item_detail_page.dart create mode 100644 lib/ui/sub_pages/borrow_manager/borrow_items_page.dart create mode 100644 lib/ui/sub_pages/borrow_manager/borrow_manager_page.dart diff --git a/assets/manage/article.png b/assets/manage/article.png new file mode 100644 index 0000000000000000000000000000000000000000..dd55c3f4d4b4efce66465df54c76b5da921c00db GIT binary patch literal 2171 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 literal 0 HcmV?d00001 diff --git a/assets/manage/borrow.png b/assets/manage/borrow.png new file mode 100644 index 0000000000000000000000000000000000000000..66458a83504d7791bc0feca674c6d611cf21dcb4 GIT binary patch literal 1885 zcmV-j2cr0iP)v$pFe-(`Sa)U^5skU^y!m% zK7amf{^sT7Nq&C*zh}UJ0Wx~@X!G>y)k`_$V4Ft@@b~ZE(%RZ8j~_plCr_Tp_wV05 z&8A0>9x{CRa2Y#xtW2IfS^D?y@2PzlKaK<-+Sb(6BsXr{kZ<3<1u_q`blS9OGH1>l z>DRAcAn)|^lF$L7ZI>@!mJc63_!(cuHa&axla~@7~Gb!-tJQ$Rrqukt0W%{R{{^XcZp-qr%^}Z{N!6*RLg0_JKWe z*|KFuBcqbQ0b(RhoH!vre*8!|hr+@_nJ{63j2}NKBdfddDI zIv2)p=FAy+@Zf=zm6e&jH7Zd9Ja_J#G&eUVjCatWL9%u0R_W8HPgHX;)_Ta0A(8b* zM=F2}c>n(W2^O(;@7}U)+cp8>|1K(k>^-;@Zo#1~E-wDx*_rwI28b(x_PGU1yJX3d zZUIjP@W_!PCZggL_Pd=scM40myNE9hBrvdd@7@GP3l}al{$6(yUjT34zHJ;>r{M3Q zeYp_uBy@(~SyWUM`nU82kP}B+TU)2W5l&jPXi?|`?n(#vg!k{?m)Wyt%e;B>LOm0E z2KejOFWJ3&w-8-+N@ZnbXs3;?Ky&^EfcNg*GyjAuwQAL>(8lH&;M1p1O{mH#7>!-K zc1bK2^E%g1e(wZmEM+VvB_$=Yc=6)E4V-6y*REYNp?Rken&JqRE8+$i9~aS}<;#}` zderj_@a);MLfFbF_a<~56B>LDV_l)^Z(YaT`Q9&O;Yju`t_?EKYm>G zj(B6-ECR6U1fP{9&C=G0XMhb24GEE#EnBvjoUKL(|L@teNAn6_ZHXCTWc)^qJOgBs z?p#N8b+y{($`(MV6M(I%s`3^5@C>l7t}bDD)YjGtu|JJu6Cm1GQBmP5QSTWbk!QkK zP6@&X%mzTRco@I=^XL0^wmkz(b_&6T!IjYnp?QvoK?p$(qDAS1Y#@7|HUR4x;OWz+ zrKP2%)7WqcX3Uro#M}dUM>;o#vpSiSHumlZ{NPMbm>yHubOOro&n4v%=uv`JDi4Z*MotRqNnq>f9H=t5>he&6_tn zy?gNB!Lnn=j!gYU^8ZvxP^Fc#wJ|SVyfDdhx2#*YP9{#A7zw0Y>BN@?GWdP__6cQd zP9b>7Uf7+)H^4`a9?7v|#}ZhrUcFk_xVww^1_+>J$2uIctX;7oMU-{#Gm1FeKjw~7J*NCyNM2s9)U0+wsmtO@)I0$P9J z!UcKw@L{KJ3DcvAQD}Z(0GYw5Q>RQtKq?_-NcDo>{6qY`B=?COHa0fO&!0b&c1N;^ zcwg8OC_n~#<;oQ^u~dRqP^Aw{?uU3u#*=Ns^5400$LzhSWZ1A_vSGspAqo?=1P+h^ zQ&vIgZ>sAK@ky~SjvF`b-$k4FWg8%qmW*GvA%y_A_wV0lGMG>R#tjQ6 z6|XlkGZISk14`>Cv5Qhd1IQ%U XWlQ2difOWF00000NkvXXu0mjfV0wA? literal 0 HcmV?d00001 diff --git a/assets/manage/remaining.png b/assets/manage/remaining.png new file mode 100644 index 0000000000000000000000000000000000000000..82f86dbf385747490064dad803caff739c0ad3e7 GIT binary patch literal 807 zcmeAS@N?(olHy`uVBq!ia0vp^0U*r51|<6gKdoh8V0!22;uum9_xAS2EUiEh)(gU- zmpGa(>V+{nP7rYvU^(c-?cHp@pjAFqb&`Ka#^hs49cD_mIKmd0X&q7OV5y0j%&y-z zIVRoz%8zeX(&gX9%E`*6>s@>OHL4;)Y=^>v)ZM-l8fM5dI@&V{35YU${==i9puup= zvXO;_^?-%?goXtS63({H# z{o0Z(!`J?#$g43kM-OOqn} zRfHxwC@k3e^Jb3P*Q&b#(*4I(MYuA*Zdm=|LBm`>cd6dC#J}Iae}DA(=az3t$o0FgTet4O+MCkh@wIVraXh~M zMNC&EL;vouU;6mx&&XYO^%&Rg(_q=6^?jnU0;40N!8uNFaGp7!{8s4f^Usfpc5-BhPH6~xYFEUfvLNT*1GC?{HuKLfy_(hN^Xy}a z(az7OzTKSTQs?t-_AwTgr<@)R0SrCGOq?8C4TXLRjQ3g9CU;)RGR^G^(NevB{rau1 zX|3tTjgLP@$jQrZb-eU)%Qs*5cvIB{Wbd&wg2fnE&hh51&8vw~DcV877RGs$eFAz4V{4 X$W7I*eQ`f1D=>Jv`njxgN@xNAH78u7 literal 0 HcmV?d00001 diff --git a/assets/static_temp/drill.png b/assets/static_temp/drill.png new file mode 100644 index 0000000000000000000000000000000000000000..9db0504b66393ee13f77a8e70a52c81e769d84a8 GIT binary patch literal 26581 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 literal 0 HcmV?d00001 diff --git a/assets/static_temp/hammer.png b/assets/static_temp/hammer.png new file mode 100644 index 0000000000000000000000000000000000000000..b8811e2c8ea6224c2fbbe7b4852634cd63451a25 GIT binary patch literal 21505 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 z models = [ + BorrowModel( + borrowPerson: '李慧珍', + borrowTime: null, + goodsStatus: null, + phone: null, + borrowGoods: SingleBorrowGoods(name: ''), + ), + ]; + + static List borrowObjects = [ + BorrowObject.init( + name: '电钻', + assetPath: R.ASSETS_STATIC_TEMP_DRILL_PNG, + allNumber: 5, + ), + BorrowObject.init( + name: '梯子', + assetPath: R.ASSETS_STATIC_TEMP_LADDER_PNG, + allNumber: 3, + ), + BorrowObject.init( + name: '三角榔头', + assetPath: R.ASSETS_STATIC_TEMP_HAMMER_PNG, + allNumber: 8, + ), + ]; +} diff --git a/lib/mock_models/borrow/borrow_model.dart b/lib/mock_models/borrow/borrow_model.dart new file mode 100644 index 0000000..3d5c4b1 --- /dev/null +++ b/lib/mock_models/borrow/borrow_model.dart @@ -0,0 +1,78 @@ +import 'dart:math'; + +import 'package:meta/meta.dart'; + +enum BORROW_STATUS { + ///出借中 + BORROWING, + + ///待检查 + WAIT_CHECK, + + ///未出借 + NOT_BORROW, + + ///已归还 + DONE, +} + +enum GOODS_STATUS { + NORMAL, + BROKEN, +} + +class BorrowModel { + String borrowPerson; + String phone; + int borrowTime; + GOODS_STATUS goodsStatus; + String title; + SingleBorrowGoods borrowGoods; + + BorrowModel({ + @required this.borrowPerson, + @required this.phone, + @required this.borrowTime, + @required this.goodsStatus, + @required this.borrowGoods, + }); +} + +class BorrowObject { + String name; + int allNumber; + dynamic assetPath; + int borrowNumber; + int get restNumber => allNumber - borrowNumber; + List items; + + BorrowObject.init({ + this.name, + this.allNumber, + this.assetPath, + }) { + this.borrowNumber = 0; + items = List.generate( + this.allNumber, + (index) => SingleBorrowGoods( + name: '${this.name}${index + 1}', + code: (179264234 + Random().nextInt(999999)).toString(), + status: BORROW_STATUS.NOT_BORROW, + assetpath: this.assetPath, + ), + ); + } +} + +class SingleBorrowGoods { + String name; + String code; + dynamic assetpath; + BORROW_STATUS status; + SingleBorrowGoods({ + this.name, + this.code, + this.assetpath, + this.status, + }); +} diff --git a/lib/style/app_style.dart b/lib/style/app_style.dart index 917077e..9bc19a9 100644 --- a/lib/style/app_style.dart +++ b/lib/style/app_style.dart @@ -3,6 +3,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; export 'package:flutter_screenutil/flutter_screenutil.dart'; +export 'package:aku_community_manager/const/resource.dart'; class AppStyle { //颜色,渐变主颜色和次级颜色 diff --git a/lib/ui/home/application/applications_page.dart b/lib/ui/home/application/applications_page.dart index a470a76..4707c36 100644 --- a/lib/ui/home/application/applications_page.dart +++ b/lib/ui/home/application/applications_page.dart @@ -1,6 +1,7 @@ import 'package:aku_community_manager/ui/manage_pages/green_manage/green_manage_page.dart'; import 'package:aku_community_manager/ui/manage_pages/inspection_manage/inspection_manage_page.dart'; import 'package:aku_community_manager/ui/sub_pages/activity_manager/activity_manager_page.dart'; +import 'package:aku_community_manager/ui/sub_pages/borrow_manager/borrow_manager_page.dart'; import 'package:aku_community_manager/ui/sub_pages/business_and_fix/business_and_fix_page.dart'; import 'package:aku_community_manager/ui/sub_pages/decoration_manager/decoration_manager_page.dart'; import 'package:aku_community_manager/ui/sub_pages/items_outdoor/items_outdoor_page.dart'; @@ -46,7 +47,7 @@ class _ApplicationPageState extends State AppApplication( '活动管理', R.ASSETS_HOME_IC_ACTIVITY_PNG, ActivityManagerPage()), AppApplication('访客管理', R.ASSETS_HOME_IC_VISITORS_PNG, VisitorManagerPage()), - AppApplication('借还管理', R.ASSETS_HOME_IC_BORROW_PNG, Scaffold()), + AppApplication('借还管理', R.ASSETS_HOME_IC_BORROW_PNG, BorrowManagerPage()), AppApplication('一键报警', R.ASSETS_HOME_IC_POLICE_PNG, Scaffold()), ]; List _wisdomApplications = [ @@ -58,7 +59,7 @@ class _ApplicationPageState extends State '装修管理', R.ASSETS_HOME_IC_DECORATION_PNG, DecorationManagerPage()), AppApplication( '活动管理', R.ASSETS_HOME_IC_ACTIVITY_PNG, ActivityManagerPage()), - AppApplication('借还管理', R.ASSETS_HOME_IC_BORROW_PNG, Scaffold()), + AppApplication('借还管理', R.ASSETS_HOME_IC_BORROW_PNG, BorrowManagerPage()), AppApplication('巡检管理', R.ASSETS_HOME_IC_PATROL_PNG, InspectionManagePage()), AppApplication('绿化管理', R.ASSETS_HOME_IC_GREENING_PNG, GreenManagePage()), ]; diff --git a/lib/ui/sub_pages/borrow_manager/add_borrow_item_page.dart b/lib/ui/sub_pages/borrow_manager/add_borrow_item_page.dart new file mode 100644 index 0000000..c70b29a --- /dev/null +++ b/lib/ui/sub_pages/borrow_manager/add_borrow_item_page.dart @@ -0,0 +1,174 @@ +import 'dart:io'; +import 'dart:math'; + +import 'package:aku_community_manager/mock_models/borrow/borrow_model.dart'; +import 'package:aku_community_manager/style/app_style.dart'; +import 'package:aku_community_manager/tools/widget_tool.dart'; +import 'package:aku_community_manager/ui/widgets/common/aku_scaffold.dart'; +import 'package:aku_community_manager/ui/widgets/inner/pick_image.dart'; +import 'package:aku_ui/common_widgets/aku_material_button.dart'; +import 'package:bot_toast/bot_toast.dart'; +import 'package:common_utils/common_utils.dart'; +import 'package:flutter/material.dart'; + +class AddBorrowItemPage extends StatefulWidget { + final BorrowObject object; + AddBorrowItemPage({Key key, @required this.object}) : super(key: key); + + @override + _AddBorrowItemPageState createState() => _AddBorrowItemPageState(); +} + +class _AddBorrowItemPageState extends State { + TextEditingController _textEditingController = TextEditingController(); + String code = ''; + File file; + @override + void initState() { + super.initState(); + code = (10000000 + Random().nextInt(999999)).toString(); + } + + @override + Widget build(BuildContext context) { + return AkuScaffold( + title: '物品详情', + actions: [ + AkuMaterialButton( + minWidth: 120.w, + onPressed: () { + if (TextUtil.isEmpty(_textEditingController.text)) { + BotToast.showText(text: '名称不能为空'); + } else if (file == null) { + BotToast.showText(text: '图片不能为空'); + } else { + widget.object.items.insert( + 0, + SingleBorrowGoods( + name: _textEditingController.text, + code: code, + assetpath: file, + status: BORROW_STATUS.NOT_BORROW, + )); + } + }, + child: Text( + '完成', + style: TextStyle( + fontSize: 28.w, + color: AppStyle.primaryTextColor, + ), + ), + ), + ], + body: ListView( + padding: EdgeInsets.symmetric(vertical: 16.w), + children: [ + Container( + color: Colors.white, + padding: EdgeInsets.symmetric(horizontal: 32.w), + child: Column( + children: [ + _buildRow( + '物品名称', + TextField( + style: TextStyle( + color: AppStyle.primaryTextColor, + fontSize: 28.sp, + fontWeight: FontWeight.bold, + ), + controller: _textEditingController, + decoration: InputDecoration( + border: InputBorder.none, + hintText: '请输入物品名称', + ), + )), + Divider(height: 1.w), + _buildRow( + '物品单号', + Text( + code, + style: TextStyle( + color: AppStyle.minorTextColor, + fontSize: 28.sp, + fontWeight: FontWeight.bold, + ), + )), + _buildRow( + '物品图片', + file == null + ? InkWell( + onTap: () { + akuPickImage().then((value) { + if (value != null) file = value; + setState(() {}); + }); + }, + child: Container( + height: 184.w, + width: 184.w, + alignment: Alignment.center, + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Icon( + Icons.image, + size: 60.w, + color: AppStyle.minorTextColor, + ), + Text( + '上传图片', + style: TextStyle( + color: AppStyle.minorTextColor, + fontSize: 22.sp, + ), + ), + ], + ), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8.w), + border: Border.all( + width: 1.w, + color: AppStyle.minorTextColor, + ), + ), + ), + ) + : Image.file( + file, + height: 184.w, + width: 184.w, + fit: BoxFit.cover, + ), + ), + AkuBox.h(28), + ], + ), + ), + ], + ), + ); + } + + _buildRow(String title, Widget child) { + return Row( + children: [ + AkuBox.h(96), + Text( + title, + style: TextStyle( + color: AppStyle.minorTextColor, + fontSize: 28.w, + ), + ), + AkuBox.w(80), + Expanded( + child: Align( + alignment: Alignment.centerLeft, + child: child, + ), + ), + ], + ); + } +} diff --git a/lib/ui/sub_pages/borrow_manager/add_borrow_object_page.dart b/lib/ui/sub_pages/borrow_manager/add_borrow_object_page.dart new file mode 100644 index 0000000..045dd03 --- /dev/null +++ b/lib/ui/sub_pages/borrow_manager/add_borrow_object_page.dart @@ -0,0 +1,185 @@ +import 'dart:io'; + +import 'package:aku_community_manager/mock_models/borrow/borrow_data.dart'; +import 'package:aku_community_manager/mock_models/borrow/borrow_model.dart'; +import 'package:aku_community_manager/mock_models/users/user_info_model.dart'; +import 'package:aku_community_manager/provider/user_provider.dart'; +import 'package:aku_community_manager/style/app_style.dart'; +import 'package:aku_community_manager/tools/widget_tool.dart'; +import 'package:aku_community_manager/ui/widgets/common/aku_scaffold.dart'; +import 'package:aku_community_manager/ui/widgets/inner/pick_image.dart'; +import 'package:aku_ui/common_widgets/aku_material_button.dart'; +import 'package:bot_toast/bot_toast.dart'; +import 'package:common_utils/common_utils.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:provider/provider.dart'; + +class AddBorrowObjectPage extends StatefulWidget { + AddBorrowObjectPage({Key key}) : super(key: key); + + @override + _AddBorrowObjectPageState createState() => _AddBorrowObjectPageState(); +} + +class _AddBorrowObjectPageState extends State { + TextEditingController _textEditingController = TextEditingController(); + TextEditingController _numberController = TextEditingController(); + File file; + List get objects => BorrowData.borrowObjects; + + @override + Widget build(BuildContext context) { + final userProvider = Provider.of(context); + return AkuScaffold( + title: '物品详情', + actions: [ + userProvider.userInfoModel.role != USER_ROLE.MANAGER + ? AkuMaterialButton( + minWidth: 120.w, + onPressed: () { + if (TextUtil.isEmpty(_textEditingController.text)) { + BotToast.showText(text: '名称不能为空'); + } else if (file == null) { + BotToast.showText(text: '图片不能为空'); + } else if (int.tryParse(_numberController.text) == null) { + BotToast.showText(text: '数量错误'); + } else { + objects.insert( + 0, + BorrowObject.init( + name: _textEditingController.text, + allNumber: int.parse(_numberController.text), + assetPath: file, + ), + ); + Get.back(); + } + }, + child: Text( + '完成', + style: TextStyle( + fontSize: 28.w, + color: AppStyle.primaryTextColor, + ), + ), + ) + : SizedBox(), + ], + body: ListView( + padding: EdgeInsets.symmetric(vertical: 16.w), + children: [ + Container( + color: Colors.white, + padding: EdgeInsets.symmetric(horizontal: 32.w), + child: Column( + children: [ + _buildRow( + '总类名称', + TextField( + style: TextStyle( + color: AppStyle.primaryTextColor, + fontSize: 28.sp, + fontWeight: FontWeight.bold, + ), + controller: _textEditingController, + decoration: InputDecoration( + border: InputBorder.none, + hintText: '请输入总类名称', + ), + )), + Divider(height: 1.w), + _buildRow( + '物品数量', + TextField( + style: TextStyle( + color: AppStyle.primaryTextColor, + fontSize: 28.sp, + fontWeight: FontWeight.bold, + ), + controller: _numberController, + decoration: InputDecoration( + border: InputBorder.none, + hintText: '请输入物品数量', + ), + )), + Divider(height: 1.w), + AkuBox.h(24), + _buildRow( + '物品图片', + file == null + ? InkWell( + onTap: () { + akuPickImage().then((value) { + if (value != null) file = value; + setState(() {}); + }); + }, + child: Container( + height: 184.w, + width: 184.w, + alignment: Alignment.center, + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Icon( + Icons.image, + size: 60.w, + color: AppStyle.minorTextColor, + ), + Text( + '上传图片', + style: TextStyle( + color: AppStyle.minorTextColor, + fontSize: 22.sp, + ), + ), + ], + ), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8.w), + border: Border.all( + width: 1.w, + color: AppStyle.minorTextColor, + ), + ), + ), + ) + : Image.file( + file, + height: 184.w, + width: 184.w, + fit: BoxFit.cover, + ), + ), + AkuBox.h(28), + ], + ), + ), + ], + ), + ); + } + + _buildRow(String title, Widget child) { + return Row( + children: [ + AkuBox.h(96), + Text( + title, + style: TextStyle( + color: AppStyle.minorTextColor, + fontSize: 28.w, + ), + ), + AkuBox.w(80), + Expanded( + child: Align( + alignment: Alignment.centerLeft, + child: child, + ), + ), + ], + ); + } +} diff --git a/lib/ui/sub_pages/borrow_manager/all_borrow_goods.dart b/lib/ui/sub_pages/borrow_manager/all_borrow_goods.dart new file mode 100644 index 0000000..13ae700 --- /dev/null +++ b/lib/ui/sub_pages/borrow_manager/all_borrow_goods.dart @@ -0,0 +1,124 @@ +import 'package:aku_community_manager/mock_models/borrow/borrow_data.dart'; +import 'package:aku_community_manager/mock_models/borrow/borrow_model.dart'; +import 'package:aku_community_manager/style/app_style.dart'; +import 'package:aku_community_manager/tools/widget_tool.dart'; +import 'package:aku_community_manager/ui/sub_pages/borrow_manager/add_borrow_object_page.dart'; +import 'package:aku_community_manager/ui/sub_pages/borrow_manager/borrow_items_page.dart'; +import 'package:aku_community_manager/ui/widgets/common/aku_scaffold.dart'; +import 'package:aku_ui/common_widgets/aku_material_button.dart'; +import 'package:aku_community_manager/const/resource.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +class AllBorrowGoods extends StatefulWidget { + AllBorrowGoods({Key key}) : super(key: key); + + @override + _AllBorrowGoodsState createState() => _AllBorrowGoodsState(); +} + +class _AllBorrowGoodsState extends State { + @override + Widget build(BuildContext context) { + return AkuScaffold( + title: '全部物品', + actions: [ + AkuMaterialButton( + minWidth: 120.w, + onPressed: () { + Get.to(AddBorrowObjectPage()); + }, + child: Text( + '新增', + style: TextStyle( + fontSize: 28.w, + color: AppStyle.primaryTextColor, + ), + ), + ), + ], + body: ListView.builder( + padding: EdgeInsets.symmetric( + horizontal: 32.w, + ), + itemBuilder: (context, index) { + return _buildCard(BorrowData.borrowObjects[index]); + }, + itemCount: BorrowData.borrowObjects.length, + ), + ); + } + + _buildCard(BorrowObject object) { + return GestureDetector( + onTap: () => Get.to(BorrowItemPage(object: object)), + child: Container( + padding: EdgeInsets.all(24.w), + margin: EdgeInsets.only(top: 16.w), + child: Row( + children: [ + ClipRRect( + borderRadius: BorderRadius.circular(4.w), + child: (object.assetPath is String) + ? Image.asset( + object.assetPath, + width: 184.w, + height: 184.w, + fit: BoxFit.cover, + ) + : Image.file( + object.assetPath, + width: 184.w, + height: 184.w, + fit: BoxFit.cover, + ), + ), + AkuBox.w(24), + Expanded( + child: Column( + children: [ + _buildRow(R.ASSETS_MANAGE_ARTICLE_PNG, '物品名称', object.name), + AkuBox.h(12), + _buildRow(R.ASSETS_MANAGE_BORROW_PNG, '借出数量', + object.borrowNumber.toString()), + AkuBox.h(12), + _buildRow(R.ASSETS_MANAGE_REMAINING_PNG, '剩余数量', + object.items.length.toString()), + ], + )), + ], + ), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8.w), + color: Colors.white, + ), + ), + ); + } + + _buildRow(String assetPath, String title, String subTitle) { + return Row( + children: [ + Image.asset( + assetPath, + height: 40.w, + width: 40.w, + ), + Text( + '$title\:', + style: TextStyle( + color: AppStyle.minorTextColor, + fontSize: 28.w, + ), + ), + Text( + subTitle, + style: TextStyle( + color: AppStyle.primaryTextColor, + fontSize: 28.w, + ), + ), + ], + ); + } +} diff --git a/lib/ui/sub_pages/borrow_manager/borrow_item_detail_page.dart b/lib/ui/sub_pages/borrow_manager/borrow_item_detail_page.dart new file mode 100644 index 0000000..c77df0b --- /dev/null +++ b/lib/ui/sub_pages/borrow_manager/borrow_item_detail_page.dart @@ -0,0 +1,148 @@ +import 'package:aku_community_manager/mock_models/borrow/borrow_model.dart'; +import 'package:aku_community_manager/style/app_style.dart'; +import 'package:aku_community_manager/tools/widget_tool.dart'; +import 'package:aku_community_manager/ui/widgets/common/aku_scaffold.dart'; +import 'package:aku_ui/common_widgets/aku_material_button.dart'; +import 'package:flutter/material.dart'; + +class BorrowItemDetailPage extends StatefulWidget { + final SingleBorrowGoods item; + BorrowItemDetailPage({Key key, this.item}) : super(key: key); + + @override + _BorrowItemDetailPageState createState() => _BorrowItemDetailPageState(); +} + +class _BorrowItemDetailPageState extends State { + bool _isEditing = false; + TextEditingController _textEditingController; + @override + void initState() { + super.initState(); + _textEditingController = TextEditingController(text: widget.item.name); + } + + @override + void dispose() { + _textEditingController?.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return AkuScaffold( + title: '物品详情', + actions: [ + AkuMaterialButton( + minWidth: 120.w, + onPressed: () { + setState(() { + _isEditing = !_isEditing; + }); + }, + child: Text( + _isEditing ? '完成' : '编辑', + style: TextStyle( + fontSize: 28.w, + color: AppStyle.primaryTextColor, + ), + ), + ), + ], + body: ListView( + padding: EdgeInsets.symmetric(vertical: 16.w), + children: [ + Container( + color: Colors.white, + padding: EdgeInsets.symmetric(horizontal: 32.w), + child: Column( + children: [ + _buildRow( + '物品名称', + TextField( + style: TextStyle( + color: AppStyle.primaryTextColor, + fontSize: 28.sp, + fontWeight: FontWeight.bold, + ), + controller: _textEditingController, + enabled: _isEditing, + onChanged: (text) { + widget.item.name = text; + }, + decoration: InputDecoration( + border: InputBorder.none, + ), + )), + Divider(height: 1.w), + _buildRow( + '物品单号', + Text( + widget.item.code, + style: TextStyle( + color: _isEditing + ? AppStyle.minorTextColor + : AppStyle.primaryTextColor, + fontSize: 28.sp, + fontWeight: FontWeight.bold, + ), + )), + _buildRow( + '出借状态', + Text( + '未出借', + style: TextStyle( + color: _isEditing + ? AppStyle.minorTextColor + : AppStyle.primaryTextColor, + fontSize: 28.sp, + fontWeight: FontWeight.bold, + ), + )), + _buildRow( + '物品图片', + (widget.item.assetpath is String) + ? Image.asset( + widget.item.assetpath, + height: 184.w, + width: 184.w, + fit: BoxFit.cover, + ) + : Image.file( + widget.item.assetpath, + height: 184.w, + width: 184.w, + fit: BoxFit.cover, + ), + ), + AkuBox.h(28), + ], + ), + ), + ], + ), + ); + } + + _buildRow(String title, Widget child) { + return Row( + children: [ + AkuBox.h(96), + Text( + title, + style: TextStyle( + color: AppStyle.minorTextColor, + fontSize: 28.w, + ), + ), + AkuBox.w(80), + Expanded( + child: Align( + alignment: Alignment.centerLeft, + child: child, + ), + ), + ], + ); + } +} diff --git a/lib/ui/sub_pages/borrow_manager/borrow_items_page.dart b/lib/ui/sub_pages/borrow_manager/borrow_items_page.dart new file mode 100644 index 0000000..4f19a2f --- /dev/null +++ b/lib/ui/sub_pages/borrow_manager/borrow_items_page.dart @@ -0,0 +1,211 @@ +import 'package:aku_community_manager/mock_models/borrow/borrow_model.dart'; +import 'package:aku_community_manager/mock_models/users/user_info_model.dart'; +import 'package:aku_community_manager/provider/user_provider.dart'; +import 'package:aku_community_manager/style/app_style.dart'; +import 'package:aku_community_manager/tools/widget_tool.dart'; +import 'package:aku_community_manager/ui/sub_pages/borrow_manager/add_borrow_item_page.dart'; +import 'package:aku_community_manager/ui/sub_pages/borrow_manager/borrow_item_detail_page.dart'; +import 'package:aku_community_manager/ui/widgets/common/aku_scaffold.dart'; +import 'package:aku_ui/common_widgets/aku_material_button.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:provider/provider.dart'; + +class BorrowItemPage extends StatefulWidget { + final BorrowObject object; + BorrowItemPage({Key key, @required this.object}) : super(key: key); + + @override + _BorrowItemPageState createState() => _BorrowItemPageState(); +} + +class _BorrowItemPageState extends State { + @override + Widget build(BuildContext context) { + final userProvider = Provider.of(context); + return AkuScaffold( + title: '物品查看', + actions: [ + userProvider.userInfoModel.role != USER_ROLE.MANAGER + ? AkuMaterialButton( + minWidth: 120.w, + onPressed: () { + Get.to(AddBorrowItemPage(object: widget.object)); + }, + child: Text( + '新增', + style: TextStyle( + fontSize: 28.w, + color: AppStyle.primaryTextColor, + ), + ), + ) + : SizedBox(), + ], + body: ListView.builder( + padding: EdgeInsets.symmetric(horizontal: 32.w), + itemBuilder: (context, index) { + return _buildCard(widget.object.items[index]); + }, + itemCount: widget.object.items.length, + ), + ); + } + + _buildCard(SingleBorrowGoods item) { + final userProvider = Provider.of(context); + return GestureDetector( + onTap: () { + Get.to(BorrowItemDetailPage(item: item)); + }, + child: Container( + margin: EdgeInsets.only(top: 16.w), + child: Column( + children: [ + Row( + children: [ + AkuBox.h(93), + AkuBox.w(24), + Text( + item.name, + style: TextStyle( + color: AppStyle.primaryTextColor, + fontWeight: FontWeight.bold, + fontSize: 32.sp, + ), + ), + Spacer(), + userProvider.userInfoModel.role != USER_ROLE.MANAGER + ? AkuMaterialButton( + padding: EdgeInsets.symmetric(horizontal: 24.w), + onPressed: () { + showCupertinoDialog( + context: context, + builder: (context) { + return CupertinoAlertDialog( + title: Text('删除物品'), + content: Text('确定要删除${item.name}该物品吗?'), + actions: [ + CupertinoDialogAction( + child: Text('取消'), + onPressed: () { + Get.back(); + }, + ), + CupertinoDialogAction( + child: Text('删除'), + onPressed: () { + widget.object.items.remove(item); + setState(() {}); + Get.back(); + }, + ), + ], + ); + }, + ); + }, + child: Row( + children: [ + Icon( + Icons.delete, + color: AppStyle.minorTextColor, + size: 40.w, + ), + Text( + '删除', + style: TextStyle( + color: AppStyle.minorTextColor, + fontSize: 28.sp, + ), + ), + ], + ), + ) + : SizedBox(), + ], + ), + Divider( + height: 1.w, + ), + AkuBox.h(28), + Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + AkuBox.w(24), + ClipRRect( + borderRadius: BorderRadius.circular(4.w), + child: (item.assetpath is String) + ? Image.asset( + item.assetpath, + height: 184.w, + width: 184.w, + fit: BoxFit.cover, + ) + : Image.file( + item.assetpath, + height: 184.w, + width: 184.w, + fit: BoxFit.cover, + ), + ), + AkuBox.w(24), + Expanded( + child: Column( + children: [ + _buildRow( + R.ASSETS_MANAGE_IC_RENWU_PNG, '物品单号', item.code), + _buildRow( + R.ASSETS_MANAGE_BORROW_PNG, + '出借状态', + '未借出', + color: AppStyle.secondaryColor, + ), + ], + ), + ), + ], + ), + AkuBox.h(32), + ], + ), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8.w), + ), + ), + ); + } + + _buildRow( + String assetPath, + String title, + String subTitle, { + Color color = AppStyle.primaryTextColor, + }) { + return Row( + children: [ + Image.asset( + assetPath, + height: 40.w, + width: 40.w, + ), + Text( + '$title\:', + style: TextStyle( + color: AppStyle.minorTextColor, + fontSize: 28.w, + ), + ), + Text( + subTitle, + style: TextStyle( + color: color, + fontSize: 28.w, + ), + ), + ], + ); + } +} diff --git a/lib/ui/sub_pages/borrow_manager/borrow_manager_page.dart b/lib/ui/sub_pages/borrow_manager/borrow_manager_page.dart new file mode 100644 index 0000000..4533aa9 --- /dev/null +++ b/lib/ui/sub_pages/borrow_manager/borrow_manager_page.dart @@ -0,0 +1,45 @@ +import 'package:aku_community_manager/mock_models/borrow/borrow_data.dart'; +import 'package:aku_community_manager/mock_models/borrow/borrow_model.dart'; +import 'package:aku_community_manager/mock_models/users/user_info_model.dart'; +import 'package:aku_community_manager/provider/user_provider.dart'; +import 'package:aku_community_manager/style/app_style.dart'; +import 'package:aku_community_manager/ui/sub_pages/borrow_manager/all_borrow_goods.dart'; +import 'package:aku_community_manager/ui/widgets/common/aku_scaffold.dart'; +import 'package:aku_ui/common_widgets/aku_material_button.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:provider/provider.dart'; + +class BorrowManagerPage extends StatefulWidget { + BorrowManagerPage({Key key}) : super(key: key); + + @override + _BorrowManagerPageState createState() => _BorrowManagerPageState(); +} + +class _BorrowManagerPageState extends State { + @override + Widget build(BuildContext context) { + final userProvider = Provider.of(context); + return AkuScaffold( + title: '物品清单', + actions: [ + userProvider.userInfoModel.role != USER_ROLE.MANAGER + ? AkuMaterialButton( + minWidth: 178.w, + onPressed: () { + Get.to(AllBorrowGoods()); + }, + child: Text( + '全部物品', + style: TextStyle( + fontSize: 28.w, + color: AppStyle.primaryTextColor, + ), + ), + ) + : SizedBox(), + ], + ); + } +} diff --git a/lib/ui/widgets/common/aku_scaffold.dart b/lib/ui/widgets/common/aku_scaffold.dart index d86d74f..34f6b82 100644 --- a/lib/ui/widgets/common/aku_scaffold.dart +++ b/lib/ui/widgets/common/aku_scaffold.dart @@ -6,7 +6,7 @@ import 'package:aku_community_manager/tools/screen_tool.dart'; class AkuScaffold extends StatefulWidget { ///AppBar 使用该值 `title`,`titleStyle`,`leading`, - ///`brightness`,`appBarColor`,``将失效 + ///`brightness`,`appBarColor`,`actions`将失效 final PreferredSizeWidget appBar; ///title @@ -45,6 +45,8 @@ class AkuScaffold extends StatefulWidget { final Color appBarColor; + final List actions; + final PreferredSizeWidget appBarBottom; AkuScaffold({ Key key, @@ -58,6 +60,7 @@ class AkuScaffold extends StatefulWidget { this.bottom, this.appBarColor = Colors.white, this.appBarBottom, + this.actions = const [], }) : super(key: key); @override @@ -86,6 +89,7 @@ class _AkuScaffoldState extends State { child: Text(widget.title ?? ''), ), bottom: widget.appBarBottom, + actions: widget.actions, ), body: widget.body, bottomNavigationBar: widget.bottom, From 03a4388174a76298754fe2edbed408b4580a4902 Mon Sep 17 00:00:00 2001 From: laiiihz Date: Fri, 6 Nov 2020 11:04:54 +0800 Subject: [PATCH 09/13] =?UTF-8?q?=E7=89=A9=E5=93=81=E6=B8=85=E5=8D=95?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2=E6=B7=BB=E5=8A=A0=E9=AA=8C=E8=AF=81=EF=BC=8C?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0tabbar?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../borrow_manager/all_borrow_goods.dart | 32 ++++++---- .../borrow_item_detail_page.dart | 36 ++++++----- .../borrow_manager/borrow_items_page.dart | 4 +- .../borrow_manager/borrow_manager_page.dart | 59 +++++++++++++------ 4 files changed, 82 insertions(+), 49 deletions(-) diff --git a/lib/ui/sub_pages/borrow_manager/all_borrow_goods.dart b/lib/ui/sub_pages/borrow_manager/all_borrow_goods.dart index 13ae700..019b096 100644 --- a/lib/ui/sub_pages/borrow_manager/all_borrow_goods.dart +++ b/lib/ui/sub_pages/borrow_manager/all_borrow_goods.dart @@ -1,5 +1,7 @@ import 'package:aku_community_manager/mock_models/borrow/borrow_data.dart'; import 'package:aku_community_manager/mock_models/borrow/borrow_model.dart'; +import 'package:aku_community_manager/mock_models/users/user_info_model.dart'; +import 'package:aku_community_manager/provider/user_provider.dart'; import 'package:aku_community_manager/style/app_style.dart'; import 'package:aku_community_manager/tools/widget_tool.dart'; import 'package:aku_community_manager/ui/sub_pages/borrow_manager/add_borrow_object_page.dart'; @@ -9,6 +11,7 @@ import 'package:aku_ui/common_widgets/aku_material_button.dart'; import 'package:aku_community_manager/const/resource.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; +import 'package:provider/provider.dart'; class AllBorrowGoods extends StatefulWidget { AllBorrowGoods({Key key}) : super(key: key); @@ -20,22 +23,25 @@ class AllBorrowGoods extends StatefulWidget { class _AllBorrowGoodsState extends State { @override Widget build(BuildContext context) { + final userProvider = Provider.of(context); return AkuScaffold( title: '全部物品', actions: [ - AkuMaterialButton( - minWidth: 120.w, - onPressed: () { - Get.to(AddBorrowObjectPage()); - }, - child: Text( - '新增', - style: TextStyle( - fontSize: 28.w, - color: AppStyle.primaryTextColor, - ), - ), - ), + userProvider.userInfoModel.role == USER_ROLE.MANAGER + ? AkuMaterialButton( + minWidth: 120.w, + onPressed: () { + Get.to(AddBorrowObjectPage()); + }, + child: Text( + '新增', + style: TextStyle( + fontSize: 28.w, + color: AppStyle.primaryTextColor, + ), + ), + ) + : SizedBox(), ], body: ListView.builder( padding: EdgeInsets.symmetric( diff --git a/lib/ui/sub_pages/borrow_manager/borrow_item_detail_page.dart b/lib/ui/sub_pages/borrow_manager/borrow_item_detail_page.dart index c77df0b..c579cab 100644 --- a/lib/ui/sub_pages/borrow_manager/borrow_item_detail_page.dart +++ b/lib/ui/sub_pages/borrow_manager/borrow_item_detail_page.dart @@ -1,9 +1,12 @@ import 'package:aku_community_manager/mock_models/borrow/borrow_model.dart'; +import 'package:aku_community_manager/mock_models/users/user_info_model.dart'; +import 'package:aku_community_manager/provider/user_provider.dart'; import 'package:aku_community_manager/style/app_style.dart'; import 'package:aku_community_manager/tools/widget_tool.dart'; import 'package:aku_community_manager/ui/widgets/common/aku_scaffold.dart'; import 'package:aku_ui/common_widgets/aku_material_button.dart'; import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; class BorrowItemDetailPage extends StatefulWidget { final SingleBorrowGoods item; @@ -30,24 +33,27 @@ class _BorrowItemDetailPageState extends State { @override Widget build(BuildContext context) { + final userProvider = Provider.of(context); return AkuScaffold( title: '物品详情', actions: [ - AkuMaterialButton( - minWidth: 120.w, - onPressed: () { - setState(() { - _isEditing = !_isEditing; - }); - }, - child: Text( - _isEditing ? '完成' : '编辑', - style: TextStyle( - fontSize: 28.w, - color: AppStyle.primaryTextColor, - ), - ), - ), + userProvider.userInfoModel.role == USER_ROLE.MANAGER + ? AkuMaterialButton( + minWidth: 120.w, + onPressed: () { + setState(() { + _isEditing = !_isEditing; + }); + }, + child: Text( + _isEditing ? '完成' : '编辑', + style: TextStyle( + fontSize: 28.w, + color: AppStyle.primaryTextColor, + ), + ), + ) + : SizedBox(), ], body: ListView( padding: EdgeInsets.symmetric(vertical: 16.w), diff --git a/lib/ui/sub_pages/borrow_manager/borrow_items_page.dart b/lib/ui/sub_pages/borrow_manager/borrow_items_page.dart index 4f19a2f..bc2609a 100644 --- a/lib/ui/sub_pages/borrow_manager/borrow_items_page.dart +++ b/lib/ui/sub_pages/borrow_manager/borrow_items_page.dart @@ -27,7 +27,7 @@ class _BorrowItemPageState extends State { return AkuScaffold( title: '物品查看', actions: [ - userProvider.userInfoModel.role != USER_ROLE.MANAGER + userProvider.userInfoModel.role == USER_ROLE.MANAGER ? AkuMaterialButton( minWidth: 120.w, onPressed: () { @@ -76,7 +76,7 @@ class _BorrowItemPageState extends State { ), ), Spacer(), - userProvider.userInfoModel.role != USER_ROLE.MANAGER + userProvider.userInfoModel.role == USER_ROLE.MANAGER ? AkuMaterialButton( padding: EdgeInsets.symmetric(horizontal: 24.w), onPressed: () { diff --git a/lib/ui/sub_pages/borrow_manager/borrow_manager_page.dart b/lib/ui/sub_pages/borrow_manager/borrow_manager_page.dart index 4533aa9..59b5619 100644 --- a/lib/ui/sub_pages/borrow_manager/borrow_manager_page.dart +++ b/lib/ui/sub_pages/borrow_manager/borrow_manager_page.dart @@ -1,10 +1,9 @@ -import 'package:aku_community_manager/mock_models/borrow/borrow_data.dart'; -import 'package:aku_community_manager/mock_models/borrow/borrow_model.dart'; import 'package:aku_community_manager/mock_models/users/user_info_model.dart'; import 'package:aku_community_manager/provider/user_provider.dart'; import 'package:aku_community_manager/style/app_style.dart'; import 'package:aku_community_manager/ui/sub_pages/borrow_manager/all_borrow_goods.dart'; import 'package:aku_community_manager/ui/widgets/common/aku_scaffold.dart'; +import 'package:aku_community_manager/ui/widgets/inner/aku_tab_bar.dart'; import 'package:aku_ui/common_widgets/aku_material_button.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; @@ -17,28 +16,50 @@ class BorrowManagerPage extends StatefulWidget { _BorrowManagerPageState createState() => _BorrowManagerPageState(); } -class _BorrowManagerPageState extends State { +class _BorrowManagerPageState extends State + with TickerProviderStateMixin { + USER_ROLE get role => + Provider.of(context, listen: false).userInfoModel.role; + TabController _tabController; + List get _tabs { + switch (role) { + case USER_ROLE.MANAGER: + return ['全部', '出借中', '待检查', '已归还']; + default: + return ['全部', '出借中', '已归还']; + } + } + + @override + void initState() { + super.initState(); + _tabController = TabController(length: _tabs.length, vsync: this); + } + @override Widget build(BuildContext context) { - final userProvider = Provider.of(context); return AkuScaffold( title: '物品清单', + appBarBottom: PreferredSize( + child: AkuTabBar( + controller: _tabController, + tabs: _tabs, + ), + preferredSize: Size.fromHeight(96.w)), actions: [ - userProvider.userInfoModel.role != USER_ROLE.MANAGER - ? AkuMaterialButton( - minWidth: 178.w, - onPressed: () { - Get.to(AllBorrowGoods()); - }, - child: Text( - '全部物品', - style: TextStyle( - fontSize: 28.w, - color: AppStyle.primaryTextColor, - ), - ), - ) - : SizedBox(), + AkuMaterialButton( + minWidth: 178.w, + onPressed: () { + Get.to(AllBorrowGoods()); + }, + child: Text( + '全部物品', + style: TextStyle( + fontSize: 28.w, + color: AppStyle.primaryTextColor, + ), + ), + ), ], ); } From 3461f4f7528032e983e7c4ee462e64abb253db6d Mon Sep 17 00:00:00 2001 From: laiiihz Date: Fri, 6 Nov 2020 13:18:41 +0800 Subject: [PATCH 10/13] =?UTF-8?q?=E5=AE=8C=E6=88=90=E5=80=9F=E8=BF=98?= =?UTF-8?q?=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assets/manage/info.png | Bin 0 -> 2201 bytes lib/mock_models/borrow/borrow_data.dart | 68 +++++- lib/mock_models/borrow/borrow_model.dart | 10 + .../borrow_manager/borrow_manager_card.dart | 221 ++++++++++++++++++ .../borrow_manager_check_page.dart | 170 ++++++++++++++ .../borrow_manager/borrow_manager_page.dart | 33 +++ pubspec.lock | 49 +++- pubspec.yaml | 2 + 8 files changed, 548 insertions(+), 5 deletions(-) create mode 100644 assets/manage/info.png create mode 100644 lib/ui/sub_pages/borrow_manager/borrow_manager_card.dart create mode 100644 lib/ui/sub_pages/borrow_manager/borrow_manager_check_page.dart diff --git a/assets/manage/info.png b/assets/manage/info.png new file mode 100644 index 0000000000000000000000000000000000000000..fad8ff980af177970ac1743358ed973805c31add GIT binary patch literal 2201 zcmV;K2xj+*P)| zw#N96&b-~8k<&kx76rl?{8bgw2vz*iq)H7Dx%5=D*}bAAz22Lz`Rbmzdwp+j=goV! z2fj%*_s7lmJM;bQcV@oxotZ_*ixUBKlFo%82k7VoIlvsCBLPS8+yirfjszUVa}Ue` zIudXc&pj{)=t#g(JomuoJHTeMS!lQ0uLFR$0KlvGLqsnHfI&nYWc!HdSpawz5vKv* z51r4$<#PG)YPA|TGH?>_iw7#D20YKZnTSS+=HsGuCN7DV0iFwr}75 zRFbyhWKsp#f%hl?yePIo#KT1NNh#&QG!4;O-$q1V1b~fQ^gdH6m99z?Vrl?+*tS}& zLtQ-YG$QUSm&<#yS{)A_JXkz-?AS*DU^f5^#DF|fsZ_2>YdEI@kQWT!_rKd^&YSi; z@0MDv_PaE_E>4&4`)@VI?2n5zc}}d=YTMFSSW*F~l=?#4YKw@!DHICtTyAkl8|=P) z`!1WGpTD1ou87gSOG?Rer&DnT*opI|VtVo0wQJX2J2EnI(y5mTg(oK`*PS|b>QEd+ zM7-HGPILmuJB(JV#ltcxNPfClEDpPR9)Cdqu!V@)08p1wa*Wt>VNX1B=FDR;!}(~X zQn}J)PIdz5`~H|QrXFFpO|)%M1Du@n1wVETufsGeH38%!xmUT39^K z8?V)B4I6!n>m~-siGfzD^~adK?G7pBmy&jhpx`%EqJ#h{OQ3);ox3SGYrnc(`0H54#Kt*4bz@Hq6h@ACEBjQ7Prswg5XJ&e5ni z5fSeaLU0UeT@nH8c*kF2=9TNy3X+vlJl|cmWXK@y5kh?2+EM`M1lt_mgbQycUy>xB zmW$jmB^g1RP(!m=*H&uM-k+hB{GEO8p{g+vj=St+iV1 zK3k=U0BWuG6VYuEjol)pe9*QN-Rd_QjX@&X#H;Z5`1r38(YWZZ*X!>Jf`IqxO9~?H z7ec((R<||4PUyleA5O!c7#bS7Fll1Iw&O|ba{^*|dioy`S)AEQrEt)!gR`W_;BPlOGdgb;^q`eF@GYkfNr?Tu)Bs}SO>p<&aR#dVcZ zYYK(J8-gIX8WDNby?}^*BBlIHQk@HOzVDA1WA2Wy;SM20RHzf%q%}aLln(&oVU5LN z@gkR92Zt@jnCp!(3~Lwwt^@$iM*pvHHb)5YIah$3lm&plN9f_5PR&NYH9)QP&xvTs zN{fhp6GB{Q({Q-1)_OM)eWII=LZPr_e0=-?mv$Cpl~TNtFUe-}Dlde%)<(ZIK&8~5 z0N~P4BhKNA*7_Pw(<9<5JBRB-VM7K61}+{Q9p%Gy=c1H477o*b+AJQx-Nxr=(J7X4*4+$Z@kru$XbQ~gPpG?R)ou!oGJ?fHx z+4H>NTCK*3Q0LP3bQW8XRYEmp0pSGdpp^2IGd(^R?RP?zjmRpcueIJrME8b3Jt?Jp zMH=u}$Erx_XLYFL`~FU2%#wT`A|4V#yeSQUtL9LtGmKL|)>KMyl5->!!pxM*<%?Zo zz*Tju$p&U|u&%Yfmx#7Sc-z+j;A@3Kp=gYGEdadSHnAF)Ne6)b9ISWd!c?zzXs!1W z(d|79*CSF&&RF+UR^`=>ju)nSxoBcyV&mN09N&A1ODR3>dENp3jE#*w(F?s*eYvPJ z7xFWP$m?xbkeuQ$fLnTRgu+gaUy_JoL@K*ZmBp7+SQb?biRnkRJi z2kT=^*9Ko`@;N}qZ!`y(19T+dD4u&@4$zT+qj>ItIY37Oj^eoo<^UZDIEv>Um;-bq b;3)oY2ymW_{?1(n00000NkvXXu0mjfh`cB> literal 0 HcmV?d00001 diff --git a/lib/mock_models/borrow/borrow_data.dart b/lib/mock_models/borrow/borrow_data.dart index 2428927..da06a3f 100644 --- a/lib/mock_models/borrow/borrow_data.dart +++ b/lib/mock_models/borrow/borrow_data.dart @@ -2,13 +2,73 @@ import 'package:aku_community_manager/const/resource.dart'; import 'package:aku_community_manager/mock_models/borrow/borrow_model.dart'; class BorrowData { + static List get checkModels => models.where((e) { + return e.borrowGoods.status == BORROW_STATUS.WAIT_CHECK; + }).toList(); + static List get borrowModels => models.where((e) { + return e.borrowGoods.status == BORROW_STATUS.BORROWING; + }).toList(); + + static List get doneModels => models.where((e) { + return e.borrowGoods.status == BORROW_STATUS.DONE; + }).toList(); + static List models = [ BorrowModel( + title: '归还梯子一个', + borrowPerson: '李慧珍', + borrowTime: 5, + goodsStatus: GOODS_STATUS.BROKEN, + phone: '19981712931', + borrowGoods: SingleBorrowGoods( + name: '梯子', + assetpath: R.ASSETS_STATIC_TEMP_LADDER_PNG, + code: '3193713894', + status: BORROW_STATUS.WAIT_CHECK, + ), + date: DateTime(2020, 5, 5, 12, 35, 45), + ), + BorrowModel( + title: '归还梯子一个', borrowPerson: '李慧珍', - borrowTime: null, - goodsStatus: null, - phone: null, - borrowGoods: SingleBorrowGoods(name: ''), + borrowTime: 5, + goodsStatus: GOODS_STATUS.BROKEN, + phone: '19981712931', + borrowGoods: SingleBorrowGoods( + name: '梯子', + assetpath: R.ASSETS_STATIC_TEMP_LADDER_PNG, + code: '3193713894', + status: BORROW_STATUS.DONE, + ), + date: DateTime(2020, 5, 5, 12, 35, 45), + ), + BorrowModel( + title: '借用电钻一把', + borrowPerson: '刘虎门', + borrowTime: 12, + goodsStatus: GOODS_STATUS.NORMAL, + phone: '19981738879', + borrowGoods: SingleBorrowGoods( + name: '电钻', + assetpath: R.ASSETS_STATIC_TEMP_DRILL_PNG, + code: '31937293841', + status: BORROW_STATUS.BORROWING, + ), + date: DateTime(2020, 4, 5, 12, 35, 45), + ), + BorrowModel( + borrowPerson: '刘海保', + borrowTime: 5, + title: '借用榔头一把', + goodsStatus: GOODS_STATUS.NORMAL, + phone: '19981738879', + borrowGoods: SingleBorrowGoods( + name: '榔头', + assetpath: R.ASSETS_STATIC_TEMP_HAMMER_PNG, + code: '3193794102481', + status: BORROW_STATUS.BORROWING, + ), + date: DateTime(2020, 3, 5, 12, 35, 45), ), ]; diff --git a/lib/mock_models/borrow/borrow_model.dart b/lib/mock_models/borrow/borrow_model.dart index 3d5c4b1..343c73b 100644 --- a/lib/mock_models/borrow/borrow_model.dart +++ b/lib/mock_models/borrow/borrow_model.dart @@ -19,6 +19,7 @@ enum BORROW_STATUS { enum GOODS_STATUS { NORMAL, BROKEN, + LOST, } class BorrowModel { @@ -28,6 +29,7 @@ class BorrowModel { GOODS_STATUS goodsStatus; String title; SingleBorrowGoods borrowGoods; + DateTime date; BorrowModel({ @required this.borrowPerson, @@ -35,6 +37,8 @@ class BorrowModel { @required this.borrowTime, @required this.goodsStatus, @required this.borrowGoods, + @required this.title, + @required this.date, }); } @@ -69,6 +73,12 @@ class SingleBorrowGoods { String code; dynamic assetpath; BORROW_STATUS status; + String get borrowValue => { + BORROW_STATUS.BORROWING: '出借中', + BORROW_STATUS.DONE: '已归还', + BORROW_STATUS.NOT_BORROW: '未出借', + BORROW_STATUS.WAIT_CHECK: '待检查', + }[status]; SingleBorrowGoods({ this.name, this.code, diff --git a/lib/ui/sub_pages/borrow_manager/borrow_manager_card.dart b/lib/ui/sub_pages/borrow_manager/borrow_manager_card.dart new file mode 100644 index 0000000..755ccef --- /dev/null +++ b/lib/ui/sub_pages/borrow_manager/borrow_manager_card.dart @@ -0,0 +1,221 @@ +import 'package:aku_community_manager/mock_models/borrow/borrow_model.dart'; +import 'package:aku_community_manager/mock_models/users/user_info_model.dart'; +import 'package:aku_community_manager/provider/user_provider.dart'; +import 'package:aku_community_manager/style/app_style.dart'; +import 'package:aku_community_manager/tools/widget_tool.dart'; +import 'package:aku_community_manager/ui/sub_pages/borrow_manager/borrow_manager_check_page.dart'; +import 'package:aku_community_manager/ui/widgets/inner/aku_chip_box.dart'; +import 'package:aku_ui/common_widgets/aku_material_button.dart'; +import 'package:bot_toast/bot_toast.dart'; +import 'package:common_utils/common_utils.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:provider/provider.dart'; +import 'package:url_launcher/url_launcher.dart'; + +class BorrowManagerCard extends StatefulWidget { + final BorrowModel model; + BorrowManagerCard({Key key, this.model}) : super(key: key); + + @override + _BorrowManagerCardState createState() => _BorrowManagerCardState(); +} + +class _BorrowManagerCardState extends State { + USER_ROLE get role => + Provider.of(context, listen: false).userInfoModel.role; + @override + Widget build(BuildContext context) { + return Container( + margin: EdgeInsets.only(top: 16.w), + padding: EdgeInsets.all(24.w), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8.w), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + AkuChipBox(title: '借还管理'), + AkuBox.w(24), + Text( + DateUtil.formatDate(widget.model.date), + style: TextStyle(), + ), + Spacer(), + Text( + widget.model.borrowGoods.borrowValue, + style: TextStyle( + color: AppStyle.failColor, + fontWeight: FontWeight.bold, + fontSize: 24.sp, + ), + ), + ], + ), + AkuBox.h(24), + Text( + widget.model.title, + style: TextStyle( + color: AppStyle.primaryTextColor, + fontSize: 32.sp, + fontWeight: FontWeight.bold, + ), + ), + AkuBox.h(16), + Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + (widget.model.borrowGoods.assetpath is String) + ? Image.asset( + widget.model.borrowGoods.assetpath, + height: 184.w, + width: 183.w, + fit: BoxFit.cover, + ) + : Image.file( + widget.model.borrowGoods.assetpath, + height: 184.w, + width: 183.w, + fit: BoxFit.cover, + ), + AkuBox.w(24), + Expanded( + child: Column( + children: [ + _buildRow(R.ASSETS_MESSAGE_IC_PEOPLE_PNG, '借用人员', + widget.model.borrowPerson), + _buildRow(R.ASSETS_MESSAGE_IC_PHONE_PNG, '联系电话', + widget.model.phone), + _buildRow(R.ASSETS_MANAGE_IC_TIME_PNG, '借用时常', + '${widget.model.borrowTime}天'), + _buildRow( + R.ASSETS_MANAGE_INFO_PNG, + '物品状态', + widget.model.goodsStatus == GOODS_STATUS.BROKEN + ? '损坏' + : widget.model.goodsStatus == GOODS_STATUS.LOST + ? '丢失' + : '正常', + color: widget.model.goodsStatus == GOODS_STATUS.NORMAL + ? AppStyle.primaryTextColor + : AppStyle.failColor, + ), + ], + ), + ), + ], + ), + ..._buildCard(), + ], + ), + ); + } + + List _buildCard() { + if (role != USER_ROLE.MANAGER) + return []; + else if (widget.model.borrowGoods.status == BORROW_STATUS.DONE) { + return []; + } else + return [ + Divider(height: 48.w), + Row( + children: [ + Spacer(), + MaterialButton( + minWidth: 160.w, + height: 64.w, + child: Text( + '电话联系', + style: TextStyle( + color: AppStyle.primaryTextColor, + fontSize: 28.sp, + fontWeight: FontWeight.bold, + ), + ), + onPressed: () { + launch('tel:${widget.model.phone}'); + }, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(4.w), + side: BorderSide(color: AppStyle.primaryColor, width: 2.w), + ), + ), + AkuBox.w(24), + widget.model.borrowGoods.status == BORROW_STATUS.BORROWING + ? AkuMaterialButton( + minWidth: 160.w, + height: 64.w, + color: AppStyle.primaryColor, + radius: 4.w, + onPressed: () { + BotToast.showText(text: '已提醒用户'); + }, + child: Text( + '提醒归还', + style: TextStyle( + color: AppStyle.primaryTextColor, + fontWeight: FontWeight.bold, + fontSize: 28.w, + ), + ), + ) + : SizedBox(), + widget.model.borrowGoods.status == BORROW_STATUS.WAIT_CHECK + ? AkuMaterialButton( + minWidth: 160.w, + height: 64.w, + color: AppStyle.primaryColor, + radius: 4.w, + onPressed: () { + Get.to(BorrowManagerCheckPage(model: widget.model)); + }, + child: Text( + '检查信息', + style: TextStyle( + color: AppStyle.primaryTextColor, + fontWeight: FontWeight.bold, + fontSize: 28.w, + ), + ), + ) + : SizedBox(), + ], + ), + ]; + } + + _buildRow( + String assetPath, + String title, + String subTitle, { + Color color = AppStyle.primaryTextColor, + }) { + return Row( + children: [ + Image.asset( + assetPath, + height: 40.w, + width: 40.w, + ), + Text( + '$title\:', + style: TextStyle( + color: AppStyle.minorTextColor, + fontSize: 28.w, + ), + ), + Text( + subTitle, + style: TextStyle( + color: color, + fontSize: 28.w, + ), + ), + ], + ); + } +} diff --git a/lib/ui/sub_pages/borrow_manager/borrow_manager_check_page.dart b/lib/ui/sub_pages/borrow_manager/borrow_manager_check_page.dart new file mode 100644 index 0000000..4114a9c --- /dev/null +++ b/lib/ui/sub_pages/borrow_manager/borrow_manager_check_page.dart @@ -0,0 +1,170 @@ +import 'package:aku_community_manager/mock_models/borrow/borrow_model.dart'; +import 'package:aku_community_manager/style/app_style.dart'; +import 'package:aku_community_manager/tools/widget_tool.dart'; +import 'package:aku_community_manager/ui/widgets/common/aku_scaffold.dart'; +import 'package:aku_community_manager/ui/widgets/inner/aku_bottom_button.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +class BorrowManagerCheckPage extends StatefulWidget { + final BorrowModel model; + BorrowManagerCheckPage({Key key, @required this.model}) : super(key: key); + + @override + _BorrowManagerCheckPageState createState() => _BorrowManagerCheckPageState(); +} + +class _BorrowManagerCheckPageState extends State { + GOODS_STATUS borrowStatus = GOODS_STATUS.NORMAL; + @override + Widget build(BuildContext context) { + return AkuScaffold( + title: '检查物品', + bottom: AkuBottomButton( + title: '确认归还', + onTap: () { + widget.model.goodsStatus = borrowStatus; + widget.model.borrowGoods.status = BORROW_STATUS.DONE; + Get.back(); + }, + ), + body: ListView( + padding: EdgeInsets.symmetric(vertical: 16.w), + children: [ + Container( + color: Colors.white, + padding: EdgeInsets.symmetric(horizontal: 32.w), + child: Column( + children: [ + _buildRow( + '物品名称', + Text( + widget.model.borrowGoods.name, + style: TextStyle( + color: AppStyle.primaryTextColor, + fontSize: 28.sp, + fontWeight: FontWeight.bold, + ), + ), + ), + Divider(height: 1.w), + _buildRow( + '物品单号', + Text( + widget.model.borrowGoods.code, + style: TextStyle( + color: AppStyle.primaryTextColor, + fontSize: 28.sp, + fontWeight: FontWeight.bold, + ), + ), + ), + Divider(height: 1.w), + _buildRow( + '归还数量', + Text( + '1', + style: TextStyle( + color: AppStyle.primaryTextColor, + fontSize: 28.sp, + fontWeight: FontWeight.bold, + ), + )), + Divider(height: 1.w), + _buildRow( + '物品情况', + Row( + children: [ + _buildCard(GOODS_STATUS.NORMAL), + AkuBox.w(24), + _buildCard(GOODS_STATUS.BROKEN), + AkuBox.w(24), + _buildCard(GOODS_STATUS.LOST), + ], + ), + ), + Divider(height: 1.w), + AkuBox.h(16), + _buildRow( + '物品图片', + (widget.model.borrowGoods.assetpath is String) + ? Image.asset( + widget.model.borrowGoods.assetpath, + height: 184.w, + width: 184.w, + fit: BoxFit.cover, + ) + : Image.file( + widget.model.borrowGoods.assetpath, + height: 184.w, + width: 184.w, + fit: BoxFit.cover, + ), + ), + AkuBox.h(28), + ], + ), + ), + ], + ), + ); + } + + _buildRow(String title, Widget child) { + return Row( + children: [ + AkuBox.h(96), + Text( + title, + style: TextStyle( + color: AppStyle.minorTextColor, + fontSize: 28.w, + ), + ), + AkuBox.w(80), + Expanded( + child: Align( + alignment: Alignment.centerLeft, + child: child, + ), + ), + ], + ); + } + + _buildCard(GOODS_STATUS status) { + return GestureDetector( + onTap: () { + borrowStatus = status; + setState(() {}); + }, + child: Container( + height: 56.w, + width: 112.w, + child: Text( + { + GOODS_STATUS.NORMAL: '完好', + GOODS_STATUS.BROKEN: '损坏', + GOODS_STATUS.LOST: '丢失', + }[status], + style: TextStyle( + color: borrowStatus == status + ? AppStyle.secondaryColor + : AppStyle.minorTextColor, + fontSize: 28.sp, + ), + ), + alignment: Alignment.center, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(4), + border: Border.all( + color: borrowStatus == status + ? AppStyle.secondaryColor + : AppStyle.minorTextColor, + width: 2.w, + ), + ), + ), + ); + } +} diff --git a/lib/ui/sub_pages/borrow_manager/borrow_manager_page.dart b/lib/ui/sub_pages/borrow_manager/borrow_manager_page.dart index 59b5619..4d793bc 100644 --- a/lib/ui/sub_pages/borrow_manager/borrow_manager_page.dart +++ b/lib/ui/sub_pages/borrow_manager/borrow_manager_page.dart @@ -1,7 +1,10 @@ +import 'package:aku_community_manager/mock_models/borrow/borrow_data.dart'; +import 'package:aku_community_manager/mock_models/borrow/borrow_model.dart'; import 'package:aku_community_manager/mock_models/users/user_info_model.dart'; import 'package:aku_community_manager/provider/user_provider.dart'; import 'package:aku_community_manager/style/app_style.dart'; import 'package:aku_community_manager/ui/sub_pages/borrow_manager/all_borrow_goods.dart'; +import 'package:aku_community_manager/ui/sub_pages/borrow_manager/borrow_manager_card.dart'; import 'package:aku_community_manager/ui/widgets/common/aku_scaffold.dart'; import 'package:aku_community_manager/ui/widgets/inner/aku_tab_bar.dart'; import 'package:aku_ui/common_widgets/aku_material_button.dart'; @@ -61,6 +64,36 @@ class _BorrowManagerPageState extends State ), ), ], + body: TabBarView( + controller: _tabController, + children: _getChildren(), + ), ); } + + List _getChildren() { + switch (role) { + case USER_ROLE.MANAGER: + return [ + getView(BorrowData.models), + getView(BorrowData.borrowModels), + getView(BorrowData.checkModels), + getView(BorrowData.doneModels), + ]; + break; + default: + return []; + } + } +} + +Widget getView(List models) { + return ListView.builder( + itemBuilder: (context, index) { + return BorrowManagerCard( + model: models[index], + ); + }, + itemCount: models.length, + ); } diff --git a/pubspec.lock b/pubspec.lock index d2f6c2f..887b13b 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -172,6 +172,11 @@ packages: description: flutter source: sdk version: "0.0.0" + flutter_web_plugins: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" get: dependency: "direct main" description: @@ -338,6 +343,48 @@ packages: url: "https://pub.flutter-io.cn" source: hosted version: "1.3.0-nullsafety.3" + url_launcher: + dependency: "direct main" + description: + name: url_launcher + url: "https://pub.flutter-io.cn" + source: hosted + version: "5.7.10" + url_launcher_linux: + dependency: transitive + description: + name: url_launcher_linux + url: "https://pub.flutter-io.cn" + source: hosted + version: "0.0.1+4" + url_launcher_macos: + dependency: transitive + description: + name: url_launcher_macos + url: "https://pub.flutter-io.cn" + source: hosted + version: "0.0.1+9" + url_launcher_platform_interface: + dependency: transitive + description: + name: url_launcher_platform_interface + url: "https://pub.flutter-io.cn" + source: hosted + version: "1.0.9" + url_launcher_web: + dependency: transitive + description: + name: url_launcher_web + url: "https://pub.flutter-io.cn" + source: hosted + version: "0.1.5+1" + url_launcher_windows: + dependency: transitive + description: + name: url_launcher_windows + url: "https://pub.flutter-io.cn" + source: hosted + version: "0.0.1+3" vector_math: dependency: transitive description: @@ -347,4 +394,4 @@ packages: version: "2.1.0-nullsafety.3" sdks: dart: ">=2.10.0 <2.11.0" - flutter: ">=1.20.0 <2.0.0" + flutter: ">=1.22.0 <2.0.0" diff --git a/pubspec.yaml b/pubspec.yaml index c180439..1f7cbac 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -56,6 +56,8 @@ dependencies: expandable: ^4.1.4 + url_launcher: ^5.7.10 + aku_ui: git: url: http://test.akuhotel.com:8099/aku_fe/aku_ui.git From b609977e1acd5073b23afbdada20e707ccf13208 Mon Sep 17 00:00:00 2001 From: laiiihz Date: Fri, 6 Nov 2020 13:20:04 +0800 Subject: [PATCH 11/13] remove unused import --- .../manage_models/manage_model.dart | 3 - .../home/application/applications_page.dart | 1 - .../inspection_manage_page.dart | 4 - lib/ui/settings/user_info_page.dart | 1 - .../decoration_department_page.dart | 1 - .../visitor_manager/visitor_manager_card.dart | 144 +++++++++++------- lib/ui/widgets/common/aku_tile.dart | 1 - 7 files changed, 93 insertions(+), 62 deletions(-) diff --git a/lib/mock_models/manage_models/manage_model.dart b/lib/mock_models/manage_models/manage_model.dart index 2629f41..517c7d2 100644 --- a/lib/mock_models/manage_models/manage_model.dart +++ b/lib/mock_models/manage_models/manage_model.dart @@ -1,6 +1,3 @@ -import 'package:flutter/material.dart'; -import 'package:aku_community_manager/const/resource.dart'; - class GreenManageCardModel { String title; String task; diff --git a/lib/ui/home/application/applications_page.dart b/lib/ui/home/application/applications_page.dart index 4707c36..1fc94c8 100644 --- a/lib/ui/home/application/applications_page.dart +++ b/lib/ui/home/application/applications_page.dart @@ -178,7 +178,6 @@ class _ApplicationPageState extends State ///应用组 _buildBottomApps() { - final appProvider = Provider.of(context); return Expanded( child: Row( children: [ diff --git a/lib/ui/manage_pages/inspection_manage/inspection_manage_page.dart b/lib/ui/manage_pages/inspection_manage/inspection_manage_page.dart index 592db42..8e65b2a 100644 --- a/lib/ui/manage_pages/inspection_manage/inspection_manage_page.dart +++ b/lib/ui/manage_pages/inspection_manage/inspection_manage_page.dart @@ -1,14 +1,10 @@ -import 'package:aku_community_manager/mock_models/manage_models/manage_model.dart'; import 'package:aku_community_manager/provider/manage_provider.dart'; import 'package:aku_community_manager/style/app_style.dart'; -import 'package:aku_community_manager/tools/widget_tool.dart'; import 'package:aku_community_manager/ui/manage_pages/inspection_manage/inspection_manage_card.dart'; import 'package:aku_community_manager/ui/widgets/common/aku_scaffold.dart'; -import 'package:aku_ui/common_widgets/aku_common_widgets.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:provider/provider.dart'; -import 'package:aku_community_manager/const/resource.dart'; class InspectionManagePage extends StatefulWidget { InspectionManagePage({Key key}) : super(key: key); diff --git a/lib/ui/settings/user_info_page.dart b/lib/ui/settings/user_info_page.dart index 9df3337..289f482 100644 --- a/lib/ui/settings/user_info_page.dart +++ b/lib/ui/settings/user_info_page.dart @@ -4,7 +4,6 @@ import 'package:aku_community_manager/ui/widgets/common/aku_tile.dart'; import 'package:aku_community_manager/ui/widgets/inner/pick_image.dart'; import 'package:flutter/material.dart'; import 'package:aku_community_manager/tools/screen_tool.dart'; -import 'package:get/get.dart'; import 'package:provider/provider.dart'; class UserInfoPage extends StatefulWidget { diff --git a/lib/ui/sub_pages/decoration_manager/decoration_department_page.dart b/lib/ui/sub_pages/decoration_manager/decoration_department_page.dart index c981799..388ea4f 100644 --- a/lib/ui/sub_pages/decoration_manager/decoration_department_page.dart +++ b/lib/ui/sub_pages/decoration_manager/decoration_department_page.dart @@ -1,6 +1,5 @@ import 'package:aku_community_manager/const/resource.dart'; import 'package:aku_community_manager/mock_models/decoration/decoration_model.dart'; -import 'package:aku_community_manager/mock_models/fix/fix_model.dart'; import 'package:aku_community_manager/mock_models/fix/fixer_model.dart'; import 'package:aku_community_manager/provider/fix_provider.dart'; import 'package:aku_community_manager/style/app_style.dart'; diff --git a/lib/ui/sub_pages/visitor_manager/visitor_manager_card.dart b/lib/ui/sub_pages/visitor_manager/visitor_manager_card.dart index d716d22..702427a 100644 --- a/lib/ui/sub_pages/visitor_manager/visitor_manager_card.dart +++ b/lib/ui/sub_pages/visitor_manager/visitor_manager_card.dart @@ -4,35 +4,46 @@ import 'package:aku_community_manager/tools/widget_tool.dart'; import 'package:aku_community_manager/ui/sub_pages/visitor_manager/visitor_manager_page.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; + class VisitorManagerCard extends StatefulWidget { final String adress; final String name; final String plate; final String time; final VisitorStatus status; - VisitorManagerCard({Key key, @required this.adress,@required this.name, this.plate, this.time,@required this.status}) : super(key: key); + VisitorManagerCard( + {Key key, + @required this.adress, + @required this.name, + this.plate, + this.time, + @required this.status}) + : super(key: key); @override _VisitorManagerCardState createState() => _VisitorManagerCardState(); } class _VisitorManagerCardState extends State { - -TextStyle _textStyle=TextStyle(color:AppStyle.primaryTextColor,fontSize:28.sp,); -String _adress; -String _name; -String _plate; -String _time; -VisitorStatus _status; + TextStyle _textStyle = TextStyle( + color: AppStyle.primaryTextColor, + fontSize: 28.sp, + ); + String _adress; + String _name; + String _plate; + String _time; + VisitorStatus _status; @override - void initState() { + void initState() { super.initState(); - _adress=widget.adress; - _name=widget.name; - _plate=widget.plate??'无信息'; - _time=widget.time??'无信息'; - _status=widget.status; + _adress = widget.adress; + _name = widget.name; + _plate = widget.plate ?? '无信息'; + _time = widget.time ?? '无信息'; + _status = widget.status; } + @override Widget build(BuildContext context) { return Column( @@ -42,49 +53,80 @@ VisitorStatus _status; color: Color(0xFFFFFFFF), width: double.infinity, height: 201.w, - padding: EdgeInsets.only(top:24.w,left:24.w,bottom: 28.w), - child: Stack(children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children:[ - Text(_adress,style: TextStyle(color:AppStyle.primaryTextColor,fontSize:32.sp,fontWeight: FontWeight.bold),), - AkuBox.h(16), - Row(children: [ - Image.asset(R.ASSETS_USER_IC_PERSON_PNG,width:40.w ,height: 40.w,), - AkuBox.w(8), - Text('$_name先生',style:_textStyle,), - AkuBox.w(137), - Image.asset(R.ASSETS_HOME_IC_BORROW_PNG,width: 40.w,height: 40.w,), - AkuBox.w(8), - Text(_plate,style: _textStyle,), + padding: EdgeInsets.only(top: 24.w, left: 24.w, bottom: 28.w), + child: Stack( + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + _adress, + style: TextStyle( + color: AppStyle.primaryTextColor, + fontSize: 32.sp, + fontWeight: FontWeight.bold), + ), + AkuBox.h(16), + Row( + children: [ + Image.asset( + R.ASSETS_USER_IC_PERSON_PNG, + width: 40.w, + height: 40.w, + ), + AkuBox.w(8), + Text( + '$_name先生', + style: _textStyle, + ), + AkuBox.w(137), + Image.asset( + R.ASSETS_HOME_IC_BORROW_PNG, + width: 40.w, + height: 40.w, + ), + AkuBox.w(8), + Text( + _plate, + style: _textStyle, + ), + Spacer(), + ], + ), Spacer(), - ],), - Spacer(), - Row(children: [ - Image.asset(R.ASSETS_HOME_IC_ARTICLE_PNG,width: 40.w,height: 40.w,), - AkuBox.w(8), - Text(_time,style:_textStyle), - Spacer(), - ],), - ], - ), - Positioned( - left: 582.w, - bottom: 104.w, - child:_statusImage(_status) ), - ],), + Row( + children: [ + Image.asset( + R.ASSETS_HOME_IC_ARTICLE_PNG, + width: 40.w, + height: 40.w, + ), + AkuBox.w(8), + Text(_time, style: _textStyle), + Spacer(), + ], + ), + ], + ), + Positioned( + left: 582.w, bottom: 104.w, child: _statusImage(_status)), + ], + ), ), ], ); } - Widget _statusImage(VisitorStatus status){ + + Widget _statusImage(VisitorStatus status) { switch (status) { case VisitorStatus.NOT_VISIT: - return Placeholder(); - case VisitorStatus.VISIT_DONE: - return Placeholder(); - case VisitorStatus.OUTDATE: - return Placeholder(); + return Placeholder(); + case VisitorStatus.VISIT_DONE: + return Placeholder(); + case VisitorStatus.OUTDATE: + return Placeholder(); + default: + return Placeholder(); } } -} \ No newline at end of file +} diff --git a/lib/ui/widgets/common/aku_tile.dart b/lib/ui/widgets/common/aku_tile.dart index 4570dc1..2eed6be 100644 --- a/lib/ui/widgets/common/aku_tile.dart +++ b/lib/ui/widgets/common/aku_tile.dart @@ -1,4 +1,3 @@ -import 'package:aku_ui/common_widgets/aku_material_button.dart'; import 'package:flutter/material.dart'; import 'package:aku_community_manager/tools/screen_tool.dart'; From 2ff948b30ef6d6bdc271a24cf90779b5dfc1c7ed Mon Sep 17 00:00:00 2001 From: laiiihz Date: Fri, 6 Nov 2020 13:32:24 +0800 Subject: [PATCH 12/13] =?UTF-8?q?=E5=AE=8C=E6=88=90=E7=89=A9=E5=93=81?= =?UTF-8?q?=E6=B8=85=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../add_borrow_object_page.dart | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/lib/ui/sub_pages/borrow_manager/add_borrow_object_page.dart b/lib/ui/sub_pages/borrow_manager/add_borrow_object_page.dart index 045dd03..256a818 100644 --- a/lib/ui/sub_pages/borrow_manager/add_borrow_object_page.dart +++ b/lib/ui/sub_pages/borrow_manager/add_borrow_object_page.dart @@ -7,6 +7,7 @@ import 'package:aku_community_manager/provider/user_provider.dart'; import 'package:aku_community_manager/style/app_style.dart'; import 'package:aku_community_manager/tools/widget_tool.dart'; import 'package:aku_community_manager/ui/widgets/common/aku_scaffold.dart'; +import 'package:aku_community_manager/ui/widgets/inner/aku_bottom_button.dart'; import 'package:aku_community_manager/ui/widgets/inner/pick_image.dart'; import 'package:aku_ui/common_widgets/aku_material_button.dart'; import 'package:bot_toast/bot_toast.dart'; @@ -77,6 +78,9 @@ class _AddBorrowObjectPageState extends State { _buildRow( '总类名称', TextField( + onChanged: (_) { + setState(() {}); + }, style: TextStyle( color: AppStyle.primaryTextColor, fontSize: 28.sp, @@ -92,6 +96,9 @@ class _AddBorrowObjectPageState extends State { _buildRow( '物品数量', TextField( + onChanged: (_) { + setState(() {}); + }, style: TextStyle( color: AppStyle.primaryTextColor, fontSize: 28.sp, @@ -156,6 +163,28 @@ class _AddBorrowObjectPageState extends State { ], ), ), + AkuBox.h(470), + Padding( + padding: EdgeInsets.symmetric(horizontal: 64.w), + child: AkuBottomButton( + title: '确定', + onTap: TextUtil.isEmpty(_textEditingController.text) || + TextUtil.isEmpty(_numberController.text) || + file == null || + int.tryParse(_numberController.text) == null + ? null + : () { + BorrowData.borrowObjects.add( + BorrowObject.init( + name: _textEditingController.text, + allNumber: int.parse(_numberController.text), + assetPath: file, + ), + ); + Get.back(); + }, + ), + ), ], ), ); From bcf4243da54615a2e8a2b5b9c2d2a36442aa038d Mon Sep 17 00:00:00 2001 From: laiiihz Date: Fri, 6 Nov 2020 14:03:04 +0800 Subject: [PATCH 13/13] add key --- README.md | 4 ++ android/app/build.gradle | 25 +++++++---- android/app/src/main/AndroidManifest.xml | 51 ++++++++--------------- keys/key.jks | Bin 0 -> 2202 bytes lib/main.dart | 4 +- pubspec.lock | 42 +++++++++++++++++++ pubspec.yaml | 2 + 7 files changed, 86 insertions(+), 42 deletions(-) create mode 100644 keys/key.jks diff --git a/README.md b/README.md index dac408b..3048626 100644 --- a/README.md +++ b/README.md @@ -5,3 +5,7 @@ A new Flutter application. ## Getting Started ### 使用`fgen`生成图片 + +### password + +password `1Xpn6hhbxztA6PC0oFiZ` diff --git a/android/app/build.gradle b/android/app/build.gradle index a008811..9bf4780 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -25,6 +25,11 @@ apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" +def keystoreProperties = new Properties() + def keystorePropertiesFile = rootProject.file('key.properties') + if (keystorePropertiesFile.exists()) { + keystoreProperties.load(new FileInputStream(keystorePropertiesFile)) + } android { compileSdkVersion 29 @@ -45,13 +50,19 @@ android { versionName flutterVersionName } - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig signingConfigs.debug - } - } + signingConfigs { + release { + keyAlias keystoreProperties['keyAlias'] + keyPassword keystoreProperties['keyPassword'] + storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null + storePassword keystoreProperties['storePassword'] + } + } + buildTypes { + release { + signingConfig signingConfigs.release + } + } } flutter { diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 8c38806..29e1b03 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -1,47 +1,30 @@ - - - - - - - - - - - - - - - - + + diff --git a/keys/key.jks b/keys/key.jks new file mode 100644 index 0000000000000000000000000000000000000000..f82a7d9152a91fe6b5e219291143d4b87a8b660b GIT binary patch literal 2202 zcmcJQ`8(8$7sux_n{{kM!jPS;pRq=Xi7YW1H)9#bGT8><>dT;%Mz#{6AU_oVerJel=cJG#!QY4MYj^K*;2hxe9RLX&<;U#Lb% zc88eF2B9=5_eHxc4X7u+Y0qpe?;F!BeD)=bS5AV?Vub6~o=SX%O9=0yF=BpoTJmaq zJa>+I?WDaVgUM~#B$HZUkGYkRWE+Q=Lw`Moxzo#Wr?qagj(b~$Ojz}w;UP(0(-^JC z5U7jw=~orXK9Ak5UIj-JKKAH`pI1- zarV>cs2Ls^4j*Guw-~PisO8Y*ObdcwH17>gH}|(j$_lT5B%K@YvXOjcl#6> zAr)hrQ4v-r`OtDqw-oN~6->XrkJEko#OQC#ZG0hRFI%X*@C6f>qvE+nP0G98Xe=`h zICfQP)WvT1bQO@J@fw`x7w@>}`OU=pQV*944d(tTQ#HZs(J&Wgofu!k-%=MH!qCel zp?pb!42+%0;Rl!e68Uq>6C}T8hEV)_k4$bLr31g}*BZH^YY0}2ZQeNYnQ!`Ygvw&o zIlNh|Hsge@MPKF*C($MYy_5PYWyurKZ|JVlv_i4`mHxMqeXX{H>ZuHQ!)}&FdMZJ z(&_HwrrE?ov)X32@8MPG(VQO9juruB8*~mc?X`Sr3u%VX=JoQ%mp8?}f)sXyn$^5p z2awBewQc|9GGJl3gZP-KVt?(=h2#t?w&`4b1O{Cqp+~m&_hY?xtnpYr+x&8(h+%v$ zEyE-J+@@R^2By(T`~=$^l;POIxtPcizIH!*yeK_D-g;(cIT%1`A~Jjz@dxs zs?S?1wn*K&iMZ5>cJIJUvtt|5h}*7Rd(^4Bvg#2URjMU|Wg>~}(yr*<)rc!Cfy1wc zrfp4;0_pjsRh&fRQu0Db$vf+(!Ve`d>Uy#11fx?8H__34ucd|UR{r!)`{lQ3HaXrb zulR&{)OV7<8|~^)k;?viGDs{o%c_kuq%|`0Jy41}CWT{mIEeQCiwC+}5V8m@YY3a| zT~6D{5th5A2mvr6L4jmO!z7W2SqoPPMhD&AoRk#>=1-$QPQ}{rq z6QqG^l&;cV5h*rOD}7!oRd8Wy5SKPv`G}B*yge2rE-515>}&gmA;(+%EpntcaED>k zE?ci(9h5JKT@RYN+-=yS?roQBma=|t-!-(}$8qMZ`U`hixhZ^GT=}#>ER`$7GB3Oc zW;3XO_a0n7eV1C@e~k$#&-=Jw^~Whpr*&h+JZjzv!A;U#&3d47d zaJUD1A-5(crOK#uhx&3Bk-_rn)8dd)H*ea@Y{uyM4e*DS1+<6!4!x2S$miFZg?T!k z=$=C`%DS`eR#Wv@Lkw4`)8+2k3v-%1F`(R4hd?~M6y^6WR{P1%tB7#Y&;<=35Ev1p z!|Xsh)PMnl0#GR2@0t1|5QXGYiMNd3L;(N~0s=Z?c|a~Cj0i`fp{BN2L6HB4;6!th zEKi@Y!r5BgwoV zL6Rs+=NPE1rSp&cf0m{Lvj1-M;0?g&06zqz1KdzL06-Gv4Qhx&^`&S+UEb)bu4C$N zwl}o|9#+o=&Na1KJn%m?JLzUjF>_2-iSMeD#$<-LxXf;;>Nc%;iavUivXeh{Zi#dC zf`4D4E5|K+)GJXF(W~alh=JpvUf9F+SD8&}74z&8y4C7HR@GWTnnFU@u5!#JU|6d2 z==BE?V+I#+hG~-W1&wub8Jg5F*YWM;oos{}pWmEc+UtgX+LeIUUwfbLY$t#Zq+!7+d$ z=0V03k*QjNTDBxoK5Sm5Wifg!4X|-J>IU9R^0Xzbj9cM^d)9^B=uE}%j=qU2?CLor zXlPIha6Gy(Qcx4eYKHuWSywSMc5a)FpiD-u$S1f=_TSQ07cYnougsxL%b6FCxoS7_ scv;8=D{cc0yc)LzKXfqpzV0TNPP@c(XGEUOV|B2x33Dm3wiZwS2D<;gj{pDw literal 0 HcmV?d00001 diff --git a/lib/main.dart b/lib/main.dart index 0ba12a3..ac472cf 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -4,6 +4,7 @@ import 'package:aku_community_manager/provider/manage_provider.dart'; import 'package:aku_community_manager/provider/outdoor_provider.dart'; import 'package:aku_community_manager/provider/user_provider.dart'; import 'package:aku_community_manager/ui/home/home_page.dart'; +import 'package:amap_map_fluttify/amap_map_fluttify.dart'; import 'package:bot_toast/bot_toast.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; @@ -11,7 +12,8 @@ import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:get/get.dart'; import 'package:provider/provider.dart'; -void main() { +void main() async { + await AmapCore.init(''); runApp(MyApp()); } diff --git a/pubspec.lock b/pubspec.lock index 887b13b..43a5358 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -10,6 +10,34 @@ packages: url: "http://test.akuhotel.com:8099/aku_fe/aku_ui.git" source: git version: "0.0.1" + amap_core_fluttify: + dependency: transitive + description: + name: amap_core_fluttify + url: "https://pub.flutter-io.cn" + source: hosted + version: "0.12.0" + amap_location_fluttify: + dependency: transitive + description: + name: amap_location_fluttify + url: "https://pub.flutter-io.cn" + source: hosted + version: "0.18.0" + amap_map_fluttify: + dependency: "direct main" + description: + name: amap_map_fluttify + url: "https://pub.flutter-io.cn" + source: hosted + version: "0.29.0" + amap_search_fluttify: + dependency: transitive + description: + name: amap_search_fluttify + url: "https://pub.flutter-io.cn" + source: hosted + version: "0.14.0" async: dependency: transitive description: @@ -80,6 +108,13 @@ packages: url: "https://pub.flutter-io.cn" source: hosted version: "2.1.1" + core_location_fluttify: + dependency: transitive + description: + name: core_location_fluttify + url: "https://pub.flutter-io.cn" + source: hosted + version: "0.4.1" crypto: dependency: transitive description: @@ -177,6 +212,13 @@ packages: description: flutter source: sdk version: "0.0.0" + foundation_fluttify: + dependency: transitive + description: + name: foundation_fluttify + url: "https://pub.flutter-io.cn" + source: hosted + version: "0.9.10+1" get: dependency: "direct main" description: diff --git a/pubspec.yaml b/pubspec.yaml index 1f7cbac..d9fef7d 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -58,6 +58,8 @@ dependencies: url_launcher: ^5.7.10 + amap_map_fluttify: ^0.29.0 + aku_ui: git: url: http://test.akuhotel.com:8099/aku_fe/aku_ui.git