发布喊话 基本完成 还差至尊喊话和支付vip 功能 我的界面接口和 个人中心和查看他人个人中心的基础信息完成 增加视频压缩和图片压缩 封装 上传七牛云

This commit is contained in:
YangYuhao 2023-06-29 18:33:04 +08:00
parent f3cf90898e
commit b86d49ee2c
20 changed files with 1255 additions and 258 deletions

View File

@ -4,16 +4,22 @@ import 'dart:typed_data';
import 'package:circle_app/util/util.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_luban/flutter_luban.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
import 'package:get/get.dart';
import 'package:image_picker/image_picker.dart';
import 'package:qiniu_flutter_sdk/qiniu_flutter_sdk.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:video_player/video_player.dart';
import 'package:video_thumbnail/video_thumbnail.dart';
import '../../common/errorcode.dart';
import '../../network/api.dart';
import '../../network/dio_manager.dart';
import '../../router/app_routers.dart';
import '../../util/qiniu.dart';
import '../login/complete_material/logic.dart';
import '../select_circle/logic.dart';
import 'state.dart';
@ -26,11 +32,11 @@ class Call_outLogic extends GetxController {
late ConfigBean configBean;
String circleName = "";
final ImagePicker _picker = ImagePicker();
var storage = Storage();
var quToken = '';
VideoPlayerController? videoPlayerController;
List<MyConfigData> numbers = [];
List<MyConfigData> myConfigData= Get.arguments['numbers'];
int vip = 0;
@override
void onClose() {
@ -41,58 +47,76 @@ class Call_outLogic extends GetxController {
@override
void onInit() async {
super.onInit();
var data =
await DioManager.instance.get(url: Api.getCircleList, params: {});
if(myConfigData!=null){
// print(myConfigData.name);
numbers.addAll(myConfigData);
circleName = numbers[0].name;
SharedPreferences prefs = await SharedPreferences.getInstance();
vip = prefs.getInt("vip")??0;
if(vip == 2){
isCheck = true;
}
update();
}
var data = await DioManager.instance.get(url: Api.getCircleList, params: {});
var bean = BaseResponse<ConfigBean>.fromJson(
data, (data) => ConfigBean.fromJson(data));
configBean = bean.data!;
if (bean.isSuccess()) {
configBean = bean.data!;
} else {
showToast(bean.msg);
}
var quniuData =
await DioManager.instance.get(url: Api.getqiniuToken, params: {});
var qiniuBean = BaseResponse<QnTokenData>.fromJson(
quniuData, (quniuData) => QnTokenData.fromJson(quniuData));
quToken = qiniuBean.data!.token.toString();
}
sendShout() async {
if (numbers.isEmpty) {
showToast("选择圈子");
showToast("选择要喊话的圈子");
return;
}
if (textEditingController.text.isEmpty) {
showToast("请输入喊话内容");
return;
}
if (state.imaglist.isEmpty || state.videolist.isEmpty) {
if (textEditingController.text.length < 50) {
showToast("内容不丰富");
if (state.imaglist.isEmpty && state.videolist.isEmpty) {
if (textEditingController.text.length < 30) {
showToast("您当前未添加图片或视频请至少输入30字故事内容。");
return;
}
} else {
if (!state.imaglist.isEmpty) {
if (textEditingController.text.length < 10) {
showToast("内容不丰富");
if (textEditingController.text.length < 5) {
showToast("请至少输入5个字内容");
return;
}
}
if (!state.videolist.isEmpty) {
if (textEditingController.text.length < 10) {
showToast("内容不丰富");
if (textEditingController.text.length < 5) {
showToast("请至少输入5个字内容");
return;
}
}
}
List myBean = [];
if (!state.imaglist.isEmpty){
if (!state.imaglist.isEmpty) {
state.imaglist.forEach((element) {
myBean.add(MyBean(type: 1, url: element).toJson());
});
}
if (!state.videolist.isEmpty){
myBean.add(MyBean(type: 1, url: state.videolist[0]).toJson());
if (!state.videolist.isEmpty) {
myBean.add(MyBean(type: 2, url: state.videolist[0]).toJson());
}
print(myBean.toString());
print(myBean.toString());
var data = await DioManager.instance.post(url: Api.SendShout, params: {
'album': myBean,
'content': textEditingController.text,
@ -100,12 +124,147 @@ print(myBean.toString());
'useQueen': isCheck,
});
//Navigator.pop(context, numbers);
var beandata = BaseResponse<dynamic>.fromJson(data, (jsonData) => jsonData,);
if (beandata.isSuccess()) {
showToast(beandata.msg);
// Navigator.pop(Get.context!, numbers);
Get.back();
}else if(beandata.code == 30503){
if(beandata.data ==null){
return ;
}
showToast(beandata.msg);
var callOutBean = BaseResponse<List<String>>.fromJson(
data,
(jsonData) => List<String>.from(jsonData),
);
textEditingController.text = filterSensitiveWords(textEditingController.text , callOutBean.data!);
print(filterSensitiveWords(textEditingController.text , callOutBean.data!));
update();
} else if(beandata.code == 30505){
var callOutBean = BaseResponse<CirclePaymentBean>.fromJson(data, (jsonData) => CirclePaymentBean.fromJson(jsonData),);
showDialog();
// tipWdiget()
}else{
showToast(beandata.msg);
}
}
void showDialog(){
Get.bottomSheet(Scaffold(
backgroundColor: Colors.transparent,
body: Container(
width: Get.width,
height: Get.height,
child: Center(
child: Container(
width: 339.sp,
height: 330.sp,
decoration: BoxDecoration(
image: DecorationImage(
fit: BoxFit.fill,
image: AssetImage(getCircleImage('add_tip_bg')))),
child: Stack(
alignment: Alignment.center,
children: [
Positioned(
top: 5.sp,
right: 12.sp,
child: GestureDetector(
onTap: () {
Get.back();
},
child: Image.asset(
getCircleImage('close'),
width: 24.sp,
),
)),
Positioned(
top: 24.sp,
child: Text(
'解锁圈子才能发布喊话',
style: TextStyle(color: Colors.white, fontSize: 16.sp),
)),
Positioned(
left: 17.sp,
top: 64.sp,
child: Text(
'为什么要解锁圈子?',
style: TextStyle(color: Colors.white, fontSize: 16.sp),
)),
Positioned(
top: 98.sp,
child: Container(
width: 339.sp,
padding: EdgeInsets.only(left: 17.sp, right: 17.sp),
child: Text(
'为打造纯净的社交环境,更好地服务大家,基于以下几方面考虑:1、平台升级为全天24小时人工审核保证用户真实避免骗子、酒托、虚假人士等扰乱平台 ;2、杜绝未入圈用户随意骚扰或影响已入圈的跨友;3、谢绝只会白嫖的猎奇人士。',
style: TextStyle(
color: Color.fromRGBO(247, 250, 250, 0.8),
fontSize: 12.sp)),
)),
Positioned(
bottom: 18.sp,
child: Container(
width: 168.sp,
height: 42.sp,
alignment: Alignment.center,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(21.sp),
gradient: const LinearGradient(
begin: Alignment.centerLeft,
end: Alignment.centerRight,
colors: [Color(0xff0AFCFF), Color(0xffD739EA)])),
child: Text(
'立即解锁',
style: TextStyle(color: Colors.white, fontSize: 16.sp),
),
)),
Positioned(
bottom: 72.sp,
child: Container(
child: Row(
children: [
Text(
'¥18',
style: TextStyle(
color: Color(0xffE845FF),
fontSize: 16.sp,
fontWeight: FontWeight.w600),
),
SizedBox(
width: 2.sp,
),
Text(
'(原价60)',
style: TextStyle(
color: Colors.white70,
fontSize: 16.sp,
fontWeight: FontWeight.w400,
decoration: TextDecoration.lineThrough,
decorationColor: Colors.white70,
),
),
],
),
))
],
),
),
),
),
),
isScrollControlled: true,
enableDrag: false
);
}
startSelectCircleActivity() async {
var data = await Get.toNamed(AppRoutes.SelectCircleActivity,
arguments: {"interestMap": configBean.interestMap, "isRodio": true});
arguments: {"interestMap": configBean.interestMap,
'selectCircle':numbers,
"isRodio": true});
if (null != data) {
numbers = data;
circleName = numbers[0].name;
@ -117,8 +276,8 @@ print(myBean.toString());
showImg() async {
try {
if (state.videolist.isNotEmpty) {
showToast("已添加图片,无法添加图片。");
if (state.videolist.length!=0) {
showToast("已添加视频,无法添加图片。");
return;
}
if (state.imaglist.length == 6) {
@ -128,7 +287,24 @@ print(myBean.toString());
final XFile? pickedFile = await _picker.pickImage(
source: ImageSource.gallery,
);
_setImageFileListFromFile(pickedFile!);
SmartDialog.showLoading();
var path = await getApplicationSupportDirectoryPath();
CompressObject compressObject = CompressObject(
imageFile:File(pickedFile!.path), //image
path:path, //compress to path
quality: 80,//first compress quality, default 80
step: 9,//compress quality step, The bigger the fast, Smaller is more accurate, default 6
mode: CompressMode.LARGE2SMALL,//default AUTO
);
Luban.compressImage(compressObject).then((_path) {
updataQiniu(pickedFile!,CONFIG.CALL_OUT_IMAGE,quToken,(result){
state.imaglist.add(result);
update();
});
});
} catch (e) {
print(e);
}
@ -157,90 +333,55 @@ print(myBean.toString());
return completer.future;
}
void _setImageFileListFromFile(XFile pickedFile) {
SmartDialog.showLoading();
String imgPath = CONFIG.CALL_OUT_IMAGE + pickedFile.name;
PutController putController = PutController();
putController.addStatusListener((StorageStatus status) {
if (status == StorageStatus.Success) {
var headUrl = CONFIG.IMAGE_HEAD + imgPath;
state.imaglist.add(headUrl);
update();
SmartDialog.dismiss();
}
print('状态变化: 当前任务状态:$status');
});
storage.putFile(File(pickedFile.path), quToken,
options: PutOptions(
controller: putController,
key: imgPath));
}
showVideo() async {
if (state.imaglist.length != 0) {
showToast("已添加图片,无法添加视频。");
return;
}
if (state.videolist.length == 6) {
showToast("最多上传6个视频哦~");
if (state.videolist.length!=0) {
showToast("最多上传1个视频哦~");
return;
}
try {
final XFile? pickedFile = await _picker.pickVideo(
source: ImageSource.gallery,
);
print(pickedFile!.path.toString());
videoPlayerController = VideoPlayerController.file(
File(pickedFile!.path),
videoPlayerOptions: VideoPlayerOptions(mixWithOthers: true),
);
await videoPlayerController?.initialize();
final Duration videoDuration = videoPlayerController!.value.duration;
final double durationInSeconds = videoDuration.inSeconds.toDouble();
print(durationInSeconds.toString());
if (durationInSeconds >= 5 && durationInSeconds <= 30) {
videoPlayerController?.setLooping(true);
videoPlayerController?.addListener(() {
if (!videoPlayerController!.value.isPlaying) {
// Navigator.pop(context);
}
});
SmartDialog.showLoading();
var path = await getApplicationSupportDirectoryPath();
compressVideo(pickedFile!.path,path,(result) async{
print(result);
videoPlayerController = VideoPlayerController.file(
File(result),
videoPlayerOptions: VideoPlayerOptions(mixWithOthers: true),
);
await videoPlayerController?.initialize();
final Duration videoDuration = videoPlayerController!.value.duration;
final double durationInSeconds = videoDuration.inSeconds.toDouble();
print(durationInSeconds.toString());
if (durationInSeconds >= 5 && durationInSeconds <= 30) {
videoPlayerController?.setLooping(true);
videoPlayerController?.addListener(() {
if (!videoPlayerController!.value.isPlaying) {
// Navigator.pop(context);
}
});
_setVideoFileListFromFile(pickedFile!);
}else{
showToast("请上传5-30秒的视频");
}
upVideoQiniu(result,pickedFile.name,CONFIG.CALL_OUT_VIDEO,quToken,(result){
state.videolist.add(result);
update();
});
} else {
showToast("请上传5-30秒的视频");
}
});
} catch (e) {}
}
void _setVideoFileListFromFile(XFile pickedFile) {
SmartDialog.showLoading();
String videoPath = CONFIG.CALL_OUT_VIDEO + pickedFile.name;
PutController putController = PutController();
putController.addStatusListener((StorageStatus status) async {
print('状态变化: 当前任务状态:$status');
if (status == StorageStatus.Success) {
// var img = await getFirstPic(CONFIG.IMAGE_HEAD + pickedFile.name);
state.videolist.add(CONFIG.IMAGE_HEAD + videoPath);
//state.videoThumbnaillist =img;
print(CONFIG.IMAGE_HEAD + videoPath);
update();
SmartDialog.dismiss();
}
});
storage.putFile(File(pickedFile.path), quToken,
options: PutOptions(
controller: putController,
key: CONFIG.CALL_OUT_VIDEO + pickedFile.name));
}
Future<ClosedCaptionFile> _loadCaptions(BuildContext context) async {
final String fileContents = await DefaultAssetBundle.of(context)
.loadString('assets/bumble_bee_captions.vtt');
@ -282,3 +423,28 @@ class ThumbnailResult {
required this.height,
required this.width});
}
class CirclePaymentBean {
final int id;
final String title;
final double amount;
final double oldAmount;
CirclePaymentBean({
required this.id,
required this.title,
required this.amount,
required this.oldAmount,
});
factory CirclePaymentBean.fromJson(Map<String, dynamic> json) {
return CirclePaymentBean(
id: json['id'] as int,
title: json['title'] as String,
amount: json['amount'] as double,
oldAmount: json['old_amount'] as double,
);
}
}

View File

@ -571,7 +571,9 @@ class Call_outPage extends StatelessWidget {
GestureDetector(
onTap: () {
Navigator.pop(context);
controller.videoPlayerController=null;
controller.state.videolist = [];
controller.update();
},
child: Container(
@ -613,4 +615,111 @@ class Call_outPage extends StatelessWidget {
},
);
}
// tipWdiget() {
// return Container(
// width: Get.width,
// height: Get.height,
// child: Center(
// child: Container(
// width: 339.sp,
// height: 330.sp,
// decoration: BoxDecoration(
// image: DecorationImage(
// fit: BoxFit.fill,
// image: AssetImage(getCircleImage('add_tip_bg')))),
// child: Stack(
// alignment: Alignment.center,
// children: [
// Positioned(
// top: 5.sp,
// right: 12.sp,
// child: GestureDetector(
// onTap: () {
// Get.back();
// },
// child: Image.asset(
// getCircleImage('close'),
// width: 24.sp,
// ),
// )),
// Positioned(
// top: 24.sp,
// child: Text(
// '解锁圈子才能主动私聊',
// style: TextStyle(color: Colors.white, fontSize: 16.sp),
// )),
// Positioned(
// left: 17.sp,
// top: 64.sp,
// child: Text(
// '为什么要解锁圈子?',
// style: TextStyle(color: Colors.white, fontSize: 16.sp),
// )),
// Positioned(
// top: 98.sp,
// child: Container(
// width: 339.sp,
// padding: EdgeInsets.only(left: 17.sp, right: 17.sp),
// child: Text(
// '为打造纯净的社交环境,更好地服务大家,基于以下几方面考虑:1、平台升级为全天24小时人工审核保证用户真实避免骗子、酒托、虚假人士等扰乱平台 ;2、杜绝未入圈用户随意骚扰或影响已入圈的跨友;3、谢绝只会白嫖的猎奇人士。',
// style: TextStyle(
// color: Color.fromRGBO(247, 250, 250, 0.8),
// fontSize: 12.sp)),
// )),
// Positioned(
// bottom: 18.sp,
// child: Container(
// width: 168.sp,
// height: 42.sp,
// alignment: Alignment.center,
// decoration: BoxDecoration(
// borderRadius: BorderRadius.circular(21.sp),
// gradient: const LinearGradient(
// begin: Alignment.centerLeft,
// end: Alignment.centerRight,
// colors: [Color(0xff0AFCFF), Color(0xffD739EA)])),
// child: Text(
// '立即解锁',
// style: TextStyle(color: Colors.white, fontSize: 16.sp),
// ),
// )),
// Positioned(
// bottom: 72.sp,
// child: Container(
// child: Row(
// children: [
// Text(
// '¥18',
// style: TextStyle(
// color: Color(0xffE845FF),
// fontSize: 16.sp,
// fontWeight: FontWeight.w600),
// ),
// SizedBox(
// width: 2.sp,
// ),
// Text(
// '(原价60)',
// style: TextStyle(
// color: Colors.white70,
// fontSize: 16.sp,
// fontWeight: FontWeight.w400,
// decoration: TextDecoration.lineThrough,
// decorationColor: Colors.white70,
// ),
// ),
// ],
// ),
// ))
// ],
// ),
// ),
// ),
// );
// }
}

View File

@ -49,8 +49,8 @@ class CircleLogic extends GetxController {
showToast(bean.msg);
}
getCircleIndexId() {
return circle.lists[state.index].id;
Circle getCircleIndex() {
return circle.lists[state.index];
}
}

View File

@ -7,6 +7,7 @@ import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:flutter_swiper/flutter_swiper.dart';
import 'package:get/get.dart';
import '../select_circle/logic.dart';
import 'logic.dart';
class CirclePage extends StatefulWidget {
@ -20,6 +21,7 @@ class _CirclePageState extends State<CirclePage>
with AutomaticKeepAliveClientMixin {
@override
bool get wantKeepAlive => true;
//
final logic = Get.put(CircleLogic());
@ -82,8 +84,14 @@ class _CirclePageState extends State<CirclePage>
bottom: 36.sp,
right: 10.sp,
child: GestureDetector(
onTap: () {
Get.toNamed(AppRoutes.Call_out);
onTap: () async {
List<MyConfigData> numbers = [];
numbers.add(MyConfigData(
logic.getCircleIndex().id.toString(),
logic.getCircleIndex().title,
false));
var data = await Get.toNamed(AppRoutes.Call_out, arguments: {'numbers': numbers});
},
child: Image.asset(
getCircleImage('send_msg'),
@ -481,5 +489,4 @@ class _CirclePageState extends State<CirclePage>
},
);
}
}

View File

@ -17,7 +17,7 @@ class FeedbackLogic extends GetxController {
final XFile? pickedFile = await _picker.pickImage(
source: ImageSource.gallery,
);
_setImageFileListFromFile(pickedFile!);
// setState(() {
// _setImageFileListFromFile(pickedFile);
// });
@ -28,12 +28,5 @@ class FeedbackLogic extends GetxController {
}
}
void _setImageFileListFromFile(XFile pickedFile) {
PutController putController = PutController();
putController.addStatusListener((StorageStatus status) {
print('状态变化: 当前任务状态:$status');
});
// storage.putFile(File(pickedFile.path), quToken,
// options: PutOptions(controller: putController, key: CONFIG.USER_INFO_HEAD+pickedFile.name));
}
}

View File

@ -4,6 +4,7 @@ import 'dart:math';
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_luban/flutter_luban.dart';
import 'package:flutter_pickers/time_picker/model/pduration.dart';
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
import 'package:get/get.dart';
@ -13,7 +14,9 @@ import 'package:qiniu_flutter_sdk/qiniu_flutter_sdk.dart';
import '../../../common/config.dart';
import '../../../network/api.dart';
import '../../../util/device.dart';
import '../../../util/qiniu.dart';
import '../../select_circle/logic.dart';
import '../../userinfo/logic.dart';
import '../login/logic.dart';
import 'state.dart';
@ -21,7 +24,7 @@ class Complete_materialLogic extends GetxController {
final Complete_materialState state = Complete_materialState();
final ImagePicker _picker = ImagePicker();
var type = Get.arguments ?? "";
var storage = Storage();
var quToken = '';
var headUrl = '';
@ -34,8 +37,37 @@ class Complete_materialLogic extends GetxController {
List<String> roleList = [];
UserBean? userInfoBean = null;
@override
void onInit() async {
if(type!=''){
var data = await DioManager.instance.get(url: Api.getUserInfo);
var bean = BaseResponse<ResponseBean>.fromJson(
data, (data) => ResponseBean.fromJson(data));
if(bean.isSuccess()){
userInfoBean = bean.data.user;
state.nickName = userInfoBean!.nickname;
state.sex = getGenderContent(userInfoBean!.gender);
state.genderId = userInfoBean!.gender.toString();
state.age = userInfoBean!.age.toString();
state.brithday = userInfoBean!.age.toString();
state.role = getRoleContent(userInfoBean!.role);
state.roleId = userInfoBean!.role.toString();
state.orientation = getOrientationContent(userInfoBean!.orientation);
state.orientationId = userInfoBean!.orientation.toString();
state.textEditingController.text = userInfoBean!.nickname;
state.descEditingController.text = userInfoBean!.signature;
headUrl = userInfoBean!.avatar;
update();
// state.nickName = userInfoBean!.nickname;
}else{
showToast(bean.msg);
}
}
var data =
await DioManager.instance.get(url: Api.getqiniuToken, params: {});
var bean = BaseResponse<QnTokenData>.fromJson(
@ -65,32 +97,30 @@ class Complete_materialLogic extends GetxController {
final XFile? pickedFile = await _picker.pickImage(
source: ImageSource.gallery,
);
// setState(() {
_setImageFileListFromFile(pickedFile!);
// });
var path = await getApplicationSupportDirectoryPath();
CompressObject compressObject = CompressObject(
imageFile:File(pickedFile!.path), //image
path:path, //compress to path
quality: 80,//first compress quality, default 80
step: 9,//compress quality step, The bigger the fast, Smaller is more accurate, default 6
mode: CompressMode.LARGE2SMALL,//default AUTO
);
Luban.compressImage(compressObject).then((_path) {
updataQiniu(pickedFile!,CONFIG.USER_INFO_AVATAR,quToken,(result){
headUrl = result;
update();
});
});
} catch (e) {
print(e);
// setState(() {
// _pickImageError = e;
// });
}
}
void _setImageFileListFromFile(XFile pickedFile) {
SmartDialog.showLoading();
PutController putController = PutController();
putController.addStatusListener((StorageStatus status) {
if (status == StorageStatus.Success) {
headUrl = CONFIG.IMAGE_HEAD + pickedFile.name;
print(headUrl);
update();
SmartDialog.dismiss();
}
print('状态变化: 当前任务状态:$status');
});
storage.putFile(File(pickedFile.path), quToken,
options: PutOptions(controller: putController, key: CONFIG.USER_INFO_AVATAR+pickedFile.name));
}
checkInfo() async {
if (state.textEditingController.text.isEmpty) {

View File

@ -156,6 +156,7 @@ class Complete_materialPage extends StatelessWidget {
AppRoutes.SelectCircleActivity,
arguments: {
"interestMap" :controller.configBean.interestMap,
'selectCircle':controller.numbers,
"isRodio" :false
});
if (data != null) {

View File

@ -1,13 +1,44 @@
import 'package:dio/dio.dart';
import 'dart:ffi';
import 'package:get/get.dart';
import '../../network/api.dart';
import '../../network/dio_manager.dart';
import '../../router/app_routers.dart';
import '../../util/util.dart';
import 'state.dart';
import 'package:shared_preferences/shared_preferences.dart';
class MinefragmentLogic extends GetxController {
final MinefragmentState state = MinefragmentState();
UserData? userInfoBean = null;
String ageMsg = "";
var isVip = 0;
@override
void onInit() async{
super.onInit();
var data = await DioManager.instance
.get(url: Api.getUserMine);
var bean = BaseResponse<UserData>.fromJson(
data, (data) => UserData.fromJson(data));
if(bean.isSuccess()){
userInfoBean = bean.data;
if(userInfoBean!=null){
isVip = userInfoBean!.vip;
SharedPreferences prefs = await SharedPreferences.getInstance();
prefs.setInt('vip', isVip);
ageMsg = getAgeCOntent(userInfoBean!.gender, userInfoBean!.age, userInfoBean!.role, userInfoBean!.orientation);
}
update();
}else{
showToast(bean.msg);
}
}
jumpSetUp() {
Get.toNamed(AppRoutes.SetUpActivity);
@ -15,3 +46,69 @@ class MinefragmentLogic extends GetxController {
}
class UserData {
final int id;
final String nickname;
final String avatar;
final String birthday;
final int age;
final int vip;
final int gender;
final int role;
final int orientation;
final double lng;
final double lat;
final String city;
UserData({
required this.id,
required this.nickname,
required this.avatar,
required this.birthday,
required this.age,
required this.vip,
required this.gender,
required this.role,
required this.orientation,
required this.lng,
required this.lat,
required this.city,
});
factory UserData.fromJson(Map<String, dynamic> json) {
return UserData(
id: json['user']['id'],
nickname: json['user']['nickname'],
avatar: json['user']['avatar'],
birthday: json['user']['birthday'],
age: json['user']['age'],
vip: json['user']['vip'],
gender: json['user']['gender'],
role: json['user']['role'],
orientation: json['user']['orientation'],
lng: json['user']['lng'],
lat: json['user']['lat'],
city: json['user']['city'],
);
}
}
class UserResponse {
final int code;
final String msg;
final UserData data;
UserResponse({
required this.code,
required this.msg,
required this.data,
});
factory UserResponse.fromJson(Map<String, dynamic> json) {
return UserResponse(
code: json['code'],
msg: json['msg'],
data: UserData.fromJson(json['data']),
);
}
}

View File

@ -11,44 +11,51 @@ class MinefragmentPage extends StatelessWidget {
final logic = Get.lazyPut(() => MinefragmentLogic());
final state = Get.find<MinefragmentLogic>().state;
final state = Get
.find<MinefragmentLogic>()
.state;
@override
Widget build(BuildContext context) {
double statusBarHeight = MediaQuery.of(context).padding.top;
double statusBarHeight = MediaQuery
.of(context)
.padding
.top;
return Scaffold(
body: Container(
width: Get.width,
height: Get.height,
decoration: BoxDecoration(
image: DecorationImage(
image: AssetImage(getBaseImage("home_back")),
fit: BoxFit.cover,
return GetBuilder<MinefragmentLogic>(builder: (logic) {
return Scaffold(
body: Container(
width: Get.width,
height: Get.height,
decoration: BoxDecoration(
image: DecorationImage(
image: AssetImage(getBaseImage("home_back")),
fit: BoxFit.cover,
),
),
),
child: Padding(
padding: EdgeInsets.only(
top: 20.0 + statusBarHeight,
left: 11.sp,
right: 11.sp,
),
child: Column(
children: [
_buildAvatarRow(),
_FriendsRow(),
Container(
child: Image(
image: AssetImage(getHomeImage("icon_vip")),
fit: BoxFit.fill,
child: Padding(
padding: EdgeInsets.only(
top: 20.0 + statusBarHeight,
left: 11.sp,
right: 11.sp,
),
child: Column(
children: [
_buildAvatarRow(logic),
_FriendsRow(),
Container(
child: Image(
image: AssetImage(getHomeImage("icon_vip")),
fit: BoxFit.fill,
),
),
),
_CircleLiveView(),
],
_CircleLiveView(),
],
),
),
),
),
);
);
});
}
Widget _CircleLiveView() {
@ -341,7 +348,7 @@ class MinefragmentPage extends StatelessWidget {
);
}
Widget _buildAvatarRow() {
Widget _buildAvatarRow(MinefragmentLogic logic) {
return GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: () {
@ -353,7 +360,7 @@ class MinefragmentPage extends StatelessWidget {
child: Row(
children: [
Center(
child: _buildAvatar1(),
child: _buildAvatar1(logic),
),
Expanded(
child: Container(
@ -361,9 +368,9 @@ class MinefragmentPage extends StatelessWidget {
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
_buildNameRow(),
SizedBox(height: 6.sp),
_buildInfoRow(),
_buildNameRow(logic),
SizedBox(height: 18.sp),
_buildInfoRow(logic),
],
),
),
@ -374,36 +381,41 @@ class MinefragmentPage extends StatelessWidget {
);
}
Widget _buildAvatar1() {
return ClipOval(
child: GestureDetector(
onTap: () {
Widget _buildAvatar1(MinefragmentLogic logic) {
return ClipOval(
child: GestureDetector(
onTap: () {
if(logic.userInfoBean!=null){
var imgList = <String>[];
imgList.add("https://book.flutterchina.club/assets/img/logo.png");
// Get.toNamed(AppRoutes.Swiper,arguments:imgList);
imgList.add(logic.userInfoBean!.avatar!);
// Get.toNamed(AppRoutes.Swiper,arguments:imgList);
Get.toNamed(AppRoutes.Swiper, arguments: {
'imaglist':imgList,
'index':0
'imaglist': imgList,
'index': 0
});
}
},
child: Image.network(
'https://book.flutterchina.club/assets/img/logo.png',
width: 65,
height: 65,
),
},
child:logic.userInfoBean==null ? Container(
width: 65.sp,
height: 65.sp,
): Image.network(
logic.userInfoBean!=null ? logic.userInfoBean!.avatar!: "",
width: 65.sp,
height: 65.sp,
),
),
);
}
Widget _buildNameRow() {
Widget _buildNameRow(MinefragmentLogic logic) {
return Container(
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
"name",
logic.userInfoBean!=null ? logic.userInfoBean!.nickname:"",
style: TextStyle(
color: Color.fromRGBO(247, 250, 250, 1.0),
fontSize: 16,
@ -430,7 +442,7 @@ class MinefragmentPage extends StatelessWidget {
);
}
Widget _buildInfoRow() {
Widget _buildInfoRow(MinefragmentLogic logic) {
return Row(
children: [
Container(
@ -447,7 +459,7 @@ class MinefragmentPage extends StatelessWidget {
),
padding: EdgeInsets.only(top: 2, bottom: 2, left: 10, right: 10),
child: Text(
"33CD",
logic.ageMsg,
style: TextStyle(
color: Colors.black,
fontSize: 10,
@ -455,11 +467,12 @@ class MinefragmentPage extends StatelessWidget {
),
),
SizedBox(width: 6),
logic.isVip>0 ?
Image(
image: AssetImage(getBaseImage("vip")),
width: 44,
height: 18,
),
):Container(),
],
);
}

View File

@ -7,12 +7,36 @@ import 'state.dart';
class Select_circleLogic extends GetxController {
late Map<String, dynamic> interestMap = Get.arguments['interestMap'];
bool isRodio = Get.arguments['isRodio'];
List<MyConfigData> selectCircle = Get.arguments['selectCircle'];
var selectIndex = -1;
@override
void onInit() async {
interestMap.forEach((key, value) {
arrList.add(MyConfigData(key, value, false));
});
if(isRodio){
List<MapEntry<String, dynamic>> entries = interestMap.entries.toList();
for (var entry in entries.asMap().entries) {
MyConfigData bean = MyConfigData(entry.value.key, entry.value.value, false);
selectCircle.forEach((element) {
if(entry.value.key==element.id){
bean.isSelect = true;
selectIndex = entry.key;
}
arrList.add(bean);
});
}
}else{
interestMap.forEach((key, value) {
MyConfigData bean = MyConfigData(key, value, false);
selectCircle.forEach((element) {
if(key==element.id){
bean.isSelect = true;
}
});
arrList.add(bean);
});
}
update();
}

View File

@ -60,7 +60,7 @@ class Select_circlePage extends StatelessWidget {
);
});
}
var selectIndex = -1;
Widget _reportAdapter(Select_circleLogic controller) {
return GridView.builder(
@ -76,11 +76,11 @@ class Select_circlePage extends StatelessWidget {
return GestureDetector(
onTap: () {
if (controller.isRodio) {
if(selectIndex != -1){
controller.arrList[selectIndex].isSelect = false;
print(selectIndex);
if(controller.selectIndex != -1){
controller.arrList[controller.selectIndex].isSelect = false;
print(controller.selectIndex);
}
selectIndex = index;
controller.selectIndex = index;
controller.arrList[index].isSelect = true;
controller.update();
} else {
@ -95,7 +95,6 @@ class Select_circlePage extends StatelessWidget {
}
Widget _getItemSelect(MyConfigData bean) {
if (bean.isSelect) {
return Container(
margin:
EdgeInsets.only(left: 8.sp, right: 8.sp, top: 6.sp, bottom: 6.sp),
@ -103,8 +102,8 @@ class Select_circlePage extends StatelessWidget {
borderRadius: BorderRadius.circular(20.sp),
gradient: LinearGradient(
colors: [
Color(0xFF06F9FA),
Color(0xFFDC5BFD),
bean.isSelect? Color(0xFF06F9FA): Color(0xFF392D53),
bean.isSelect? Color(0xFFDC5BFD): Color(0xFF392D53),
],
begin: Alignment.centerLeft,
end: Alignment.centerRight,
@ -120,33 +119,6 @@ class Select_circlePage extends StatelessWidget {
),
),
);
} else {
return Container(
margin:
EdgeInsets.only(left: 8.sp, right: 8.sp, top: 6.sp, bottom: 6.sp),
child: Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(20.0), //
border: Border.all(
color: Color(0xFF392D53),
),
color: Color(0xFF392D53),
),
child: Padding(
padding: EdgeInsets.only(
top: 0.sp, bottom: 0.sp, left: 15.sp, right: 15.sp),
child: Center(
child: Text(
bean.name,
style: TextStyle(
fontSize: 11.0,
color: Colors.white,
),
),
),
),
),
);
}
}
}

View File

@ -1,12 +1,65 @@
import 'package:get/get.dart';
import 'package:image_picker/image_picker.dart';
import '../../network/api.dart';
import '../../network/dio_manager.dart';
import '../../util/util.dart';
import 'state.dart';
class UserinfoLogic extends GetxController {
var userId = Get.arguments ?? "";
final UserinfoState state = UserinfoState();
final ImagePicker _picker = ImagePicker();
UserBean? userInfoBean = null;
String ageMsg = "";
var isVip = 0;
var onLineCity = "";
var isLikeFoMsg = '';
@override
void onInit() async {
super.onInit();
if (userId == '') {
var data = await DioManager.instance.get(url: Api.getUserInfo);
var bean = BaseResponse<ResponseBean>.fromJson(
data, (data) => ResponseBean.fromJson(data));
if(bean.isSuccess()){
isLikeFoMsg = bean.data.imageUrgeCount.toString()+"位圈友感兴趣,其中"+bean.data.likeMeCount.toString()+"位已催您更新";
userInfoBean = bean.data.user;
isVip = userInfoBean!.vip;
onLineCity = userInfoBean!.isOnline == true? "在线":"离线";
if(userInfoBean!.city != null) {
onLineCity = onLineCity + "·" + userInfoBean!.city.toString();
}
ageMsg = getAgeCOntent(userInfoBean!.gender, userInfoBean!.age, userInfoBean!.role, userInfoBean!.orientation);
}else{
showToast(bean.msg);
}
} else {
var data = await DioManager.instance.get(url: Api.getUserInfoTA);
var bean = BaseResponse<ResponseBean>.fromJson(
data, (data) => ResponseBean.fromJson(data));
if(bean.isSuccess()){
isLikeFoMsg = bean.data.imageUrgeCount.toString()+"位圈友感兴趣,其中"+bean.data.likeMeCount.toString()+"位已催您更新";
userInfoBean = bean.data!;
isVip = userInfoBean!.vip;
onLineCity = userInfoBean!.isOnline == true? "在线":"离线";
if(userInfoBean!.city != null){
onLineCity = onLineCity +"·"+userInfoBean!.city.toString();
}
ageMsg = getAgeCOntent(userInfoBean!.gender, userInfoBean!.age, userInfoBean!.role, userInfoBean!.orientation);
}else{
showToast(bean.msg);
}
}
update();
}
Future getImageFile() async {
try {
final XFile? pickedFile = await _picker.pickImage(
@ -22,3 +75,83 @@ class UserinfoLogic extends GetxController {
}
}
}
class UserBean {
int id;
String nickname;
String avatar;
String birthday;
int age;
String signature;
int vip;
int gender;
int role;
int orientation;
double lng;
double lat;
String? city;
bool isOnline;
DateTime? offlineTime;
String avatarThumb;
UserBean({
required this.id,
required this.nickname,
required this.avatar,
required this.birthday,
required this.age,
required this.signature,
required this.vip,
required this.gender,
required this.role,
required this.orientation,
required this.lng,
required this.lat,
this.city,
required this.isOnline,
this.offlineTime,
required this.avatarThumb,
});
factory UserBean.fromJson(Map<String, dynamic> json) {
return UserBean(
id: json['id'],
nickname: json['nickname'],
avatar: json['avatar'],
birthday: json['birthday'],
age: json['age'],
signature: json['signature'],
vip: json['vip'],
gender: json['gender'],
role: json['role'],
orientation: json['orientation'],
lng: json['lng'],
lat: json['lat'],
city: json['city'],
isOnline: json['isOnline'],
offlineTime: json['offlineTime'] != null ? DateTime.parse(json['offlineTime']) : null,
avatarThumb: json['avatar_thumb'],
);
}
}
class ResponseBean {
UserBean user;
int likeMeCount;
int imageUrgeCount;
ResponseBean({
required this.user,
required this.likeMeCount,
required this.imageUrgeCount,
});
factory ResponseBean.fromJson(Map<String, dynamic> json) {
return ResponseBean(
user: UserBean.fromJson(json['user']),
likeMeCount: json['like_me_count'],
imageUrgeCount: json['image_urge_count'],
);
}
}

View File

@ -3,10 +3,5 @@ class UserinfoState {
///Initialize variables
}
List<String> imaglist = ["https://book.flutterchina.club/assets/img/logo.png",
"https://book.flutterchina.club/assets/img/logo.png",
"https://book.flutterchina.club/assets/img/logo.png",
"https://book.flutterchina.club/assets/img/logo.png",
"https://book.flutterchina.club/assets/img/logo.png",
"https://book.flutterchina.club/assets/img/logo.png",];
List<String> imaglist = [];
}

View File

@ -52,7 +52,7 @@ class _MyTabbedScreenState extends State<UserinfoPage>
@override
Widget build(BuildContext context) {
return GetBuilder(builder: (UserinfoLogic controller) {
return GetBuilder(builder: (UserinfoLogic logic) {
return Container(
decoration: BoxDecoration(
image: DecorationImage(
@ -63,17 +63,17 @@ class _MyTabbedScreenState extends State<UserinfoPage>
child: Scaffold(
backgroundColor: Colors.transparent,
appBar: MyAppBar(
centerTitle: '个人主页',
centerTitle: logic.userInfoBean!=null? logic.userInfoBean!.nickname+"的主页":"个人主页",
),
body: Stack(
children: [
Container(
child: buildContent(controller),
child: buildContent(logic),
),
Positioned(
bottom: 27.sp,
width: Get.width,
child: _MeInfoButton(controller),
child: _MeInfoButton(logic),
)
],
),
@ -199,7 +199,7 @@ class _MyTabbedScreenState extends State<UserinfoPage>
children: [
_imagelistView(controller),
Flexible(
child: buildUserContainer(),
child: buildUserContainer(controller),
),
],
),
@ -209,29 +209,29 @@ class _MyTabbedScreenState extends State<UserinfoPage>
Row(
children: [
Text(
"name",
controller.userInfoBean!=null ?controller.userInfoBean!.nickname:"" ,
style: TextStyle(
color: Color.fromRGBO(247, 250, 250, 1.0),
fontSize: 16,
),
),
SizedBox(width: 10.sp),
_buildInfoRow(),
_buildInfoRow(controller),
],
),
Row(
children: [
Container(
margin: EdgeInsets.only(right: 5.sp),
width: 10.sp,
height: 10.sp,
width:5.sp,
height: 5.sp,
decoration: BoxDecoration(
shape: BoxShape.circle,
color: Color(0xFF00FFF4),
),
),
Text(
"在线·深圳",
controller.onLineCity,
style: TextStyle(color: Color(0xFF00FFF4)),
)
],
@ -292,7 +292,7 @@ class _MyTabbedScreenState extends State<UserinfoPage>
Container(
margin: EdgeInsets.only(top: 18.sp, bottom: 14.sp),
child: Text(
"1314位圈友感兴趣其中10位已催您更新",
controller.isLikeFoMsg,
style: TextStyle(color: Colors.white30),
)),
Expanded(
@ -395,7 +395,7 @@ class _MyTabbedScreenState extends State<UserinfoPage>
);
}
Widget _buildInfoRow() {
Widget _buildInfoRow(UserinfoLogic controller) {
return Row(
children: [
Container(
@ -413,7 +413,7 @@ class _MyTabbedScreenState extends State<UserinfoPage>
padding: EdgeInsets.only(
top: 2.sp, bottom: 2.sp, left: 10.sp, right: 10.sp),
child: Text(
"33CD",
controller.ageMsg ,
style: TextStyle(
color: Colors.black,
fontSize: 10,
@ -421,16 +421,17 @@ class _MyTabbedScreenState extends State<UserinfoPage>
),
),
SizedBox(width: 6.sp),
controller.isVip>0 ?
Image(
image: AssetImage(getBaseImage("vip")),
width: 44.sp,
height: 18.sp,
),
):Container(),
],
);
}
Widget buildUserContainer() {
Widget buildUserContainer(UserinfoLogic controller) {
return Container(
margin: EdgeInsets.symmetric(horizontal: 1.sp, vertical: 14.sp),
height: 58.sp,
@ -444,7 +445,7 @@ class _MyTabbedScreenState extends State<UserinfoPage>
margin: EdgeInsets.only(left: 24.sp),
child: Center(
child: Text(
'动物是灵性的动物是灵性的动物是灵性的动物是灵性的动物是灵性的动物是灵性的动物是灵性的,不同于植物。 你若孤独, 它陪伴你。在阳光的午后,蜷缩在你的...',
controller.userInfoBean!=null ? controller.userInfoBean!.signature:"",
maxLines: 2,
style: TextStyle(color: Colors.white),
overflow: TextOverflow.ellipsis,
@ -480,24 +481,32 @@ class _MyTabbedScreenState extends State<UserinfoPage>
}
Widget _buildAvatar1(UserinfoLogic controller) {
return ClipOval(
child: GestureDetector(
onTap: () {
var imgList = <String>[];
imgList.add("https://book.flutterchina.club/assets/img/logo.png");
// Get.toNamed(AppRoutes.Swiper,arguments:imgList);
Get.toNamed(AppRoutes.Swiper, arguments: {
'imaglist':imgList,
'index':0
});
},
child: Image.network(
'https://book.flutterchina.club/assets/img/logo.png',
width: 66.sp,
height: 66.sp,
),
),
if(controller.userInfoBean==null){
return Container(
width: 66.sp,
height: 66.sp,
);
}else {
return ClipOval(
child: GestureDetector(
onTap: () {
var imgList = <String>[];
imgList.add(controller.userInfoBean!.avatar);
Get.toNamed(AppRoutes.Swiper, arguments: {
'imaglist': imgList,
'index': 0
});
},
child: Image.network(
controller.userInfoBean != null
? controller.userInfoBean!.avatar
: "",
width: 66.sp,
height: 66.sp,
),
),
);
}
}
Widget _buildImageItem(String url, UserinfoLogic controller,int index) {

View File

@ -0,0 +1,237 @@
enum ErrorCode {
SUCCESS,
ERROR,
NOT_FOUND,
PARAMS_INVALID,
BAN_ACTION,
BAN_DEVICE,
BAN_USER,
BAN_USER_CLOSED,
BAN_USER_DESTROY,
BAN_PB_ACCOUNT_LOGIN,
BAN_PB_FOREVER,
BAN_PB_DEVICE,
TOKEN_INVALID,
TOKEN_NOT_FOUND,
TOKEN_EXPIRED,
TOKEN_LOGIN_OTHER_SIDE,
TEXT_CONTAINS_DENY_WORDS,
FEIGN_ERROR,
FEIGN_CHECK_WORD_ERROR,
FREQUENT_OPERATION,
FREQUENT_SMS_VERIFY,
LIMIT_OPERATION,
LIMIT_SMS_VERIFY,
LIMIT_CSRF,
ACCOUNT_PASSWORD_INVALID,
ACCOUNT_INCOMPLETE,
ACCOUNT_NOT_FOUND,
SMS_CODE_EXPIRE,
SMS_CODE_INVALID,
PHONE_BIND_ALREADY,
VIOLATION_TEXT_FAIL,
INTEREST_JOIN,
INTEREST_EXIT,
INTEREST_NOT_FOUND,
CALLOUT_CONTENT_NO_IMAGE,
CALLOUT_CONTENT_HAVE_IMAGE,
CALLOUT_CONTENT_INVALID,
CALLOUT_QUEEN_LIMIT,
CALLOUT_LIMIT,
CALLOUT_LIMIT_EXPIRE,
CALLOUT_ALBUM_LIMIT,
}
extension ErrorCodeExtension on ErrorCode {
int get code {
switch (this) {
case ErrorCode.SUCCESS:
return 200;
case ErrorCode.ERROR:
return 500;
case ErrorCode.NOT_FOUND:
return 404;
case ErrorCode.PARAMS_INVALID:
return 1001;
case ErrorCode.BAN_ACTION:
return 4000;
case ErrorCode.BAN_DEVICE:
return 4001;
case ErrorCode.BAN_USER:
return 4002;
case ErrorCode.BAN_USER_CLOSED:
return 4003;
case ErrorCode.BAN_USER_DESTROY:
return 4004;
case ErrorCode.BAN_PB_ACCOUNT_LOGIN:
return 4100;
case ErrorCode.BAN_PB_FOREVER:
return 4101;
case ErrorCode.BAN_PB_DEVICE:
return 4102;
case ErrorCode.TOKEN_INVALID:
return 5000;
case ErrorCode.TOKEN_NOT_FOUND:
return 5001;
case ErrorCode.TOKEN_EXPIRED:
return 5002;
case ErrorCode.TOKEN_LOGIN_OTHER_SIDE:
return 5003;
case ErrorCode.TEXT_CONTAINS_DENY_WORDS:
return 10001;
case ErrorCode.FEIGN_ERROR:
return 10100;
case ErrorCode.FEIGN_CHECK_WORD_ERROR:
return 10101;
case ErrorCode.FREQUENT_OPERATION:
return 20000;
case ErrorCode.FREQUENT_SMS_VERIFY:
return 20001;
case ErrorCode.LIMIT_OPERATION:
return 21000;
case ErrorCode.LIMIT_SMS_VERIFY:
return 21001;
case ErrorCode.LIMIT_CSRF:
return 21002;
case ErrorCode.ACCOUNT_PASSWORD_INVALID:
return 30001;
case ErrorCode.ACCOUNT_INCOMPLETE:
return 30002;
case ErrorCode.ACCOUNT_NOT_FOUND:
return 30003;
case ErrorCode.SMS_CODE_EXPIRE:
return 30100;
case ErrorCode.SMS_CODE_INVALID:
return 30101;
case ErrorCode.PHONE_BIND_ALREADY:
return 30201;
case ErrorCode.VIOLATION_TEXT_FAIL:
return 30300;
case ErrorCode.INTEREST_JOIN:
return 30401;
case ErrorCode.INTEREST_EXIT:
return 30402;
case ErrorCode.INTEREST_NOT_FOUND:
return 30403;
case ErrorCode.CALLOUT_CONTENT_NO_IMAGE:
return 30501;
case ErrorCode.CALLOUT_CONTENT_HAVE_IMAGE:
return 30502;
case ErrorCode.CALLOUT_CONTENT_INVALID:
return 30503;
case ErrorCode.CALLOUT_QUEEN_LIMIT:
return 30504;
case ErrorCode.CALLOUT_LIMIT:
return 30505;
case ErrorCode.CALLOUT_LIMIT_EXPIRE:
return 30506;
case ErrorCode.CALLOUT_ALBUM_LIMIT:
return 30507;
default:
throw Exception('Unknown ErrorCode: $this');
}
}
String get message {
switch (this) {
case ErrorCode.SUCCESS:
return '成功';
case ErrorCode.ERROR:
return '发生错误';
case ErrorCode.NOT_FOUND:
return '资源没有找到';
case ErrorCode.PARAMS_INVALID:
return '参数校验错误';
case ErrorCode.BAN_ACTION:
return '用户当前操作被禁止';
case ErrorCode.BAN_DEVICE:
return '当前设备被禁止';
case ErrorCode.BAN_USER:
return '用户不存在或者状态异常';
case ErrorCode.BAN_USER_CLOSED:
return '账户已被禁用';
case ErrorCode.BAN_USER_DESTROY:
return '账户已被注销';
case ErrorCode.BAN_PB_ACCOUNT_LOGIN:
return '账户被冻结登录';
case ErrorCode.BAN_PB_FOREVER:
return '账户被永久封禁';
case ErrorCode.BAN_PB_DEVICE:
return '该设备已被封禁';
case ErrorCode.TOKEN_INVALID:
return '登录异常,请重新登录';
case ErrorCode.TOKEN_NOT_FOUND:
return '你还没有登录,请先登录';
case ErrorCode.TOKEN_EXPIRED:
return '登录超时,请重新登录';
case ErrorCode.TOKEN_LOGIN_OTHER_SIDE:
return '网络异常,请重新登录';
case ErrorCode.TEXT_CONTAINS_DENY_WORDS:
return '包含违规词,请重新编辑';
case ErrorCode.FEIGN_ERROR:
return 'feign调用发生异常';
case ErrorCode.FEIGN_CHECK_WORD_ERROR:
return '检验词汇时发生网络异常,请重试';
case ErrorCode.FREQUENT_OPERATION:
return '操作频繁';
case ErrorCode.FREQUENT_SMS_VERIFY:
return '验证码已经发送过了';
case ErrorCode.LIMIT_OPERATION:
return '操作超过限制';
case ErrorCode.LIMIT_SMS_VERIFY:
return '验证码当日发送次数已达到上线';
case ErrorCode.LIMIT_CSRF:
return '请勿重复提交';
case ErrorCode.ACCOUNT_PASSWORD_INVALID:
return '用户名或者密码错误';
case ErrorCode.ACCOUNT_INCOMPLETE:
return '账户信息不完整';
case ErrorCode.ACCOUNT_NOT_FOUND:
return '账户已被销毁或不存在';
case ErrorCode.SMS_CODE_EXPIRE:
return '验证码已过期';
case ErrorCode.SMS_CODE_INVALID:
return '验证码错误';
case ErrorCode.PHONE_BIND_ALREADY:
return '已经绑定手机号,不要重复绑定';
case ErrorCode.VIOLATION_TEXT_FAIL:
return '{} 包含违规词,请重新编辑';
case ErrorCode.INTEREST_JOIN:
return '加入圈子失败';
case ErrorCode.INTEREST_EXIT:
return '退出圈子失败';
case ErrorCode.INTEREST_NOT_FOUND:
return '没有找到指定圈子';
case ErrorCode.CALLOUT_CONTENT_NO_IMAGE:
return '您当前未添加图片或视频请至少输入30字故事内容';
case ErrorCode.CALLOUT_CONTENT_HAVE_IMAGE:
return '请至少输入5个字内容';
case ErrorCode.CALLOUT_CONTENT_INVALID:
return '包含违规词汇,无法发布';
case ErrorCode.CALLOUT_QUEEN_LIMIT:
return '至尊喊话为年会员特权,开通年会员即可享受哦~';
case ErrorCode.CALLOUT_LIMIT:
return '解锁圈子才能发布喊话';
case ErrorCode.CALLOUT_LIMIT_EXPIRE:
return '一小时只能发一条喊话哦,请等会再来~';
case ErrorCode.CALLOUT_ALBUM_LIMIT:
return '图像超过数量';
default:
throw Exception('Unknown ErrorCode: $this');
}
}
}
String getErrorMessageByCode(int code) {
for (ErrorCode errorCode in ErrorCode.values) {
if (errorCode.code == code) {
return errorCode.message;
}
}
return 'Unknown error';
}
void main() {
print(getErrorMessageByCode(200)); // Output:
print(getErrorMessageByCode(500)); // Output:
}

View File

@ -41,4 +41,19 @@ class Api {
//
static const SendShout = 'up-service/callout';
//mine
static const getUserMine = 'user-service/my/main';
//
static const getUserInfo = 'user-service/my/home';
//
static const getUserInfoTA = 'user-service/user/1/home';
}

View File

@ -226,16 +226,20 @@ class DioManager {
class BaseResponse<T> {
int code;
String msg;
T? data;
dynamic? data;
BaseResponse({required this.code, required this.msg, required this.data});
isSuccess(){
return code==200;
}
factory BaseResponse.fromJson(Map<String, dynamic> json,
T Function(dynamic) fromJsonData) {
return BaseResponse(
code: json['code'],
msg: json['msg'],
data: json['data'] != null ? fromJsonData?.call(json['data']) : null,
data: json['data'] != null ? fromJsonData?.call(json['data']) : '',
);
}
}

View File

@ -0,0 +1,72 @@
import 'dart:convert';
import 'dart:io';
import 'dart:math';
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
import 'package:image_picker/image_picker.dart';
import 'package:qiniu_flutter_sdk/qiniu_flutter_sdk.dart';
import 'package:intl/intl.dart';
import '../common/config.dart';
typedef void MyCallback(String result);
void updataQiniu(XFile pickedFile,String path ,String quToken,MyCallback myCallback) {
SmartDialog.showLoading();
var storage = Storage();
DateTime now = DateTime.now();
String yearMonth = DateFormat('yyyyMM').format(now);
String imgPath = path +yearMonth+"/"+generateRandomString(16)+ pickedFile.name;
PutController putController = PutController();
putController.addStatusListener((StorageStatus status) {
if (status == StorageStatus.Success) {
var headUrl = CONFIG.IMAGE_HEAD + imgPath;
myCallback(headUrl);
SmartDialog.dismiss();
}
print('状态变化: 当前任务状态:$status');
});
putController.addProgressListener((double status) {
print('上传进度: $status');
});
storage.putFile(File(pickedFile.path), quToken,
options: PutOptions(controller: putController, key: imgPath));
}
void upVideoQiniu(String filePath,String name,String path ,String quToken,MyCallback myCallback) {
SmartDialog.showLoading();
var storage = Storage();
DateTime now = DateTime.now();
String yearMonth = DateFormat('yyyyMM').format(now);
String imgPath = path +yearMonth+"/"+generateRandomString(16)+ name;
PutController putController = PutController();
putController.addStatusListener((StorageStatus status) {
if (status == StorageStatus.Success) {
var headUrl = CONFIG.IMAGE_HEAD + imgPath;
myCallback(headUrl);
SmartDialog.dismiss();
}
print('状态变化: 当前任务状态:$status');
});
putController.addProgressListener((double status) {
print('上传进度: $status');
});
storage.putFile(File(filePath), quToken,
options: PutOptions(controller: putController, key: imgPath));
}
String generateRandomString(int length) {
var random = Random.secure();
var values = List<int>.generate(length, (index) => random.nextInt(256));
var randomString = base64Url.encode(values);
return randomString.substring(0, length);
}

View File

@ -1,3 +1,4 @@
import 'dart:io';
import 'dart:ui';
import 'package:circle_app/common/values/values.dart';
@ -7,6 +8,9 @@ import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:get/get.dart';
import 'package:path_provider/path_provider.dart';
import 'package:get/get_state_manager/get_state_manager.dart';
import 'package:video_compress/video_compress.dart';
class Util {
@ -113,3 +117,113 @@ String convertToTenThousand(int number) {
pushLoginPage() {
Get.offAllNamed(AppRoutes.Login);
}
String filterSensitiveWords(String input, List<String> sensitiveWords) {
String filteredString = input;
for (String word in sensitiveWords) {
String replacement = '*' * word.length;
filteredString = filteredString.replaceAll(word, replacement);
}
return filteredString;
}
String getAgeCOntent (int gender,int age,int role,int orientation){
return "${getGenderContent(gender)}.${age}.${getRoleContent(role)}.${getOrientationContent(orientation)}";
}
String getGenderContent(int number) {
switch (number) {
case 1:
return "";
case 2:
return "";
case 3:
return "MTF";
case 4:
return "FTM";
case 5:
return "CD";
case 6:
return "酷儿";
default:
return "";
}
}
String getOrientationContent(int number) {
switch (number) {
case 1:
return "异性恋";
case 2:
return "同性恋";
case 3:
return "双性恋";
case 4:
return "泛性恋";
case 5:
return "无性恋";
case 6:
return "智性恋";
case 7:
return "性单恋";
default:
return "";
}
}
String getRoleContent(int number) {
switch (number) {
case 1:
return "Sado";
case 2:
return "Maso";
case 3:
return "Dom";
case 4:
return "Sub";
case 5:
return "Switch";
default:
return "";
}
}
typedef void MyCallback(String path);
Future<void> compressVideo(String inputPath, String outputPath,MyCallback myCallback) async {
final info = await VideoCompress.compressVideo(
inputPath,
quality: VideoQuality.MediumQuality,
deleteOrigin: false,
);
if (info != null&&null!=info.path) {
print(info.path);
myCallback(info.path!);
} else {
print('视频压缩失败');
}
}
//
Future<String> getApplicationDocumentsDirectoryPath() async {
final directory = await getApplicationDocumentsDirectory();
return directory.path;
}
//
Future<String> getApplicationSupportDirectoryPath() async {
final directory = await getApplicationSupportDirectory();
return directory.path;
}
//
Future<String> getTemporaryDirectoryPath() async {
final directory = await getTemporaryDirectory();
return directory.path;
}
//
Future<String> getLibraryDirectoryPath() async {
final directory = await getLibraryDirectory();
return directory.path;
}

View File

@ -76,6 +76,12 @@ dependencies:
package_info_plus: ^1.4.3+1
#视频播放器
video_player: ^2.6.1
#时间戳
flutter_intl: ^0.0.1
#图片压缩
flutter_luban: ^0.1.13
#视频压缩
video_compress: ^3.1.2
#图片缓存
cached_network_image: ^3.2.3