diff --git a/circle_app/android/app/build.gradle b/circle_app/android/app/build.gradle index 96b12fc..01aad7e 100644 --- a/circle_app/android/app/build.gradle +++ b/circle_app/android/app/build.gradle @@ -47,7 +47,7 @@ android { applicationId "com.example.circle_app" // You can update the following values to match your application needs. // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration. - minSdkVersion 19 + minSdkVersion 21 targetSdkVersion flutter.targetSdkVersion versionCode flutterVersionCode.toInteger() versionName flutterVersionName diff --git a/circle_app/android/app/src/main/AndroidManifest.xml b/circle_app/android/app/src/main/AndroidManifest.xml index dd8259a..e8618c7 100644 --- a/circle_app/android/app/src/main/AndroidManifest.xml +++ b/circle_app/android/app/src/main/AndroidManifest.xml @@ -24,6 +24,8 @@ android:name="android.permission.READ_MEDIA_IMAGES"/> + + - + diff --git a/circle_app/android/app/src/main/res/drawable/launch_background.xml b/circle_app/android/app/src/main/res/drawable/launch_background.xml index 304732f..54e6e21 100644 --- a/circle_app/android/app/src/main/res/drawable/launch_background.xml +++ b/circle_app/android/app/src/main/res/drawable/launch_background.xml @@ -4,9 +4,9 @@ - + diff --git a/circle_app/android/app/src/main/res/mipmap-hdpi/launch_image.png b/circle_app/android/app/src/main/res/mipmap-hdpi/launch_image.png new file mode 100644 index 0000000..bacf978 Binary files /dev/null and b/circle_app/android/app/src/main/res/mipmap-hdpi/launch_image.png differ diff --git a/circle_app/android/app/src/main/res/mipmap-mdpi/launch_image.png b/circle_app/android/app/src/main/res/mipmap-mdpi/launch_image.png new file mode 100644 index 0000000..969ac90 Binary files /dev/null and b/circle_app/android/app/src/main/res/mipmap-mdpi/launch_image.png differ diff --git a/circle_app/android/app/src/main/res/mipmap-xhdpi/launch_image.png b/circle_app/android/app/src/main/res/mipmap-xhdpi/launch_image.png new file mode 100644 index 0000000..252cd3b Binary files /dev/null and b/circle_app/android/app/src/main/res/mipmap-xhdpi/launch_image.png differ diff --git a/circle_app/android/app/src/main/res/mipmap-xxhdpi/launch_image.png b/circle_app/android/app/src/main/res/mipmap-xxhdpi/launch_image.png new file mode 100644 index 0000000..5b42848 Binary files /dev/null and b/circle_app/android/app/src/main/res/mipmap-xxhdpi/launch_image.png differ diff --git a/circle_app/android/app/src/main/res/mipmap-xxxhdpi/launch_image.png b/circle_app/android/app/src/main/res/mipmap-xxxhdpi/launch_image.png new file mode 100644 index 0000000..14511d8 Binary files /dev/null and b/circle_app/android/app/src/main/res/mipmap-xxxhdpi/launch_image.png differ diff --git a/circle_app/lib/app/account/view.dart b/circle_app/lib/app/account/view.dart index b0fd82c..829831c 100644 --- a/circle_app/lib/app/account/view.dart +++ b/circle_app/lib/app/account/view.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; +import 'package:shared_preferences/shared_preferences.dart'; import '../../components/my_app_bar.dart'; import '../../router/app_routers.dart'; @@ -260,7 +261,10 @@ class AccountPage extends StatelessWidget { // ), // ), // ), - Container( + GestureDetector(onTap: (){ + getAuthorization(); + }, + child: Container( margin: EdgeInsets.only( top: 40.0.sp, left: 72.0.sp, right: 72.0.sp), height: 42.sp, @@ -277,7 +281,8 @@ class AccountPage extends StatelessWidget { ), ), ), - ), + ),) + , ], ), ), @@ -285,4 +290,9 @@ class AccountPage extends StatelessWidget { ), ); } + Future getAuthorization() async{ + SharedPreferences prefs = await SharedPreferences.getInstance(); + prefs.remove("Authorization"); + Get.toNamed(AppRoutes.Login); + } } diff --git a/circle_app/lib/app/blacklist/logic.dart b/circle_app/lib/app/blacklist/logic.dart index 114a54b..f8e806a 100644 --- a/circle_app/lib/app/blacklist/logic.dart +++ b/circle_app/lib/app/blacklist/logic.dart @@ -1,7 +1,16 @@ +import 'package:circle_app/router/app_routers.dart'; import 'package:get/get.dart'; +import 'package:shared_preferences/shared_preferences.dart'; +import '../../network/api.dart'; +import '../../network/dio_manager.dart'; +import '../../util/device.dart'; +import '../../util/util.dart'; +import '../login/login/logic.dart'; import 'state.dart'; class BlacklistLogic extends GetxController { final BlacklistState state = BlacklistState(); + + } diff --git a/circle_app/lib/app/circle/logic.dart b/circle_app/lib/app/circle/logic.dart index 94c79ad..8011a75 100644 --- a/circle_app/lib/app/circle/logic.dart +++ b/circle_app/lib/app/circle/logic.dart @@ -1,10 +1,152 @@ +import 'package:circle_app/util/util.dart'; import 'package:flutter/cupertino.dart'; import 'package:get/get.dart'; +import '../../network/api.dart'; +import '../../network/dio_manager.dart'; import 'state.dart'; class CircleLogic extends GetxController { - PageController pageController = PageController(initialPage: 1,viewportFraction: 0.8 - ); + PageController pageController = PageController(initialPage: 1, viewportFraction: 0.8); + InterestsBean circle = InterestsBean(lists: []); final CircleState state = CircleState(); + int page = 1; + + @override + void onInit() async { + super.onInit(); + var data = await DioManager.instance + .get(url: Api.getCircleInterests, params: {"page": page}); + var bean = BaseResponse.fromJson( + data, (data) => InterestsBean.fromJson(data)); + circle = bean.data!; + update(); + } + + loadMore() async { + page = page++; + var data = await DioManager.instance + .get(url: Api.getCircleInterests, params: {"page": page}); + var bean = BaseResponse.fromJson( + data, (data) => InterestsBean.fromJson(data)); + circle = bean.data!; + update(); + } + + + outCircle(String interest_id,bool isStatus) async{ + var data = await DioManager.instance.post(url: Api.outCrrcle+interest_id+"/join", params: {"status": isStatus?"0":"1"}); + var bean = BaseResponse.fromJson(data, (data) => data); + if (bean.code == 200) { + circle.lists.forEach((element) { + if(element.id.toString()==interest_id.toString()){ + element.isJoin = !isStatus; + } + }); + } + showToast(bean.msg); + } +} + +class InterestsBean { + List lists; + + InterestsBean({required this.lists}); + + factory InterestsBean.fromJson(Map json) { + List listsJson = json['lists']; + List lists = listsJson.map((e) => Circle.fromJson(e)).toList(); + return InterestsBean(lists: lists); + } +} + +class Circle { + int id; + String image; + String title; + String intro; + double amount; + double oldAmount; + String lastCalloutTime; + bool isJoin; + dynamic isLike; + int viewTotal; + int joinTotal; + List lastJoinUsers; + + Circle({ + required this.id, + required this.image, + required this.title, + required this.intro, + required this.amount, + required this.oldAmount, + required this.lastCalloutTime, + required this.isJoin, + required this.isLike, + required this.viewTotal, + required this.joinTotal, + required this.lastJoinUsers, + }); + + factory Circle.fromJson(Map json) { + List lastJoinUsersJson = json['last_join_users']; + List lastJoinUsers = + lastJoinUsersJson.map((e) => JoinUser.fromJson(e)).toList(); + + return Circle( + id: json['id'], + image: json['image'], + title: json['title'], + intro: json['intro'], + amount: json['amount'].toDouble(), + oldAmount: json['old_amount'].toDouble(), + lastCalloutTime: json['last_callout_time'], + isJoin: json['is_join'], + isLike: json['is_like'], + viewTotal: json['view_total'], + joinTotal: json['join_total'], + lastJoinUsers: lastJoinUsers, + ); + } +} + +class JoinUser { + int id; + String avatar; + String nickname; + + JoinUser({ + required this.id, + required this.avatar, + required this.nickname, + }); + + factory JoinUser.fromJson(Map json) { + return JoinUser( + id: json['id'], + avatar: json['avatar'], + nickname: json['nickname'], + ); + } +} + +class LastJoinUser { + int id; + String avatar; + String nickname; + + LastJoinUser({ + required this.id, + required this.avatar, + required this.nickname, + }); + + factory LastJoinUser.fromJson(Map json) { + return LastJoinUser( + id: json['id'], + avatar: json['avatar'], + nickname: json['nickname'], + ); + } } diff --git a/circle_app/lib/app/circle/view.dart b/circle_app/lib/app/circle/view.dart index 3cf6a3c..8d5b358 100644 --- a/circle_app/lib/app/circle/view.dart +++ b/circle_app/lib/app/circle/view.dart @@ -16,50 +16,61 @@ class CirclePage extends StatelessWidget { @override Widget build(BuildContext context) { - return Container( - - width: MediaQuery.of(context).size.width, - height: MediaQuery.of(context).size.height, - decoration: BoxDecoration( - color: Color(0xFF423055), - image: DecorationImage( - fit: BoxFit.fill, - image: AssetImage(getBaseImage('home_back')))), - // child: Image.asset( - // getBaseImage('bg'), - // fit: BoxFit.fill, - // ), - child: Scaffold( - backgroundColor: Colors.transparent, - body: SafeArea( - child: GetBuilder(builder: (CircleLogic controller) { - return Container( - child: Column(children: [ - navigatorItem(), - Text(controller.state.msg), - //组件使用 - Expanded( - child: Swiper( - itemBuilder: (BuildContext context, int index) { - return _getPageByIndex(index); - }, - onIndexChanged: (index) { - controller.state.index = index; - controller.update(); - }, - index: controller.state.index, - itemCount: 3, - viewportFraction: 0.95, - // scale: 0.9, - loop: false, - // pagination: new SwiperPagination(),//如果不填则不显示指示点 - // control: new SwiperControl(),//如果不填则不显示左右按钮 - )) - ]), - ); - }), - ), - )); + return GetBuilder(builder: (logic) { + return Container( + width: MediaQuery + .of(context) + .size + .width, + height: MediaQuery + .of(context) + .size + .height, + decoration: BoxDecoration( + color: Color(0xFF423055), + image: DecorationImage( + fit: BoxFit.fill, + image: AssetImage(getBaseImage('home_back')))), + // child: Image.asset( + // getBaseImage('bg'), + // fit: BoxFit.fill, + // ), + child: Scaffold( + backgroundColor: Colors.transparent, + body: SafeArea( + child: GetBuilder(builder: (CircleLogic controller) { + return Container( + child: Column(children: [ + navigatorItem(), + Text(controller.state.msg), + //组件使用 + Expanded( + child: Swiper( + itemBuilder: (BuildContext context, int index) { + return _getPageByIndex(index); + }, + onIndexChanged: (index) { + controller.state.index = index; + if(index==logic.circle.lists.length-1){ + logic.loadMore(); + } + print(index.toString()); + controller.update(); + }, + index: controller.state.index, + itemCount: logic.circle.lists.length, + viewportFraction: 0.95, + // scale: 0.9, + loop: false, + // pagination: new SwiperPagination(),//如果不填则不显示指示点 + // control: new SwiperControl(),//如果不填则不显示左右按钮 + )) + ]), + ); + }), + ), + )); + }); } navigatorItem() { @@ -128,45 +139,42 @@ class CirclePage extends StatelessWidget { circleWidget(String url, {double width = 30}) { return GestureDetector( child: Stack( - alignment: Alignment.center, - children: [ - Image.asset( - getCircleImage('avatar_bg'), - width: width.sp, - ), - ClipOval( - child: Image.network( - url, - width: (width - 1).sp, - height: (width - 1).sp, - fit: BoxFit.fill, - ), - ) - ], - )); + alignment: Alignment.center, + children: [ + Image.asset( + getCircleImage('avatar_bg'), + width: width.sp, + ), + ClipOval( + child: Image.network( + url, + width: (width - 1).sp, + height: (width - 1).sp, + fit: BoxFit.fill, + ), + ) + ], + )); } - _getPageByIndex(int index) { + _getPageByIndex(int myIndex) { + var bean =logic.circle.lists[myIndex]; TextSpan span = TextSpan( text: '查看更多', style: TextStyle(color: Color(0xFFFF4DF6), fontSize: 14.sp), ); TextSpan descSpan = TextSpan( - text: '圈子介绍圈子介绍圈子介绍圈子介绍圈子介绍圈子介绍圈子介绍圈子介绍圈子介绍圈子介绍圈子介绍圈', + text: bean.intro, style: TextStyle(color: Colors.white, fontSize: 12.sp), ); - List urlList = [ - 'https://p3-passport.byteimg.com/img/user-avatar/eb429d4dbb3c246f580a6f7894f2b246~100x100.awebp', - 'https://p3-passport.byteimg.com/img/user-avatar/eb429d4dbb3c246f580a6f7894f2b246~100x100.awebp', - 'https://p3-passport.byteimg.com/img/user-avatar/eb429d4dbb3c246f580a6f7894f2b246~100x100.awebp' - ]; + List urlList = bean.lastJoinUsers; List widgets = []; int index = 0; urlList.forEach((element) { widgets.add(Positioned( left: 15.sp * index, - child: circleWidget(element), + child: circleWidget(element.avatar), )); index++; }); @@ -196,65 +204,69 @@ class CirclePage extends StatelessWidget { if (index == 0) { return Container( padding: EdgeInsets.only(left: 12.sp, right: 12.sp), - height: 72.sp, + height: 88.sp, decoration: BoxDecoration( image: DecorationImage( fit: BoxFit.fill, image: AssetImage( getCircleImage('circle_desc')))), - child: Column( - children: [ - Container( - width: Get.width, - child: RichText( - overflow: TextOverflow.fade, - maxLines: 2, - text: TextSpan(children: [ - descSpan, - span - ])), - ), - Container( - child: Row( - children: [ - Row( - children: [ - Container( - height: 30.sp, - width: 30.0.sp + - 15.sp * (widgets.length - 1.sp), - child: Stack( - children: widgets, - ), - ), - SizedBox( - width: 8.sp, - ), - Text( - '3.5万圈友', - style: TextStyle( - color: Colors.white, - fontSize: 12.sp), - ), - SizedBox( - width: 8.sp, - ), - Image.asset( - getCircleImage('play'), - width: 20.sp, - ) - ], - ) - ], + child: Container( + margin: EdgeInsets.only(top: 12.sp), + child: Column( + children: [ + Container( + width: Get.width, + child: RichText( + overflow: TextOverflow.fade, + maxLines: 2, + text: TextSpan(children: [ + descSpan, + span + ])), ), - ), - ], + Container( + child: Row( + children: [ + Row( + children: [ + Container( + height: 30.sp, + width: 30.0.sp + + 15.sp * + (widgets.length - 1.sp), + child: Stack( + children: widgets, + ), + ), + SizedBox( + width: 8.sp, + ), + Text( + bean.viewTotal.toString(), + style: TextStyle( + color: Colors.white, + fontSize: 12.sp), + ), + SizedBox( + width: 8.sp, + ), + Image.asset( + getCircleImage('play'), + width: 20.sp, + ) + ], + ) + ], + ), + ), + ], + ), ), ); } else if (index == 1) { - return vipDynamicItem(); + return vipDynamicItem(bean); } else { - return normalDynamicItem(); + return normalDynamicItem(bean); } }), ), @@ -269,46 +281,69 @@ class CirclePage extends StatelessWidget { image: DecorationImage( fit: BoxFit.fill, image: - AssetImage(getCircleImage('top_circle_bg')))), + AssetImage(getCircleImage('top_circle_bg')))), child: Row( // mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Image.network( - 'https://p3-passport.byteimg.com/img/user-avatar/eb429d4dbb3c246f580a6f7894f2b246~100x100.awebp', + Container( width: 42.sp, height: 42.sp, - fit: BoxFit.fill, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8.0), + gradient: LinearGradient( + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + colors: [ + Color(0xFF71F3F2), + Color(0xFFF558FF), + ], + stops: [0.0365, 0.9427], + ), + ), + padding: EdgeInsets.all(1.sp), + child: ClipRRect( + borderRadius: BorderRadius.circular(8.0), + child: Image.network( + bean.image, + width: 40.sp, + height: 40.sp, + ), + ), ), Expanded( child: Container( - padding: EdgeInsets.only(left: 8.sp, top: 12.sp), - alignment: Alignment.centerLeft, - height: 72.sp, - child: Column( - children: [ - Text( - '圈子名称', - style: TextStyle( - color: Colors.white, - fontSize: 18.sp, - fontWeight: FontWeight.w600), + padding: EdgeInsets.only( + left: 8.sp, top: 12.sp), + // alignment: Alignment., + height: 72.sp, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + bean.title, + style: TextStyle( + color: Colors.white, + fontSize: 18.sp, + fontWeight: FontWeight.w600), + ), + SizedBox( + height: 4.sp, + ), + Text( + '${bean.joinTotal.toStringAsFixed(0)}万人看过', + textAlign: TextAlign.left, + style: TextStyle( + color: Color(0xff03FEFB), + fontSize: 12.sp, + ), + ), + ], ), - SizedBox( - height: 4.sp, - ), - Text( - '35.6万人看过', - style: TextStyle( - color: Color(0xff03FEFB), - fontSize: 12.sp, - ), - ), - ], - ), - )), + )), GestureDetector( onTap: () { - Get.toNamed(AppRoutes.Login); + logic.outCircle(bean.id.toString(),bean.isJoin); + // Get.toNamed(AppRoutes.Login); // Get.bottomSheet(tipWdiget(), // Get.bottomSheet(Open_vip_tipPage(), // isScrollControlled: true, enableDrag: false); @@ -322,8 +357,11 @@ class CirclePage extends StatelessWidget { ), )), Positioned( - top: 70.sp, - child: Image.asset(getCircleImage('circle_line'),width: Get.width,)), + top: 70.sp, + child: Image.asset( + getCircleImage('circle_line'), + width: Get.width, + )), Positioned( bottom: 56.sp, right: 0.sp, @@ -340,23 +378,19 @@ class CirclePage extends StatelessWidget { } ///至尊喊话 - vipDynamicItem() { + vipDynamicItem(Circle bean) { Text descText = Text( - '圈子介绍圈子介绍圈子介绍圈子介绍圈子介绍圈子介绍圈子介圈子介绍圈子介绍圈', + bean.intro, style: TextStyle(color: Colors.white, fontSize: 14.sp), ); - List urlList = [ - 'https://p3-passport.byteimg.com/img/user-avatar/eb429d4dbb3c246f580a6f7894f2b246~100x100.awebp', - 'https://p3-passport.byteimg.com/img/user-avatar/eb429d4dbb3c246f580a6f7894f2b246~100x100.awebp', - 'https://p3-passport.byteimg.com/img/user-avatar/eb429d4dbb3c246f580a6f7894f2b246~100x100.awebp' - ]; + List urlList = bean.lastJoinUsers; List widgets = []; int index = 0; urlList.forEach((element) { widgets.add(Positioned( left: 12.sp * index, - child: circleWidget(element, width: 24), + child: circleWidget(element.avatar, width: 24), )); index++; }); @@ -403,79 +437,80 @@ class CirclePage extends StatelessWidget { children: [ GestureDetector( child: Stack( - alignment: Alignment.center, - children: [ - Image.asset( - getCircleImage('avatar_bg'), - width: 42.sp, - ), - ClipOval( - child: Image.network( - 'https://p3-passport.byteimg.com/img/user-avatar/eb429d4dbb3c246f580a6f7894f2b246~100x100.awebp', - width: 40.sp, - height: 40.sp, - fit: BoxFit.fill, - ), - ) - ], - )), + alignment: Alignment.center, + children: [ + Image.asset( + getCircleImage('avatar_bg'), + width: 42.sp, + ), + ClipOval( + child: Image.network( + 'https://p3-passport.byteimg.com/img/user-avatar/eb429d4dbb3c246f580a6f7894f2b246~100x100.awebp', + width: 40.sp, + height: 40.sp, + fit: BoxFit.fill, + ), + ) + ], + )), Expanded( child: Container( - padding: EdgeInsets.only(left: 8.sp, top: 12.sp), - alignment: Alignment.centerLeft, - height: 72.sp, - child: Column( - children: [ - Row( + padding: EdgeInsets.only(left: 8.sp, top: 12.sp), + alignment: Alignment.centerLeft, + height: 72.sp, + child: Column( children: [ - Text( - '圈子名称', - style: TextStyle( - color: Colors.white, - fontSize: 18.sp, - fontWeight: FontWeight.w600), + Row( + children: [ + Text( + '圈子名称', + style: TextStyle( + color: Colors.white, + fontSize: 18.sp, + fontWeight: FontWeight.w600), + ), + SizedBox( + width: 8.sp, + ), + Image.asset( + getCircleImage('vip'), + width: 36.sp, + ) + ], ), SizedBox( - width: 8.sp, + height: 4.sp, ), - Image.asset( - getCircleImage('vip'), - width: 36.sp, - ) - ], - ), - SizedBox( - height: 4.sp, - ), - Row( - children: [ - Container( - alignment: Alignment.center, - height: 18.sp, - padding: + Row( + children: [ + Container( + alignment: Alignment.center, + height: 18.sp, + padding: EdgeInsets.only(left: 6.sp, right: 6.sp), - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(9.sp), - gradient: const LinearGradient( - begin: Alignment(0.25, 0.5), - end: Alignment(0.75, 0.5), - colors: [ - Color(0xff8DFFF8), - Color(0xffB5D3FF) - ])), - child: Text( - '男.33.DOM.异性恋', - style: TextStyle( - color: Colors.black, - fontSize: 12.sp, - ), - ), - ) + decoration: BoxDecoration( + borderRadius: BorderRadius.circular( + 9.sp), + gradient: const LinearGradient( + begin: Alignment(0.25, 0.5), + end: Alignment(0.75, 0.5), + colors: [ + Color(0xff8DFFF8), + Color(0xffB5D3FF) + ])), + child: Text( + '男.33.DOM.异性恋', + style: TextStyle( + color: Colors.black, + fontSize: 12.sp, + ), + ), + ) + ], + ), ], ), - ], - ), - )), + )), ], ), ), @@ -492,7 +527,7 @@ class CirclePage extends StatelessWidget { crossAxisCount: 3, //横轴三个子widget crossAxisSpacing: 8.sp, childAspectRatio: 1.0 //宽高比为1时,子widget - ), + ), children: [ ClipRRect( borderRadius: BorderRadius.circular(6.sp), @@ -537,9 +572,10 @@ class CirclePage extends StatelessWidget { ), Expanded( child: Text( - '1位圈友已私聊', - style: TextStyle(color: Colors.white, fontSize: 12.sp), - )), + '1位圈友已私聊', + style: TextStyle(color: Colors.white, fontSize: 12 + .sp), + )), Image.asset( getCircleImage('chat'), width: 60.sp, @@ -556,9 +592,9 @@ class CirclePage extends StatelessWidget { } ///普通图文喊话 - normalDynamicItem() { + normalDynamicItem(Circle bean) { Text descText = Text( - '圈子介绍圈子介绍圈子介绍圈子介绍圈子介绍圈子介绍圈子介圈子介绍圈子介绍圈', + bean.intro, style: TextStyle(color: Colors.white, fontSize: 14.sp), ); @@ -613,79 +649,80 @@ class CirclePage extends StatelessWidget { children: [ GestureDetector( child: Stack( - alignment: Alignment.center, - children: [ - Image.asset( - getCircleImage('avatar_bg'), - width: 42.sp, - ), - ClipOval( - child: Image.network( - 'https://p3-passport.byteimg.com/img/user-avatar/eb429d4dbb3c246f580a6f7894f2b246~100x100.awebp', - width: 40.sp, - height: 40.sp, - fit: BoxFit.fill, - ), - ) - ], - )), + alignment: Alignment.center, + children: [ + Image.asset( + getCircleImage('avatar_bg'), + width: 42.sp, + ), + ClipOval( + child: Image.network( + 'https://p3-passport.byteimg.com/img/user-avatar/eb429d4dbb3c246f580a6f7894f2b246~100x100.awebp', + width: 40.sp, + height: 40.sp, + fit: BoxFit.fill, + ), + ) + ], + )), Expanded( child: Container( - padding: EdgeInsets.only(left: 8.sp, top: 12.sp), - alignment: Alignment.centerLeft, - height: 72.sp, - child: Column( - children: [ - Row( + padding: EdgeInsets.only(left: 8.sp, top: 12.sp), + alignment: Alignment.centerLeft, + height: 72.sp, + child: Column( children: [ - Text( - '圈子名称', - style: TextStyle( - color: Colors.white, - fontSize: 18.sp, - fontWeight: FontWeight.w600), + Row( + children: [ + Text( + '圈子名称', + style: TextStyle( + color: Colors.white, + fontSize: 18.sp, + fontWeight: FontWeight.w600), + ), + SizedBox( + width: 8.sp, + ), + Image.asset( + getCircleImage('vip'), + width: 36.sp, + ) + ], ), SizedBox( - width: 8.sp, + height: 4.sp, ), - Image.asset( - getCircleImage('vip'), - width: 36.sp, - ) - ], - ), - SizedBox( - height: 4.sp, - ), - Row( - children: [ - Container( - alignment: Alignment.center, - height: 18.sp, - padding: + Row( + children: [ + Container( + alignment: Alignment.center, + height: 18.sp, + padding: EdgeInsets.only(left: 6.sp, right: 6.sp), - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(9.sp), - gradient: LinearGradient( - begin: Alignment(0.25, 0.5), - end: Alignment(0.75, 0.5), - colors: [ - Color(0xff8DFFF8), - Color(0xffB5D3FF) - ])), - child: Text( - '男.33.DOM.异性恋', - style: TextStyle( - color: Colors.black, - fontSize: 12.sp, - ), - ), - ) + decoration: BoxDecoration( + borderRadius: BorderRadius.circular( + 9.sp), + gradient: LinearGradient( + begin: Alignment(0.25, 0.5), + end: Alignment(0.75, 0.5), + colors: [ + Color(0xff8DFFF8), + Color(0xffB5D3FF) + ])), + child: Text( + '男.33.DOM.异性恋', + style: TextStyle( + color: Colors.black, + fontSize: 12.sp, + ), + ), + ) + ], + ), ], ), - ], - ), - )), + )), ], ), ), @@ -702,7 +739,7 @@ class CirclePage extends StatelessWidget { crossAxisCount: 3, //横轴三个子widget crossAxisSpacing: 8.sp, childAspectRatio: 1.0 //宽高比为1时,子widget - ), + ), children: [ ClipRRect( borderRadius: BorderRadius.circular(6.sp), @@ -747,9 +784,10 @@ class CirclePage extends StatelessWidget { ), Expanded( child: Text( - '1位圈友已私聊', - style: TextStyle(color: Colors.white, fontSize: 12.sp), - )), + '1位圈友已私聊', + style: TextStyle(color: Colors.white, fontSize: 12 + .sp), + )), Image.asset( getCircleImage('chat'), width: 60.sp, diff --git a/circle_app/lib/app/feedback/logic.dart b/circle_app/lib/app/feedback/logic.dart index dc3f8d3..fecdada 100644 --- a/circle_app/lib/app/feedback/logic.dart +++ b/circle_app/lib/app/feedback/logic.dart @@ -30,8 +30,6 @@ class FeedbackLogic extends GetxController { void _setImageFileListFromFile(XFile pickedFile) { PutController putController = PutController(); - - // 添加任务状态监听 putController.addStatusListener((StorageStatus status) { print('状态变化: 当前任务状态:$status'); }); diff --git a/circle_app/lib/app/help/logic.dart b/circle_app/lib/app/help/logic.dart index d3ebd72..0fb26b4 100644 --- a/circle_app/lib/app/help/logic.dart +++ b/circle_app/lib/app/help/logic.dart @@ -24,7 +24,7 @@ class HelpLogic extends GetxController { ), FaqItem( question: '·发现图片或视频被人盗取了怎么办?', - answer: '答:立即举报,并向在线客户反应情况。\n 划重点:核实后会对其做出处理并要求删除相关内容~', + answer: '答:立即举报,并向在线客户反应情况。\n画重点:核实后会对其做出处理并要求删除相关内容~', ), // 添加更多的问题和答案 ]; diff --git a/circle_app/lib/app/help/view.dart b/circle_app/lib/app/help/view.dart index 404e823..9526a44 100644 --- a/circle_app/lib/app/help/view.dart +++ b/circle_app/lib/app/help/view.dart @@ -1,4 +1,3 @@ -import 'package:dio/dio.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; diff --git a/circle_app/lib/app/login/complete_material/logic.dart b/circle_app/lib/app/login/complete_material/logic.dart index 7f6638e..fac26e4 100644 --- a/circle_app/lib/app/login/complete_material/logic.dart +++ b/circle_app/lib/app/login/complete_material/logic.dart @@ -1,22 +1,70 @@ +import 'dart:io'; + +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_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:qiniu_flutter_sdk/qiniu_flutter_sdk.dart'; +import '../../../network/api.dart'; +import '../../../util/device.dart'; +import '../../select_circle/logic.dart'; +import '../login/logic.dart'; import 'state.dart'; 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 = ''; + + late ConfigBean configBean; + List numbers = []; + + List genderList = []; + + List orientationList = []; + + List roleList = []; + + @override + void onInit() async { + var data = + await DioManager.instance.get(url: Api.getqiniuToken, params: {}); + var bean = BaseResponse.fromJson( + data, (data) => QnTokenData.fromJson(data)); + quToken = bean.data!.token.toString(); + + var data1 = + await DioManager.instance.get(url: Api.getCircleList, params: {}); + var bean1 = BaseResponse.fromJson( + data1, (data1) => ConfigBean.fromJson(data1)); + configBean = bean1.data!; + + configBean.genderMap.forEach((key, value) { + genderList.add(value); + }); + + configBean.orientationMap.forEach((key, value) { + orientationList.add(value); + }); + configBean.roleMap.forEach((key, value) { + roleList.add(value); + }); + } + Future getImageFile() async { try { final XFile? pickedFile = await _picker.pickImage( source: ImageSource.gallery, ); // setState(() { - // _setImageFileListFromFile(pickedFile); + _setImageFileListFromFile(pickedFile!); // }); } catch (e) { // setState(() { @@ -25,23 +73,111 @@ class Complete_materialLogic extends GetxController { } } - checkInfo() { + void _setImageFileListFromFile(XFile pickedFile) { + SmartDialog.showLoading(); + PutController putController = PutController(); + putController.addStatusListener((StorageStatus status) { + if (status == StorageStatus.Success) { + headUrl = "http://qiniuyun.ikuayou.com/" + pickedFile.name; + print(headUrl); + update(); + SmartDialog.dismiss(); + } + print('状态变化: 当前任务状态:$status'); + }); + storage.putFile(File(pickedFile.path), quToken, + options: PutOptions(controller: putController, key: pickedFile.name)); + } + + checkInfo() async { if (state.textEditingController.text.isEmpty) { showToast('请输入您的昵称'); + return; } else if (state.sex.isEmpty) { showToast('请选择您的属性'); + return; } else if (state.age.isEmpty) { showToast('请选择您的年龄'); + return; } else if (state.role.isEmpty) { showToast('请选择您的角色'); + return; } else if (state.role.isEmpty) { showToast('请选择您的角色'); + return; } else if (state.orientation.isEmpty) { showToast('请选择您的取向'); - }else if (state.interest.isEmpty) { + return; + } else if (numbers.isEmpty) { showToast('请选择您的兴趣'); + // return; } else if (state.descEditingController.text.isEmpty) { showToast('请输入您的交友宣言'); + return; + } else if (state.descEditingController.text.length < 5) { + showToast('您的交友宣言太短'); + return; + } + if (headUrl == '') { + showToast('请上传头像'); + return; + } + LatLng location = await getLocation(); + List 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 爱好 + 'lat': location.latitude, + 'lng': location.longitude, + 'nickname': state.textEditingController.text, + 'signature': state.descEditingController.text, + }); + var bean = BaseResponse.fromJson(data, (data) => data); + if (bean.code == 200) { + Get.toNamed(AppRoutes.Home); + } + } + + editInfo() async { + Map params = Map(); + if (numbers.length > 0) { + List interestsList = []; + numbers.forEach((element) { + interestsList.add(element.id); + }); + params['interests'] = interestsList; + } + if (!headUrl.isEmpty) { + params['avatar_url'] = headUrl; + } + if (!state.brithday.isEmpty) { + params['birthday'] = state.brithday; + } + if (!state.genderId.isEmpty) { + params['gender'] = state.genderId; + } + if (!state.roleId.isEmpty) { + params['role'] = state.roleId; + } + if (!state.orientationId.isEmpty) { + params['orientation'] = state.orientationId; + } + LatLng location = await getLocation(); + params['lat'] = location.latitude; + params['lng'] = location.longitude; + params['nickname'] = state.textEditingController.text; + params['signature'] = state.descEditingController.text; + var data = await DioManager.instance.put(url: Api.UpdataUserInfo, params: params); + var bean = BaseResponse.fromJson(data, (data) => data); + if (bean.code == 200) { + Get.back(); } } @@ -50,25 +186,39 @@ class Complete_materialLogic extends GetxController { } //时间戳转年龄 - String getAge(PDuration brt){ + String getAge(PDuration brt) { int age = 0; DateTime dateTime = DateTime.now(); - int yearNow = dateTime.year; //当前年份 - int monthNow = dateTime.month; //当前月份 + 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; //计算整岁数 + age = yearNow - yearBirth; //计算整岁数 if (monthNow <= monthBirth) { if (monthNow == monthBirth) { - if (dayOfMonthNow < dayOfMonthBirth) age--;//当前日期在生日之前,年龄减一 + if (dayOfMonthNow < dayOfMonthBirth) age--; //当前日期在生日之前,年龄减一 } else { - age--;//当前月份在生日之前,年龄减一 + age--; //当前月份在生日之前,年龄减一 } } return age.toString(); } } + +class QnTokenData { + final String token; + final String cdnPrefix; + + QnTokenData({required this.token, required this.cdnPrefix}); + + factory QnTokenData.fromJson(Map json) { + return QnTokenData( + token: json['token'], + cdnPrefix: json['cdn_prefix'], + ); + } +} diff --git a/circle_app/lib/app/login/complete_material/state.dart b/circle_app/lib/app/login/complete_material/state.dart index 8f8370b..32a000d 100644 --- a/circle_app/lib/app/login/complete_material/state.dart +++ b/circle_app/lib/app/login/complete_material/state.dart @@ -5,10 +5,14 @@ class Complete_materialState { TextEditingController descEditingController = TextEditingController(); String nickName = ''; String sex = ''; + String genderId = ''; String age = ''; String brithday = ''; String role = ''; + String roleId = ''; String orientation = ''; + String orientationId = ''; + List interest = []; Complete_materialState() { diff --git a/circle_app/lib/app/login/complete_material/view.dart b/circle_app/lib/app/login/complete_material/view.dart index 2bc25c3..650b06e 100644 --- a/circle_app/lib/app/login/complete_material/view.dart +++ b/circle_app/lib/app/login/complete_material/view.dart @@ -1,9 +1,9 @@ import 'package:circle_app/components/my_app_bar.dart'; +import 'package:circle_app/router/app_routers.dart'; import 'package:circle_app/util/util.dart'; import 'package:flutter/material.dart'; import 'package:flutter_pickers/pickers.dart'; import 'package:flutter_pickers/style/default_style.dart'; -import 'package:flutter_pickers/style/picker_style.dart'; import 'package:flutter_pickers/time_picker/model/date_mode.dart'; import 'package:flutter_pickers/time_picker/model/pduration.dart'; import 'package:flutter_pickers/time_picker/model/suffix.dart'; @@ -15,10 +15,10 @@ import 'logic.dart'; class Complete_materialPage extends StatelessWidget { Complete_materialPage({Key? key}) : super(key: key); final logic = Get.put(Complete_materialLogic()); + // PickerStyle pickerStyle = PickerStyle(); @override Widget build(BuildContext context) { - return GetBuilder(builder: (Complete_materialLogic controller) { return Stack( children: [ @@ -54,11 +54,20 @@ class Complete_materialPage extends StatelessWidget { onTap: () { controller.getImageFile(); }, - child: Image.asset( - getLoginImage('add'), - width: 86.sp, - height: 86.sp, - ), + child: controller.headUrl == '' + ? Image.asset( + getLoginImage('add'), + width: 86.sp, + height: 86.sp, + ) + : ClipOval( + child: Image.network( + fit: BoxFit.fill, + controller.headUrl, + width: 86.sp, + height: 86.sp, + ), + ), ), SizedBox( height: 15.sp, @@ -79,13 +88,13 @@ class Complete_materialPage extends StatelessWidget { fontWeight: FontWeight.w500, fontSize: 14.sp), decoration: InputDecoration( - hintText: '请输入昵称', - hintStyle: TextStyle( - color: Colors.white, - fontWeight: FontWeight.w500, - fontSize: 14.sp), - border: InputBorder.none, - ), + hintText: '请输入昵称', + hintStyle: TextStyle( + color: Colors.white, + fontWeight: FontWeight.w500, + fontSize: 14.sp), + border: InputBorder.none, + ), ), () {}, img: 'edit'), @@ -101,17 +110,19 @@ class Complete_materialPage extends StatelessWidget { showSexPiker(context, controller); }), funcWidget( - '年龄', + '生日', Text( controller.state.age, style: TextStyle( color: Colors.white, fontSize: 14.sp, fontWeight: FontWeight.w500), - ), - () { - showAgePiker(context,controller,); - }), + ), () { + showAgePiker( + context, + controller, + ); + }), funcWidget( '角色', Text( @@ -120,10 +131,9 @@ class Complete_materialPage extends StatelessWidget { color: Colors.white, fontSize: 14.sp, fontWeight: FontWeight.w500), - ), - () { - showRolePiker(context, controller); - }), + ), () { + showRolePiker(context, controller); + }), funcWidget( '取向', Text( @@ -132,16 +142,19 @@ class Complete_materialPage extends StatelessWidget { color: Colors.white, fontSize: 14.sp, fontWeight: FontWeight.w500), - ), - () { - showOrientationPiker(context, controller); - }), + ), () { + showOrientationPiker(context, controller); + }), funcWidget( '兴趣', Row( - children: [interestWdiget('JK圈')], + children: [interestWdiget('JK圈',controller)], ), - () {}), + () async { + controller.numbers = await Get.toNamed(AppRoutes.SelectCircleActivity,arguments: controller.configBean.interestMap); + controller.update(); + }), + Container( margin: EdgeInsets.only( top: 24.sp, @@ -180,10 +193,11 @@ class Complete_materialPage extends StatelessWidget { ), GestureDetector( onTap: () { - if(controller.type=="user"){ - Navigator.pop(context); - }else{ - controller.pushHome(); + if (controller.type == "user") { + // Navigator.pop(context); + controller.editInfo(); + } else { + controller.checkInfo(); } // controller.checkInfo(); @@ -198,7 +212,7 @@ class Complete_materialPage extends StatelessWidget { image: AssetImage(getLoginImage('start_bg'))), ), child: Text( - controller.type=="user"? "完成" : '开启小圈之旅', + controller.type == "user" ? "完成" : '开启小圈之旅', style: TextStyle( color: Color(0xff00FFF4), fontSize: 16.sp, @@ -217,7 +231,6 @@ class Complete_materialPage extends StatelessWidget { }); } - Widget funcWidget( String leftStr, Widget tipWidget, GestureTapCallback callback, {String img = 'down_arr'}) { @@ -243,7 +256,8 @@ class Complete_materialPage extends StatelessWidget { shadows: [ Shadow(color: Color(0xffF657FF), blurRadius: 4.0.sp) ])), - Expanded(child: Padding( + Expanded( + child: Padding( padding: EdgeInsets.only(left: 20.sp), child: tipWidget, )), @@ -271,43 +285,96 @@ class Complete_materialPage extends StatelessWidget { ); } - interestWdiget(String interest) { + interestWdiget(String interest,Complete_materialLogic controller) { return Container( - height: 21.sp, - padding: EdgeInsets.only(left: 12.sp, right: 12.sp), - margin: EdgeInsets.only(left: 10.sp), - alignment: Alignment.center, - decoration: BoxDecoration( - border: Border.all(width: 1, color: Colors.white), - borderRadius: BorderRadius.circular(21.sp), - ), - child: Text( - interest, - style: TextStyle( - color: Colors.white, fontSize: 11.sp, fontWeight: FontWeight.w500), + height: 59.sp, + width: 240.sp, + child: ListView.builder( + itemCount: controller.numbers.length, + // 替换为实际的 item 数量 + scrollDirection: Axis.horizontal, + // 设置为水平方向 + padding: EdgeInsets.symmetric(vertical: 18.sp), + // 替换为实际的边距值 + itemBuilder: (context, index) { + return Container( + margin: EdgeInsets.only(right: 11.sp), // 替换为实际的 item 间距 + child: Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(17.0), // 设置圆角半径 + gradient: LinearGradient( + colors: [ + Color(0xFFffffff), + Color(0xFFffffff), + ], + ), + color: Color(0xFF392D53), + ), + child: Container( + margin: EdgeInsets.all(0.2.sp), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(17.0), + // shape: BoxShape.circle, + color: Color(0xFF392D53), + ), + child: Padding( + padding: EdgeInsets.only( + top: 2.sp, bottom: 2.sp, left: 15.sp, right: 15.sp), + child: Center( + child: Text( + controller.numbers[index].name, + style: TextStyle( + fontSize: 12.0, + color: Colors.white, + ), + ), + ), + ), + ), + ), // 替换为实际的列表项小部件 + ); + }, ), ); + + // return Container( + // height: 21.sp, + // padding: EdgeInsets.only(left: 12.sp, right: 12.sp), + // margin: EdgeInsets.only(left: 10.sp), + // alignment: Alignment.center, + // decoration: BoxDecoration( + // border: Border.all(width: 1, color: Colors.white), + // borderRadius: BorderRadius.circular(21.sp), + // ), + // child: Text( + // interest, + // style: TextStyle( + // color: Colors.white, fontSize: 11.sp, fontWeight: FontWeight.w500), + // ), + // ); } showSexPiker(context, Complete_materialLogic controller) { Pickers.showSinglePicker(context, - pickerStyle:DefaultPickerStyle.dark(), - data: '男、女、MTF、FTM、CD、酷儿'.split('、'), - selectData: controller.state.sex.isNotEmpty ? controller.state.sex : '男', onConfirm: (p, position) { + pickerStyle: DefaultPickerStyle.dark(), + data: controller.genderList, + selectData: controller.state.sex.isNotEmpty + ? controller.state.sex + : '男', onConfirm: (p, position) { controller.state.sex = p; + controller.state.genderId = controller.configBean.genderMap.keys.toList()[position]; controller.update(); }); } showAgePiker(context, Complete_materialLogic controller) { - var date = PDuration.now(); - PDuration currentDur = PDuration(year: date.year! - 18, month: date.month, day: date.day); - if (controller.state.brithday.isNotEmpty) { - - } + var date = PDuration.now(); + PDuration currentDur = + PDuration(year: date.year! - 18, month: date.month, day: date.day); + if (controller.state.brithday.isNotEmpty) {} Pickers.showDatePicker( context, - pickerStyle:DefaultPickerStyle.dark(), + pickerStyle: DefaultPickerStyle.dark(), // context, // 模式,详见下方 mode: DateMode.YMD, @@ -317,12 +384,14 @@ class Complete_materialPage extends StatelessWidget { // pickerStyle: pickerStyle, // 默认选中 selectDate: currentDur, - maxDate: PDuration(year: date.year! - 18, month: date.month, day: date.day), - minDate: PDuration(year: date.year! - 100, month: date.month, day: date.day), + maxDate: + PDuration(year: date.year! - 18, month: date.month, day: date.day), + minDate: + PDuration(year: date.year! - 100, month: date.month, day: date.day), onConfirm: (p) { 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}'; + var time = '${p.year}-${month}-${day}'; controller.state.age = controller.getAge(p); controller.state.brithday = time; controller.update(); @@ -333,21 +402,31 @@ class Complete_materialPage extends StatelessWidget { showRolePiker(context, Complete_materialLogic controller) { Pickers.showSinglePicker(context, - pickerStyle:DefaultPickerStyle.dark(), - data: 'Sado、Maso、Dom、Sub、Switch'.split('、'), - selectData: controller.state.role.isNotEmpty ? controller.state.role : 'Sado', onConfirm: (p, position) { - controller.state.role = p; - controller.update(); - }); + pickerStyle: DefaultPickerStyle.dark(), + data: controller.roleList, + selectData: controller.state.role.isNotEmpty + ? controller.state.role + : 'Sado', onConfirm: (p, position) { + controller.state.role = p; + controller.state.roleId = controller.configBean.roleMap.keys.toList()[position]; + controller.update(); + }); } + // showOrientationPiker(context, Complete_materialLogic controller) { Pickers.showSinglePicker(context, - pickerStyle:DefaultPickerStyle.dark(), - data: '异性恋、同性恋、双性恋、泛性恋、无性恋、智性恋、性单恋'.split('、'), - selectData: controller.state.orientation.isNotEmpty ? controller.state.orientation : '异性恋', onConfirm: (p, position) { - controller.state.orientation = p; - controller.update(); - }); + pickerStyle: DefaultPickerStyle.dark(), + data: controller.orientationList, + selectData: controller.state.orientation.isNotEmpty + ? controller.state.orientation + : '异性恋', onConfirm: (p, position) { + controller.state.orientation = p; + controller.state.orientationId = controller.configBean.orientationMap.keys.toList()[position]; + controller.update(); + }); } + + + } diff --git a/circle_app/lib/app/login/login/logic.dart b/circle_app/lib/app/login/login/logic.dart index 440f61f..0bcf62e 100644 --- a/circle_app/lib/app/login/login/logic.dart +++ b/circle_app/lib/app/login/login/logic.dart @@ -1,14 +1,16 @@ import 'dart:async'; import 'dart:convert'; +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:dio/dio.dart'; import 'package:flutter/cupertino.dart'; +import 'package:flutter/foundation.dart'; import 'package:get/get.dart'; import 'package:shared_preferences/shared_preferences.dart'; -import '../../../network/network.dart'; +import '../../../network/api.dart'; import 'state.dart'; class LoginLogic extends GetxController { @@ -18,7 +20,7 @@ class LoginLogic extends GetxController { bool sendCodeBtn = false; //判断发送短信按钮是否点击过标志 int seconds = 60; - Timer? t; + Timer? t; //倒计时 starDownTimer() { @@ -36,23 +38,18 @@ class LoginLogic extends GetxController { }); } } - Future getCode() async { - try{ - // var formData = Dio().options.contentType = 'application/x-www-form-urlencoded'; - // formData = {"phone": phoneEditingController.text} as String; - var response = await dio.post('msg-service/sms/code/send', queryParameters: {"phone": phoneEditingController.text}); - }catch(e){ - if (e is DioException) { - print('DioException: ${e.message}'); - print('DioException Error: ${e.error}'); - print('DioException Response: ${e.response}'); - } else { - print('Exception: $e'); + Future getCode() async { + var data = await DioManager.instance.post(url: Api.sendCode, params: {"phone": phoneEditingController.text}); + var bean = BaseResponse.fromJson(data, (data) => Data.fromJson(data)); + if(kDebugMode){ + if(bean.code==200){ + codeEditingController.text = bean.data!.code.toString(); + update(); } } - } + @override void dispose() { super.dispose(); @@ -66,35 +63,54 @@ class LoginLogic extends GetxController { if (codeEditingController.text == '') { showToast('请输入验证码'); } - - try{ - var response = await dio.post('user-service/login/smscode', data: {"phone": phoneEditingController.text,"code":codeEditingController.text}); - Map jsonData = jsonDecode(response.data.toString()); - int code = jsonData['code']; - String msg = jsonData['msg']; - - String authorization = jsonData['data']['Authorization']; - SharedPreferences prefs = await SharedPreferences.getInstance(); - prefs.setString('Authorization', authorization); - - if(code == 200){ - Get.toNamed(AppRoutes.Home); + var data = await DioManager.instance.post(url: Api.login,params: { + "phone": phoneEditingController.text, + "code": codeEditingController.text + }); + var bean = BaseResponse.fromJson(data, (data) => LoginData.fromJson(data)); + if (bean.code == 200) { + SharedPreferences prefs = await SharedPreferences.getInstance(); + prefs.setString('Authorization', bean.data!.Authorization.toString()); + Get.offNamed(AppRoutes.Home); return; - }else if(code == 30002){ - Get.toNamed(AppRoutes.Complete_materialPage); + } else if (bean.code == 30002) { + SharedPreferences prefs = await SharedPreferences.getInstance(); + prefs.setString('Authorization', bean.data!.Authorization.toString()); + + Get.offNamed(AppRoutes.Complete_materialPage); return; } - showToast(msg); - }catch(e){ - if (e is DioException) { - print('DioException: ${e.message}'); - print('DioException Error: ${e.error}'); - print('DioException Response: ${e.response}'); - } else { - print('Exception: $e'); - } - } - + showToast(bean.msg.toString()); + // try { + // var response = await dio.post('user-service/login/smscode', data: { + // "phone": phoneEditingController.text, + // "code": codeEditingController.text + // }); + // Map jsonData = jsonDecode(response.data.toString()); + // int code = jsonData['code']; + // String msg = jsonData['msg']; + // + // String authorization = jsonData['data']['Authorization']; + // SharedPreferences prefs = await SharedPreferences.getInstance(); + // prefs.setString('Authorization', authorization); + // + // if (code == 200) { + // Get.toNamed(AppRoutes.Home); + // return; + // } else if (code == 30002) { + // Get.toNamed(AppRoutes.Complete_materialPage); + // return; + // } + // showToast(msg); + // } catch (e) { + // if (e is DioException) { + // print('DioException: ${e.message}'); + // print('DioException Error: ${e.error}'); + // print('DioException Response: ${e.response}'); + // } else { + // print('Exception: $e'); + // } + // } // Get.toNamed(AppRoutes.Complete_materialPage); // if (!GetUtils.isPhoneNumber(phoneEditingController.text)) { @@ -102,3 +118,27 @@ class LoginLogic extends GetxController { // } } } + +class Data { + String? code; + + Data({this.code}); + + factory Data.fromJson(Map json) { + return Data( + code: json['code'], + ); + } +} + +class LoginData { + String? Authorization; + + LoginData({this.Authorization}); + + factory LoginData.fromJson(Map json) { + return LoginData( + Authorization: json['Authorization'] as String?, + ); + } +} diff --git a/circle_app/lib/app/login/login/view.dart b/circle_app/lib/app/login/login/view.dart index 7fecaa0..65de2ae 100644 --- a/circle_app/lib/app/login/login/view.dart +++ b/circle_app/lib/app/login/login/view.dart @@ -1,5 +1,6 @@ import 'package:circle_app/util/util.dart'; import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; @@ -63,6 +64,11 @@ class LoginPage extends StatelessWidget { logic.update(); }, controller: logic.phoneEditingController, + keyboardType: TextInputType.phone, + inputFormatters: [ + FilteringTextInputFormatter.digitsOnly, + FilteringTextInputFormatter.deny(RegExp('[^0-9]')), + ], maxLength: 11, style: TextStyle( color: Colors.white, fontSize: 16.sp), diff --git a/circle_app/lib/app/minefragment/logic.dart b/circle_app/lib/app/minefragment/logic.dart index dbf7a55..424cf16 100644 --- a/circle_app/lib/app/minefragment/logic.dart +++ b/circle_app/lib/app/minefragment/logic.dart @@ -1,7 +1,6 @@ import 'package:dio/dio.dart'; import 'package:get/get.dart'; -import '../../network/network.dart'; import '../../router/app_routers.dart'; import 'state.dart'; diff --git a/circle_app/lib/app/minefragment/state.dart b/circle_app/lib/app/minefragment/state.dart index 8ef5e39..4e00a0f 100644 --- a/circle_app/lib/app/minefragment/state.dart +++ b/circle_app/lib/app/minefragment/state.dart @@ -1,6 +1,5 @@ import 'package:dio/dio.dart'; -import '../../network/network.dart'; class MinefragmentState { var hearUrl = "http://pics5.baidu.com/feed/622762d0f703918f751ba5e950ce8d915beec4c1.jpeg?token=ed435fd18c71cf7ca7a011acb70460f7"; @@ -9,19 +8,19 @@ class MinefragmentState { ///Initialize variables } Future request() async { - print("111111"); - try{ - var response = await dio.put('user-service/register/user/info', data: {}); - print(response.data.toString()); - }catch(e){ - if (e is DioException) { - print('DioException: ${e.message}'); - print('DioException Error: ${e.error}'); - print('DioException Response: ${e.response}'); - } else { - print('Exception: $e'); - } - } + // print("111111"); + // try{ + // var response = await dio.put('user-service/register/user/info', data: {}); + // print(response.data.toString()); + // }catch(e){ + // if (e is DioException) { + // print('DioException: ${e.message}'); + // print('DioException Error: ${e.error}'); + // print('DioException Response: ${e.response}'); + // } else { + // print('Exception: $e'); + // } + // } } } diff --git a/circle_app/lib/app/select_circle/binding.dart b/circle_app/lib/app/select_circle/binding.dart new file mode 100644 index 0000000..0212c40 --- /dev/null +++ b/circle_app/lib/app/select_circle/binding.dart @@ -0,0 +1,10 @@ +import 'package:get/get.dart'; + +import 'logic.dart'; + +class Select_circleBinding extends Bindings { + @override + void dependencies() { + Get.lazyPut(() => Select_circleLogic()); + } +} diff --git a/circle_app/lib/app/select_circle/logic.dart b/circle_app/lib/app/select_circle/logic.dart new file mode 100644 index 0000000..11ea685 --- /dev/null +++ b/circle_app/lib/app/select_circle/logic.dart @@ -0,0 +1,49 @@ +import 'package:get/get.dart'; + +import '../../network/api.dart'; +import '../../network/dio_manager.dart'; +import 'state.dart'; + +class Select_circleLogic extends GetxController { + + + late Map interestMap = Get.arguments; + @override + void onInit() async { + interestMap.forEach((key, value) { + arrList.add(MyConfigData(key,value, false)); + }); + update(); + + } + + final Select_circleState state = Select_circleState(); + List arrList = [ + ]; + + List getItemList() { + return arrList; + } +} +class ConfigBean { + late Map genderMap; + late Map roleMap; + late Map orientationMap; + late Map interestMap; + + ConfigBean.fromJson(Map json) { + genderMap = json['gender_map']; + roleMap = json['role_map']; + orientationMap = json['orientation_map']; + interestMap = json['interest_map']; + } +} + + +class MyConfigData { + String id ; + String name; + bool isSelect; + + MyConfigData(this.id,this.name, this.isSelect); +} diff --git a/circle_app/lib/app/select_circle/state.dart b/circle_app/lib/app/select_circle/state.dart new file mode 100644 index 0000000..a3417eb --- /dev/null +++ b/circle_app/lib/app/select_circle/state.dart @@ -0,0 +1,5 @@ +class Select_circleState { + Select_circleState() { + ///Initialize variables + } +} diff --git a/circle_app/lib/app/select_circle/view.dart b/circle_app/lib/app/select_circle/view.dart new file mode 100644 index 0000000..53788c0 --- /dev/null +++ b/circle_app/lib/app/select_circle/view.dart @@ -0,0 +1,141 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:get/get.dart'; + +import '../../components/my_app_bar.dart'; +import '../../util/util.dart'; +import 'logic.dart'; + +class Select_circlePage extends StatelessWidget { + Select_circlePage({Key? key}) : super(key: key); + + final logic = Get.find(); + final state = Get.find().state; + + @override + Widget build(BuildContext context) { + return GetBuilder(builder: (Select_circleLogic controller) { + return Container( + decoration: BoxDecoration( + image: DecorationImage( + image: AssetImage(getBaseImage("home_back")), + fit: BoxFit.cover, + ), + ), + child: Scaffold( + backgroundColor: Colors.transparent, + appBar: MyAppBar( + centerTitle: '选择感兴趣的圈子', + actionWdiget: Text( + "提交", + style: TextStyle(color: Colors.white), + ), + onPressed: () { + // showToast("提交"); + List numbers = []; + controller.arrList.forEach((element) { + if(element.isSelect){ + numbers.add(element); + } + }); + if(numbers.length>0){ + Navigator.pop(context, numbers); + }else{ + showToast("请选择兴趣圈子"); + } + + }, + ), + body: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Expanded( + child: Container( + margin: EdgeInsets.only(top: 20.sp), + child: _reportAdapter(controller), + ), + ), + ], + ), + ), + ); + }); + } + + Widget _reportAdapter(Select_circleLogic controller) { + return GridView.builder( + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 3, + // crossAxisSpacing: 6.sp, + mainAxisSpacing: 10.sp, + childAspectRatio: 3, + ), + itemCount: controller.getItemList().length, + shrinkWrap: true, + itemBuilder: (BuildContext context, int index) { + return GestureDetector( + onTap: () { + controller.arrList[index].isSelect = + !controller.arrList[index].isSelect; + controller.update(); + }, + child: _getItemSelect(controller.arrList[index]), + ); + }, + ); + } + + Widget _getItemSelect(MyConfigData bean) { + if (bean.isSelect) { + return Container( + margin: EdgeInsets.only(left: 8.sp, right: 8.sp, top: 6.sp, bottom: 6.sp), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(20.sp), + gradient: LinearGradient( + colors: [ + Color(0xFF06F9FA), + Color(0xFFDC5BFD), + ], + begin: Alignment.centerLeft, + end: Alignment.centerRight, + ), + ), + child: Center( + child: Text( + bean.name, + style: TextStyle( + color: Colors.white, + fontSize: 11.sp, + ), + ), + ), + ); + } 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, + ), + ), + ), + ), + ), + ); + } + } +} diff --git a/circle_app/lib/app/splash/binding.dart b/circle_app/lib/app/splash/binding.dart new file mode 100644 index 0000000..f456539 --- /dev/null +++ b/circle_app/lib/app/splash/binding.dart @@ -0,0 +1,10 @@ +import 'package:get/get.dart'; + +import 'logic.dart'; + +class SplashBinding extends Bindings { + @override + void dependencies() { + Get.lazyPut(() => SplashLogic()); + } +} diff --git a/circle_app/lib/app/splash/logic.dart b/circle_app/lib/app/splash/logic.dart new file mode 100644 index 0000000..e8fa016 --- /dev/null +++ b/circle_app/lib/app/splash/logic.dart @@ -0,0 +1,44 @@ +import 'package:get/get.dart'; + +import '../../router/app_routers.dart'; +import 'state.dart'; +import 'package:shared_preferences/shared_preferences.dart'; + +import '../../network/api.dart'; +import '../../network/dio_manager.dart'; +import '../../util/device.dart'; +import '../../util/util.dart'; +import '../login/login/logic.dart'; + +class SplashLogic extends GetxController { + final SplashState state = SplashState(); + @override + void onInit() async{ + super.onInit(); + if(getAuthorization()==''){ + Get.toNamed(AppRoutes.Login); + }else{ + var data = + await DioManager.instance.put(url: Api.refreshToken,params:{}); + var bean = BaseResponse.fromJson(data, (data) => LoginData.fromJson(data)); + if (bean.code == 200) { + SharedPreferences prefs = await SharedPreferences.getInstance(); + prefs.setString('Authorization', bean.data!.Authorization.toString()); + Get.offNamed(AppRoutes.Home); + return; + } else if (bean.code == 30002) { + SharedPreferences prefs = await SharedPreferences.getInstance(); + prefs.setString('Authorization', bean.data!.Authorization.toString()); + + Get.offNamed(AppRoutes.Complete_materialPage); + return; + } + showToast(bean.msg.toString()); + + + + + // Get.toNamed(AppRoutes.Home); + } + } +} diff --git a/circle_app/lib/app/splash/state.dart b/circle_app/lib/app/splash/state.dart new file mode 100644 index 0000000..217d9f4 --- /dev/null +++ b/circle_app/lib/app/splash/state.dart @@ -0,0 +1,5 @@ +class SplashState { + SplashState() { + ///Initialize variables + } +} diff --git a/circle_app/lib/app/splash/view.dart b/circle_app/lib/app/splash/view.dart new file mode 100644 index 0000000..1d6faf9 --- /dev/null +++ b/circle_app/lib/app/splash/view.dart @@ -0,0 +1,28 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import '../../util/util.dart'; +import 'logic.dart'; + +class SplashPage extends StatelessWidget { + SplashPage() : super(); + + + @override + Widget build(BuildContext context) { + return GetBuilder(builder: (logic) { + return Container( + decoration: BoxDecoration( + image: DecorationImage( + image: AssetImage(getBaseImage("home_back")), + fit: BoxFit.cover, + ), + ), + child: Scaffold( + backgroundColor: Colors.transparent, + body: Container(),), + ); + }); + } + +} diff --git a/circle_app/lib/main.dart b/circle_app/lib/main.dart index df8479f..61551d6 100644 --- a/circle_app/lib/main.dart +++ b/circle_app/lib/main.dart @@ -1,5 +1,6 @@ import 'package:circle_app/app/home/binding.dart'; import 'package:circle_app/app/home/view.dart'; +import 'package:circle_app/app/splash/binding.dart'; import 'package:circle_app/router/app_pages.dart'; import 'package:circle_app/router/app_routers.dart'; import 'package:circle_app/util/util.dart'; @@ -8,7 +9,8 @@ import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import 'package:tencent_cloud_chat_uikit/tencent_cloud_chat_uikit.dart'; -import 'network/network.dart'; +import 'app/splash/view.dart'; + void main() { runApp(const MyApp()); @@ -94,7 +96,7 @@ class _MyAppState extends State { @override Widget build(BuildContext context) { //填入设计稿中设备的屏幕尺寸,单位dp - configureDio(); +// configureDio(); return ScreenUtilInit( designSize: const Size(375, 812), minTextAdapt: true, @@ -102,9 +104,9 @@ class _MyAppState extends State { builder: (context, child) { return GetMaterialApp( title: 'Flutter Demo', - initialBinding: HomeBinding(), + initialBinding: SplashBinding(), getPages: AppPages.routes, - home: HomePage(), + home: SplashPage(), ); }); } diff --git a/circle_app/lib/network/api.dart b/circle_app/lib/network/api.dart new file mode 100644 index 0000000..da857b9 --- /dev/null +++ b/circle_app/lib/network/api.dart @@ -0,0 +1,40 @@ +import 'package:flutter/foundation.dart'; + +class Api { + static const baseUrl = kDebugMode ? 'http://192.168.3.55:2000/' : 'http://192.168.3.55:2000/'; + + // 获取验证码 + static const sendCode = 'msg-service/sms/code/send'; + + // 登录 + static const login = 'user-service/login/smscode'; + + + + //获取七牛token + static const getqiniuToken = 'up-service/oss/token'; + + + + //上传个人资料 + static const UpdataUserInfo = 'user-service/register/user/info'; + + + //获取圈子列表 + static const getCircleList = 'user-service/app/config'; + + + + //刷新token + static const refreshToken = 'user-service/login/token/refresh'; + + + + //圈子列表 + static const getCircleInterests = 'up-service/interest/interests'; + + + + //入圈出圈 + static const outCrrcle = 'up-service/interest/'; +} \ No newline at end of file diff --git a/circle_app/lib/network/dio_manager.dart b/circle_app/lib/network/dio_manager.dart index 8ce28ad..60010cb 100644 --- a/circle_app/lib/network/dio_manager.dart +++ b/circle_app/lib/network/dio_manager.dart @@ -1,8 +1,12 @@ import 'dart:convert'; +import 'dart:io'; import 'package:dio/dio.dart'; -const String baseUrl = ''; +import '../util/device.dart'; +import 'api.dart'; + +const String baseUrl = Api.baseUrl; /// Dio 请求方法 @@ -37,6 +41,7 @@ class DioManager { // 接收数据的最长时限 receiveTimeout: Duration(seconds: 30), )); + _dio!.interceptors.add(LogInterceptor(responseBody: true)); } /// get请求 @@ -58,15 +63,14 @@ class DioManager { } /// post 请求 - Future post( - {required String url, - Map? params, - bool isAddTokenInHeader = true, - bool isShowErrorToast = true, - FormData? formData, - CancelToken? cancelToken, - ProgressCallback? onSendProgress, - ProgressCallback? onReceiveProgress}) async { + Future post({required String url, + Map? params, + bool isAddTokenInHeader = true, + bool isShowErrorToast = true, + FormData? formData, + CancelToken? cancelToken, + ProgressCallback? onSendProgress, + ProgressCallback? onReceiveProgress}) async { return await requestHttp(url, method: DioMethod.post, isShowErrorToast: isShowErrorToast, @@ -77,16 +81,42 @@ class DioManager { onReceiveProgress: onReceiveProgress); } + /// put 请求 + Future put({ + required String url, + Map? params, + bool isAddTokenInHeader = true, + bool isShowErrorToast = true, + FormData? formData, + CancelToken? cancelToken, + ProgressCallback? onSendProgress, + ProgressCallback? onReceiveProgress, + }) async { + return await requestHttp( + url, + method: DioMethod.put, + // 修改请求方法为 put + isShowErrorToast: isShowErrorToast, + params: params, + formData: formData, + cancelToken: cancelToken, + onSendProgress: onSendProgress, + onReceiveProgress: onReceiveProgress, + ); + } + + + /// Dio request 方法 Future requestHttp(String url, {DioMethod method = DioMethod.get, - Map? params, - bool isShowErrorToast = true, - bool isAddTokenInHeader = true, - FormData? formData, - CancelToken? cancelToken, - ProgressCallback? onSendProgress, - ProgressCallback? onReceiveProgress}) async { + Map? params, + bool isShowErrorToast = true, + bool isAddTokenInHeader = true, + FormData? formData, + CancelToken? cancelToken, + ProgressCallback? onSendProgress, + ProgressCallback? onReceiveProgress}) async { const methodValues = { DioMethod.get: 'get', DioMethod.post: 'post', @@ -96,21 +126,37 @@ class DioManager { try { Response response; + Options options = Options( + method: methodValues[method], headers: { + "Authorization": await getAuthorization(), + 'version': await getDeviceId(), + 'platform': Platform.isIOS ? '1' : '0', + 'imei': await getImei(), + 'brand': await getBrand(), + }); + print(">>>>>"+params.toString()); /// 不同请求方法,不同的请求参数,按实际项目需求分. /// 这里 get 是 queryParameters,其它用 data. FormData 也是 data /// 注意: 只有 post 方法支持发送 FormData. switch (method) { case DioMethod.get: - response = await _dio!.request(url, - queryParameters: params, - options: Options(method: methodValues[method], extra: { - 'isAddTokenInHeader': isAddTokenInHeader, - 'isShowErrorToast': isShowErrorToast - })); + response = + await _dio!.request(url, queryParameters: params, options: options); + break; + case DioMethod.post: + response = await _dio!.post( + url, data: params, cancelToken: cancelToken, options: options); + break; + case DioMethod.put: + response = await _dio!.put(url, data: json.encode(params), options: options); + break; + case DioMethod.delete: + response = + await _dio!.delete(url, queryParameters: params, options: options); break; default: - // 如果有formData参数,说明是传文件,忽略params的参数 + // 如果有formData参数,说明是传文件,忽略params的参数 if (formData != null) { response = await _dio!.post(url, data: formData, @@ -119,12 +165,7 @@ class DioManager { onReceiveProgress: onReceiveProgress); } else { response = await _dio!.request(url, - data: params, - cancelToken: cancelToken, - options: Options(method: methodValues[method], extra: { - 'isAddToken': isAddTokenInHeader, - 'isShowErrorToast': isShowErrorToast - })); + data: params, cancelToken: cancelToken, options: options); } } // json转model @@ -141,12 +182,10 @@ class DioManager { // String? errorMsg = isNetworkConnected // ? e.requestOptions.extra["errorMsg"] // : "网络连接断开,请检查网络设置"; - return { - 'code': 500, 'msg': '请求失败'}; + return {'code': 500, 'msg': '请求失败'}; } catch (e) { // 其他一些意外的报错 - return { - 'code': 500, 'msg': '请求异常'}; + return {'code': 500, 'msg': '请求异常'}; } } // @@ -178,3 +217,20 @@ class DioManager { // } // } } + +class BaseResponse { + int code; + String msg; + T? data; + + BaseResponse({required this.code, required this.msg, required this.data}); + + factory BaseResponse.fromJson(Map json, + T Function(dynamic) fromJsonData) { + return BaseResponse( + code: json['code'], + msg: json['msg'], + data: json['data'] != null ? fromJsonData?.call(json['data']) : null, + ); + } +} diff --git a/circle_app/lib/network/network.dart b/circle_app/lib/network/network.dart deleted file mode 100644 index 08c5685..0000000 --- a/circle_app/lib/network/network.dart +++ /dev/null @@ -1,76 +0,0 @@ -import 'dart:io'; -import 'package:dio/dio.dart'; -import 'package:dio/io.dart'; -import 'package:shared_preferences/shared_preferences.dart'; - -import '../util/device.dart'; - -final dio = Dio(); // 初始化默认的配置 - -void configureDio() { - // 通过BaseOptions设置默认配置 - dio.options.baseUrl = 'http://192.168.3.55:2000/'; - dio.options.connectTimeout = Duration(seconds: 5); - dio.options.receiveTimeout = Duration(seconds: 3); - - //添加拦截器 - //自定义拦截器,请求、返回、异常三种拦截器 - dio.interceptors.add(Interceptor()); - // dio.interceptors.add(ErrorInterceptor()); - // dio.interceptors.add(ResponceInterceptor()); - //日志记录 - dio.interceptors.add(LogInterceptor(responseBody: true)); - dio.interceptors.add(InterceptorsWrapper( - onRequest: (RequestOptions options, RequestInterceptorHandler handler) { - // 在这里对请求进行拦截和修改 - // 添加公共请求头 - - options.headers['Authorization'] = getAuthorization(); - options.headers['version'] = getDeviceId(); - if(Platform.isIOS){ - options.headers['platform'] = '1'; - }else if(Platform.isAndroid){ - options.headers['platform'] = '0'; - } - options.headers['imei'] = getImei(); - options.headers['brand'] = getBrand(); - - - // - // // 修改请求参数 - // options.queryParameters['key'] = 'value'; - - // 继续请求 - return handler.next(options); - }, - onResponse: (Response response, ResponseInterceptorHandler handler) { - // 在这里可以对响应进行处理 - // ... - print("onResponse"); - // 继续处理响应 - return handler.next(response); - }, - onError: (DioException error, ErrorInterceptorHandler handler) { - // 在这里处理请求错误 - // ... - print("onError"); - // 继续处理错误 - return handler.next(error); - }, - )); - - // 设置代理 - // (dio.httpClientAdapter as DefaultHttpClientAdapter).onHttpClientCreate = (client) { - // client.badCertificateCallback = (X509Certificate cert, String host, int port) => true; - // // config the http client - // client.findProxy = (uri) { - // //proxy all request to localhost:8888 - // return "PROXY http://192.168.3.55:2000"; // 替换为实际的代理主机和端口 - // }; - // // you can also create a new HttpClient to dio - // // return new HttpClient(); - // }; - - // 通过BaseOptions构造函数设置 - -} diff --git a/circle_app/lib/router/app_pages.dart b/circle_app/lib/router/app_pages.dart index 288bad9..48a18bc 100644 --- a/circle_app/lib/router/app_pages.dart +++ b/circle_app/lib/router/app_pages.dart @@ -28,10 +28,13 @@ import 'package:circle_app/app/photoinfo/binding.dart'; import 'package:circle_app/app/photoinfo/view.dart'; import 'package:circle_app/app/report/binding.dart'; import 'package:circle_app/app/report/view.dart'; +import 'package:circle_app/app/select_circle/binding.dart'; +import 'package:circle_app/app/select_circle/view.dart'; import 'package:circle_app/app/setup/binding.dart'; import 'package:circle_app/app/setup/view.dart'; import 'package:circle_app/app/login/complete_material/binding.dart'; import 'package:circle_app/app/login/complete_material/view.dart'; +import 'package:circle_app/app/splash/binding.dart'; import 'package:circle_app/app/swiper/binding.dart'; import 'package:circle_app/app/swiper/view.dart'; import 'package:circle_app/app/text/binding.dart'; @@ -40,9 +43,11 @@ import 'package:circle_app/app/userinfo/binding.dart'; import 'package:circle_app/app/userinfo/view.dart'; import 'package:circle_app/app/webview/binding.dart'; import 'package:circle_app/app/webview/view.dart'; +import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:get/get_navigation/src/routes/get_route.dart'; import '../app/blacklist/view.dart'; +import '../app/splash/view.dart'; import 'app_routers.dart'; class AppPages { @@ -54,7 +59,7 @@ class AppPages { ), GetPage( name: AppRoutes.Complete_materialPage, - page: () => Complete_materialPage(), + page: () => FlutterSmartDialog(child: Complete_materialPage(),), binding: Complete_materialBinding(), ), GetPage( @@ -148,5 +153,15 @@ class AppPages { page: () => ChatPage(), binding: ChatBinding(), ), + GetPage( + name: AppRoutes.SelectCircleActivity, + page: () => Select_circlePage(), + binding: Select_circleBinding(), + ), + GetPage( + name: AppRoutes.SplashActivity, + page: () => SplashPage(), + binding: SplashBinding(), + ), ]; } diff --git a/circle_app/lib/router/app_routers.dart b/circle_app/lib/router/app_routers.dart index 1c34a02..acd3a31 100644 --- a/circle_app/lib/router/app_routers.dart +++ b/circle_app/lib/router/app_routers.dart @@ -20,4 +20,6 @@ abstract class AppRoutes { static const OffAccountActivity = '/user/OffAccountActivity'; static const WebViewActivity = '/user/WebViewActivity'; static const Chat = '/chat'; + static const SelectCircleActivity = '/user/SelectCircleActivity'; + static const SplashActivity = '/user/SplashActivity'; } \ No newline at end of file diff --git a/circle_app/lib/util/device.dart b/circle_app/lib/util/device.dart index 9a3e024..43bba95 100644 --- a/circle_app/lib/util/device.dart +++ b/circle_app/lib/util/device.dart @@ -1,7 +1,7 @@ - import 'dart:io'; import 'package:device_info/device_info.dart'; +import 'package:geolocator/geolocator.dart'; import 'package:shared_preferences/shared_preferences.dart'; Future getDeviceId() async { @@ -10,10 +10,12 @@ Future getDeviceId() async { try { if (Platform.isAndroid) { var build = await deviceInfoPlugin.androidInfo; - deviceId = build.androidId; // Android + String version = build.version.release; + deviceId = version; // Android } else if (Platform.isIOS) { var data = await deviceInfoPlugin.iosInfo; - deviceId = data.identifierForVendor; // iOS + String version = data.systemVersion; + deviceId = version; // iOS } } catch (e) { print('Failed to get device id: $e'); @@ -21,33 +23,63 @@ Future getDeviceId() async { return deviceId; } -Future getImei() async{ +Future getImei() async { String imei = ""; DeviceInfoPlugin deviceInfo = DeviceInfoPlugin(); if (Platform.isAndroid) { AndroidDeviceInfo androidInfo = await deviceInfo.androidInfo; - String imei = androidInfo.androidId; + imei = androidInfo.androidId; // other specific Android data } else if (Platform.isIOS) { IosDeviceInfo iosInfo = await deviceInfo.iosInfo; - imei = iosInfo.identifierForVendor; + imei = iosInfo.identifierForVendor; // other specific iOS data } return imei; } -Future getBrand() async{ + +Future getBrand() async { String brand = ''; DeviceInfoPlugin deviceInfo = DeviceInfoPlugin(); - if(Platform.isIOS){ + if (Platform.isIOS) { IosDeviceInfo iosDeviceInfo = await deviceInfo.iosInfo; brand = iosDeviceInfo.model; - }else if(Platform.isAndroid){ + } else if (Platform.isAndroid) { AndroidDeviceInfo androidInfo = await deviceInfo.androidInfo; brand = androidInfo.model; } return brand; } -Future getAuthorization() async{ + +Future getLocation() async { + LatLng latLng = LatLng(latitude: 0.0, longitude: 0.0);; + try { + LocationPermission permission = await Geolocator.requestPermission(); + if (permission == LocationPermission.whileInUse || + permission == LocationPermission.always) { + Position position = await Geolocator.getCurrentPosition( + desiredAccuracy: LocationAccuracy.high, + ); + print('Latitude: ${position.latitude}'); + print('Longitude: ${position.longitude}'); + latLng= LatLng(latitude: position.latitude, longitude: position.longitude); + } else { + print('Location permission denied'); + } + } catch (e) { + print('Failed to get device or location info: $e'); + } + return latLng; +} + +class LatLng { + final double latitude; + final double longitude; + + LatLng({required this.latitude, required this.longitude}); +} + +Future getAuthorization() async { SharedPreferences prefs = await SharedPreferences.getInstance(); return prefs.getString("Authorization") ?? ""; } diff --git a/circle_app/pubspec.yaml b/circle_app/pubspec.yaml index 0d7f0d6..cd1a222 100644 --- a/circle_app/pubspec.yaml +++ b/circle_app/pubspec.yaml @@ -66,6 +66,10 @@ dependencies: tencent_cloud_chat_uikit: ^2.0.0 #权限申请 permission_handler: ^10.3.0 + #loading + flutter_smart_dialog: 4.9.2 + #获取位置信息 + geolocator: ^9.0.2 dev_dependencies: flutter_test: