Merge branch 'master' of https://git.oa00.com/austin_dai/project_telephony
commit
5e53e777f5
Binary file not shown.
Binary file not shown.
File diff suppressed because one or more lines are too long
@ -0,0 +1,154 @@
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:image_picker/image_picker.dart';
|
||||
|
||||
// import 'package:image_picker/image_picker.dart';
|
||||
import 'package:project_telephony/utils/headers.dart';
|
||||
import 'package:velocity_x/velocity_x.dart';
|
||||
// import 'package:velocity_x/velocity_x.dart';
|
||||
|
||||
class CloudImagePicker {
|
||||
static Future<List<File>> pickMultiImage(
|
||||
{required String title,
|
||||
double maxWidth = 1000,
|
||||
double maxHeight = 1000}) async {
|
||||
List<XFile>? files = [];
|
||||
files = await ImagePicker().pickMultiImage();
|
||||
if (files == null) {
|
||||
return <File>[];
|
||||
} else {
|
||||
return files.map((e) => File(e.path)).toList();
|
||||
}
|
||||
}
|
||||
|
||||
static Future<List<File>> pickMultiAndSingleImage(
|
||||
{required String title,
|
||||
double maxWidth = 1000,
|
||||
double maxHeight = 1000}) async {
|
||||
List<XFile>? files = [];
|
||||
// _files = await ImagePicker().pickMultiImage();
|
||||
|
||||
files = await Get.bottomSheet(CupertinoActionSheet(
|
||||
title: title.text.isIntrinsic.make(),
|
||||
actions: [
|
||||
CupertinoDialogAction(
|
||||
onPressed: () async {
|
||||
await ImagePicker().pickMultiImage().then((value) {
|
||||
if (value != null) {
|
||||
Get.back(
|
||||
result: value,
|
||||
);
|
||||
}
|
||||
});
|
||||
},
|
||||
child: Row(
|
||||
children: [
|
||||
const Icon(CupertinoIcons.photo),
|
||||
30.wb,
|
||||
'相册(长按图片多选)'.text.isIntrinsic.make(),
|
||||
],
|
||||
),
|
||||
),
|
||||
CupertinoDialogAction(
|
||||
onPressed: () async {
|
||||
await ImagePicker()
|
||||
.pickImage(
|
||||
source: ImageSource.camera,
|
||||
maxHeight: maxHeight,
|
||||
maxWidth: maxWidth,
|
||||
)
|
||||
.then((value) {
|
||||
if (value != null) {
|
||||
XFile pickFile = value;
|
||||
List<XFile> files = [];
|
||||
files.add(pickFile);
|
||||
Get.back(
|
||||
result: files,
|
||||
);
|
||||
}
|
||||
});
|
||||
},
|
||||
child: Row(
|
||||
children: [
|
||||
const Icon(CupertinoIcons.camera),
|
||||
30.wb,
|
||||
'相机'.text.isIntrinsic.make(),
|
||||
],
|
||||
),
|
||||
),
|
||||
],
|
||||
cancelButton: CupertinoDialogAction(
|
||||
onPressed: Get.back,
|
||||
child: '取消'.text.isIntrinsic.make(),
|
||||
),
|
||||
));
|
||||
if (files == null) {
|
||||
return <File>[];
|
||||
} else {
|
||||
return files.map((e) => File(e.path)).toList();
|
||||
}
|
||||
}
|
||||
|
||||
static Future<File?> pickSingleImage(
|
||||
{required String title,
|
||||
double maxWidth = 1000,
|
||||
double maxHeight = 1000}) async {
|
||||
XFile? xFile = await Get.bottomSheet(CupertinoActionSheet(
|
||||
title: title.text.isIntrinsic.make(),
|
||||
actions: [
|
||||
CupertinoDialogAction(
|
||||
onPressed: () async {
|
||||
await ImagePicker()
|
||||
.pickImage(
|
||||
source: ImageSource.gallery,
|
||||
maxHeight: maxHeight,
|
||||
maxWidth: maxWidth,
|
||||
)
|
||||
.then((value) {
|
||||
Get.back(
|
||||
result: value,
|
||||
);
|
||||
});
|
||||
},
|
||||
child: Row(
|
||||
children: [
|
||||
const Icon(CupertinoIcons.photo),
|
||||
30.wb,
|
||||
'相册'.text.isIntrinsic.make(),
|
||||
],
|
||||
)),
|
||||
CupertinoDialogAction(
|
||||
onPressed: () async {
|
||||
await ImagePicker()
|
||||
.pickImage(
|
||||
source: ImageSource.camera,
|
||||
maxHeight: maxHeight,
|
||||
maxWidth: maxWidth,
|
||||
)
|
||||
.then((value) {
|
||||
Get.back(
|
||||
result: value,
|
||||
);
|
||||
});
|
||||
},
|
||||
child: Row(
|
||||
children: [
|
||||
const Icon(CupertinoIcons.camera),
|
||||
30.wb,
|
||||
'相机'.text.isIntrinsic.make(),
|
||||
],
|
||||
)),
|
||||
],
|
||||
cancelButton: CupertinoDialogAction(
|
||||
onPressed: Get.back,
|
||||
child: '取消'.text.isIntrinsic.make(),
|
||||
),
|
||||
));
|
||||
if (xFile != null) {
|
||||
return File(xFile.path);
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,166 @@
|
||||
// import 'dart:async';
|
||||
// import 'dart:convert';
|
||||
|
||||
// import 'package:bot_toast/bot_toast.dart';
|
||||
// import 'package:cloud_car/model/pay/wx_pay_model.dart';
|
||||
// import 'package:cloud_car/utils/new_work/api_client.dart';
|
||||
// import 'package:cloud_car/utils/toast/cloud_toast.dart';
|
||||
// import 'package:dio/dio.dart';
|
||||
// import 'package:flutter/foundation.dart';
|
||||
// import 'package:fluwx/fluwx.dart';
|
||||
// import 'package:power_logger/power_logger.dart';
|
||||
// import 'package:tobias/tobias.dart';
|
||||
|
||||
// import '../model/pay/pay_model.dart';
|
||||
|
||||
// enum PAYTYPE {
|
||||
// ///支付宝
|
||||
// ali,
|
||||
|
||||
// ///微信
|
||||
// wx,
|
||||
|
||||
// ///现金
|
||||
// cash,
|
||||
|
||||
// ///pos
|
||||
// pos
|
||||
// }
|
||||
|
||||
// class PayUtil {
|
||||
// static final PayUtil _instance = PayUtil._();
|
||||
|
||||
// factory PayUtil() => _instance;
|
||||
|
||||
// PayUtil._();
|
||||
|
||||
// void resultSatus(String status) {
|
||||
// switch (status) {
|
||||
// case '8000':
|
||||
// BotToast.showText(text: '正在处理中');
|
||||
// break;
|
||||
// case '4000':
|
||||
// BotToast.showText(text: '订单支付失败');
|
||||
// break;
|
||||
// case '5000':
|
||||
// BotToast.showText(text: '重复请求');
|
||||
// break;
|
||||
// case '6001':
|
||||
// BotToast.showText(text: ' 用户中途取消');
|
||||
// break;
|
||||
// case '6002':
|
||||
// BotToast.showText(text: '网络连接出错');
|
||||
// break;
|
||||
// case '6004':
|
||||
// BotToast.showText(text: '支付结果未知,请查询商户订单列表中订单的支付状态');
|
||||
// break;
|
||||
// default:
|
||||
// BotToast.showText(text: '其他支付错误');
|
||||
// break;
|
||||
// }
|
||||
// }
|
||||
|
||||
// String _resultStatus = '';
|
||||
|
||||
// ///支付宝支付
|
||||
// ///传入订单信息和确认订单请求地址
|
||||
// Future<bool> callAliPay(String order, {String? apiPath}) async {
|
||||
// var install = await isAliPayInstalled();
|
||||
// if (!install) {
|
||||
// BotToast.showText(text: '未安装支付宝!');
|
||||
// return false;
|
||||
// }
|
||||
// Map<dynamic, dynamic> result = {};
|
||||
// try {
|
||||
// result = await aliPay(order);
|
||||
// } catch (e) {
|
||||
// if (kDebugMode) {
|
||||
// print(e.toString());
|
||||
// }
|
||||
// }
|
||||
// _resultStatus = result['resultStatus'];
|
||||
// if (_resultStatus == '9000') {
|
||||
// String res = result['result'];
|
||||
// PayModel model = PayModel.fromJson(jsonDecode(res));
|
||||
// if (apiPath != null) {
|
||||
// bool confirmResult = await _confirmPayResult(
|
||||
// apiPath, model.aliPayTradeAppPayResponse.outTradeNo);
|
||||
// return confirmResult;
|
||||
// } else {
|
||||
// CloudToast.show('支付成功');
|
||||
// return true;
|
||||
// }
|
||||
// } else {
|
||||
// resultSatus(_resultStatus);
|
||||
// return false;
|
||||
// }
|
||||
// }
|
||||
|
||||
// Future<bool> _confirmPayResult(String path, String code) async {
|
||||
// try {
|
||||
// int status = 0;
|
||||
// for (var i = 0; i < 3; i++) {
|
||||
// await Future.delayed(const Duration(milliseconds: 1000), () async {
|
||||
// Response response = await apiClient.dio.get(path, queryParameters: {
|
||||
// "code": code,
|
||||
// });
|
||||
// status = response.data['status'] as int;
|
||||
// });
|
||||
// if (status == 2) {
|
||||
// break;
|
||||
// }
|
||||
// }
|
||||
// if (status == 2) {
|
||||
// BotToast.showText(text: '交易成功');
|
||||
// return true;
|
||||
// } else {
|
||||
// BotToast.showText(text: '交易失败 错误码$status');
|
||||
// return false;
|
||||
// }
|
||||
// } catch (e) {
|
||||
// BotToast.showText(text: '网络请求错误');
|
||||
// LoggerData.addData(e);
|
||||
// return false;
|
||||
// }
|
||||
// }
|
||||
|
||||
// ///微信支付
|
||||
|
||||
// StreamSubscription? _wxPayStream;
|
||||
|
||||
// void wxPayAddListener(
|
||||
// {required VoidCallback paySuccess,
|
||||
// Function(BaseWeChatResponse)? payError}) {
|
||||
// _wxPayStream = weChatResponseEventHandler.listen((event) {
|
||||
// if (kDebugMode) {
|
||||
// print('errorCode:${event.errCode} errorStr:${event.errStr}');
|
||||
// }
|
||||
// if (event.errCode == 0) {
|
||||
// paySuccess();
|
||||
// } else {
|
||||
// LoggerData.addData(
|
||||
// 'errorCode:${event.errCode} errorStr:${event.errStr ?? '支付失败'}');
|
||||
// CloudToast.show(event.errStr ?? '支付失败');
|
||||
// if (payError != null) payError(event);
|
||||
// //payError == null ? null : payError(event);
|
||||
// }
|
||||
// });
|
||||
// }
|
||||
|
||||
// void removeWxPayListener() {
|
||||
// _wxPayStream?.cancel();
|
||||
// }
|
||||
|
||||
// Future callWxPay({
|
||||
// required WxPayModel payModel,
|
||||
// }) async {
|
||||
// await payWithWeChat(
|
||||
// appId: 'wx9bc3ffb23a749254',
|
||||
// partnerId: payModel.partnerId,
|
||||
// prepayId: payModel.prepayId,
|
||||
// packageValue: payModel.package,
|
||||
// nonceStr: payModel.nonceStr,
|
||||
// timeStamp: int.parse(payModel.timeStamp),
|
||||
// sign: payModel.sign);
|
||||
// }
|
||||
// }
|
@ -0,0 +1,16 @@
|
||||
|
||||
|
||||
import 'package:bot_toast/bot_toast.dart';
|
||||
import 'package:permission_handler/permission_handler.dart';
|
||||
|
||||
class PermissionUtils {
|
||||
static Future requestAllPermission() async {
|
||||
Map<Permission, PermissionStatus> permission =
|
||||
await [Permission.phone, Permission.sms].request();
|
||||
if (await Permission.phone.isGranted) {
|
||||
BotToast.showText(text: "手机申请通过");
|
||||
} else {
|
||||
BotToast.showText(text: "手机申请不通过");
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,62 @@
|
||||
part of './grind.dart';
|
||||
|
||||
@Task('打包Android项目')
|
||||
buildApk() async {
|
||||
await runAsync(
|
||||
'fvm',
|
||||
arguments: [
|
||||
'flutter',
|
||||
'build',
|
||||
'apk',
|
||||
'--target-platform=android-arm64',
|
||||
'--dart-define',
|
||||
'BUILD_TYPE=PRODUCT',
|
||||
],
|
||||
);
|
||||
|
||||
String date = DateUtil.formatDate(DateTime.now(), format: 'yy_MM_dd_HH_mm');
|
||||
String version = await getVersion();
|
||||
await runAsync('rm', arguments: ['-rf', Config.apkDir]);
|
||||
await runAsync('mkdir', arguments: ['-p', Config.apkDir]);
|
||||
await runAsync('mv', arguments: [
|
||||
Config.buildPath,
|
||||
'${Config.apkDir}/${Config.packageName}_${version}_release_$date.apk'
|
||||
]);
|
||||
}
|
||||
|
||||
@Task('打包Android项目')
|
||||
buildApkDev() async {
|
||||
await runAsync(
|
||||
'fvm',
|
||||
arguments: [
|
||||
'flutter',
|
||||
'build',
|
||||
'apk',
|
||||
'--target-platform=android-arm64',
|
||||
'--dart-define',
|
||||
'BUILD_TYPE=Dev',
|
||||
],
|
||||
);
|
||||
String date = DateUtil.formatDate(DateTime.now(), format: 'yy_MM_dd_HH_mm');
|
||||
String version = await getVersion();
|
||||
await runAsync('rm', arguments: ['-rf', Config.apkDevDir]);
|
||||
await runAsync('mkdir', arguments: ['-p', Config.apkDevDir]);
|
||||
await runAsync('mv', arguments: [
|
||||
Config.buildPath,
|
||||
'${Config.apkDevDir}/${Config.packageName}_${version}_beta_$date.apk'
|
||||
]);
|
||||
}
|
||||
|
||||
@Task('打包iOS项目')
|
||||
buildIos() async {
|
||||
await runAsync(
|
||||
'fvm',
|
||||
arguments: [
|
||||
'flutter',
|
||||
'build',
|
||||
'ios',
|
||||
'--dart-define',
|
||||
'BUILD_TYPE=PRODUCT',
|
||||
],
|
||||
);
|
||||
}
|
@ -0,0 +1,64 @@
|
||||
part of './grind.dart';
|
||||
|
||||
@Task('import 排序')
|
||||
void sort() {
|
||||
Pub.run('import_sorter:main');
|
||||
}
|
||||
|
||||
@Task('格式化dart代码')
|
||||
void format() {
|
||||
DartFmt.format(libDir);
|
||||
}
|
||||
|
||||
@Task('自动提交修改')
|
||||
@Depends(sort, format, gitPush)
|
||||
void git() {
|
||||
log(' commit to git');
|
||||
run(
|
||||
'git',
|
||||
arguments: [
|
||||
'commit',
|
||||
'-a',
|
||||
'-m',
|
||||
'[auto task] sort & format',
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
@Task('推送代码')
|
||||
void gitPush() {
|
||||
log(' push to git');
|
||||
run(
|
||||
'git',
|
||||
arguments: ['push'],
|
||||
);
|
||||
}
|
||||
|
||||
@Task('build runner')
|
||||
void gen() async {
|
||||
await runAsync(
|
||||
'fvm',
|
||||
arguments: [
|
||||
'flutter',
|
||||
'pub',
|
||||
'run',
|
||||
'build_runner',
|
||||
'build',
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
@Task('build runner clean')
|
||||
void genClean() async {
|
||||
await runAsync(
|
||||
'fvm',
|
||||
arguments: [
|
||||
'flutter',
|
||||
'pub',
|
||||
'run',
|
||||
'build_runner',
|
||||
'build',
|
||||
'--delete-conflicting-outputs'
|
||||
],
|
||||
);
|
||||
}
|
@ -0,0 +1,70 @@
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:flustars/flustars.dart';
|
||||
import 'package:grinder/grinder.dart';
|
||||
import 'package:path/path.dart';
|
||||
import 'package:pub_semver/pub_semver.dart';
|
||||
import 'package:yaml/yaml.dart';
|
||||
|
||||
import 'config.dart';
|
||||
import 'version_tool.dart';
|
||||
|
||||
part '_build.dart';
|
||||
part '_project_manage.dart';
|
||||
|
||||
main(args) => grind(args);
|
||||
|
||||
@Task('add minor version number')
|
||||
void addVersion() async {
|
||||
String projectPath = Directory('.').absolute.path;
|
||||
String yamlPath = join(projectPath, 'pubspec.yaml');
|
||||
String yamlContent = await File(yamlPath).readAsString();
|
||||
dynamic content = loadYaml(yamlContent);
|
||||
String version = content['version'];
|
||||
//rename version
|
||||
|
||||
Version resultVersion = VersionTool.fromText(version).nextMinorTag('dev');
|
||||
|
||||
String result = yamlContent.replaceFirst(version, resultVersion.toString());
|
||||
await File(yamlPath).writeAsString(result);
|
||||
}
|
||||
|
||||
@Task('add path version number')
|
||||
void addVersionPatch() async {
|
||||
String projectPath = Directory('.').absolute.path;
|
||||
String yamlPath = join(projectPath, 'pubspec.yaml');
|
||||
String yamlContent = await File(yamlPath).readAsString();
|
||||
dynamic content = loadYaml(yamlContent);
|
||||
String version = content['version'];
|
||||
//rename version
|
||||
|
||||
Version resultVersion = VersionTool.fromText(version).nextPatchTag('dev');
|
||||
|
||||
String result = yamlContent.replaceFirst(version, resultVersion.toString());
|
||||
await File(yamlPath).writeAsString(result);
|
||||
}
|
||||
|
||||
@Task('add major version number')
|
||||
void addVersionMajor() async {
|
||||
String projectPath = Directory('.').absolute.path;
|
||||
String yamlPath = join(projectPath, 'pubspec.yaml');
|
||||
String yamlContent = await File(yamlPath).readAsString();
|
||||
dynamic content = loadYaml(yamlContent);
|
||||
String version = content['version'];
|
||||
//rename version
|
||||
|
||||
Version resultVersion = VersionTool.fromText(version).nextMajorTag('dev');
|
||||
|
||||
String result = yamlContent.replaceFirst(version, resultVersion.toString());
|
||||
await File(yamlPath).writeAsString(result);
|
||||
}
|
||||
|
||||
@Task()
|
||||
Future<String> getVersion() async {
|
||||
String projectPath = Directory('.').absolute.path;
|
||||
String yamlPath = join(projectPath, 'pubspec.yaml');
|
||||
String yamlContent = await File(yamlPath).readAsString();
|
||||
dynamic content = loadYaml(yamlContent);
|
||||
String version = content['version'];
|
||||
return version;
|
||||
}
|
@ -0,0 +1,59 @@
|
||||
import 'package:pub_semver/pub_semver.dart';
|
||||
|
||||
enum VersionNumber {
|
||||
major,
|
||||
minor,
|
||||
patch,
|
||||
}
|
||||
|
||||
class VersionTool {
|
||||
Version version;
|
||||
VersionTool(this.version);
|
||||
VersionTool.fromText(String text) : version = Version.parse(text);
|
||||
|
||||
Version get nextMajor => _addBuildNumber(VersionNumber.major);
|
||||
Version get nextMinor => _addBuildNumber(VersionNumber.minor);
|
||||
Version get nextPatch => _addBuildNumber(VersionNumber.patch);
|
||||
|
||||
Version nextMajorTag(String tag) => _addBuildNumber(
|
||||
VersionNumber.major,
|
||||
tag: tag,
|
||||
);
|
||||
Version nextMinorTag(String tag) => _addBuildNumber(
|
||||
VersionNumber.minor,
|
||||
tag: tag,
|
||||
);
|
||||
Version nextPatchTag(String tag) => _addBuildNumber(
|
||||
VersionNumber.patch,
|
||||
tag: tag,
|
||||
);
|
||||
|
||||
Version _addBuildNumber(VersionNumber type, {String? tag}) {
|
||||
switch (type) {
|
||||
case VersionNumber.major:
|
||||
return Version(
|
||||
version.major,
|
||||
version.minor,
|
||||
version.patch + 1,
|
||||
pre: tag,
|
||||
build: '${(version.build.first as int) + 1}',
|
||||
);
|
||||
case VersionNumber.minor:
|
||||
return Version(
|
||||
version.major,
|
||||
version.minor + 1,
|
||||
0,
|
||||
pre: tag,
|
||||
build: '${(version.build.first as int) + 1}',
|
||||
);
|
||||
case VersionNumber.patch:
|
||||
return Version(
|
||||
version.major + 1,
|
||||
0,
|
||||
0,
|
||||
pre: tag,
|
||||
build: '${(version.build.first as int) + 1}',
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in new issue