Files
real-e-party-iOS/YuMi/Modules/NewMine/Controllers/NewMineViewController.m
edwinQQQ 5294f32ca7 完成 Moment 和 Mine 模块的 API 集成
Moment 模块:
-  集成真实动态列表 API (momentsRecommendList)
-  集成点赞 API (momentsLike)
-  使用 MomentsInfoModel 替代 mock 数据
-  实现时间格式化(相对时间显示)
-  实现点赞状态切换和 UI 更新
-  分页加载功能完善

Mine 模块:
-  集成用户信息 API (getUserInfo)
-  集成钱包信息 API (getUserWalletInfo)
-  使用 UserInfoModel 和 WalletInfoModel
-  头部视图动态显示真实数据
-  昵称、等级、经验、关注/粉丝数

改进:
- NewMomentCell: 支持点赞交互,实时更新
- NewMineViewController: viewWillAppear 时自动刷新数据
- 所有 API 调用都有错误处理和日志

下一步:
- 测试真实 API 调用是否成功
- 完善评论和发布功能
- 准备图片资源
2025-10-09 19:02:02 +08:00

282 lines
9.5 KiB
Objective-C
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//
// NewMineViewController.m
// YuMi
//
// Created by AI on 2025-10-09.
// Copyright © 2025 YuMi. All rights reserved.
//
#import "NewMineViewController.h"
#import "NewMineHeaderView.h"
#import <Masonry/Masonry.h>
#import "Api+Mine.h"
#import "AccountInfoStorage.h"
#import "UserInfoModel.h"
#import "WalletInfoModel.h"
#import <MJExtension/MJExtension.h>
#import "XPSkillCardPlayerManager.h"
@interface NewMineViewController () <UITableViewDelegate, UITableViewDataSource>
// MARK: - UI Components
/// 主列表
@property (nonatomic, strong) UITableView *tableView;
/// 顶部个人信息卡片
@property (nonatomic, strong) NewMineHeaderView *headerView;
/// 设置按钮
@property (nonatomic, strong) UIButton *settingsButton;
// MARK: - Data
/// 菜单项数据源
@property (nonatomic, strong) NSArray<NSDictionary *> *menuItems;
/// 用户信息模型
@property (nonatomic, strong) UserInfoModel *userInfo;
/// 钱包信息模型
@property (nonatomic, strong) WalletInfoModel *walletInfo;
@end
@implementation NewMineViewController
// MARK: - Lifecycle
- (void)viewDidLoad {
[super viewDidLoad];
self.title = @"我的";
self.view.backgroundColor = [UIColor colorWithRed:0.96 green:0.96 blue:0.96 alpha:1.0]; // 浅灰背景
[self setupNavigationBar];
[self setupUI];
[self loadData];
NSLog(@"[NewMineViewController] 页面加载完成");
}
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
// 刷新用户信息
[self refreshUserInfo];
}
// MARK: - Setup
- (void)setupNavigationBar {
// 设置按钮(右上角)
self.settingsButton = [UIButton buttonWithType:UIButtonTypeSystem];
[self.settingsButton setTitle:@"⚙️" forState:UIControlStateNormal];
self.settingsButton.titleLabel.font = [UIFont systemFontOfSize:24];
[self.settingsButton addTarget:self action:@selector(onSettingsButtonTapped) forControlEvents:UIControlEventTouchUpInside];
UIBarButtonItem *settingsBarButton = [[UIBarButtonItem alloc] initWithCustomView:self.settingsButton];
self.navigationItem.rightBarButtonItem = settingsBarButton;
}
- (void)setupUI {
// TableView
[self.view addSubview:self.tableView];
[self.tableView mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.equalTo(self.view);
}];
// 设置头部视图
self.tableView.tableHeaderView = self.headerView;
NSLog(@"[NewMineViewController] UI 设置完成");
}
// MARK: - Data Loading
- (void)loadData {
// 菜单项配置(完全不同的顺序和图标)
self.menuItems = @[
@{@"title": @"💎 我的钱包", @"type": @"wallet"},
@{@"title": @"📊 数据统计", @"type": @"stats"},
@{@"title": @"⭐️ 我的收藏", @"type": @"favorites"},
@{@"title": @"📝 编辑资料", @"type": @"profile"},
@{@"title": @"🔔 消息通知", @"type": @"notifications"},
@{@"title": @"🎨 主题设置", @"type": @"theme"},
@{@"title": @"🌐 语言切换", @"type": @"language"},
@{@"title": @" 关于我们", @"type": @"about"},
];
[self.tableView reloadData];
}
- (void)refreshUserInfo {
NSString *uid = [[AccountInfoStorage instance] getUid];
if (!uid.length) {
NSLog(@"[NewMineViewController] 未登录,无法获取用户信息");
return;
}
// 调用真实 API 获取用户信息
[Api getUserInfo:^(BaseModel * _Nullable data, NSInteger code, NSString * _Nullable msg) {
if (code == 200 && data.data) {
self.userInfo = [UserInfoModel mj_objectWithKeyValues:data.data];
// 更新头部视图
NSDictionary *userInfoDict = @{
@"nickname": self.userInfo.nick ?: @"未设置昵称",
@"avatar": self.userInfo.avatar ?: @"",
@"level": @(self.userInfo.charmLevel),
@"exp": @(self.userInfo.charmLevelExp),
@"nextLevelExp": @(self.userInfo.nextCharmLevelExp),
@"followers": @(self.userInfo.fansNum),
@"following": @(self.userInfo.followNum),
};
[self.headerView configureWithUserInfo:userInfoDict];
NSLog(@"[NewMineViewController] 用户信息加载成功: %@", self.userInfo.nick);
} else {
NSLog(@"[NewMineViewController] 用户信息加载失败: %@", msg);
}
} uid:uid];
// 同时获取钱包信息
[self refreshWalletInfo];
}
- (void)refreshWalletInfo {
NSString *uid = [[AccountInfoStorage instance] getUid];
NSString *ticket = [[AccountInfoStorage instance] getTicket];
if (!uid.length || !ticket.length) return;
[Api getUserWalletInfo:^(BaseModel * _Nullable data, NSInteger code, NSString * _Nullable msg) {
if (code == 200 && data.data) {
self.walletInfo = [WalletInfoModel mj_objectWithKeyValues:data.data];
NSLog(@"[NewMineViewController] 钱包信息加载成功: 钻石=%ld 金币=%ld",
(long)self.walletInfo.diamond, (long)self.walletInfo.money);
}
} fail:^(NSInteger code, NSString * _Nullable msg) {
NSLog(@"[NewMineViewController] 钱包信息加载失败: %@", msg);
} uid:uid ticket:ticket];
}
// MARK: - Actions
- (void)onSettingsButtonTapped {
NSLog(@"[NewMineViewController] 设置按钮点击");
// TODO: 跳转到设置页面
[self showAlertWithMessage:@"设置功能开发中"];
}
- (void)onMenuItemTapped:(NSDictionary *)item {
NSString *type = item[@"type"];
NSString *title = item[@"title"];
NSLog(@"[NewMineViewController] 菜单项点击: %@", type);
if ([type isEqualToString:@"wallet"]) {
// TODO: 跳转到钱包页面
[self showAlertWithMessage:@"钱包功能开发中"];
} else if ([type isEqualToString:@"stats"]) {
// TODO: 跳转到数据统计页面
[self showAlertWithMessage:@"数据统计功能开发中"];
} else if ([type isEqualToString:@"favorites"]) {
// TODO: 跳转到收藏页面
[self showAlertWithMessage:@"收藏功能开发中"];
} else if ([type isEqualToString:@"profile"]) {
// TODO: 跳转到编辑资料页面
[self showAlertWithMessage:@"编辑资料功能开发中"];
} else {
[self showAlertWithMessage:[NSString stringWithFormat:@"%@ 功能开发中", title]];
}
}
- (void)showAlertWithMessage:(NSString *)message {
UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"提示"
message:message
preferredStyle:UIAlertControllerStyleAlert];
[alert addAction:[UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:nil]];
[self presentViewController:alert animated:YES completion:nil];
}
// MARK: - UITableViewDataSource
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return self.menuItems.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *identifier = @"MenuCell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
if (!cell) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];
cell.backgroundColor = [UIColor whiteColor];
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
cell.textLabel.font = [UIFont systemFontOfSize:15];
cell.textLabel.textColor = [UIColor colorWithWhite:0.2 alpha:1.0];
}
if (indexPath.row < self.menuItems.count) {
NSDictionary *item = self.menuItems[indexPath.row];
cell.textLabel.text = item[@"title"];
}
return cell;
}
// MARK: - UITableViewDelegate
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
[tableView deselectRowAtIndexPath:indexPath animated:YES];
if (indexPath.row < self.menuItems.count) {
NSDictionary *item = self.menuItems[indexPath.row];
[self onMenuItemTapped:item];
}
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
return 56; // 卡片式高度
}
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
return 15; // 上间距
}
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
UIView *header = [[UIView alloc] init];
header.backgroundColor = [UIColor clearColor];
return header;
}
// MARK: - Lazy Loading
- (UITableView *)tableView {
if (!_tableView) {
_tableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStyleGrouped];
_tableView.delegate = self;
_tableView.dataSource = self;
_tableView.separatorStyle = UITableViewCellSeparatorStyleSingleLine;
_tableView.separatorInset = UIEdgeInsetsMake(0, 15, 0, 15);
_tableView.backgroundColor = self.view.backgroundColor;
_tableView.showsVerticalScrollIndicator = NO;
_tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
}
return _tableView;
}
- (NewMineHeaderView *)headerView {
if (!_headerView) {
_headerView = [[NewMineHeaderView alloc] initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, 280)];
}
return _headerView;
}
@end