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)
This commit is contained in:
CAPTAIN1275
2026-09-29 18:44:37 +08:00
parent d7f0e2f8a8
commit baf307e9d5
184 changed files with 31334 additions and 0 deletions
@@ -0,0 +1,263 @@
// 我的页签(对齐小程序 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%')
}
}