Commit c2cba53a4bfa5a0b2d7b608a6234bb85d09394d4

Authored by wdn127929
1 parent 7e8c6898

经理基础信息新增和修改

769 Bytes

... ... @@ -10,6 +10,7 @@ import 'package:flutter_easyrefresh/easy_refresh.dart';
import 'package:flutter_easyrefresh/material_header.dart';
import 'package:fluwx/fluwx.dart';
import 'package:one_key/pages/detail/handle_online_page.dart';
import 'package:one_key/provider/base_info_provider.dart';
import 'package:one_key/provider/coupon_provider.dart';
import 'package:one_key/provider/message_dialog_model.dart';
import 'package:intl/date_symbol_data_local.dart';
... ... @@ -69,6 +70,9 @@ Future<void> main() async {
ChangeNotifierProvider<UploadImageProvider>(
create: (_) => UploadImageProvider(),
),
ChangeNotifierProvider<BaseIndoProvider>(
create: (_) => BaseIndoProvider(),
),
],
child: MyApp(),
));
... ...
import 'package:json_annotation/json_annotation.dart';
part 'base_info_model.g.dart';
@JsonSerializable()
class BaseInfoModel extends Object {
@JsonKey(name: 'ret')
int ret;
@JsonKey(name: 'data')
BaseInfoSunModel data;
@JsonKey(name: 'msg')
String msg;
BaseInfoModel(this.ret,this.data,this.msg,);
factory BaseInfoModel.fromJson(Map<String, dynamic> srcJson) => _$BaseInfoModelFromJson(srcJson);
Map<String, dynamic> toJson() => _$BaseInfoModelToJson(this);
}
@JsonSerializable()
class BaseInfoSunModel extends Object {
@JsonKey(name: 'id')
String id;
@JsonKey(name: 'sellerid')
String sellerid;
@JsonKey(name: 'uid')
String uid;
@JsonKey(name: 'photo')
String photo;
@JsonKey(name: 'name')
String name;
@JsonKey(name: 'phone')
String phone;
@JsonKey(name: 'position')
String position;
@JsonKey(name: 'qrcode')
String qrcode;
BaseInfoSunModel(this.id,this.sellerid,this.uid,this.photo,this.name,this.phone,this.position,this.qrcode,);
factory BaseInfoSunModel.fromJson(Map<String, dynamic> srcJson) => _$BaseInfoSunModelFromJson(srcJson);
Map<String, dynamic> toJson() => _$BaseInfoSunModelToJson(this);
}
... ...
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'base_info_model.dart';
// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************
BaseInfoModel _$BaseInfoModelFromJson(Map<String, dynamic> json) {
return BaseInfoModel(
json['ret'] as int,
json['data'] == null
? null
: BaseInfoSunModel.fromJson(json['data'] as Map<String, dynamic>),
json['msg'] as String);
}
Map<String, dynamic> _$BaseInfoModelToJson(BaseInfoModel instance) =>
<String, dynamic>{
'ret': instance.ret,
'data': instance.data,
'msg': instance.msg
};
BaseInfoSunModel _$BaseInfoSunModelFromJson(Map<String, dynamic> json) {
return BaseInfoSunModel(
json['id'] as String,
json['sellerid'] as String,
json['uid'] as String,
json['photo'] as String,
json['name'] as String,
json['phone'] as String,
json['position'] as String,
json['qrcode'] as String);
}
Map<String, dynamic> _$BaseInfoSunModelToJson(BaseInfoSunModel instance) =>
<String, dynamic>{
'id': instance.id,
'sellerid': instance.sellerid,
'uid': instance.uid,
'photo': instance.photo,
'name': instance.name,
'phone': instance.phone,
'position': instance.position,
'qrcode': instance.qrcode
};
... ...
... ... @@ -81,5 +81,9 @@ class HttpUrl {
"?service=App.Activity.SetActivityAsReserve"; //设置预定绑定活动ID
static const String get_activity_by_rid =
"?service=App.Activity.GetActivityByRid"; //获取预定绑定活动
static const String set_customer_activity_baseinfo =
"?service=App.Activity.SetCustomerActivityBaseinfo"; //客户经理添加/修改基本信息
static const String get_customer_activity_baseinfo =
"?service=App.Activity.GetCustomerActivityBaseinfo"; //客户经理获取基本信息
}
... ...
import 'dart:io';
import 'package:cached_network_image/cached_network_image.dart';
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/screenutil.dart';
import 'package:one_key/models/upload_img_model.dart';
import 'package:one_key/pages/online_check/progress.dart';
import 'package:one_key/provider/base_info_provider.dart';
import 'package:one_key/provider/upload_img_provider.dart';
import 'package:one_key/provider/user_model.dart';
import 'package:one_key/res/colors.dart';
import 'package:one_key/utils/event_bus.dart';
import 'package:one_key/utils/upload_image_util.dart';
import 'package:one_key/utils/utils.dart';
import 'package:one_key/widgets/h_empty_view.dart';
import 'package:one_key/widgets/round_button.dart';
import 'package:one_key/widgets/system_app_bar.dart';
import 'package:one_key/widgets/v_empty_view.dart';
import 'package:image_picker/image_picker.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:provider/provider.dart';
class BaseInfoPage extends StatefulWidget {
BaseInfoPage({Key key}) : super(key: key);
@override
_BaseInfoPageState createState() => _BaseInfoPageState();
}
class _BaseInfoPageState extends State<BaseInfoPage> {
ScrollController _scrollController;
TextEditingController _nameController = TextEditingController();
TextEditingController _phoneController = TextEditingController();
TextEditingController _positionController = TextEditingController();
FocusNode _nameFocusNode = FocusNode();
FocusNode _phoneFocusNode = FocusNode();
FocusNode _positionFocusNode = FocusNode();
final picker = ImagePicker();
// OnlineCheckEditProvider _onlineCheckEditProvider;
UploadImageProvider _uploadImageProvider;
BaseIndoProvider _baseIndoProvider;
@override
void initState() {
super.initState();
_scrollController = ScrollController();
WidgetsBinding.instance.addPostFrameCallback((_) {
_uploadImageProvider.touxiang.process = 0.01;
_uploadImageProvider.touxiang.qiniuUrl = '';
_uploadImageProvider.erweima.process = 0.01;
_uploadImageProvider.erweima.qiniuUrl = '';
_uploadImageProvider.imgSizeTouxiang = 64;
_uploadImageProvider.imgSizeErweima = 22;
_getQiniuInfo();
_getCustomerActivityBaseinfo();
});
}
_getCustomerActivityBaseinfo() async {
Map<String, String> params = {
'sellerid': Provider.of<UserModel>(context, listen: false).user.sellerid,
"uid": Provider.of<UserModel>(context, listen: false).user.openid,
};
bool success =
await _baseIndoProvider.getCustomerActivityBaseinfo(context, params);
if (success) {
_nameController.text = _baseIndoProvider.baseInfoSunModel.name;
_uploadImageProvider.touxiang.qiniuUrl =
_baseIndoProvider.baseInfoSunModel.photo;
_uploadImageProvider.erweima.qiniuUrl =
_baseIndoProvider.baseInfoSunModel.qrcode;
_phoneController.text = _baseIndoProvider.baseInfoSunModel.phone;
_positionController.text = _baseIndoProvider.baseInfoSunModel.position;
_uploadImageProvider.imgSizeErweima = 64;
setState(() {});
}
}
///获取七牛云token
///
_getQiniuInfo() async {
await _uploadImageProvider.getQiniuInfo(context, {});
}
//客户经理添加/修改基本信息
_setCustomerActivityBaseinfo() async {
FocusScope.of(context).requestFocus(FocusNode()); //点击空白处隐藏键盘
Map<String, String> params = {
'sellerid': Provider.of<UserModel>(context, listen: false).user.sellerid,
"uid": Provider.of<UserModel>(context, listen: false).user.openid,
"name": _nameController.text.trim(),
"photo": _uploadImageProvider.touxiang.qiniuUrl,
"phone": _phoneController.text.trim(),
"position": _positionController.text,
"qrcode": _uploadImageProvider.erweima.qiniuUrl,
};
bool isSuccess =
await _baseIndoProvider.setCustomerActivityBaseinfo(context, params);
if (isSuccess) {
//成功之后跳回前一个页面
// bus.emit('refresh_coupon_list');
Utils.showToast('保存成功');
EventBus().emit('changeStatusColor');
Navigator.pop(context, true);
}
}
///输入框
Widget _textfield(String title, String hintText,
TextEditingController editingController, FocusNode focusNode) {
return Container(
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Container(
child: Text(
title,
style: TextStyle(
color: MyColours.color_333333,
fontWeight: FontWeight.bold,
fontSize: ScreenUtil().setSp(34)),
),
),
HEmptyView(80),
Container(
width: ScreenUtil().setWidth(231 * 2),
child: TextField(
controller: editingController,
textAlign: TextAlign.right,
textAlignVertical: TextAlignVertical.bottom,
maxLines: 1,
// //光标颜色
// cursorColor:
// widget.isSelect ? Colors.white : MyColours.color_199095,
//输入文本的样式
style: TextStyle(
fontSize: ScreenUtil().setSp(32),
),
focusNode: focusNode,
decoration: InputDecoration(
border: OutlineInputBorder(borderSide: BorderSide.none),
hintText: hintText,
hintStyle: TextStyle(
color: MyColours.color_999999,
fontSize: ScreenUtil().setSp(32),
),
enabledBorder: new UnderlineInputBorder(
borderSide: BorderSide.none,
),
focusedBorder: new UnderlineInputBorder(
borderSide: BorderSide.none,
),
),
onChanged: (value) {},
onEditingComplete: () {
FocusScope.of(context).requestFocus(FocusNode()); //点击空白处隐藏键盘
},
keyboardType: TextInputType.text,
),
)
],
),
);
}
///#相机拍照,单图选择
Future _getFromPictureOrCamera(
String title, UploadImgModel imgModel, imageSource) async {
final pickedFile = await picker.getImage(source: imageSource);
setState(() {
if (pickedFile != null) {
imgModel.file = File(pickedFile.path);
imgModel.process = 0.01;
} else {
print('No image selected.');
}
});
if (pickedFile != null) {
title == '头像'
? _uploadImageProvider.imgSizeTouxiang = 64
: _uploadImageProvider.imgSizeErweima = 64;
UploadImageUtil().startUploadOnly(context, File(pickedFile.path),
title == '头像' ? 0 : 1, true, _uploadImageProvider);
}
}
///图片 头像和二维码
Widget _imageWidget(
String title, UploadImgModel model, double imgSize, double radius) {
return InkWell(
onTap: () {
Utils.getPickPermission(context, () {
_getFromPictureOrCamera(title, model, ImageSource.gallery);
}, PermissionGroup.photos);
},
child: Container(
height: ScreenUtil().setWidth(imgSize * 2),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
title,
textAlign: TextAlign.left,
style: TextStyle(
color: MyColours.color_333333,
fontWeight: FontWeight.bold,
fontSize: ScreenUtil().setSp(34)),
),
Spacer(),
Stack(
children: [
ClipRRect(
borderRadius:
BorderRadius.circular(ScreenUtil().setWidth(radius)),
child: model.file == null
? model.qiniuUrl != null
? CachedNetworkImage(
imageUrl: model.qiniuUrl,
fit: BoxFit.cover,
width: ScreenUtil().setWidth(imgSize * 2),
height: ScreenUtil().setWidth(imgSize * 2),
)
: Image.asset(
Utils.getImgPath(
title == '头像' ? 'touxiang' : 'erweima'),
fit: BoxFit.cover,
width: ScreenUtil().setWidth(imgSize * 2),
height: ScreenUtil().setWidth(imgSize * 2),
)
: Image.file(
model.file,
fit: BoxFit.cover,
width: ScreenUtil().setWidth(imgSize * 2),
height: ScreenUtil().setWidth(imgSize * 2),
),
),
model.file == null && model.qiniuUrl == null
? Offstage(
offstage: model.process == 1,
child: Container(
width: ScreenUtil().setWidth(imgSize * 2),
height: ScreenUtil().setWidth(imgSize * 2),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(radius),
color: Color.fromRGBO(0, 0, 0, 0.2)),
child: Center(
child: Text('上传中',
style:
TextStyle(color: MyColours.color_333333)),
),
),
)
: Container(),
],
),
HEmptyView(30),
Image.asset(
"assets/arr_right_gray.png",
width: ScreenUtil().setWidth(14),
height: ScreenUtil().setWidth(22),
)
],
),
));
}
@override
Widget build(BuildContext context) {
_uploadImageProvider =
Provider.of<UploadImageProvider>(context, listen: true);
_baseIndoProvider = Provider.of<BaseIndoProvider>(context, listen: true);
return Scaffold(
backgroundColor: MyColours.color_fefefe,
appBar: SystemAppBar(
'填写信息',
onTap: () {
EventBus().emit('changeStatusColor');
Navigator.of(context).pop();
},
),
body: InkWell(
onTap: () {
FocusScope.of(context).requestFocus(FocusNode()); //点击空白处隐藏键盘
},
child: Column(children: [
Expanded(
child: SingleChildScrollView(
controller: _scrollController,
physics: BouncingScrollPhysics(),
child: Padding(
padding: EdgeInsets.all(ScreenUtil().setWidth(40)),
child: Column(
children: [
_imageWidget('头像', _uploadImageProvider.touxiang,
_uploadImageProvider.imgSizeTouxiang, 64),
VEmptyView(30),
Container(
height: ScreenUtil().setWidth(2),
color: MyColours.color_efefef,
margin: EdgeInsets.only(
left: ScreenUtil().setWidth(108 * 2)),
),
VEmptyView(10),
_textfield('姓名', '请填写您的姓名', _nameController,
_nameFocusNode),
VEmptyView(10),
Container(
height: ScreenUtil().setWidth(2),
color: MyColours.color_efefef,
margin: EdgeInsets.only(
left: ScreenUtil().setWidth(108 * 2)),
),
VEmptyView(10),
_textfield('电话', '请填写您的联系电话', _phoneController,
_phoneFocusNode),
VEmptyView(10),
Container(
height: ScreenUtil().setWidth(2),
color: MyColours.color_efefef,
margin: EdgeInsets.only(
left: ScreenUtil().setWidth(108 * 2)),
),
VEmptyView(10),
_textfield('职位', '请填写您在餐厅中担任的职位',
_positionController, _positionFocusNode),
VEmptyView(10),
Container(
height: ScreenUtil().setWidth(2),
color: MyColours.color_efefef,
margin: EdgeInsets.only(
left: ScreenUtil().setWidth(108 * 2)),
),
VEmptyView(40),
_imageWidget('微信二维码', _uploadImageProvider.erweima,
_uploadImageProvider.imgSizeErweima, 0),
VEmptyView(30),
],
))),
),
VEmptyView(20),
Padding(
padding: EdgeInsets.fromLTRB(ScreenUtil().setWidth(40), 0,
ScreenUtil().setWidth(40), ScreenUtil().setWidth(40)),
child: RoundButton(
onPressed: () {
if (_uploadImageProvider.touxiang.qiniuUrl
.trim()
.length ==
0) {
Utils.showToast('请上传头像');
return;
}
if (_nameController.text.trim().length == 0) {
Utils.showToast('请填写您的姓名');
return;
}
if (_phoneController.text.trim().length == 0) {
Utils.showToast('请填写您的联系电话');
return;
}
if (_positionController.text.trim().length == 0) {
Utils.showToast('请填写您在餐厅中担任的职位');
return;
}
if (_uploadImageProvider.erweima.qiniuUrl.trim().length ==
0) {
Utils.showToast('请上传头像');
return;
}
//接口
_setCustomerActivityBaseinfo();
},
text: '保存',
fontSize: 34,
isBold: false,
height: ScreenUtil().setWidth(80),
width: double.infinity,
radius: ScreenUtil().setWidth(10),
))
])));
}
}
... ...
... ... @@ -13,6 +13,7 @@ import 'package:one_key/widgets/MyDivider.dart';
import 'package:one_key/widgets/app_bar.dart';
import 'package:one_key/widgets/h_empty_view.dart';
import 'package:one_key/widgets/my_item.dart';
import 'package:one_key/widgets/round_button.dart';
import 'package:one_key/widgets/v_empty_view.dart';
import 'package:provider/provider.dart';
... ... @@ -109,7 +110,7 @@ class MyPageState extends State<MyPage> with WidgetsBindingObserver {
elevation: 0, //appbar的阴影
centerTitle: true, // 标题居中
title: Text(
'我的',
'一键订',
style: TextStyle(
color: MyColours.color_fefefe,
fontSize: ScreenUtil().setSp(34),
... ... @@ -123,7 +124,7 @@ class MyPageState extends State<MyPage> with WidgetsBindingObserver {
SliverAppBar(
pinned: false,
floating: false,
expandedHeight: ScreenUtil().setWidth(200),
expandedHeight: ScreenUtil().setWidth(260),
flexibleSpace: FlexibleSpaceBar(
collapseMode: CollapseMode.pin,
background: Consumer<UserModel>(builder:
... ... @@ -132,7 +133,7 @@ class MyPageState extends State<MyPage> with WidgetsBindingObserver {
children: [
Container(
width: double.infinity,
height: ScreenUtil().setHeight(200),
height: ScreenUtil().setHeight(260),
alignment: Alignment.centerLeft,
color: MyColours.color_199095,
),
... ... @@ -142,14 +143,14 @@ class MyPageState extends State<MyPage> with WidgetsBindingObserver {
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
VEmptyView(38),
VEmptyView(58),
Text(
model.user.sellername,
style: TextStyle(
color: MyColours.color_ffffff,
fontSize: ScreenUtil().setSp(36)),
),
VEmptyView(38),
VEmptyView(28),
Text(
model.user.account +
" | " +
... ... @@ -159,6 +160,24 @@ class MyPageState extends State<MyPage> with WidgetsBindingObserver {
fontSize: ScreenUtil().setSp(30)),
),
],
)),
Positioned(
right: ScreenUtil().setWidth(40),
bottom: ScreenUtil().setWidth(70),
child: RoundButton(
image: Utils.getImgPath('edit'),
text: '编辑',
gradientStart: Color.fromRGBO(255, 255, 255, 0.1),
gradientEnd: Color.fromRGBO(255, 255, 255, 0.1),
borderColor: Color.fromRGBO(255, 255, 255, 0.2),
width: ScreenUtil().setWidth(160),
height: ScreenUtil().setWidth(60),
fontSize: 28,
isBold: false,
imgWidth: 26,
onPressed: () {
NavigatorUtil.goBaseInfoPage(context);
},
))
],
);
... ... @@ -208,6 +227,7 @@ class MyPageState extends State<MyPage> with WidgetsBindingObserver {
// ],
// ),
VEmptyView(40),
MyItem(
title: "线上券创建",
content: '',
... ...
... ... @@ -15,6 +15,7 @@ import 'package:one_key/provider/upload_img_provider.dart';
import 'package:one_key/res/colors.dart';
import 'package:one_key/utils/dialog_util.dart';
import 'package:one_key/utils/misc.dart';
import 'package:one_key/utils/upload_image_util.dart';
import 'package:one_key/utils/utils.dart';
import 'package:one_key/widgets/MyDivider.dart';
import 'package:one_key/widgets/v_empty_view.dart';
... ... @@ -91,8 +92,12 @@ class _ImgPickerWidgetState extends DisposableState<ImgPickerWidget> {
}
});
if (pickedFile != null) {
startUpload(File(pickedFile.path),
_uploadImageProvider.imageList.length - 1, true);
UploadImageUtil().startUpload(
context,
File(pickedFile.path),
_uploadImageProvider.imageList.length - 1,
true,
_uploadImageProvider);
}
}
... ... @@ -153,99 +158,105 @@ class _ImgPickerWidgetState extends DisposableState<ImgPickerWidget> {
imgModel.process = 0.01;
_uploadImageProvider.imageList.add(imgModel);
});
startUpload(File(file.absolute.path),
_uploadImageProvider.imageList.length - 1, false);
UploadImageUtil().startUpload(
context,
File(file.absolute.path),
_uploadImageProvider.imageList.length - 1,
false,
_uploadImageProvider);
// startUpload(File(file.absolute.path),
// _uploadImageProvider.imageList.length - 1, false);
}
}
}
///上传到七牛云
void startUpload(File selectedFile, int index, bool needInit) async {
final PutController putController = PutController();
print(index);
// ///上传到七牛云
// void startUpload(File selectedFile, int index, bool needInit) async {
// final PutController putController = PutController();
// print(index);
// 添加状态监听
putController.addStatusListener((StorageStatus status) {
print('状态变化: 当前任务状态:${status.toString()}');
});
// 添加整体进度监听
putController.addProgressListener((percent) {
print('${index}任务进度变化:进度:${percent.toStringAsFixed(4)}');
_uploadImageProvider.imageList[index].process = percent;
_uploadImageProvider.notifyListeners();
});
// 添加实际发送进度订阅
putController.addSendProgressListener((percent) {
// _onlineCheckEditProvider.imageList[index].process = percent;
// setState(() {});
print('${index}实际发送变化:进度:${percent.toStringAsFixed(4)}');
});
if (token == null || token == '') {
await _uploadImageProvider.getQiniuInfo(context, {});
}
var usedToken = _uploadImageProvider.qiniuInfoSunModel.token;
if (usedToken == null || usedToken == '') {
print('token 不能为空');
return;
}
print('开始上传文件');
storage.putFile(
selectedFile,
usedToken,
options: PutOptions(
key: key,
partSize: partSize,
controller: putController,
),
)
..then((PutResponse response) {
print('${index}上传已完成: 原始响应数据: ${jsonEncode(response.rawData)}');
print('------------------------');
String imgUrl = _uploadImageProvider.qiniuInfoSunModel.domain +
'/' +
response.rawData['key'];
_uploadImageProvider.imageList[index].process = 1;
_uploadImageProvider.imageList[index].qiniuUrl = imgUrl;
// 取消当前任务
putController.cancel();
// _image
_uploadImageProvider.notifyListeners();
})
..catchError((dynamic error) {
if (error is StorageError) {
switch (error.type) {
case StorageErrorType.CONNECT_TIMEOUT:
print('发生错误: 连接超时');
break;
case StorageErrorType.SEND_TIMEOUT:
print('发生错误: 发送数据超时');
break;
case StorageErrorType.RECEIVE_TIMEOUT:
print('发生错误: 响应数据超时');
break;
case StorageErrorType.RESPONSE:
print('发生错误: ${error.message}');
break;
case StorageErrorType.CANCEL:
print('发生错误: 请求取消');
break;
case StorageErrorType.UNKNOWN:
print('发生错误: 未知错误');
break;
case StorageErrorType.NO_AVAILABLE_HOST:
print('发生错误: 无可用 Host');
break;
case StorageErrorType.IN_PROGRESS:
print('发生错误: 已在队列中');
break;
}
} else {
print('发生错误: ${error.toString()}');
}
// // 添加状态监听
// putController.addStatusListener((StorageStatus status) {
// print('状态变化: 当前任务状态:${status.toString()}');
// });
// // 添加整体进度监听
// putController.addProgressListener((percent) {
// print('${index}任务进度变化:进度:${percent.toStringAsFixed(4)}');
// _uploadImageProvider.imageList[index].process = percent;
// _uploadImageProvider.notifyListeners();
// });
// // 添加实际发送进度订阅
// putController.addSendProgressListener((percent) {
// // _onlineCheckEditProvider.imageList[index].process = percent;
// // setState(() {});
// print('${index}实际发送变化:进度:${percent.toStringAsFixed(4)}');
// });
// if (token == null || token == '') {
// await _uploadImageProvider.getQiniuInfo(context, {});
// }
// var usedToken = _uploadImageProvider.qiniuInfoSunModel.token;
// if (usedToken == null || usedToken == '') {
// print('token 不能为空');
// return;
// }
// print('开始上传文件');
// storage.putFile(
// selectedFile,
// usedToken,
// options: PutOptions(
// key: key,
// partSize: partSize,
// controller: putController,
// ),
// )
// ..then((PutResponse response) {
// print('${index}上传已完成: 原始响应数据: ${jsonEncode(response.rawData)}');
// print('------------------------');
// String imgUrl = _uploadImageProvider.qiniuInfoSunModel.domain +
// '/' +
// response.rawData['key'];
// _uploadImageProvider.imageList[index].process = 1;
// _uploadImageProvider.imageList[index].qiniuUrl = imgUrl;
// // 取消当前任务
// putController.cancel();
// // _image
// _uploadImageProvider.notifyListeners();
// })
// ..catchError((dynamic error) {
// if (error is StorageError) {
// switch (error.type) {
// case StorageErrorType.CONNECT_TIMEOUT:
// print('发生错误: 连接超时');
// break;
// case StorageErrorType.SEND_TIMEOUT:
// print('发生错误: 发送数据超时');
// break;
// case StorageErrorType.RECEIVE_TIMEOUT:
// print('发生错误: 响应数据超时');
// break;
// case StorageErrorType.RESPONSE:
// print('发生错误: ${error.message}');
// break;
// case StorageErrorType.CANCEL:
// print('发生错误: 请求取消');
// break;
// case StorageErrorType.UNKNOWN:
// print('发生错误: 未知错误');
// break;
// case StorageErrorType.NO_AVAILABLE_HOST:
// print('发生错误: 无可用 Host');
// break;
// case StorageErrorType.IN_PROGRESS:
// print('发生错误: 已在队列中');
// break;
// }
// } else {
// print('发生错误: ${error.toString()}');
// }
print('------------------------');
});
}
// print('------------------------');
// });
// }
///添加图片UI弹出
Future _openModalBottomSheet(context) async {
... ... @@ -266,7 +277,7 @@ class _ImgPickerWidgetState extends DisposableState<ImgPickerWidget> {
children: <Widget>[
InkWell(
onTap: () {
_getPickPermission(() {
Utils.getPickPermission(context, () {
_getFromPictureOrCamera(ImageSource.camera);
Navigator.pop(context);
}, PermissionGroup.camera);
... ... @@ -291,7 +302,7 @@ class _ImgPickerWidgetState extends DisposableState<ImgPickerWidget> {
),
InkWell(
onTap: () {
_getPickPermission(() {
Utils.getPickPermission(context, () {
pickAsset(PickType.onlyImage);
// _getFromPictureOrCamera(ImageSource.gallery);
Navigator.pop(context);
... ... @@ -337,45 +348,6 @@ class _ImgPickerWidgetState extends DisposableState<ImgPickerWidget> {
});
}
///检测是否有相机或者相册权限
_getPickPermission(
VoidCallback callback, PermissionGroup permissionGroup) async {
if (!(await checkPermission(permissionGroup))) {
String title = '相册';
if (permissionGroup == PermissionGroup.camera) {
title = '相机';
}
PermissionStatus status = await permissionStatus(permissionGroup);
if (status == PermissionStatus.neverAskAgain) {
//用户选择不在弹出权限提示框
print('never');
Navigator.pop(context);
DialogUtil.openAlertDialog(
context, '未获得${title}权限', "请在手机的权限管理里,将${title}权限开启", '去设置', 340.0,
onTap: () {
openSetting();
Navigator.pop(context, '');
});
} else {
// 申请权限
bool canContacts = await requestPermission(permissionGroup);
if (canContacts) {
callback();
} else {
Navigator.pop(context);
//拒绝通讯录权限 , 苹果拒绝权限后,不再提示权限框,进入此处
DialogUtil.openAlertDialog(context, '未获得${title}权限',
"请在手机的权限管理里,将${title}权限开启。", '去设置', 340.0, onTap: () {
openSetting();
Navigator.pop(context, '');
});
}
}
} else {
callback();
}
}
//查看大图
_showPhotoView(BuildContext context, int index, List imgs,
{isShow = false, List dashName}) async {
... ...
import 'package:flutter/material.dart';
import 'package:one_key/constant/constant.dart';
import 'package:one_key/constant/error.dart';
import 'package:one_key/models/base_info_model.dart';
import 'package:one_key/net/base_resp.dart';
import 'package:one_key/net/dio_util.dart';
import 'package:one_key/net/http_url.dart';
import 'package:one_key/utils/utils.dart';
class BaseIndoProvider with ChangeNotifier {
BaseInfoSunModel baseInfoSunModel; //客户经理基础信息
///客户经理添加/修改基本信息
Future<dynamic> setCustomerActivityBaseinfo(
BuildContext context, Map<String, String> params,
{isShowLoading = true}) async {
BaseResp<dynamic> baseResp = await DioUtil()
.request<dynamic>(
context, Method.get, HttpUrl.set_customer_activity_baseinfo,
data: params, showLoading: isShowLoading)
.catchError((error) {
print(error.toString());
if (error is MyError) {}
return false;
});
if (baseResp.code == Constant.status_success) {
if (baseResp.data != null) {
// coupons = baseResp.data['aid'].split('');
return true;
} else {
// Utils.showToast(baseResp.msg ?? "修改失败");
return false;
}
} else {
if (baseResp != null) {
// Utils.showToast(baseResp.msg ?? "");
}
return false;
}
}
///客户经理获取基本信息
Future<bool> getCustomerActivityBaseinfo(
BuildContext context, Map<String, String> params,
{isShowLoading = true}) async {
BaseResp<dynamic> baseResp = await DioUtil()
.request<dynamic>(
context, Method.get, HttpUrl.get_customer_activity_baseinfo,
data: params, showLoading: isShowLoading)
.catchError((error) {
print(error.toString());
if (error is MyError) {}
});
if (baseResp.code == Constant.status_success) {
if (baseResp.data == null || baseResp.data == false) {
return false;
} else {
baseInfoSunModel = BaseInfoModel.fromJson(baseResp.responseData).data;
// for (int i = 0; i < couponListSelect.length; i++) {
// coupons.add(couponListSelect[i].id);
// // couponsShow.add(couponTemp[i].id);
// }
// hasModify = true;
return true;
}
} else {
if (baseResp != null) {
Utils.showToast(baseResp.msg ?? "");
}
return false;
}
}
}
... ...
import 'package:flutter/material.dart';
import 'package:one_key/constant/constant.dart';
import 'package:one_key/models/qiniu_info_model.dart';
... ... @@ -12,7 +11,10 @@ class UploadImageProvider extends ChangeNotifier {
List<UploadImgModel> imageList = []; //图片信息列表
List<String> imageQiniuUrlList = []; //七牛云地址列表
QiniuInfoSunModel qiniuInfoSunModel;
UploadImgModel touxiang = UploadImgModel(); //头像
UploadImgModel erweima = UploadImgModel(); //二维码
double imgSizeTouxiang = 64;
double imgSizeErweima = 22;
/// 获取七牛上传token信息
Future<QiniuInfoSunModel> getQiniuInfo(
... ... @@ -36,5 +38,4 @@ class UploadImageProvider extends ChangeNotifier {
}
}
}
}
... ...
... ... @@ -19,6 +19,7 @@ import 'package:one_key/pages/detail/handle_online_page.dart';
import 'package:one_key/pages/detail/notebook_detail_page.dart';
import 'package:one_key/pages/login/web_page.dart';
import 'package:one_key/pages/message/message_order_menu.dart';
import 'package:one_key/pages/my/base_info.dart';
import 'package:one_key/pages/my/book_time_set.dart';
import 'package:one_key/pages/my/receive_orders_time_set.dart';
import 'package:one_key/pages/my/remark_manager_page.dart';
... ... @@ -248,7 +249,7 @@ var handleCouponSelectPageHandler = new Handler(
handlerFunc: (BuildContext context, Map<String, List<Object>> params) {
String rid = params["rid"].first;
bool hasModify = FluroConvertUtils.string2bool(params["hasModify"].first);
return CouponSelectPage(rid: rid,hasModify:hasModify);
return CouponSelectPage(rid: rid, hasModify: hasModify);
});
///优惠券详情页
... ... @@ -259,3 +260,12 @@ var handleCouponDetailPageHandler = new Handler(
return CouponDetailPage(couponSunModel: couponSunModel);
});
///个人资料页面
var baseInfoPageHandler = new Handler(
handlerFunc: (BuildContext context, Map<String, List<Object>> params) {
// CouponSunModel couponSunModel = CouponSunModel.fromJson(json.decode(
// FluroConvertUtils.fluroCnParamsDecode(params["couponSunModel"].first)));
return BaseInfoPage();
});
... ...
... ... @@ -27,6 +27,7 @@ class Routes {
static String coupon_edit = "/coupon_edit"; //创建优惠券
static String coupon_select = "/coupon_select"; //优惠券选择
static String coupon_detail = "/coupon_detail"; //优惠券详情页
static String base_info = "/base_info"; //个人资料页面
static void configureRoutes(FluroRouter router) {
router.notFoundHandler = new Handler(
... ... @@ -58,5 +59,6 @@ class Routes {
router.define(coupon_edit, handler: handleCouponEditPageHandler);
router.define(coupon_select, handler: handleCouponSelectPageHandler);
router.define(coupon_detail, handler: handleCouponDetailPageHandler);
router.define(base_info, handler: baseInfoPageHandler);
}
}
... ...
... ... @@ -186,4 +186,9 @@ class NavigatorUtil {
"${Routes.coupon_detail}?couponSunModel=${FluroConvertUtils.object2string(couponSunModel)}",
replace: replace);
}
/// 个人资料页面
static void goBaseInfoPage(BuildContext context, {replace = false}) {
_navigateTo(context, "${Routes.base_info}", replace: replace);
}
}
... ...
import 'dart:convert';
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:image_picker/image_picker.dart';
import 'package:one_key/models/upload_img_model.dart';
import 'package:one_key/provider/upload_img_provider.dart';
import 'package:one_key/res/colors.dart';
import 'package:one_key/utils/dialog_util.dart';
import 'package:photo/photo.dart';
import 'package:qiniu_flutter_sdk/qiniu_flutter_sdk.dart';
import 'package:photo_manager/photo_manager.dart';
class UploadImageUtil {
final picker = ImagePicker();
// 用户输入的文件名
String key;
// 用户输入的 partSize
int partSize = 4;
// 用户输入的 token
String token;
/// storage 实例
final Storage storage = Storage();
// 控制器,可以用于取消任务、获取上述的状态,进度等信息
// PutController putController = PutController();
// 当前的任务状态
///上传到七牛云
void startUpload(BuildContext context, File selectedFile, int index,
bool needInit, UploadImageProvider uploadImageProvider) async {
final PutController putController = PutController();
print(index);
// 添加状态监听
putController.addStatusListener((StorageStatus status) {
print('状态变化: 当前任务状态:${status.toString()}');
});
// 添加整体进度监听
putController.addProgressListener((percent) {
print('${index}任务进度变化:进度:${percent.toStringAsFixed(4)}');
uploadImageProvider.imageList[index].process = percent;
uploadImageProvider.notifyListeners();
});
// 添加实际发送进度订阅
putController.addSendProgressListener((percent) {
// _onlineCheckEditProvider.imageList[index].process = percent;
// setState(() {});
print('${index}实际发送变化:进度:${percent.toStringAsFixed(4)}');
});
if (token == null || token == '') {
await uploadImageProvider.getQiniuInfo(context, {});
}
var usedToken = uploadImageProvider.qiniuInfoSunModel.token;
if (usedToken == null || usedToken == '') {
print('token 不能为空');
return;
}
print('开始上传文件');
storage.putFile(
selectedFile,
usedToken,
options: PutOptions(
key: key,
partSize: partSize,
controller: putController,
),
)
..then((PutResponse response) {
print('${index}上传已完成: 原始响应数据: ${jsonEncode(response.rawData)}');
print('------------------------');
String imgUrl = uploadImageProvider.qiniuInfoSunModel.domain +
'/' +
response.rawData['key'];
uploadImageProvider.imageList[index].process = 1;
uploadImageProvider.imageList[index].qiniuUrl = imgUrl;
// 取消当前任务
putController.cancel();
// _image
uploadImageProvider.notifyListeners();
})
..catchError((dynamic error) {
if (error is StorageError) {
switch (error.type) {
case StorageErrorType.CONNECT_TIMEOUT:
print('发生错误: 连接超时');
break;
case StorageErrorType.SEND_TIMEOUT:
print('发生错误: 发送数据超时');
break;
case StorageErrorType.RECEIVE_TIMEOUT:
print('发生错误: 响应数据超时');
break;
case StorageErrorType.RESPONSE:
print('发生错误: ${error.message}');
break;
case StorageErrorType.CANCEL:
print('发生错误: 请求取消');
break;
case StorageErrorType.UNKNOWN:
print('发生错误: 未知错误');
break;
case StorageErrorType.NO_AVAILABLE_HOST:
print('发生错误: 无可用 Host');
break;
case StorageErrorType.IN_PROGRESS:
print('发生错误: 已在队列中');
break;
}
} else {
print('发生错误: ${error.toString()}');
}
print('------------------------');
});
}
///上传到七牛云
void startUploadOnly(
BuildContext context,
File selectedFile,
int index,
bool needInit,
UploadImageProvider uploadImageProvider,
) async {
final PutController putController = PutController();
print(index);
// 添加状态监听
putController.addStatusListener((StorageStatus status) {
print('状态变化: 当前任务状态:${status.toString()}');
});
// 添加整体进度监听
putController.addProgressListener((percent) {
print('${index}任务进度变化:进度:${percent.toStringAsFixed(4)}');
if (index == 0) {
uploadImageProvider.touxiang.process = percent;
} else {
uploadImageProvider.erweima.process = percent;
}
uploadImageProvider.notifyListeners();
});
// 添加实际发送进度订阅
putController.addSendProgressListener((percent) {
// _onlineCheckEditProvider.imageList[index].process = percent;
// setState(() {});
print('${index}实际发送变化:进度:${percent.toStringAsFixed(4)}');
});
if (token == null || token == '') {
await uploadImageProvider.getQiniuInfo(context, {});
}
var usedToken = uploadImageProvider.qiniuInfoSunModel.token;
if (usedToken == null || usedToken == '') {
print('token 不能为空');
return;
}
print('开始上传文件');
storage.putFile(
selectedFile,
usedToken,
options: PutOptions(
key: key,
partSize: partSize,
controller: putController,
),
)
..then((PutResponse response) {
print('${index}上传已完成: 原始响应数据: ${jsonEncode(response.rawData)}');
print('------------------------');
String imgUrl = uploadImageProvider.qiniuInfoSunModel.domain +
'/' +
response.rawData['key'];
// 取消当前任务
putController.cancel();
if (index == 0) {
uploadImageProvider.touxiang.process = 1;
uploadImageProvider.touxiang.qiniuUrl = imgUrl;
uploadImageProvider.notifyListeners();
} else if (index == 1) {
uploadImageProvider.erweima.process = 1;
uploadImageProvider.erweima.qiniuUrl = imgUrl;
uploadImageProvider.notifyListeners();
}
})
..catchError((dynamic error) {
if (error is StorageError) {
switch (error.type) {
case StorageErrorType.CONNECT_TIMEOUT:
print('发生错误: 连接超时');
break;
case StorageErrorType.SEND_TIMEOUT:
print('发生错误: 发送数据超时');
break;
case StorageErrorType.RECEIVE_TIMEOUT:
print('发生错误: 响应数据超时');
break;
case StorageErrorType.RESPONSE:
print('发生错误: ${error.message}');
break;
case StorageErrorType.CANCEL:
print('发生错误: 请求取消');
break;
case StorageErrorType.UNKNOWN:
print('发生错误: 未知错误');
break;
case StorageErrorType.NO_AVAILABLE_HOST:
print('发生错误: 无可用 Host');
break;
case StorageErrorType.IN_PROGRESS:
print('发生错误: 已在队列中');
break;
}
} else {
print('发生错误: ${error.toString()}');
}
print('------------------------');
});
}
}
... ...
... ... @@ -11,9 +11,12 @@ import 'package:flutter/services.dart';
import 'package:fluwx/fluwx.dart';
import 'package:one_key/pages/login/web_page.dart';
import 'package:one_key/provider/user_model.dart';
import 'package:one_key/utils/dialog_util.dart';
import 'package:one_key/utils/misc.dart';
import 'package:one_key/utils/navigator_util.dart';
import 'package:one_key/widgets/loading.dart';
import 'package:package_info/package_info.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:provider/provider.dart';
import 'package:url_launcher/url_launcher.dart';
import 'package:webview_flutter/webview_flutter.dart';
... ... @@ -23,6 +26,45 @@ import '../app.dart';
typedef BookTimeSetCallback = void Function(bool needChange);
class Utils {
///检测是否有相机或者相册权限
static getPickPermission(BuildContext context, VoidCallback callback,
PermissionGroup permissionGroup) async {
if (!(await checkPermission(permissionGroup))) {
String title = '相册';
if (permissionGroup == PermissionGroup.camera) {
title = '相机';
}
PermissionStatus status = await permissionStatus(permissionGroup);
if (status == PermissionStatus.neverAskAgain) {
//用户选择不在弹出权限提示框
print('never');
Navigator.pop(context);
DialogUtil.openAlertDialog(
context, '未获得${title}权限', "请在手机的权限管理里,将${title}权限开启", '去设置', 340.0,
onTap: () {
openSetting();
Navigator.pop(context, '');
});
} else {
// 申请权限
bool canContacts = await requestPermission(permissionGroup);
if (canContacts) {
callback();
} else {
Navigator.pop(context);
//拒绝通讯录权限 , 苹果拒绝权限后,不再提示权限框,进入此处
DialogUtil.openAlertDialog(context, '未获得${title}权限',
"请在手机的权限管理里,将${title}权限开启。", '去设置', 340.0, onTap: () {
openSetting();
Navigator.pop(context, '');
});
}
}
} else {
callback();
}
}
///value: 文本内容;fontSize : 文字的大小;fontWeight:文字权重;maxWidth:文本框的最大宽度;maxLines:文本支持最大多少行
static double calculateTextHeight(
String value,
... ...
... ... @@ -3,14 +3,14 @@ import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:one_key/res/colors.dart';
import 'package:one_key/widgets/h_empty_view.dart';
class MyItem extends StatefulWidget{
class MyItem extends StatefulWidget {
final String title;
final String content;
final VoidCallback callback;
const MyItem({Key key, this.title, this.content, this.callback}) : super(key: key);
const MyItem({Key key, this.title, this.content, this.callback})
: super(key: key);
@override
State<StatefulWidget> createState() {
// TODO: implement createState
... ... @@ -18,8 +18,7 @@ class MyItem extends StatefulWidget{
}
}
class MyItemState extends State<MyItem>{
class MyItemState extends State<MyItem> {
@override
Widget build(BuildContext context) {
// TODO: implement build
... ... @@ -33,15 +32,28 @@ class MyItemState extends State<MyItem>{
alignment: Alignment.center,
child: Row(
children: <Widget>[
Text(widget.title,style: TextStyle(fontSize: ScreenUtil().setSp(30),color: MyColours.color_353535),),
Text(
widget.title,
style: TextStyle(
fontSize: ScreenUtil().setSp(30),
color: MyColours.color_353535),
),
Spacer(),
Text(widget.content,style: TextStyle(fontSize: ScreenUtil().setSp(28),color: MyColours.color_666666),),
Text(
widget.content,
style: TextStyle(
fontSize: ScreenUtil().setSp(28),
color: MyColours.color_666666),
),
HEmptyView(20),
Image.asset("assets/arr_right_gray.png",width: ScreenUtil().setWidth(14),height: ScreenUtil().setWidth(22),)
Image.asset(
"assets/arr_right_gray.png",
width: ScreenUtil().setWidth(14),
height: ScreenUtil().setWidth(22),
)
],
),
),
);
}
}
\ No newline at end of file
}
... ...