circle_app/circle_app/lib/app/login/complete_material/logic.dart
2024-02-04 16:39:05 +08:00

527 lines
16 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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'],
);
}
}