这是 Dugout 的移动端与 Web 客户端,基于 Expo Router 构建,统一承载论坛浏览、发帖、管理和设置页面。
当前客户端采用以下技术栈:
- Expo + React Native
- Expo Router 进行文件路由
- Tamagui 作为组件和主题系统
- pnpm workspace 管理本地共享包
- TypeScript + Vitest + ESLint 作为开发质量工具
src/app/:路由入口,页面按文件名映射到路由src/components/:客户端通用组件src/lib/:会话、主题、时间等运行时工具packages/api/:后端 API 封装packages/domain/:领域类型与共享数据结构packages/i18n/:国际化资源与文案定义tamagui.config.ts:Tamagui 主题和 token 配置tailwind.config.js、nativewind-env.d.ts:样式系统相关配置app.json:Expo 应用配置
当前页面入口位于 src/app/:
index.tsx:首页compose.tsx:发帖页admin.tsx:管理页settings.tsx:设置页post/[id].tsx:帖子详情页_layout.tsx:全局布局、主题、国际化和会话提供器
- Node.js 20+
- pnpm 9+
- Expo Go、Android 模拟器、iOS 模拟器或浏览器
- 可访问的后端
server服务
客户端默认通过环境变量连接后端:
EXPO_PUBLIC_API_BASE_URL:后端地址,默认http://localhost:8080EXPO_PUBLIC_ADMIN_TOKEN:管理接口令牌,默认dev-admin-token
如果后端地址发生变化,请同步更新该变量。
pnpm install
pnpm start常见开发入口:
# Android
pnpm android
# iOS
pnpm ios
# Web
pnpm webpnpm start:启动 Expo 开发服务pnpm android:启动 Android 设备或模拟器pnpm ios:启动 iOS 设备或模拟器pnpm web:启动 Web 调试模式pnpm build:web:导出 Web 产物pnpm lint:静态检查pnpm typecheck:类型检查pnpm test:执行 Vitest 测试
客户端依赖 server 提供的接口,至少需要以下能力:
GET /api/v1/bootstrapGET /api/v1/settingsPATCH /api/v1/settingsGET /api/v1/boardsPOST /api/v1/boardsPATCH /api/v1/boards/{id}DELETE /api/v1/boards/{id}GET /api/v1/feedGET /api/v1/posts/searchPOST /api/v1/auth/registerPOST /api/v1/auth/loginGET /api/v1/auth/me
src/app/_layout.tsx 负责初始化以下上下文:
TamaguiProviderI18nProviderSessionProviderSafeAreaProviderStack路由布局
这意味着页面层应尽量保持纯 UI 和轻逻辑,不要在页面中重复创建全局提供器。
工作区中的共享包是客户端代码复用的核心:
@dugout/api:请求后端接口@dugout/domain:共享模型和类型@dugout/i18n:中英文资源和翻译函数
修改这些包时,要同步检查 src/ 下的页面和组件是否仍然兼容。
建议在提交前至少执行:
pnpm lint
pnpm typecheck
pnpm test如果修改了页面路由或全局布局,建议额外执行:
pnpm web- 该客户端默认使用中文界面资源
- 当前布局和主题以 Tamagui 为核心,不要直接依赖默认 RN 组件风格覆盖整体视觉
- 如果后端接口结构变化,优先同步
packages/api和packages/domain
This client intentionally follows the same stack direction as whu.sb/app (not app-legacy):
- Expo + React Native
- Expo Router (file-based routing)
- pnpm workspace packages under
packages/* - Tamagui component system
src/app: route entriessrc/app/settings.tsx: Tamagui-based runtime config/board management clienttamagui.config.ts: Tamagui theme and token configurationpackages/domain: shared domain typespackages/api: HTTP client forserverAPIs
Set these before running:
EXPO_PUBLIC_API_BASE_URL(default:http://localhost:8080)EXPO_PUBLIC_ADMIN_TOKEN(default:dev-admin-token)
Initialize workspace submodules first:
git submodule update --init --recursivepnpm install
pnpm startFor web preview:
pnpm webGET /api/v1/bootstrapPATCH /api/v1/settingsPOST /api/v1/boardsPATCH /api/v1/boards/{id}