Files
SmartSeniorHMOS/entry/src/main/ets/pages/profile/ProfileTab.ets
T
CAPTAIN1275 baf307e9d5 chore(hmos): 导入生产环境鸿蒙工程
- 以 D:\SmartSenior 生产工程为源,纳入 AppScope、entry、cjagent、hvigor 及根配置
- 移除 build-profile.json5 的 signingConfigs(p12/p7b/cer 路径与加密口令)及 products.signingConfig 引用
- 不纳入本地与开发产物:local.properties、.idea、.hvigor、.codegenie、demo、backup_a2a_native、SESSION_LOG.md、build_err.txt、build/、oh_modules
- .gitignore 追加 .codegenie 与密钥文件通配(*.p12/*.p7b/*.cer/*.jks/*.keystore/*.pem)
2026-09-29 18:44:37 +08:00

264 lines
8.8 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
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.
// 我的页签(对齐小程序 profile:用户信息 + 菜单 + 退出登录,ArkTS 严格类型,无 any)
import { router, promptAction, uiMaterial } from '@kit.ArkUI';
import { common } from '@kit.AbilityKit';
import { pasteboard } from '@kit.BasicServicesKit';
import { UnifiedRole, ROLE_NAME_MAP } from '../../common/ApiConstants';
import { AuthStore } from '../../utils/AuthStore';
import { PushManager } from '../../utils/PushManager';
import { FontScaleLevel, FontScaleOption, FONT_SCALE_LABELS, loadFontScale, setFontScale } from '../../utils/FontScale';
interface ProfileMenu {
key: string;
title: string;
desc: string;
route: string; // 空字符串表示未实现
}
@Component
export struct ProfileTab {
@State userName: string = '';
@State role: UnifiedRole | null = null;
@State isLoggedIn: boolean = false;
@State pushToken: string = '';
@State fontScale: FontScaleLevel = 'system';
@StorageProp('fontScale') fontScaleLevel: FontScaleLevel = 'system';
menus: Array<ProfileMenu> = [
{ key: 'notifications', title: '消息通知', desc: '系统与预警通知', route: 'pages/notifications/Notifications' },
{ key: 'records', title: '我的记录', desc: '我提交过的护理记录', route: 'pages/nurse/History' },
{ key: 'feedback', title: '意见反馈', desc: '提交使用建议', route: 'pages/profile/Feedback' },
{ key: 'about', title: '关于应用', desc: '版本与说明', route: 'pages/profile/About' },
];
// 按角色过滤"我的"菜单:消防的记录是巡更记录,销售无记录入口
private visibleMenus(): Array<ProfileMenu> {
const role = this.role;
if (role === 'fire_control') {
return this.menus.map((m: ProfileMenu): ProfileMenu => {
if (m.key === 'records') {
return { key: 'records_fire', title: '我的巡更记录', desc: '我提交过的巡更打卡', route: 'pages/fire-control/FirePatrolHome' } as ProfileMenu;
}
return m;
});
}
if (role === 'sales') {
return this.menus.filter((m: ProfileMenu): boolean => m.key !== 'records');
}
return this.menus;
}
aboutToAppear(): void {
this.loadAuth();
}
private async loadAuth(): Promise<void> {
const state = await AuthStore.getState();
this.userName = state.userName;
this.role = state.role;
this.isLoggedIn = state.token.length > 0;
this.pushToken = PushManager.getToken();
loadFontScale(getContext(this) as common.UIAbilityContext).then((level: FontScaleLevel) => {
this.fontScale = level;
});
}
private changeFontScale(level: FontScaleLevel): void {
this.fontScale = level;
setFontScale(getContext(this) as common.UIAbilityContext, level);
const label = FONT_SCALE_LABELS.find((item: FontScaleOption) => item.level === level)?.label ?? '';
promptAction.showToast({ message: `字体已调整为${label}` });
}
private copyPushToken(): void {
if (this.pushToken.length === 0) {
promptAction.showToast({ message: '推送令牌为空(未获取成功)' });
return;
}
const data = pasteboard.createData(pasteboard.MIMETYPE_TEXT_PLAIN, this.pushToken);
pasteboard.getSystemPasteboard().setData(data).then(() => {
promptAction.showToast({ message: '推送令牌已复制' });
}).catch(() => {
promptAction.showToast({ message: '复制失败' });
});
}
private onMenuClick(menu: ProfileMenu): void {
if (menu.route.length === 0) {
promptAction.showToast({ message: '功能开发中' });
return;
}
router.pushUrl({ url: menu.route }).catch(() => {});
}
private async logout(): Promise<void> {
await AuthStore.logout();
this.isLoggedIn = false;
promptAction.showToast({ message: '已退出登录' });
router.replaceUrl({ url: 'pages/Login' }).catch(() => {});
}
private roleName(): string {
if (!this.isLoggedIn) {
return '未登录';
}
return this.role ? (ROLE_NAME_MAP[this.role] ?? '员工') : '员工';
}
@Builder
MenuRow(menu: ProfileMenu) {
Row({ space: 12 }) {
Column({ space: 4 }) {
Text(menu.title)
.fontSize(16)
.fontWeight(FontWeight.Medium)
.fontColor($r('app.color.text_primary'))
Text(menu.desc)
.fontSize(12)
.fontColor($r('app.color.text_secondary'))
}
.layoutWeight(1)
.alignItems(HorizontalAlign.Start)
Text('›')
.fontSize(22)
.fontColor($r('app.color.inactive_tab'))
}
.width('100%')
.padding(16)
.backgroundColor(Color.Transparent)
.backgroundBlurStyle(BlurStyle.Thin)
.borderRadius(14)
.onClick(() => {
this.onMenuClick(menu);
})
}
build() {
Scroll() {
Column({ space: 16 }) {
// 用户信息卡
Row({ space: 14 }) {
Stack() {
Circle()
.width(60)
.height(60)
.fill(this.isLoggedIn ? $r('app.color.accent_blue') : $r('app.color.inactive_tab'))
Text(this.isLoggedIn && this.userName.length > 0 ? this.userName.substring(0, 1) : '未')
.fontSize(22)
.fontWeight(FontWeight.Bold)
.fontColor('#FFFFFF')
}
.width(60)
.height(60)
Column({ space: 4 }) {
Text(this.isLoggedIn ? this.userName : '未登录')
.fontSize(20)
.fontWeight(FontWeight.Bold)
.fontColor($r('app.color.text_primary'))
Text(this.roleName())
.fontSize(13)
.fontColor($r('app.color.text_secondary'))
}
.layoutWeight(1)
.alignItems(HorizontalAlign.Start)
}
.width('92%')
.padding(20)
.backgroundColor($r('app.color.background_card'))
.borderRadius(16)
.margin({ top: 24 })
// 推送令牌(调试用)
Column({ space: 6 }) {
Text('推送令牌(点按复制)')
.fontSize(14)
.fontColor($r('app.color.text_secondary'))
Text(this.pushToken.length > 0 ? this.pushToken : '未获取到推送令牌')
.fontSize(11)
.fontColor($r('app.color.text_primary'))
.maxLines(3)
.textOverflow({ overflow: TextOverflow.Ellipsis })
.width('100%')
}
.width('92%')
.padding(16)
.backgroundColor($r('app.color.background_card'))
.borderRadius(14)
.alignItems(HorizontalAlign.Start)
.onClick(() => {
this.copyPushToken();
})
// 字体大小(家属)
if (this.role === 'family') {
Column({ space: 8 }) {
Text('字体大小')
.fontSize(15)
.fontColor($r('app.color.text_primary'))
.width('100%')
Flex({ wrap: FlexWrap.Wrap, alignItems: ItemAlign.Center }) {
ForEach(FONT_SCALE_LABELS, (item: FontScaleOption) => {
Text(item.label)
.fontSize(15)
.fontColor(this.fontScale === item.level ? '#FFFFFF' : $r('app.color.text_primary'))
.padding({ left: 18, right: 18, top: 10, bottom: 10 })
.backgroundColor(this.fontScale === item.level ? $r('app.color.accent_blue') : $r('app.color.background_card'))
.borderRadius(10)
.margin({ right: 10, bottom: 10 })
.onClick(() => {
this.changeFontScale(item.level);
})
}, (item: FontScaleOption) => item.level)
}
.width('100%')
}
.width('92%')
.padding(16)
.backgroundColor($r('app.color.background_card'))
.borderRadius(14)
.alignItems(HorizontalAlign.Start)
}
// 菜单列表
Column({ space: 8 }) {
ForEach(this.visibleMenus(), (menu: ProfileMenu) => {
this.MenuRow(menu)
}, (menu: ProfileMenu) => menu.key)
}
.width('92%')
// 登录/退出
if (this.isLoggedIn) {
Button('退出登录')
.width('92%')
.height(48)
.fontColor('#FFFFFF')
.backgroundColor($r('app.color.accent_red'))
.borderRadius(12)
.onClick(() => {
this.logout();
})
} else {
Button('去登录')
.width('92%')
.height(48)
.fontColor('#FFFFFF')
.backgroundColor($r('app.color.accent_blue'))
.borderRadius(12)
.onClick(() => {
router.pushUrl({ url: 'pages/Login' }).catch(() => {});
})
}
}
.width('100%')
.alignItems(HorizontalAlign.Center)
.padding({ bottom: 120 })
}
.scrollBar(BarState.Auto)
.edgeEffect(EdgeEffect.Spring)
.width('100%')
.height('100%')
}
}