import 'dart:async'; import 'dart:convert'; import 'dart:io'; import 'package:flutter_dmzj/app/app_constant.dart'; import 'package:flutter_dmzj/app/event_bus.dart'; import 'package:flutter_dmzj/app/log.dart'; import 'package:flutter_dmzj/app/utils.dart'; import 'package:flutter_dmzj/models/db/comic_history.dart'; import 'package:flutter_dmzj/models/db/novel_history.dart'; import 'package:flutter_dmzj/models/user/login_result_model.dart'; import 'package:flutter_dmzj/models/user/user_profile_model.dart'; import 'package:flutter_dmzj/modules/user/login/user_login_dialog.dart'; import 'package:flutter_dmzj/requests/user_request.dart'; import 'package:flutter_dmzj/services/db_service.dart'; import 'package:flutter_dmzj/services/local_storage_service.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:get/get.dart'; import 'package:webview_flutter/webview_flutter.dart'; class UserService extends GetxService { static StreamController loginedStreamController = StreamController.broadcast(); static StreamController logoutStreamController = StreamController.broadcast(); ///登录事件流 static Stream get loginedStream => loginedStreamController.stream; ///退出登录事件流 static Stream get logoutStream => logoutStreamController.stream; static UserService get instance => Get.find(); final LocalStorageService storage = Get.find(); final request = UserRequest(); LoginResultModel? userAuthInfo; Rx userProfile = Rx(null); String get dmzjToken => userAuthInfo?.token ?? ''; String get userId => userAuthInfo?.uid.toString() ?? ''; String get nickname => userAuthInfo?.nickname ?? ''; bool get isVip => (userProfile.value?.userfeeinfo?.isVip ?? false); String get sign => (userProfile.value?.description ?? "").isEmpty ? "无个性签名" : userProfile.value?.description ?? ""; String get vipInfo => "会员有效期至${Utils.dateFormat.format(userProfile.value?.userfeeinfo?.expiresTime ?? DateTime.now())}"; /// 是否已经绑定手机号 var bindTel = true.obs; /// 是否已经设置密码 var setPwd = true.obs; /// 是否已经登录 var logined = false.obs; /// 已经订阅的漫画ID var subscribedComicIds = RxSet(); /// 已经订阅的小说ID var subscribedNovelIds = RxSet(); void init() { var value = storage.getValue(LocalStorageService.kUserAuthInfo, ''); if (value.isEmpty) { return; } LoginResultModel info = LoginResultModel.fromJson(json.decode(value)); userAuthInfo = info; logined.value = true; if (logined.value) { //syncRemoteHistory(); } } /// 设置登录信息 void setAuthInfo(LoginResultModel info) { userAuthInfo = info; storage.setValue(LocalStorageService.kUserAuthInfo, info.toString()); logined.value = true; UserService.loginedStreamController.add(true); //refreshProfile(); syncRemoteHistory(); } void logout() { storage.removeValue(LocalStorageService.kUserAuthInfo); userProfile.value = null; logined.value = false; UserService.logoutStreamController.add(true); } Future login() async { if (logined.value) { return true; } var result = await Get.dialog(UserLoginDialog()); return (result != null && result == true); } /// 刷新个人资料 Future refreshProfile() async { try { if (!logined.value) { return; } userProfile.value = await request.userProfile(); //updateCookie(); updateBindStatus(); } catch (e) { Log.logPrint(e); } } /// 更新一下用户的历史记录 void syncRemoteHistory() { if (!logined.value) { return; } syncRemoteComicHistory(); syncRemoteNovelHistory(); } void syncRemoteComicHistory() async { try { await request.comicHistory(); } catch (e) { Log.logPrint(e); } } void syncRemoteNovelHistory() async { try { await request.novelHistory(); } catch (e) { Log.logPrint(e); } } /// 更新绑定状态 void updateBindStatus() async { try { if (!logined.value) { return; } var result = await request.isBindTelPwd(); bindTel.value = result.isBindTel == 1; setPwd.value = result.isBindTel == 1; } catch (e) { Log.logPrint(e); } } /// 添加订阅 Future addSubscribe(List ids, int type) async { try { if (!await login()) { return false; } await request.addSubscribe( ids: ids, type: type, ); if (type == AppConstant.kTypeComic) { subscribedComicIds.addAll(ids); } else if (type == AppConstant.kTypeNovel) { subscribedNovelIds.addAll(ids); } SmartDialog.showToast("订阅成功"); return true; } catch (e) { SmartDialog.showToast(e.toString()); return false; } } /// 取消订阅 Future cancelSubscribe(List ids, int type) async { try { if (!await login()) { return false; } await request.removeSubscribe( ids: ids, type: type, ); if (type == AppConstant.kTypeComic) { subscribedComicIds.removeAll(ids); } else if (type == AppConstant.kTypeNovel) { subscribedNovelIds.removeAll(ids); } SmartDialog.showToast("已取消订阅"); return true; } catch (e) { SmartDialog.showToast(e.toString()); return false; } } /// 更新漫画记录 Future updateComicHistory({ required int comicId, required int chapterId, required int page, required String comicName, required String comicCover, required String chapterName, }) async { try { var time = DateTime.now(); await DBService.instance.updateComicHistory( ComicHistory( comicId: comicId, chapterId: chapterId, comicName: comicName, comicCover: comicCover, chapterName: chapterName, updateTime: time, page: page, ), ); EventBus.instance.emit(EventBus.kUpdatedComicHistory, comicId); if (!logined.value) { return; } // await request.uploadComicHistory( // comicId: comicId, // chapterId: chapterId, // page: page, // time: time, // ); } catch (e) { Log.logPrint(e); } } /// 更新漫画记录 Future updateNovelHistory({ required int novelId, required int chapterId, required int index, required int total, required String novelName, required String novelCover, required String chapterName, required int volumeId, required String volumeName, }) async { try { var time = DateTime.now(); await DBService.instance.updateNovelHistory( NovelHistory( novelId: novelId, chapterId: chapterId, volumeName: volumeName, volumeId: volumeId, chapterName: chapterName, updateTime: time, index: index, total: total, novelCover: novelCover, novelName: novelName, ), ); EventBus.instance.emit(EventBus.kUpdatedNovelHistory, novelId); if (!logined.value) { return; } await request.uploadNovelHistory( novelId: novelId, volumeId: volumeId, chapterId: chapterId, page: 1, total: total, time: time, ); } catch (e) { Log.logPrint(e); } } void updateCookie() async { if (Platform.isAndroid || Platform.isIOS) { final WebViewCookieManager cookieManager = WebViewCookieManager(); for (var item in getCookies()) { await cookieManager.setCookie(item); } } } List getCookies() { var cookie = userProfile.value?.cookieVal ?? ""; if (cookie.isEmpty) { return []; } List cookies = []; cookie.split(";").forEach((element) { List keyValue = element.split("="); if (keyValue.length == 2) { cookies.add( WebViewCookie( domain: ".dmzj.com", value: keyValue[1], name: keyValue[0], ), ); cookies.add( WebViewCookie( domain: ".idmzj.com", value: keyValue[1], name: keyValue[0], ), ); cookies.add( WebViewCookie( domain: ".muwai.com", value: keyValue[1], name: keyValue[0], ), ); } }); return cookies; } }