添加建议页面卡片

hmxc
小赖 4 years ago
parent bd869e6d3c
commit 0225e33f5e

@ -87,6 +87,9 @@ class _Manager {
////app/ type (1.2.3.4.) ////app/ type (1.2.3.4.)
String get advice => '/user/advice/list'; String get advice => '/user/advice/list';
/// //
String get addAdvice => '/user/advice/insert';
} }
class _Upload { class _Upload {

@ -69,7 +69,7 @@ class _PropertyIndexState extends State<PropertyIndex>
GoodsDetoPage().to(); GoodsDetoPage().to();
}), }),
GridButton('投诉表扬', R.ASSETS_ICONS_TOOL_TSBY_PNG, GridButton('投诉表扬', R.ASSETS_ICONS_TOOL_TSBY_PNG,
AdvicePage(type: AdviceType.SUGGESTION).to), AdvicePage(type: AdviceType.COMPLAIN).to),
GridButton('问卷调查', R.ASSETS_ICONS_TOOL_WJDC_PNG, () { GridButton('问卷调查', R.ASSETS_ICONS_TOOL_WJDC_PNG, () {
QuestionnairePage().to(); QuestionnairePage().to();
}), }),

@ -0,0 +1,55 @@
import 'package:akuCommunity/model/manager/suggestion_or_complain_model.dart';
import 'package:akuCommunity/utils/headers.dart';
import 'package:common_utils/common_utils.dart';
import 'package:flutter/material.dart';
import 'package:velocity_x/velocity_x.dart';
class AdviceCard extends StatefulWidget {
final SuggestionOrComplainModel model;
AdviceCard({Key key, this.model}) : super(key: key);
@override
_AdviceCardState createState() => _AdviceCardState();
}
class _AdviceCardState extends State<AdviceCard> {
///1.2.3.
String get statusValue => {
1: '未反馈',
2: '反馈中',
3: '已反馈',
}[widget.model.status];
@override
Widget build(BuildContext context) {
return MaterialButton(
elevation: 0,
padding: EdgeInsets.all(24.w),
color: Colors.white,
onPressed: () {},
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(8.w),
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
DateUtil.formatDate(
widget.model.createDate,
format: 'yyyy年MM月dd日',
).text.size(32.sp).black.bold.make(),
statusValue.text.size(24.sp).color(Color(0xFFFF8200)).make(),
],
),
Divider(
height: 50.w,
thickness: 1.w,
color: Color(0xFFE8E8E8),
),
widget.model.content.text.size(28.w).black.make(),
],
),
);
}
}

@ -1,6 +1,7 @@
import 'package:akuCommunity/constants/api.dart'; import 'package:akuCommunity/constants/api.dart';
import 'package:akuCommunity/model/manager/suggestion_or_complain_model.dart'; import 'package:akuCommunity/model/manager/suggestion_or_complain_model.dart';
import 'package:akuCommunity/pages/things_page/widget/bee_list_view.dart'; import 'package:akuCommunity/pages/things_page/widget/bee_list_view.dart';
import 'package:akuCommunity/ui/manager/advice/advice_card.dart';
import 'package:akuCommunity/ui/manager/advice/new_advice_page.dart'; import 'package:akuCommunity/ui/manager/advice/new_advice_page.dart';
import 'package:akuCommunity/widget/bee_scaffold.dart'; import 'package:akuCommunity/widget/bee_scaffold.dart';
import 'package:akuCommunity/utils/headers.dart'; import 'package:akuCommunity/utils/headers.dart';
@ -94,8 +95,9 @@ class _AdvicePageState extends State<AdvicePage> with TickerProviderStateMixin {
.toList(), .toList(),
builder: (items) { builder: (items) {
return ListView.separated( return ListView.separated(
padding: EdgeInsets.symmetric(horizontal: 32.w, vertical: 20.w),
itemBuilder: (context, index) { itemBuilder: (context, index) {
return SizedBox(); return AdviceCard(model: items[index]);
}, },
separatorBuilder: (_, __) => 20.hb, separatorBuilder: (_, __) => 20.hb,
itemCount: items.length, itemCount: items.length,

@ -1,13 +1,19 @@
import 'dart:io'; import 'dart:io';
import 'package:akuCommunity/const/resource.dart'; import 'package:akuCommunity/const/resource.dart';
import 'package:akuCommunity/constants/api.dart';
import 'package:akuCommunity/ui/manager/advice/advice_page.dart'; import 'package:akuCommunity/ui/manager/advice/advice_page.dart';
import 'package:akuCommunity/utils/network/base_model.dart';
import 'package:akuCommunity/utils/network/net_util.dart';
import 'package:akuCommunity/widget/bee_scaffold.dart'; import 'package:akuCommunity/widget/bee_scaffold.dart';
import 'package:akuCommunity/utils/headers.dart'; import 'package:akuCommunity/utils/headers.dart';
import 'package:akuCommunity/widget/buttons/bottom_button.dart'; import 'package:akuCommunity/widget/buttons/bottom_button.dart';
import 'package:akuCommunity/widget/picker/grid_image_picker.dart'; import 'package:akuCommunity/widget/picker/grid_image_picker.dart';
import 'package:bot_toast/bot_toast.dart';
import 'package:common_utils/common_utils.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
import 'package:velocity_x/velocity_x.dart'; import 'package:velocity_x/velocity_x.dart';
class NewAdvicePage extends StatefulWidget { class NewAdvicePage extends StatefulWidget {
@ -21,6 +27,8 @@ class NewAdvicePage extends StatefulWidget {
class _NewAdvicePageState extends State<NewAdvicePage> { class _NewAdvicePageState extends State<NewAdvicePage> {
int _type = 0; int _type = 0;
List<File> _files = []; List<File> _files = [];
TextEditingController _editingController = TextEditingController();
GlobalKey<FormState> _formKey = GlobalKey<FormState>();
String get title { String get title {
switch (widget.type) { switch (widget.type) {
case AdviceType.SUGGESTION: case AdviceType.SUGGESTION:
@ -80,6 +88,32 @@ class _NewAdvicePageState extends State<NewAdvicePage> {
); );
} }
////
Future addAdvice(int type, List<File> files, String content) async {
VoidCallback cancel = BotToast.showLoading();
List<String> urls =
await NetUtil().uploadFiles(files, API.upload.uploadArticle);
BaseModel baseModel = await NetUtil().post(
API.manager.addAdvice,
params: {
'type': type,
'content': content,
'fileUrls': urls,
},
showMessage: true,
);
cancel();
if (baseModel.status) {
Get.back();
}
}
@override
void dispose() {
_editingController.dispose();
super.dispose();
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return BeeScaffold.white( return BeeScaffold.white(
@ -102,28 +136,37 @@ class _NewAdvicePageState extends State<NewAdvicePage> {
'您要选择的类型是?'.text.size(28.sp).make(), '您要选择的类型是?'.text.size(28.sp).make(),
32.hb, 32.hb,
<Widget>[ <Widget>[
_buildType(0, R.ASSETS_ICONS_PROPOSAL_PNG, '建议'), _buildType(0, R.ASSETS_ICONS_PROPOSAL_PNG,
widget.type == AdviceType.SUGGESTION ? '建议' : '投诉'),
80.wb, 80.wb,
_buildType(1, R.ASSETS_ICONS_CONSULT_PNG, '咨询'), _buildType(1, R.ASSETS_ICONS_CONSULT_PNG,
widget.type == AdviceType.SUGGESTION ? '咨询' : '表扬'),
].row(), ].row(),
44.hb, 44.hb,
'请输入内容'.text.size(28.sp).make(), '请输入内容'.text.size(28.sp).make(),
24.hb, 24.hb,
TextField( Form(
// controller: , key: _formKey,
minLines: 6, child: TextFormField(
maxLines: 99, controller: _editingController,
decoration: InputDecoration( minLines: 6,
border: OutlineInputBorder(), maxLines: 99,
isDense: true, validator: (text) {
contentPadding: EdgeInsets.symmetric( if (TextUtil.isEmpty(text)) return '内容不能为空';
horizontal: 22.w, return null;
vertical: 32.w, },
), decoration: InputDecoration(
hintText: '您对我们的工作有什么建议吗?欢迎您提给我们宝贵的建议,谢谢', border: OutlineInputBorder(),
hintStyle: TextStyle( isDense: true,
fontSize: 28.sp, contentPadding: EdgeInsets.symmetric(
color: Color(0xFF999999), horizontal: 22.w,
vertical: 32.w,
),
hintText: '您对我们的工作有什么建议吗?欢迎您提给我们宝贵的建议,谢谢',
hintStyle: TextStyle(
fontSize: 28.sp,
color: Color(0xFF999999),
),
), ),
), ),
), ),
@ -138,7 +181,20 @@ class _NewAdvicePageState extends State<NewAdvicePage> {
], ],
), ),
bottomNavi: BottomButton( bottomNavi: BottomButton(
onPressed: () {}, onPressed: () {
if (_formKey.currentState.validate()) {
int type = 1;
switch (widget.type) {
case AdviceType.SUGGESTION:
type = _type == 0 ? 2 : 1;
break;
case AdviceType.COMPLAIN:
type = _type == 0 ? 4 : 3;
break;
}
addAdvice(type, _files, _editingController.text);
}
},
child: '确认提交'.text.make(), child: '确认提交'.text.make(),
), ),
); );

@ -144,14 +144,11 @@ class NetUtil {
Future<List<String>> uploadFiles(List<File> files, String api) async { Future<List<String>> uploadFiles(List<File> files, String api) async {
List<String> urls = []; List<String> urls = [];
if (urls.isEmpty) { for (var item in files) {
for (var item in files) {
BaseFileModel model = await NetUtil().upload(api, item); BaseFileModel model = await NetUtil().upload(api, item);
urls.add(model.url); urls.add(model.url);
} }
} else if (urls.isEmpty) return [];
return [];
return urls; return urls;
} }

Loading…
Cancel
Save