feat(entry): 新增四入口 ViewModel

This commit is contained in:
AndyChen1024
2026-09-11 20:48:04 +08:00
parent 28fc0a1026
commit d9f1893f67
4 changed files with 193 additions and 13 deletions

View File

@@ -1,37 +1,41 @@
import { User } from '../model/User';
import { UserRepository } from '../data/repository/UserRepository';
import { HomeData } from '../model/HomeModels';
import { HomeRepository } from '../data/repository/HomeRepository';
import { SessionRepository } from '../data/repository/SessionRepository';
import { ServiceLocator } from '../di/ServiceLocator';
/**
* 首页视图模型:@ObservedV2 三态(loading / error / data)。
* 只依赖 UserRepository 契约,不直接接触网络层。
* 根据登录态分流到游客首页 / 原生首页。
*/
@ObservedV2
export class HomeViewModel {
@Trace users: User[] = [];
@Trace data: HomeData = new HomeData();
@Trace isGuest: boolean = true;
@Trace loading: boolean = false;
@Trace error: string = '';
private readonly repository: UserRepository;
private readonly repository: HomeRepository;
private readonly session: SessionRepository;
constructor(repository: UserRepository) {
constructor(repository: HomeRepository, session: SessionRepository) {
this.repository = repository;
this.session = session;
}
/**
* 工厂:从 DI 容器解析依赖并装配,避免页面直接触碰 data 层类型。
*/
static create(): HomeViewModel {
return new HomeViewModel(ServiceLocator.get('userRepository') as UserRepository);
return new HomeViewModel(
ServiceLocator.get('homeRepository') as HomeRepository,
ServiceLocator.get('sessionRepository') as SessionRepository
);
}
async load(): Promise<void> {
this.loading = true;
this.error = '';
try {
// 演示:拉取一个示例用户;真实业务可替换为列表接口。
const user = await this.repository.getUser('demo-user');
this.users = [user];
const loggedIn = this.session.isLoggedIn();
this.isGuest = !loggedIn;
this.data = loggedIn ? await this.repository.observeHome() : await this.repository.observeGuestHome();
} catch (err) {
this.error = JSON.stringify(err);
} finally {