527 lines
16 KiB
Dart
527 lines
16 KiB
Dart
|
||
import 'dart:convert';
|
||
|
||
import 'package:app_settings/app_settings.dart';
|
||
import 'package:circle_app/network/dio_manager.dart';
|
||
import 'package:circle_app/router/app_routers.dart';
|
||
import 'package:circle_app/util/util.dart';
|
||
import 'package:flutter/cupertino.dart';
|
||
import 'package:flutter/services.dart';
|
||
import 'package:flutter_native_splash/flutter_native_splash.dart';
|
||
import 'package:flutter_pickers/time_picker/model/pduration.dart';
|
||
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
|
||
import 'package:get/get.dart';
|
||
import 'package:image_picker/image_picker.dart';
|
||
import 'package:permission_handler/permission_handler.dart';
|
||
|
||
import '../../../common/Widgets/base_tip_widget.dart';
|
||
import '../../../common/config.dart';
|
||
import '../../../network/api.dart';
|
||
import '../../../util/qiniu.dart';
|
||
import '../../circle/logic.dart';
|
||
import '../../minefragment/logic.dart';
|
||
import '../../select_circle/logic.dart';
|
||
import '../../userinfo/logic.dart';
|
||
import 'state.dart';
|
||
|
||
class Complete_materialLogic extends GetxController {
|
||
@override
|
||
void onReady() {
|
||
// TODO: implement onReady
|
||
// FlutterNativeSplash.remove();
|
||
super.onReady();
|
||
|
||
|
||
}
|
||
final Complete_materialState state = Complete_materialState();
|
||
final ImagePicker _picker = ImagePicker();
|
||
var type = Get.arguments ?? "";
|
||
|
||
var quToken = '';
|
||
var headUrl = '';
|
||
|
||
int unLockWxNum = 0;
|
||
|
||
Map wxStatusInfo = {};
|
||
|
||
late ConfigBean configBean;
|
||
List<MyConfigData> numbers = [];
|
||
|
||
List<String> genderList = [];
|
||
|
||
List<String> orientationList = [];
|
||
|
||
List<String> roleList = [];
|
||
|
||
UserBean? userInfoBean = null;
|
||
|
||
List<Province> provinceList = [];
|
||
|
||
List<int> genderTagList = [];//你想认识
|
||
|
||
List<SysTag> watchGenderList = [];
|
||
Map cityMap = {};
|
||
|
||
@override
|
||
void onInit() async {
|
||
FlutterNativeSplash.remove();
|
||
await loadCofigData();
|
||
getCityList();
|
||
if(type!=''){
|
||
loadWXEditStatus();
|
||
var data = await DioManager.instance.get(url: Api.getUserInfo);
|
||
var bean = BaseResponse<ResponseBean>.fromJson(
|
||
data, (data) => ResponseBean.fromJson(data));
|
||
if(bean.isSuccess()){
|
||
unLockWxNum = bean.data.unLockWxNum;
|
||
|
||
userInfoBean = bean.data.user;
|
||
state.wxEditingController.text = userInfoBean!.wx_num ;
|
||
state.nickName = userInfoBean!.nickname;
|
||
state.sex = getGenderContent(userInfoBean!.gender);
|
||
state.genderId = userInfoBean!.gender.toString();
|
||
state.age = userInfoBean!.age.toString();
|
||
state.brithday = userInfoBean!.birthday.toString();
|
||
state.role = getRoleContent(userInfoBean!.role);
|
||
state.roleId = userInfoBean!.role.toString();
|
||
state.orientation = getOrientationContent(userInfoBean!.orientation);
|
||
if (userInfoBean!.orientations.isNotEmpty) {
|
||
watchGenderList.forEach((element) {
|
||
if (userInfoBean!.orientations!.contains(element.id)) {
|
||
element.isSelect = true;
|
||
}
|
||
});
|
||
|
||
}
|
||
state.orientationId = userInfoBean!.orientation.toString();
|
||
state.textEditingController.text = userInfoBean!.nickname;
|
||
state.city = userInfoBean!.city ?? '';
|
||
state.descEditingController.text = userInfoBean!.signature;
|
||
headUrl = userInfoBean!.avatar;
|
||
userInfoBean!.interests.forEach((element) {
|
||
numbers.add(MyConfigData(element.id.toString(),element.title,false));
|
||
});
|
||
update();
|
||
// state.nickName = userInfoBean!.nickname;
|
||
}else{
|
||
showOKToast(bean.msg);
|
||
}
|
||
|
||
} else {
|
||
watchGenderList[1].isSelect = true;
|
||
update();
|
||
}
|
||
|
||
|
||
|
||
}
|
||
|
||
loadWXEditStatus() async {
|
||
var data =
|
||
await DioManager.instance.get(url: Api.checkWxNumState,);
|
||
if (data['code'] == 200) {
|
||
// code 200 直接跳填微信,不提示,4000 不让填写,32100 弹返回的提示
|
||
//
|
||
// BAN_ACTION(4000, "用户当前操作被禁止"),
|
||
//
|
||
// NOTICE_UPDATE_WXNUM(32100, "填写/更新微信需要消耗{}小票哦");
|
||
|
||
} else {
|
||
wxStatusInfo['${data['code']}'] = data['msg'];
|
||
}
|
||
}
|
||
|
||
loadCofigData() async {
|
||
var data =
|
||
await DioManager.instance.get(url: Api.getqiniuToken, params: {});
|
||
var bean = BaseResponse<QnTokenData>.fromJson(
|
||
data, (data) => QnTokenData.fromJson(data));
|
||
if(bean.isSuccess()){
|
||
quToken = bean.data!.token.toString();
|
||
}
|
||
|
||
|
||
var data1 =
|
||
await DioManager.instance.get(url: Api.getCircleList, params: {});
|
||
var bean1 = BaseResponse<ConfigBean>.fromJson(
|
||
data1, (data1) => ConfigBean.fromJson(data1));
|
||
configBean = bean1.data!;
|
||
|
||
configBean.genderMap.forEach((key, value) {
|
||
genderList.add(value);
|
||
SysTag tag = SysTag(id: int.parse(key), tagName: value);
|
||
watchGenderList.add(tag);
|
||
});
|
||
|
||
configBean.orientationMap.forEach((key, value) {
|
||
orientationList.add(value);
|
||
});
|
||
configBean.roleMap.forEach((key, value) {
|
||
roleList.add(value);
|
||
});
|
||
}
|
||
|
||
getCityList() async {
|
||
try {
|
||
String jsonString = await rootBundle.loadString('assets/province.json');
|
||
List<dynamic> jsonData = json.decode(jsonString);
|
||
provinceList =
|
||
jsonData.map((dynamic item) => Province.fromJson(item)).toList();
|
||
cityMap.clear();
|
||
for (int i = 0; i < provinceList.length; i++) {
|
||
Map areaMap = {};
|
||
for (int c = 0; c < provinceList[i].city.length; c++) {
|
||
String cityName = provinceList[i].city[c].name;
|
||
List<String> cityAreaList = [];
|
||
provinceList[i].city[c].area.forEach((element) {
|
||
cityAreaList.add(element);
|
||
});
|
||
areaMap[cityName] = cityAreaList;
|
||
}
|
||
cityMap[provinceList[i].name] = areaMap;
|
||
}
|
||
} catch (e) {
|
||
print('Error loading JSON file: $e');
|
||
}
|
||
}
|
||
|
||
Future getImageFile() async {
|
||
|
||
|
||
checkPhotosStatus();
|
||
try {
|
||
final XFile? pickedFile = await _picker.pickImage(
|
||
source: ImageSource.gallery,
|
||
);
|
||
if(null==pickedFile){
|
||
return;
|
||
}
|
||
SmartDialog.showLoading(msg: '上传中');
|
||
uploadImage(quToken,pickedFile!,CONFIG.USER_INFO_AVATAR,(result){
|
||
SmartDialog.dismiss(force: true);
|
||
headUrl = result;
|
||
update();
|
||
});
|
||
|
||
} catch (e) {
|
||
SmartDialog.dismiss();
|
||
print(e);
|
||
|
||
PlatformException? exception = e as PlatformException?;
|
||
// invalid_image
|
||
if(exception!.code == 'invalid_image') {
|
||
showOKToast('不支持的图片格式,请另外选择图片');
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
checkInfo() async {
|
||
if (state.textEditingController.text.isEmpty) {
|
||
showOKToast('请输入您的昵称');
|
||
return;
|
||
} else if(state.textEditingController.text.length<2){
|
||
showOKToast('昵称不能低于两个字');
|
||
return;
|
||
} else if(state.textEditingController.text.length>6){
|
||
showOKToast('昵称最多输入6个字');
|
||
return;
|
||
}
|
||
// else if (state.sex.isEmpty) {
|
||
// showOKToast('请选择您的角色');
|
||
// return;
|
||
// } else if (state.age.isEmpty) {
|
||
// showOKToast('请选择您的年龄');
|
||
// return;
|
||
// } else if (state.city.isEmpty) {
|
||
// showOKToast('请选择您的常驻城市');
|
||
// return;
|
||
// }
|
||
else if (state.role.isEmpty) {
|
||
showOKToast('请选择您的属性');
|
||
return;
|
||
} else if (state.orientation.isEmpty) {
|
||
showOKToast('请选择您的取向');
|
||
return;
|
||
} else if (numbers.isEmpty) {
|
||
showOKToast('请选择您的兴趣圈子');
|
||
return;
|
||
} else if (state.descEditingController.text.isEmpty) {
|
||
showOKToast('请输入您的交友宣言');
|
||
return;
|
||
} else if (state.descEditingController.text.length < 5) {
|
||
showOKToast('您的交友宣言太短');
|
||
return;
|
||
} else if (state.descEditingController.text.length > 40) {
|
||
showOKToast('您的交友宣言超出40个字啦');
|
||
return;
|
||
}
|
||
|
||
|
||
if (headUrl == '') {
|
||
showOKToast('请上传头像');
|
||
return;
|
||
}
|
||
|
||
genderTagList.clear();
|
||
List tagIds = [];
|
||
watchGenderList.forEach((element) {
|
||
if(element.isSelect){
|
||
tagIds.add(element.id);
|
||
genderTagList.add(element.id);
|
||
}
|
||
});
|
||
if(genderTagList.isEmpty){
|
||
// showOKToast("请点击选择你想认识的人");
|
||
// return;
|
||
}
|
||
|
||
// LatLng location = await getLocation();
|
||
List<String> interestsList = [];
|
||
numbers.forEach((element) {
|
||
interestsList.add(element.id);
|
||
});
|
||
if (state.brithday.isEmpty) {
|
||
var date = PDuration.now();
|
||
PDuration p =
|
||
PDuration(year: date.year! - 20, month: date.month, day: date.day);
|
||
|
||
String month = p.month! < 10 ? '0${p.month!}' : p.month!.toString();
|
||
String day = p.day! < 10 ? '0${p.day!}' : p.day!.toString();
|
||
var time = '${p.year}-$month-$day';
|
||
state.brithday = time;
|
||
}
|
||
|
||
|
||
if (state.wxEditingController.text.isNotEmpty) {
|
||
bool isPass = false;
|
||
if (state.wxEditingController.text.length == 11) {
|
||
RegExp exp = RegExp(
|
||
r'^((13[0-9])|(14[0-9])|(15[0-9])|(16[0-9])|(17[0-9])|(18[0-9])|(19[0-9]))\d{8}$');
|
||
isPass = exp.hasMatch(state.wxEditingController.text);
|
||
}
|
||
|
||
if (state.wxEditingController.text.isNotEmpty && !isPass) {
|
||
RegExp wxReg = RegExp(r'^[-_a-zA-Z][-_a-zA-Z0-9]{5,19}$');
|
||
if (!wxReg.hasMatch(state.wxEditingController.text)) {
|
||
showOKToast('请输入正确的微信号');
|
||
return;
|
||
}
|
||
}
|
||
|
||
if (wxStatusInfo.containsKey('4000')) {
|
||
showOKToast(wxStatusInfo['40000']);
|
||
return;
|
||
}
|
||
|
||
var result = await DioManager().post(url: Api.updateWxNum,params: {'type':2,'wxNum':state.wxEditingController.text});
|
||
if (result['code'] == 31201) {
|
||
// showToast.
|
||
showOKToast(result['msg']);
|
||
showRechargeScreenDialog();
|
||
return;
|
||
} else if (result['code'] == 200) {
|
||
if (wxStatusInfo.containsKey('32100')) {
|
||
showOKToast(wxStatusInfo['32100']);
|
||
}
|
||
}
|
||
print(result);
|
||
}
|
||
|
||
var data = await DioManager.instance.put(url: Api.UpdataUserInfo, params: {
|
||
'avatar_url': headUrl,
|
||
'birthday': state.brithday,
|
||
'gender': state.genderId.isNotEmpty ? state.genderId : '2', //性别
|
||
'role': state.roleId, //Int 角色
|
||
'interests': interestsList, //兴趣
|
||
'orientation': state.orientationId, //Int 爱好
|
||
'city':state.city.isNotEmpty ? state.city : '上海市',
|
||
'orientations':genderTagList.isEmpty ? [2] : genderTagList,
|
||
// 'lat': location.latitude,
|
||
// 'lng': location.longitude,
|
||
'nickname': state.textEditingController.text.trim(),
|
||
'signature': state.descEditingController.text.trim(),
|
||
});
|
||
var bean = BaseResponse<String>.fromJson(data, (data) => data);
|
||
if (bean.code == 200) {
|
||
Get.offAllNamed(AppRoutes.Home);
|
||
}else{
|
||
showOKToast(bean.msg);
|
||
}
|
||
}
|
||
|
||
editInfo() async {
|
||
if (state.textEditingController.text.isEmpty) {
|
||
showOKToast('请输入您的昵称');
|
||
return;
|
||
} else if(state.textEditingController.text.length>6){
|
||
showOKToast('昵称最多输入6个字');
|
||
return;
|
||
}else if (state.sex.isEmpty) {
|
||
showOKToast('请选择您的属性');
|
||
return;
|
||
} else if (state.age.isEmpty) {
|
||
showOKToast('请选择您的年龄');
|
||
return;
|
||
} else if (state.city.isEmpty) {
|
||
showOKToast('请选择您的常驻城市');
|
||
return;
|
||
} else if (state.role.isEmpty) {
|
||
showOKToast('请选择您的属性');
|
||
return;
|
||
} else if (state.sex.isEmpty) {
|
||
showOKToast('请选择您的角色');
|
||
return;
|
||
} else if (state.orientation.isEmpty) {
|
||
showOKToast('请选择您的取向');
|
||
return;
|
||
} else if (numbers.isEmpty) {
|
||
showOKToast('请选择您的兴趣圈子');
|
||
// return;
|
||
} else if (state.descEditingController.text.isEmpty) {
|
||
showOKToast('请输入您的交友宣言');
|
||
return;
|
||
} else if (state.descEditingController.text.length < 5) {
|
||
showOKToast('您的交友宣言太短');
|
||
return;
|
||
}
|
||
if (headUrl == '') {
|
||
showOKToast('请上传头像');
|
||
return;
|
||
}
|
||
genderTagList.clear();
|
||
List tagIds = [];
|
||
watchGenderList.forEach((element) {
|
||
if(element.isSelect){
|
||
tagIds.add(element.id);
|
||
genderTagList.add(element.id);
|
||
}
|
||
});
|
||
if(genderTagList.isEmpty){
|
||
showOKToast("请点击选择你想认识的人");
|
||
return;
|
||
}
|
||
|
||
if (state.wxEditingController.text.isNotEmpty && userInfoBean!.wx_num != state.wxEditingController.text) {
|
||
bool isPass = false;
|
||
if (state.wxEditingController.text.length == 11) {
|
||
RegExp exp = RegExp(
|
||
r'^((13[0-9])|(14[0-9])|(15[0-9])|(16[0-9])|(17[0-9])|(18[0-9])|(19[0-9]))\d{8}$');
|
||
isPass = exp.hasMatch(state.wxEditingController.text);
|
||
}
|
||
|
||
if (state.wxEditingController.text.isNotEmpty && !isPass) {
|
||
RegExp wxReg = RegExp(r'^[-_a-zA-Z][-_a-zA-Z0-9]{5,19}$');
|
||
if (!wxReg.hasMatch(state.wxEditingController.text)) {
|
||
showOKToast('请输入正确的微信号');
|
||
return;
|
||
}
|
||
}
|
||
|
||
if (wxStatusInfo.containsKey('4000')) {
|
||
showOKToast(wxStatusInfo['40000']);
|
||
return;
|
||
}
|
||
|
||
var result = await DioManager().post(url: Api.updateWxNum,params: {'type':2,'wxNum':state.wxEditingController.text});
|
||
if (result['code'] == 31201) {
|
||
// showToast.
|
||
showOKToast(result['msg']);
|
||
showRechargeScreenDialog();
|
||
return;
|
||
} else if (result['code'] == 200) {
|
||
if (wxStatusInfo.containsKey('32100')) {
|
||
showOKToast(wxStatusInfo['32100']);
|
||
}
|
||
}
|
||
print(result);
|
||
}
|
||
//TODO 强制获取经纬度
|
||
// LatLng location = await getLocation();
|
||
List<String> interestsList = [];
|
||
numbers.forEach((element) {
|
||
interestsList.add(element.id);
|
||
});
|
||
|
||
|
||
var data = await DioManager.instance.put(url: Api.UpdataUserInfo, params: {
|
||
'avatar_url': headUrl,
|
||
'birthday': state.brithday,
|
||
'gender': state.genderId, //性别
|
||
'role': state.roleId, //Int 角色
|
||
'interests': interestsList, //兴趣
|
||
'orientation': state.orientationId, //Int 爱好
|
||
'orientations':genderTagList,
|
||
'city':state.city,
|
||
// 'lat': location.latitude,
|
||
// 'lng': location.longitude,
|
||
'nickname': state.textEditingController.text,
|
||
'signature': state.descEditingController.text,
|
||
});
|
||
var bean = BaseResponse<String>.fromJson(data, (data) => data);
|
||
if (bean.code == 200) {
|
||
showOKToast('操作成功');
|
||
var mineFragment = Get.find<MinefragmentLogic>();
|
||
mineFragment.avatar = headUrl;
|
||
mineFragment.name = state.textEditingController.text;
|
||
mineFragment.gender = int.parse(state.genderId);
|
||
mineFragment.role = int.parse(state.roleId);
|
||
mineFragment.age = int.parse(state.age);
|
||
mineFragment.orientation = int.parse(state.orientationId);
|
||
mineFragment.update();
|
||
Get.back();
|
||
|
||
|
||
|
||
}else{
|
||
showOKToast(bean.msg);
|
||
}
|
||
}
|
||
|
||
pushHome() {
|
||
Get.toNamed(AppRoutes.Home);
|
||
}
|
||
|
||
//时间戳转年龄
|
||
String getAge(PDuration brt) {
|
||
int age = 0;
|
||
DateTime dateTime = DateTime.now();
|
||
|
||
int yearNow = dateTime.year; //当前年份
|
||
int monthNow = dateTime.month; //当前月份
|
||
int dayOfMonthNow = dateTime.day; //当前日期
|
||
|
||
int yearBirth = brt.year!;
|
||
int monthBirth = brt.month!;
|
||
int dayOfMonthBirth = brt.day!;
|
||
age = yearNow - yearBirth; //计算整岁数
|
||
if (monthNow <= monthBirth) {
|
||
if (monthNow == monthBirth) {
|
||
if (dayOfMonthNow < dayOfMonthBirth) age--; //当前日期在生日之前,年龄减一
|
||
} else {
|
||
age--; //当前月份在生日之前,年龄减一
|
||
}
|
||
}
|
||
return age.toString();
|
||
}
|
||
}
|
||
|
||
class SysTag {
|
||
final int id;
|
||
final String tagName;
|
||
|
||
bool isSelect = false;
|
||
|
||
SysTag({
|
||
required this.id,
|
||
required this.tagName,
|
||
this.isSelect = false,
|
||
});
|
||
|
||
factory SysTag.fromJson(Map<String, dynamic> json) {
|
||
return SysTag(
|
||
id: json['id'],
|
||
tagName: json['tagName'],
|
||
);
|
||
}
|
||
} |