feat(m0): 后端骨架 + Web/安卓前端骨架 + 设计文档
- backend: FastAPI 应用工厂、统一错误信封、JWT、短信登录、工作区/成员/邀请、幂等中间件 - alembic 0001: workspace/member/invitation/audit_log/app_user + RLS 策略 + 双角色 GRANT - tests: 认证/工作区/租户隔离/幂等 四组用例(尚未在本机执行) - web: React18+Vite 骨架(登录、工作区、邀请落地页) - android: Compose 骨架(登录、工作区列表) - 2.Design: PRODUCT-PLAN / ROADMAP-M0-M1 / NAMING / DEVELOPMENT
This commit is contained in:
@@ -0,0 +1,36 @@
|
||||
# 安卓端(M0 骨架)
|
||||
|
||||
Kotlin + Jetpack Compose。当前只做了 M0 的骨架:登录、工作区列表、新建工作区、生成邀请码。
|
||||
任务/工单/知识(M1 起)在 `ui/` 下按同样结构扩展。
|
||||
|
||||
## 打开与运行
|
||||
|
||||
1. Android Studio 打开 `android/` 目录(它会把缺失的 Gradle Wrapper 补齐)。
|
||||
2. 在 `android/local.properties` 里指定后端地址(模拟器访问宿主机用 `10.0.2.2`):
|
||||
```
|
||||
dadao.apiBase=http://10.0.2.2:8100
|
||||
```
|
||||
3. 运行 `app` 配置。后端需先在本机 8100 端口起来。
|
||||
|
||||
> 仓库里**没有提交 `gradle/wrapper/gradle-wrapper.jar`**(二进制,且 M0 阶段由 Android Studio 生成更稳)。
|
||||
> 等 M5 正式做安卓时把 wrapper 一起提交,保证构建可复现。
|
||||
|
||||
## 结构
|
||||
|
||||
```
|
||||
app/src/main/java/com/dadao/task/
|
||||
├── MainActivity.kt 入口 + 极简三态路由(Splash/Login/Home)
|
||||
├── data/
|
||||
│ ├── Api.kt OkHttp + kotlinx.serialization;信封解包、业务码抛 ApiException
|
||||
│ └── TokenStore.kt 令牌本地存储(M5 换 EncryptedSharedPreferences)
|
||||
└── ui/
|
||||
├── Theme.kt 与 Web 一致的墨青 + 陶土色板
|
||||
├── LoginScreen.kt 手机号 + 验证码(开发环境后端回显验证码)
|
||||
└── HomeScreen.kt 工作区列表 / 新建 / 生成邀请码
|
||||
```
|
||||
|
||||
## 已知待办
|
||||
|
||||
- 明文令牌存储(`TokenStore` 里已标 TODO),M5 换 Keystore 加密。
|
||||
- 无离线缓存,弱网直接报错——与产品 D7「在线优先」一致。
|
||||
- 邀请链接 `https://dadaotask.com/join/<wsId>/<code>` 已在 Manifest 注册,但落地处理尚未实现。
|
||||
Reference in New Issue
Block a user