From db4283af4adb08f193978558454b21e2a0d6b3cd Mon Sep 17 00:00:00 2001 From: bggRGjQaUbCoE Date: Fri, 6 Jun 2025 21:33:55 +0800 Subject: [PATCH] refa: coin/like arc Signed-off-by: bggRGjQaUbCoE --- lib/http/api.dart | 4 + lib/http/member.dart | 96 ++++++++----------- lib/models/member/coin.dart | 17 ---- lib/models_new/member/coin_like_arc/data.dart | 16 ++++ lib/models_new/member/coin_like_arc/item.dart | 96 +++++++++++++++++++ lib/pages/member_coin/controller.dart | 16 +++- lib/pages/member_coin/view.dart | 9 +- lib/pages/member_coin/widgets/item.dart | 62 ++++++------ lib/pages/member_like/controller.dart | 16 +++- lib/pages/member_like/view.dart | 9 +- 10 files changed, 220 insertions(+), 121 deletions(-) delete mode 100644 lib/models/member/coin.dart create mode 100644 lib/models_new/member/coin_like_arc/data.dart create mode 100644 lib/models_new/member/coin_like_arc/item.dart diff --git a/lib/http/api.dart b/lib/http/api.dart index ffab87e7..34d51ee3 100644 --- a/lib/http/api.dart +++ b/lib/http/api.dart @@ -876,4 +876,8 @@ class Api { static const String favFavFolder = '/x/v3/fav/folder/fav'; static const String unfavFavFolder = '/x/v3/fav/folder/unfav'; + + static const String coinArc = '${HttpString.appBaseUrl}/x/v2/space/coinarc'; + + static const String likeArc = '${HttpString.appBaseUrl}/x/v2/space/likearc'; } diff --git a/lib/http/member.dart b/lib/http/member.dart index 52ec6084..f0031fca 100644 --- a/lib/http/member.dart +++ b/lib/http/member.dart @@ -8,11 +8,11 @@ import 'package:PiliPlus/http/init.dart'; import 'package:PiliPlus/http/loading_state.dart'; import 'package:PiliPlus/models/common/member/contribute_type.dart'; import 'package:PiliPlus/models/dynamics/result.dart'; -import 'package:PiliPlus/models/member/coin.dart'; import 'package:PiliPlus/models/member/info.dart'; import 'package:PiliPlus/models/member/tags.dart'; import 'package:PiliPlus/models_new/follow/data.dart'; import 'package:PiliPlus/models_new/follow/list.dart'; +import 'package:PiliPlus/models_new/member/coin_like_arc/data.dart'; import 'package:PiliPlus/models_new/member/search_archive/data.dart'; import 'package:PiliPlus/models_new/space/space/data.dart'; import 'package:PiliPlus/models_new/space/space_archive/data.dart'; @@ -605,62 +605,6 @@ class MemberHttp { } } - // 最近投币 - static Future?>> getRecentCoinVideo( - {required int mid}) async { - Map params = await WbiSign.makSign({ - 'mid': mid, - 'gaia_source': 'main_web', - 'web_location': 333.999, - }); - var res = await Request().get( - Api.getRecentCoinVideoApi, - queryParameters: { - 'vmid': mid, - 'gaia_source': 'main_web', - 'web_location': 333.999, - 'w_rid': params['w_rid'], - 'wts': params['wts'], - }, - ); - if (res.data['code'] == 0) { - List? list = (res.data['data'] as List?) - ?.map((e) => MemberCoinsDataModel.fromJson(e)) - .toList(); - return Success(list); - } else { - return Error(res.data['message']); - } - } - - // 最近点赞 - static Future?>> getRecentLikeVideo( - {required int mid}) async { - Map params = await WbiSign.makSign({ - 'mid': mid, - 'gaia_source': 'main_web', - 'web_location': 333.999, - }); - var res = await Request().get( - Api.getRecentLikeVideoApi, - queryParameters: { - 'vmid': mid, - 'gaia_source': 'main_web', - 'web_location': 333.999, - 'w_rid': params['w_rid'], - 'wts': params['wts'], - }, - ); - if (res.data['code'] == 0) { - List? list = (res.data['data']?['list'] as List?) - ?.map((e) => MemberCoinsDataModel.fromJson(e)) - .toList(); - return Success(list); - } else { - return Error(res.data['message']); - } - } - // 获取up播放数、点赞数 static Future memberView({required int mid}) async { var res = await Request() @@ -748,4 +692,42 @@ class MemberHttp { return Error(res.data['message']); } } + + static Future> coinArc({ + required int mid, + required int page, + }) async { + var res = await Request().get( + Api.coinArc, + queryParameters: { + 'pn': page, + 'ps': 20, + 'vmid': mid, + }, + ); + if (res.data['code'] == 0) { + return Success(CoinLikeArcData.fromJson(res.data['data'])); + } else { + return Error(res.data['message']); + } + } + + static Future> likeArc({ + required int mid, + required int page, + }) async { + var res = await Request().get( + Api.likeArc, + queryParameters: { + 'pn': page, + 'ps': 20, + 'vmid': mid, + }, + ); + if (res.data['code'] == 0) { + return Success(CoinLikeArcData.fromJson(res.data['data'])); + } else { + return Error(res.data['message']); + } + } } diff --git a/lib/models/member/coin.dart b/lib/models/member/coin.dart deleted file mode 100644 index 5a8ceb26..00000000 --- a/lib/models/member/coin.dart +++ /dev/null @@ -1,17 +0,0 @@ -import 'package:PiliPlus/models/model_hot_video_item.dart'; - -class MemberCoinsDataModel extends HotVideoItemModel { - String? subtitle; - int? coins; - int? time; - String? resourceType; - - MemberCoinsDataModel.fromJson(Map json) - : super.fromJson(json) { - coins = json['coins']; - subtitle = json['subtitle']; - time = json['time']; - resourceType = json['resource_type']; - redirectUrl = json['redirect_url']; - } -} diff --git a/lib/models_new/member/coin_like_arc/data.dart b/lib/models_new/member/coin_like_arc/data.dart new file mode 100644 index 00000000..4a3ba7b9 --- /dev/null +++ b/lib/models_new/member/coin_like_arc/data.dart @@ -0,0 +1,16 @@ +import 'package:PiliPlus/models_new/member/coin_like_arc/item.dart'; + +class CoinLikeArcData { + int? count; + List? item; + + CoinLikeArcData({this.count, this.item}); + + factory CoinLikeArcData.fromJson(Map json) => + CoinLikeArcData( + count: json['count'] as int?, + item: (json['item'] as List?) + ?.map((e) => CoinLikeArcItem.fromJson(e as Map)) + .toList(), + ); +} diff --git a/lib/models_new/member/coin_like_arc/item.dart b/lib/models_new/member/coin_like_arc/item.dart new file mode 100644 index 00000000..cb39e552 --- /dev/null +++ b/lib/models_new/member/coin_like_arc/item.dart @@ -0,0 +1,96 @@ +class CoinLikeArcItem { + String? title; + String? subtitle; + String? tname; + String? cover; + String? coverIcon; + String? uri; + String? param; + String? goto; + String? length; + int? duration; + bool? isPopular; + bool? isSteins; + bool? isUgcpay; + bool? isCooperation; + bool? isPgc; + bool? isLivePlayback; + bool? isPugv; + bool? isFold; + bool? isOneself; + int? play; + int? danmaku; + int? ctime; + int? ugcPay; + String? author; + bool? state; + int? videos; + String? viewContent; + int? iconType; + String? publishTimeText; + + CoinLikeArcItem({ + this.title, + this.subtitle, + this.tname, + this.cover, + this.coverIcon, + this.uri, + this.param, + this.goto, + this.length, + this.duration, + this.isPopular, + this.isSteins, + this.isUgcpay, + this.isCooperation, + this.isPgc, + this.isLivePlayback, + this.isPugv, + this.isFold, + this.isOneself, + this.play, + this.danmaku, + this.ctime, + this.ugcPay, + this.author, + this.state, + this.videos, + this.viewContent, + this.iconType, + this.publishTimeText, + }); + + factory CoinLikeArcItem.fromJson(Map json) => + CoinLikeArcItem( + title: json['title'] as String?, + subtitle: json['subtitle'] as String?, + tname: json['tname'] as String?, + cover: json['cover'] as String?, + coverIcon: json['cover_icon'] as String?, + uri: json['uri'] as String?, + param: json['param'] as String?, + goto: json['goto'] as String?, + length: json['length'] as String?, + duration: json['duration'] as int?, + isPopular: json['is_popular'] as bool?, + isSteins: json['is_steins'] as bool?, + isUgcpay: json['is_ugcpay'] as bool?, + isCooperation: json['is_cooperation'] as bool?, + isPgc: json['is_pgc'] as bool?, + isLivePlayback: json['is_live_playback'] as bool?, + isPugv: json['is_pugv'] as bool?, + isFold: json['is_fold'] as bool?, + isOneself: json['is_oneself'] as bool?, + play: json['play'] as int?, + danmaku: json['danmaku'] as int?, + ctime: json['ctime'] as int?, + ugcPay: json['ugc_pay'] as int?, + author: json['author'] as String?, + state: json['state'] as bool?, + videos: json['videos'] as int?, + viewContent: json['view_content'] as String?, + iconType: json['icon_type'] as int?, + publishTimeText: json['publish_time_text'] as String?, + ); +} diff --git a/lib/pages/member_coin/controller.dart b/lib/pages/member_coin/controller.dart index a8f55857..d428d7f9 100644 --- a/lib/pages/member_coin/controller.dart +++ b/lib/pages/member_coin/controller.dart @@ -1,10 +1,11 @@ import 'package:PiliPlus/http/loading_state.dart'; import 'package:PiliPlus/http/member.dart'; -import 'package:PiliPlus/models/member/coin.dart'; +import 'package:PiliPlus/models_new/member/coin_like_arc/data.dart'; +import 'package:PiliPlus/models_new/member/coin_like_arc/item.dart'; import 'package:PiliPlus/pages/common/common_list_controller.dart'; -class MemberCoinController extends CommonListController< - List?, MemberCoinsDataModel> { +class MemberCoinController + extends CommonListController { final dynamic mid; MemberCoinController({this.mid}); @@ -15,6 +16,11 @@ class MemberCoinController extends CommonListController< } @override - Future?>> customGetData() => - MemberHttp.getRecentCoinVideo(mid: mid); + List? getDataList(CoinLikeArcData response) { + return response.item; + } + + @override + Future> customGetData() => + MemberHttp.coinArc(mid: mid, page: page); } diff --git a/lib/pages/member_coin/view.dart b/lib/pages/member_coin/view.dart index 2af36cb9..1e92d359 100644 --- a/lib/pages/member_coin/view.dart +++ b/lib/pages/member_coin/view.dart @@ -2,7 +2,7 @@ import 'package:PiliPlus/common/constants.dart'; import 'package:PiliPlus/common/skeleton/video_card_v.dart'; import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart'; import 'package:PiliPlus/http/loading_state.dart'; -import 'package:PiliPlus/models/member/coin.dart'; +import 'package:PiliPlus/models_new/member/coin_like_arc/item.dart'; import 'package:PiliPlus/pages/member_coin/controller.dart'; import 'package:PiliPlus/pages/member_coin/widgets/item.dart'; import 'package:PiliPlus/utils/grid.dart'; @@ -59,7 +59,7 @@ class _MemberCoinPageState extends State { ); } - Widget _buildBody(LoadingState?> loadingState) { + Widget _buildBody(LoadingState?> loadingState) { return switch (loadingState) { Loading() => SliverGrid.builder( gridDelegate: SliverGridDelegateWithExtentAndRatio( @@ -85,7 +85,10 @@ class _MemberCoinPageState extends State { ), itemCount: response!.length, itemBuilder: (context, index) { - return MemberCoinsItem(coinItem: response[index]); + if (index == response.length - 1) { + _ctr.onLoadMore(); + } + return MemberCoinLikeItem(item: response[index]); }, ) : HttpError(onReload: _ctr.onReload), diff --git a/lib/pages/member_coin/widgets/item.dart b/lib/pages/member_coin/widgets/item.dart index 5f12eec8..161cb818 100644 --- a/lib/pages/member_coin/widgets/item.dart +++ b/lib/pages/member_coin/widgets/item.dart @@ -6,18 +6,18 @@ import 'package:PiliPlus/common/widgets/stat/stat.dart'; import 'package:PiliPlus/http/search.dart'; import 'package:PiliPlus/models/common/badge_type.dart'; import 'package:PiliPlus/models/common/stat_type.dart'; -import 'package:PiliPlus/models/member/coin.dart'; -import 'package:PiliPlus/utils/app_scheme.dart'; +import 'package:PiliPlus/models_new/member/coin_like_arc/item.dart'; +import 'package:PiliPlus/utils/id_utils.dart'; import 'package:PiliPlus/utils/page_utils.dart'; import 'package:PiliPlus/utils/utils.dart'; import 'package:flutter/material.dart'; -class MemberCoinsItem extends StatelessWidget { - final MemberCoinsDataModel coinItem; +class MemberCoinLikeItem extends StatelessWidget { + final CoinLikeArcItem item; - const MemberCoinsItem({ + const MemberCoinLikeItem({ super.key, - required this.coinItem, + required this.item, }); @override @@ -27,29 +27,29 @@ class MemberCoinsItem extends StatelessWidget { margin: EdgeInsets.zero, child: InkWell( onTap: () async { - if (coinItem.resourceType != 'ugc') { - if (coinItem.redirectUrl?.isNotEmpty == true) { - if (await PiliScheme.routePushFromUrl(coinItem.redirectUrl!, - selfHandle: true)) { - return; - } + if (item.isPgc == true) { + if (item.uri?.isNotEmpty == true) { + PageUtils.viewPgcFromUri(item.uri!); } + return; } - int? cid = - await SearchHttp.ab2c(aid: coinItem.aid, bvid: coinItem.bvid); - if (cid != null) { - PageUtils.toVideoPage( - 'bvid=${coinItem.bvid}&cid=$cid', - arguments: { - 'videoItem': coinItem, - 'heroTag': Utils.makeHeroTag(coinItem.aid) - }, - ); + + if (item.param != null) { + int? cid = await SearchHttp.ab2c(aid: item.param); + if (cid != null) { + PageUtils.toVideoPage( + 'bvid=${IdUtils.av2bv(int.parse(item.param!))}&cid=$cid', + arguments: { + 'videoItem': item, + 'heroTag': Utils.makeHeroTag(item.param) + }, + ); + } } }, onLongPress: () => imageSaveDialog( - title: coinItem.title, - cover: coinItem.cover, + title: item.title, + cover: item.cover, ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, @@ -63,16 +63,16 @@ class MemberCoinsItem extends StatelessWidget { clipBehavior: Clip.none, children: [ NetworkImgLayer( - src: coinItem.cover, + src: item.cover, width: maxWidth, height: maxHeight, ), - if (coinItem.duration > 0) + if (item.duration != null && item.duration! > 0) PBadge( bottom: 6, right: 6, type: PBadgeType.gray, - text: Utils.timeFormat(coinItem.duration), + text: Utils.timeFormat(item.duration), ) ], ); @@ -85,7 +85,7 @@ class MemberCoinsItem extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( - '${coinItem.title}\n', + '${item.title}\n', maxLines: 2, overflow: TextOverflow.ellipsis, ), @@ -94,17 +94,17 @@ class MemberCoinsItem extends StatelessWidget { children: [ StatWidget( type: StatType.play, - value: coinItem.stat.view, + value: item.play, ), const SizedBox(width: 8), StatWidget( type: StatType.danmaku, - value: coinItem.stat.danmu, + value: item.danmaku, ), const Spacer(), Text( Utils.customStampStr( - timestamp: coinItem.pubdate, date: 'MM-DD'), + timestamp: item.ctime, date: 'MM-DD'), style: TextStyle( fontSize: 11, color: Theme.of(context).colorScheme.outline, diff --git a/lib/pages/member_like/controller.dart b/lib/pages/member_like/controller.dart index 8365bf7c..b938be66 100644 --- a/lib/pages/member_like/controller.dart +++ b/lib/pages/member_like/controller.dart @@ -1,10 +1,11 @@ import 'package:PiliPlus/http/loading_state.dart'; import 'package:PiliPlus/http/member.dart'; -import 'package:PiliPlus/models/member/coin.dart'; +import 'package:PiliPlus/models_new/member/coin_like_arc/data.dart'; +import 'package:PiliPlus/models_new/member/coin_like_arc/item.dart'; import 'package:PiliPlus/pages/common/common_list_controller.dart'; -class MemberLikeController extends CommonListController< - List?, MemberCoinsDataModel> { +class MemberLikeController + extends CommonListController { final dynamic mid; MemberLikeController({this.mid}); @@ -15,6 +16,11 @@ class MemberLikeController extends CommonListController< } @override - Future?>> customGetData() => - MemberHttp.getRecentLikeVideo(mid: mid); + List? getDataList(CoinLikeArcData response) { + return response.item; + } + + @override + Future> customGetData() => + MemberHttp.likeArc(mid: mid, page: page); } diff --git a/lib/pages/member_like/view.dart b/lib/pages/member_like/view.dart index dac37a0e..239cccaa 100644 --- a/lib/pages/member_like/view.dart +++ b/lib/pages/member_like/view.dart @@ -2,7 +2,7 @@ import 'package:PiliPlus/common/constants.dart'; import 'package:PiliPlus/common/skeleton/video_card_v.dart'; import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart'; import 'package:PiliPlus/http/loading_state.dart'; -import 'package:PiliPlus/models/member/coin.dart'; +import 'package:PiliPlus/models_new/member/coin_like_arc/item.dart'; import 'package:PiliPlus/pages/member_coin/widgets/item.dart'; import 'package:PiliPlus/pages/member_like/controller.dart'; import 'package:PiliPlus/utils/grid.dart'; @@ -59,7 +59,7 @@ class _MemberLikePageState extends State { ); } - Widget _buildBody(LoadingState?> loadingState) { + Widget _buildBody(LoadingState?> loadingState) { return switch (loadingState) { Loading() => SliverGrid.builder( gridDelegate: SliverGridDelegateWithExtentAndRatio( @@ -85,7 +85,10 @@ class _MemberLikePageState extends State { ), itemCount: response!.length, itemBuilder: (context, index) { - return MemberCoinsItem(coinItem: response[index]); + if (index == response.length - 1) { + _ctr.onLoadMore(); + } + return MemberCoinLikeItem(item: response[index]); }, ) : HttpError(onReload: _ctr.onReload),