import 'dart:convert'; import 'dart:io'; import 'package:dio/dio.dart'; import 'package:fast_gbk/fast_gbk.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_easyloading/flutter_easyloading.dart'; import 'package:huixiang/data/achivement_detail_list.dart'; import 'package:huixiang/data/activity_pos.dart'; import 'package:huixiang/data/address.dart'; import 'package:huixiang/data/app_update.dart'; import 'package:huixiang/data/banner.dart'; import 'package:huixiang/data/base_data.dart'; import 'package:huixiang/data/brand_data.dart'; import 'package:huixiang/data/category_select.dart'; import 'package:huixiang/data/channels.dart'; import 'package:huixiang/data/chapter.dart'; import 'package:huixiang/data/collect_class.dart'; import 'package:huixiang/data/coupon_detail.dart'; import 'package:huixiang/data/course.dart'; import 'package:huixiang/data/course_details.dart'; import 'package:huixiang/data/exchange_order.dart'; import 'package:huixiang/data/follow.dart'; import 'package:huixiang/data/goods.dart'; import 'package:huixiang/data/goods_category.dart'; import 'package:huixiang/data/headlines.dart'; import 'package:huixiang/data/headlines_details.dart'; import 'package:huixiang/data/home_rank.dart'; import 'package:huixiang/data/invitation.dart'; import 'package:huixiang/data/invoice_list.dart'; import 'package:huixiang/data/invoices_detail_info.dart'; import 'package:huixiang/data/invoices_history_list.dart'; import 'package:huixiang/data/ip_data.dart'; import 'package:huixiang/data/login_info.dart'; import 'package:huixiang/data/logistics.dart'; import 'package:huixiang/data/member_comment.dart'; import 'package:huixiang/data/member_infor.dart'; import 'package:huixiang/data/message.dart'; import 'package:huixiang/data/msg_stats.dart'; import 'package:huixiang/data/page.dart'; import 'package:huixiang/data/rank.dart'; import 'package:huixiang/data/recharge_act.dart'; import 'package:huixiang/data/second_card.dart'; import 'package:huixiang/data/sign_info.dart'; import 'package:huixiang/data/social_info.dart'; import 'package:huixiang/data/store.dart'; import 'package:huixiang/data/title_info_list.dart'; import 'package:huixiang/data/upload_result.dart'; import 'package:huixiang/data/user_bill.dart'; import 'package:huixiang/data/user_info.dart'; import 'package:huixiang/data/vip_badges.dart'; import 'package:huixiang/data/vip_benefit.dart'; import 'package:huixiang/data/vip_card.dart'; import 'package:huixiang/data/vip_card_home.dart'; import 'package:huixiang/data/vip_rule_details.dart'; import 'package:huixiang/generated/l10n.dart'; import 'package:huixiang/data/activity.dart'; import 'package:huixiang/data/article.dart'; import 'package:huixiang/data/comunity_comment.dart'; import 'package:huixiang/data/coupon.dart'; import 'package:huixiang/data/farmers.dart'; import 'package:huixiang/data/order_info.dart'; import 'package:huixiang/view_widget/login_tips_dialog.dart'; import 'package:retrofit/retrofit.dart'; import 'package:huixiang/login/captcha/click_word_captcha.dart'; part 'retrofit_api.g.dart'; const localBaseUrl = "http://192.168.10.54:8766/app/";///本地 // const localBaseUrl = "http://platform.test.api.lotus-wallet.com/app/";///测试 const serviceBaseUrl = "https://pos.platform.lotus-wallet.com/app/";///线上 const ipBaseUrl = "http://whois.pconline.com.cn"; ///ip @RestApi(baseUrl: localBaseUrl) abstract class ApiService { factory ApiService( Dio dio, { String? baseUrl, BuildContext? context, String? token, bool showLoading = false, bool isIp = false, bool pay = true, }) { Map<String, dynamic> headers = (token?.isEmpty ?? true) ? {} : {'token': "Bearer $token"}; if (pay) { headers["Environment"] = "app"; } print("软件当前运行的模式 kReleaseMode:" + (kReleaseMode ? "发布模式":"调试模式")); if (kReleaseMode) baseUrl = serviceBaseUrl; if (isIp) baseUrl = ipBaseUrl; dio.options = BaseOptions( connectTimeout: const Duration(milliseconds: 30000), receiveTimeout: const Duration(milliseconds: 30000), headers: headers, responseType: ResponseType.json, ); if (dio.interceptors.length <= 1) { dio.interceptors.add( InterceptorsWrapper(onRequest: (RequestOptions options, RequestInterceptorHandler handler,) { try { debugPrint("\n======================= 请求数据 ======================="); debugPrint("method = ${options.method.toString()}"); debugPrint("url = ${options.uri.toString()}"); debugPrint("headers = ${options.headers}"); if (context != null && showLoading && !EasyLoading.isShow) { //是否显示loading EasyLoading.show( status: S.of(context).zhengzaijiazai, maskType: EasyLoadingMaskType.black, ); } if (options.data is FormData) { debugPrint("params data = FormData"); } else { debugPrint("params data = ${jsonEncode(options.data)}"); } debugPrint("params queryParameters = ${options.queryParameters}"); } catch (e1) {} handler.next(options); }, onResponse: (Response response, ResponseInterceptorHandler handler,) { try { debugPrint("\n======================= 响应数据开始 ======================="); if (showLoading && EasyLoading.isShow) { EasyLoading.dismiss(); } debugPrint("code = ${response.statusCode}"); p(jsonEncode(response.data)); if (response.data is Map) { Map map = response.data; if (map["code"] == 40005 || map["code"] == 40001) { if (context != null && !LoginTipsDialog().isShow) { print("show: ${LoginTipsDialog().isShow}"); LoginTipsDialog().show(context); } } debugPrint("======================= 响应数据结束 =======================\n"); if(map["code"] == 0 || map["code"] == 200) { } } handler.next(response); } catch (e2) { print("respon: ${e2}"); } }, onError: (DioException e, ErrorInterceptorHandler handler,) { if (EasyLoading.isShow) { EasyLoading.dismiss(); } debugPrint("\n======================= 错误响应数据 ======================="); debugPrint("type = ${e.type}"); debugPrint("message = ${e.message}"); debugPrint("\n"); handler.next(e); }), ); } return _ApiService(dio, baseUrl: baseUrl); } static void p(String msg) { //因为String的length是字符数量不是字节数量所以为了防止中文字符过多, // 把4*1024的MAX字节打印长度改为1000字符数 if(msg.length > 10000) return; int maxStrLength = 900; //大于1000时 while (msg.length > maxStrLength) { debugPrint(msg.substring(0, maxStrLength), wrapWidth: maxStrLength); msg = msg.substring(maxStrLength); } //剩余部分 debugPrint(msg, wrapWidth: maxStrLength); } ///文件上传 @POST("/file/upload") @MultiPart() Future<BaseData<UploadResult>> upload(@Part(name: "file") File data, @Part(name: "folderId") int folderId, bool isVideo); /// 周边搜索 @GET("https://restapi.amap.com/v3/place/around?key=542b46afa8e4b88fe1eb3c4d0ba0872f&location={lat},{lng}&keywords={keywords}&offset={size}&page={page}&extensions=all") Future<dynamic> searchPoi(@Path("lat") String lat, @Path("lng") String lng, @Path("keywords") String keywords, int size, int page); /// 逆地理编码 @GET("https://restapi.amap.com/v3/geocode/regeo?key=542b46afa8e4b88fe1eb3c4d0ba0872f&location={lat},{lng}&extensions=base") Future<dynamic> geocodeRegeo(@Path("lat") String lat, @Path("lng") String lng); /// 用户登录 @POST("/auth/platform/memberLogin") Future<BaseData<LoginInfo>?> memberLogin(@Body() Map<String, dynamic> param); ///获取APP门店推广渠道 @GET("/auth/appChannels") Future<BaseData<Channels>> appChannels(); ///发送验证码 @POST("/auth/sendVerify") Future<BaseData<dynamic>> sendVerify(@Body() Map<String, dynamic> param); ///积分商城商品列表 @POST("/creditGoods/list") Future<BaseData<PageInfo<Goods>>> creditGoods( @Body() Map<String, dynamic> param); ///积分商城商品分類列表 @POST("/creditGoodsCategory/page") Future<BaseData<PageInfo<GoodsCategory>>> goodsCategory( @Body() Map<String, dynamic> param); ///积分商城商品详情 @GET("/creditGoods/{id}") Future<BaseData<Goods>> creditGoodsById(@Path("id") String id); ///查询用户信息 @GET("/member/info") Future<BaseData<UserInfo>> queryInfo(); ///编辑用户信息 @POST("/member/editMemberInfo") Future<BaseData> editInfo(@Body() Map<String, dynamic> param); ///用户签到信息 @GET("/member/signInInfo") Future<BaseData<SignInfo>> signInInfo(); ///用户签到 @GET("/member/signIn") Future<BaseData> signIn(); ///平台充值 @POST("/wallet/recharge") Future<BaseData<dynamic>> recharge(@Body() Map<String, dynamic> param); ///充值活动列表 @GET("/wallet/rechargeActList?tenantCode={tenantCode}") Future<BaseData<RechargeAct>> rechargeActList( @Path("tenantCode") String tenantCode); ///领取优惠券 @GET("/coupon/receive?couponId={couponId}") Future<BaseData> receiveCoupon(@Path("couponId") String couponId); ///兑换订单列表 @POST("/creditOrder/list") Future<BaseData<PageInfo<ExchangeOrder>>> creditOrderList( @Body() Map<String, dynamic> param); ///创建积分订单 @POST("/creditOrder/create") Future<BaseData> creditOrder(@Body() Map<String, dynamic> param); ///保存收货地址 @POST("/address/add") Future<BaseData> addAddress(@Body() Map<String, dynamic> param); ///删除收货地址 @POST("/address/delete") Future<BaseData> deleteAddress(@Body() Map<String, dynamic> param); ///查询收货地址 @GET("/address/detail/{id}") Future<BaseData> queryAddress(@Path("id") String id); ///查询用户所有的收货地址 @GET("/address/queryMemberAddress") Future<BaseData<List<Address>>> queryMemberAddress(); ///更新收货地址 @POST("/address/update") Future<BaseData> updateAddress(@Body() Map<String, dynamic> param); ///查询领券列表 @POST("/coupon/centreList") Future<BaseData<PageInfo<Coupon>>> queryCoupon( @Body() Map<String, dynamic> param); ///查询卡包列表 @POST("/coupon/packageList") Future<BaseData<PageInfo<Coupon>>> queryCard( @Body() Map<String, dynamic> param); ///门店地址列表 @POST("/store/list") Future<BaseData<List<Store>>> queryStore(@Body() Map<String, dynamic> param); ///分页查看资讯列表 @POST("/information/list") Future<BaseData<PageInfo<Activity>>> informationList( @Body() Map<String, dynamic> param); ///查看资讯详情 @GET("/information/{id}") Future<BaseData<Article>> informationInfo(@Path("id") String id); ///查看活动详情 @GET("/information/{id}") Future<BaseData<Activity>> activityInfo(@Path("id") String id); ///积分订单兑换到券包 @GET("/creditOrder/receive/{id}") Future<BaseData> creditOrderReceive(@Path("id") String id); ///首页数据 @GET("/home/home") Future<BaseData<BrandData>> queryHome(); ///查询店铺商家详情 @GET("/store/{id}") Future<BaseData> queryStoreInfo(@Path("id") String id); ///分页查看资讯列表 @POST("/information/list") Future<BaseData<PageInfo<Article>>> queryArticle( @Body() Map<String, dynamic> param); ///banner查询 @POST("/banner/page") Future<BaseData<PageInfo<BannerData>>> queryBanner(@Body() Map<String, dynamic> param); ///品牌信息 @GET("/home/brand") Future<BaseData> queryHomeBrand(); /// 小程序会员登录 @GET("/auth/mini/login/{storeId}") Future<BaseData> minLogin(@Path("storeId") String storeId); /// 各种消费记录 @POST("/member/listBill") Future<BaseData<PageInfo<UserBill>>> queryBillInfo( @Body() Map<String, dynamic> param); ///会员等级列表 @GET("/member/rankList") Future<BaseData<List<Rank>>> rankList(); ///订单列表 @POST("/order/list") Future<BaseData<PageInfo<OrderInfo>>> orderList( @Body() Map<String, dynamic> param); ///订单详情 @GET("/order/orderDetail?id={id}") Future<BaseData<OrderInfo>> orderDetail(@Path("id") String id); ///继续付款 @POST("/order/continuePay") Future<BaseData> continuePay(@Body() Map<String, dynamic> param); ///积分订单兑换到券包 @GET("/creditOrder/receive/{id}") Future<BaseData> receiveToCard(@Path("id") String id); ///会员卡列表 @POST("/member/vipList") Future<BaseData<List<VipCard>>> vipList(@Body() Map<String, dynamic> param); ///会员卡详情 @POST("/member/vipDetail") Future<BaseData<VipCard>> vipDetail(@Body() Map<String, dynamic> param); ///分页查询App消息列表 @POST("/app-msg/list") Future<BaseData<PageInfo<Message>>> msgList( @Body() Map<String, dynamic> param); ///加载验证码 @POST("/captcha/get") Future<ClickWordCaptchaModel> captchaGet( @Body() Map<String, dynamic> param); ///校验验证码 @POST("/captcha/check") Future<bool> captchaCheck( @Body() Map<String, dynamic> param); ///App消息详情 @GET("/app-msg/{id}") Future<BaseData> queryMsg(@Path("id") String id); ///App消息 统计各类消息数量 @GET("/app-msg/stats") Future<BaseData<List<MsgStats>>> stats(); ///给文章/活动点赞 @GET("/information/likes/{id}") Future<BaseData> informationLikes(@Path("id") String id); ///发布评论 @POST("/memberComment") Future<BaseData> memberComment(@Body() Map<String, dynamic> param); ///查询评论列表 @POST("/memberComment/list") Future<BaseData<PageInfo<MemberComment>>> memberCommentList( @Body() Map<String, dynamic> param); ///评论点赞 @GET("/memberComment/likes/{id}") Future<BaseData> commentLike(@Path("id") String id); ///评论删除 @DELETE("/memberComment/{id}") Future<BaseData> delComment(@Path("id") String id); ///查询物流轨迹 @GET("/order/getShippingTrace/{shipperCode}/{logisticCode}") Future<BaseData<Logistics>> shippingTrace( @Path("shipperCode") String shipperCode, @Path("logisticCode") String logisticCode); // ///反馈 // @POST("/other/report") // Future<BaseData<dynamic>> report(@Body() Map<String, String> map); ///取消订单 @GET("/order/cancel/{id}") Future<BaseData<dynamic>> orderCancel(@Path("id") String id); ///继续付款? @POST("/order/settlement") Future<BaseData<String>> settlement(@Body() Map<String, String> map); /// 发表动态 @POST("/information/trend") Future<BaseData<bool>> trend(@Body() Map<String, dynamic> map); /// 动态列表 @POST("/information/trend-list") Future<BaseData<PageInfo<ComunityComment>>> trendList( @Body() Map<String, dynamic> map); /// 我关注/粉丝的会员列表 @POST("/member/follow/list") Future<BaseData<PageInfo<Follow>>> followList( @Body() Map<String, dynamic> map); ///关注/取关会员 @PUT("/member/follow/{followId}") Future<BaseData> follow(@Path("followId") String followId); ///删除动态 @DELETE("/information/trend/{id}") Future<BaseData> deleteTrend(@Path("id") String id); ///个人社交信息(粉丝/关注数量/成就数量) @GET("/member/socialInfo") Future<BaseData<SocialInfo>> socialInfo(); ///课程分类列表 @GET("/course/categoryList") Future<BaseData<List<CategorySelect>>> categoryList(); ///课程章节列表 @GET("/course/catalogList/{courseId}") Future<BaseData<List<Chapter>>> catalogList( @Path("courseId") String courseId); /// 课程列表 @POST("/course/list") Future<BaseData<PageInfo<Course>>> courseList( @Body() Map<String, dynamic> map); ///课程的合集列表 @GET("/course/collectList") Future<BaseData<List<CollectClass>>> collectList(); ///合集包含的课程列表 @GET("/course/collect/{collectId}") Future<BaseData<List<Course>>> collect( @Path("collectId") String collectId); ///课程详情 @GET("/course/{id}") Future<BaseData<CourseDetails>> course(@Path("id") String id); ///给文章/活动点赞 @GET("/course/likes/{courseId}") Future<BaseData> courseLikes(@Path("courseId") String courseId); /// APP查询所有成就徽章 并显示会员完成的 @POST("/app-memberAchievement/findBadges") Future<BaseData<List<VipBadges>>> findBadges( @Body() Map<String, dynamic> map); ///查看一个成就大类详情 @GET("/app-memberAchievement/getAchievementDetail?achievementCategoryId={achievementCategoryId}") Future<BaseData<List<AchivementDetailList>>> getAchievementDetail( @Path("achievementCategoryId") String achievementCategoryId); ///会员的权益列表 @GET("/member/benefitList") Future<BaseData<List<VipBenefit>>> benefitList(); ///会员权益 @GET("/home/vipBenefit") Future<BaseData<VipRuleDetails>> vipBenefit(); ///查询副卡列表 @GET("/member/secondCardList") Future<BaseData<List<SecondCard>>> secondCardList(); ///绑定副卡 @GET("/member/bindSecondCard/{phone}") Future<BaseData> bindSecondCard(@Path("phone") String phone); ///解绑副卡 @GET("/member/unbindSecondCard/{phone}") Future<BaseData> unbindSecondCard(@Path("phone") String phone); ///查看积分订单物流 @GET("/creditOrder/getAppShippingTrace?orderId={orderId}") Future<BaseData<Logistics>> getAppShippingTrace( @Path("orderId") String orderId); ///购买会员等级 @POST("/member/rankBuy") Future<BaseData<dynamic>> rankBuy(@Body() Map<String, dynamic> param); ///文章合集列表 @GET("/information/categoryList") Future<BaseData<List<Headlines>>> headlinesList(); ///文章合集详情 @GET("/information/category/{id}") Future<BaseData<HeadlinesDetails>> headlinesDetails(@Path("id") String id); /// 我的邀请会员列表 @POST("/member/inviteMemberList") Future<BaseData<PageInfo<Invitation>>> inviteMemberList(@Body() Map<String, dynamic> map); ///核销优惠券 @GET("/coupon/wiped/{memberCouponId}") Future<BaseData> wiped(@Path("memberCouponId") String memberCouponId); ///查询优惠券详情 @GET("/coupon/detail/{memberCouponId}") Future<BaseData<CouponDetail>> couponDetail(@Path("") String memberCouponId); ///查询会员信息 @GET("/member/detail/{id}") Future<BaseData<MemberInfor>> memberDetail(@Path("id") String id); ///活动弹窗 @GET("/home/appPopup") Future<BaseData<ActivityPos>> appPopup(); ///注销会员 @GET("/member/deleteMine") Future<BaseData> deleteMine(); ///投诉资讯/动态 @POST("/information/complaint") Future<BaseData> complaint(@Body() Map<String, dynamic> param); ///app自动更新 @GET("/home/version") Future<BaseData<AppUpdate>> appVersion(); ///App推荐排行 @GET("/home/recommendRank") Future<BaseData<HomeRank>> recommendRank(); ///发送修改支付密码的短信验证 @GET("/member/sendVerifyByUpdatePayPwd") Future<BaseData> sendVerifyByUpdatePayPwd(); ///修改支付密码 @POST("/member/updatePayPwd") Future<BaseData> updatePayPwd(@Body() Map<String, dynamic> param); ///验证验证码 @POST("/member/verifyByUpdatePayPwd") Future<BaseData> verifyByUpdatePayPwd(@Body() Map<String, dynamic> param); ///VIP首页 @GET("/vipCard/index") Future<BaseData<VipCardHome>> vipCardIndex(); ///VIP订阅/购买 @POST("/vipCard/orderVip") Future<BaseData<dynamic>> orderVip(@Body() Map<String, dynamic> param); ///通过code获取设置/助农列表 @GET("/raise/products") Future<BaseData<List<Farmers>>> getConfig(); ///更换账户手机号码 @POST("/auth/changePhone") Future<BaseData> changePhone(@Body() Map<String, dynamic> param); ///修改手机号-发送验证码 @GET("/auth/sendVerify/{mobile}") Future<BaseData> changeSendVerify(@Path("mobile") String mobile); ///兑换积分门店列表 @GET("/store/storeListByCreditId/{creditGoodsId}") Future<BaseData<List<Store>>> storeListByCreditId( @Path("creditGoodsId") String creditGoodsId); ///获取APP门店推广渠道 @GET("/ipJson.jsp") Future<IpData> getIpInfo(); ///查询订单状态完成的并且可以开发票的订单列表 @POST("order/invoiceOrderList") Future<BaseData<InvoiceList>> invoiceOrderList(@Body() Map<String, dynamic> param); ///新增发票抬头 @POST("invoiceHeader") Future<BaseData> invoiceHeader(@Body() Map<String, dynamic> param); ///修改发票抬头 @PUT("invoiceHeader") Future<BaseData> invoiceHeaders(@Body() Map<String, dynamic> param); ///抬头信息列表 @POST("invoiceHeader/page") Future<BaseData<TitleInfoList>> invoiceHeaderList(@Body() Map<String, dynamic> param); ///删除抬头信息 @DELETE("invoiceHeader?ids[]={ids}") Future<BaseData> delInvoiceHeader(@Path("ids") String ids); ///提交发票审核 @POST("invoice") Future<BaseData> invoiceSubmit(@Body() Map<String, dynamic> param); ///开票历史 @POST("invoice/page") Future<BaseData<InvoicesHistoryList>> invoicePage(@Body() Map<String, dynamic> param); ///发票详情 @GET("invoice/detail{id}") Future<BaseData<InvoicesDetailInfo>> invoiceDetail(@Path("id") String id); }