v0.7.0 接上真实服务器:登录 / 设备会话 / 全量同步与各模块真实数据
从「演示数据壳子」走到「真的能连家里的服务器用」。
登录(用户 2026-10-17「完整的登录功能」)
· 首次启动先填服务器地址 → /api/v1/ping 自报门户(认得出"这地址上真是家书")
· 手机号或用户名 + 密码 → 拿令牌;失败提示统一,不泄露账号是否存在
· FbDeviceStore:首次启动生成并持久化设备 UUID(三方应用拿不到 UDID),
设备名取机型(marketName),并上报 platform / app_version
设备会话(v57,用户 2026-10-17)
· 一把令牌 = 一台设备的一条会话;每次启动打一次 /me(有网就验)
· 两种锁分开:need_login(401/被踢 → 清令牌)与 offline_expired
(离线超 24h → 只锁界面、不清数据、联网自动恢复)——
混成一种就会违背用户要的"一直联网就不用每天输密码"
· 运行期任何请求 401 → 网络层全局回调立刻锁定跳登录页(FbHttp 的 authProbe
让登录/校验类请求跳过,避免"两个地方同时跳登录页")
· 退出登录:先清本地令牌(主防线),再尽力通知服务端
· 设置页显示版本号与「这台设备」
数据层
· FbDb / FbSchema / FbParse / 各 Repo(日程 / 名册 / 观影 / 模块)+ FbSyncAll
· 首页改为服务端 /home(农历/节气/纪念日/生日/天气/统计/往年的今天)
· 日程页用 FbDayEventPanel,与网页端显示方式/红线/并排三处一致
验证:ArkTS 静态守卫 231/0;hvigor 编译 BUILD SUCCESSFUL(entry-default-signed.hap)。
This commit is contained in:
@@ -28,14 +28,23 @@ export struct FbTopBar {
|
||||
@BuilderParam actions: () => void;
|
||||
|
||||
build() {
|
||||
Row({ space: 10 }) {
|
||||
// ---- 应用图标(贴最左;**点它开抽屉**)----
|
||||
// 🔴 顶栏横向镜像 —— 「质感握姿」(用户 2026-10-16 第 4 条):
|
||||
// 左手握时家书图标在**左**,右手握时它跑到**右**,方便单手点它开抽屉。
|
||||
// ⚠️ 用 `Flex(direction: RowReverse)` 整体镜像,而不是逐个改 padding/margin ——
|
||||
// 后者要同时动 4 处、还会把"标题靠左"这类布局搞乱。
|
||||
// ⚠️ 但**图标不能真的反着画**(`RowReverse` 只改主轴顺序、不翻转图形本身),
|
||||
// 所以镜像后位置对、图形仍正。
|
||||
Flex({
|
||||
direction: this.app.drawerSide === 'right' ? FlexDirection.RowReverse : FlexDirection.Row,
|
||||
alignItems: ItemAlign.Center
|
||||
}) {
|
||||
// ---- 应用图标(**点它开抽屉**;左右握姿时自动换边)----
|
||||
// ⚠️ 必须给描边:logo 是「米色底(74%) + 砖红图案(24%)」的实心方图,
|
||||
// 放在白色/米色上时底板与背景几乎同色,只剩砖红图案发飘、看不清。
|
||||
// 一层极浅的描边就能把底板"托"出来(本机范本 SyncCalendar 也给了描边)。
|
||||
//
|
||||
// 🔴 点击事件直接挂在 Image 上,**不套 Button** ——
|
||||
// Button 自带最小尺寸与内边距,会把图标挤离左边线(用户要"图标靠左")。
|
||||
// Button 自带最小尺寸与内边距,会把图标挤离边线(用户要"图标靠边")。
|
||||
Image($r('app.media.fb_logo'))
|
||||
.width(30)
|
||||
.height(30)
|
||||
@@ -43,7 +52,7 @@ export struct FbTopBar {
|
||||
.border({ width: 1, color: FbColors.line })
|
||||
.flexShrink(0)
|
||||
.onClick(() => {
|
||||
// 点图标 ⇒ 开抽屉(沿用上次的方向 drawerSide,默认左边)
|
||||
// 点图标 ⇒ 开抽屉(方向由**握姿**定,见 common/FbGrip.ets)
|
||||
this.app.drawerOpen = true;
|
||||
})
|
||||
|
||||
@@ -60,6 +69,7 @@ export struct FbTopBar {
|
||||
.maxLines(1)
|
||||
}
|
||||
.alignItems(HorizontalAlign.Start)
|
||||
.margin({ left: 10, right: 10 })
|
||||
.layoutWeight(1)
|
||||
|
||||
// ---- 右:各模块自己的操作 ----
|
||||
@@ -100,14 +110,34 @@ export struct FbTopBar {
|
||||
dia: 32,
|
||||
fontSizeVp: 14
|
||||
})
|
||||
.margin({ left: 2 })
|
||||
}
|
||||
.width('100%')
|
||||
.height(FbMetric.topBarH)
|
||||
// 🔴 高度 = **状态栏高度 + 顶栏本身高度**(用户 2026-10-13 要"全沉浸")。
|
||||
//
|
||||
// 为什么必须自己加这一段:
|
||||
// 应用开了 `setWindowLayoutFullScreen(true)`(见 EntryAbility)——
|
||||
// 窗口**不再为状态栏让位**,内容会真的画到状态栏底下。
|
||||
// ⇒ 顶栏若不自己让出这一截,"家书"标题会被时间/信号图标压住。
|
||||
//
|
||||
// ⚠️ 让位用 **padding.top**(不是 margin):这样**白底会一并覆盖状态栏区域**,
|
||||
// 静止时看起来通知栏与顶栏是一整块;而向上滑动时,
|
||||
// 这一整块(含白底)随内容滚走,下面的内容直接顶到屏幕最上沿 ——
|
||||
// 这就是用户要的"内容从手机边缘滑上去"的观感。
|
||||
// ⚠️ `statusBarH` 是 `@Trace` 的,量出来(异步)后顶栏会**自动重排**;
|
||||
// 量不到时为 0,标题贴到最上面(仍可读),不会把内容推到屏幕中间。
|
||||
.height(FbMetric.topBarH + this.app.statusBarH)
|
||||
// 左内边距=pagePad(与下面各区块的左边线对齐);右侧 10(图标可略贴边)
|
||||
.padding({ left: FbMetric.pagePad, right: 10, top: 4, bottom: 4 })
|
||||
.alignItems(VerticalAlign.Center)
|
||||
// 顶栏底色 = 白色(与下面的个人信息卡同色)
|
||||
.padding({
|
||||
left: FbMetric.pagePad,
|
||||
right: 10,
|
||||
top: this.app.statusBarH + 4,
|
||||
bottom: 4
|
||||
})
|
||||
// 顶栏底色 = 白色(与下面的个人信息卡同色)。
|
||||
// ⚠️ 它会覆盖上面 `padding.top` 让出来的状态栏区域 —— 这是**有意为之**:
|
||||
// 静止时通知栏与顶栏连成一整块白(用户 2026-10-12 定的"融为一体"),
|
||||
// 滚动时再一起滑走。**不要**改成"顶栏不设背景色、透出页面底色",
|
||||
// 那样静止时会变成"米色通知栏 + 白色顶栏"上下拼接(踩过这个坑)。
|
||||
.backgroundColor(FbColors.surface)
|
||||
// 底线:与下方内容(同是白色卡)之间给一条极浅的分隔,避免"两块白糊在一起"
|
||||
.border({ width: { bottom: 1 }, color: FbColors.line2 })
|
||||
|
||||
Reference in New Issue
Block a user