鸿蒙系统app开发:运动监测app(三)
最后总结一下,目前为止已经完成了基本的架构和前期的准备,比如用户的管理储存创建,注册、登录,数据持久性的保证和页面交互的优化等,使用的代码可以参考一下,有些引用可能不对,会存在问题,需要具体分析和调试,只展示方法。
1. 用户系统架构设计
1.1 整体架构规划
用户系统作为运动监测应用的基础支撑模块,采用经典的三层架构设计,确保系统的可维护性、可扩展性和安全性。
架构层次说明:
表现层:基于ArkUI的页面组件,负责用户交互界面渲染
业务逻辑层:UserManager单例类,处理核心业务规则和数据验证
数据持久层:Preferences工具类,实现用户数据的本地持久化存储
核心业务流程:
注册流程:用户输入 → 数据校验 → 唯一性验证 → 用户创建 → 数据持久化
登录流程:身份凭证验证 → 会话创建 → 状态持久化 → 界面跳转
密码管理:身份识别 → 安全验证 → 密码更新 → 状态同步
1.2 技术架构
单例模式应用:UserManager采用单例设计模式,确保整个应用生命周期内用户状态的一致性,避免多个用户实例导致的数据不一致问题。
MVVM数据绑定:通过ArkUI的@State装饰器实现数据与视图的自动绑定,当用户状态发生变化时,界面自动更新,提升开发效率和用户体验。
数据安全策略:用户密码在存储前进行校验,虽然未加密但通过本地存储保障基础安全。关键用户数据使用Preferences进行隔离存储。
2. 核心数据模型设计
2.1 用户实体模型
用户模型设计要充分考虑运动健康应用的特性和数据完整性要求:
export class User {
id: string; // 分布式唯一标识,采用时间戳+随机数+设备标识生成
username: string; // 系统登录标识,3-20位字母数字组合
phoneNumber: string; // 已验证手机号,用于安全操作和消息通知
password: string; // 用户凭证,存储前进行长度和复杂度校验
nickname: string; // 用户显示名称,支持中文和特殊字符,长度1-30位
avatar: string; // 头像资源地址,支持本地和远程资源加载
createdAt: number; // 账户创建时间戳,用于数据分析和安全审计
lastLoginTime: number; // 最后登录时间,用于会话管理和安全监控
loginCount: number; // 累计登录次数,用于用户行为分析
}
模型设计原则:
唯一性设计:用户ID采用复合生成算法,确保在分布式环境下的全局唯一性
数据完整性:所有核心字段在构造时初始化,支持完整的状态重建
扩展性预留:模型结构支持用户等级、运动偏好、健康目标等业务扩展
性能优化:关键查询字段建立索引映射,提升数据检索效率
2.2 数据传输对象与接口设计
建立完整的数据传输对象体系,规范各层间的数据交互契约:
// 注册数据契约
export interface RegisterData {
username: string; // 用户名:唯一标识,注册时实时校验
phoneNumber: string; // 手机号:格式校验和唯一性验证
password: string; // 密码:强度校验,需包含字母数字
nickname?: string; // 昵称:个性化设置,支持表情符号
agreeTerms: boolean; // 协议同意:必须接受用户协议和隐私政策
}
// 登录凭证规范
export interface LoginCredentials {
identifier: string; // 登录标识:支持用户名/手机号双因子登录
password: string; // 登录密码:与服务端存储凭证匹配
rememberMe: boolean; // 记住状态:控制会话持久化策略
}
// 用户信息更新
export interface UserUpdateData {
nickname?: string; // 昵称更新:即时生效,支持频繁修改
avatar?: string; // 头像更新:支持base64和URL格式
phoneNumber?: string; // 手机号变更:需要验证码二次确认
currentPassword?: string; // 当前密码:敏感操作身份验证
}
// 密码重置请求
export interface PasswordResetRequest {
identifier: string; // 用户标识:支持多方式账户识别
verificationCode: string; // 验证码:时效性控制,防暴力破解
newPassword: string; // 新密码:符合密码策略要求
confirmPassword: string; // 密码确认:防止输入错误
}
接口设计:
契约优先:明确定义数据格式和约束条件,减少运行时错误
场景化设计:针对不同业务场景设计专用接口,避免过度通用化
渐进式增强:通过可选字段和扩展点支持功能平滑升级
文档即代码:接口定义自带文档说明
3. 用户管理核心逻辑
3.1 用户注册实现
注册功能是用户系统的入口门户:
registerWithData(registerData: RegisterData): boolean {
// 数据完整性校验
if (!this.validateRegisterData(registerData)) {
throw new Error('注册数据格式错误');
}
// 业务规则验证
if (this.findUserByUsername(registerData.username)) {
throw new Error('用户名已被使用');
}
if (this.findUserByPhone(registerData.phoneNumber)) {
throw new Error('手机号已被注册');
}
// 用户实体创建
const userId = this.generateDistributedId();
const newUser = new User(
userId,
registerData.username,
registerData.phoneNumber,
registerData.password,
registerData.nickname
);
// 数据持久化操作
const users = this.getAllUsers();
users.push(newUser);
this.saveUsers(users);
// 注册后处理
this.onUserRegistered(newUser);
return true;
}
注册流程优化:
异步验证:用户名和手机号检查支持异步操作,避免界面阻塞
事件驱动:注册成功触发事件通知,支持后续业务流程扩展
3.2 用户登录验证
常见的用户登录和验证:
loginWithCredentials(credentials: LoginCredentials): LoginResult {
// 输入预处理
const normalizedIdentifier = this.normalizeIdentifier(credentials.identifier);
// 身份认证
const user = this.findUserByIdentifier(normalizedIdentifier);
if (!user || !this.verifyPassword(credentials.password, user.password)) {
return {
success: false,
errorCode: 'INVALID_CREDENTIALS',
message: '用户名或密码错误'
};
}
// 会话管理
this.currentUser = user;
user.lastLoginTime = Date.now();
user.loginCount += 1;
// 状态持久化
this.saveCurrentUser(user);
this.updateUserLoginStats(user);
// 登录后处理
this.onUserLoggedIn(user, credentials.rememberMe);
return {
success: true,
user: this.sanitizeUserInfo(user)
};
}
3.3 分布式会话管理
支持多设备登录和会话状态同步:
manageUserSessions(user: User): void {
// 会话创建
const sessionId = this.generateSessionId();
const session: UserSession = {
id: sessionId,
userId: user.id,
deviceId: this.getDeviceId(),
loginTime: Date.now(),
lastActiveTime: Date.now(),
expiresAt: this.calculateExpiryTime(user),
isPersistent: this.shouldPersistSession(user)
};
// 会话存储
this.activeSessions.set(sessionId, session);
this.persistSession(session);
// 会话同步
this.syncSessionsAcrossDevices(user.id);
// 过期管理
this.startSessionCleanupTimer();
}
会话特性:
设备感知:区分不同设备的登录会话,支持独立管理
冲突处理:同一账户多设备登录的会话冲突解决策略
4. 密码安全
4.1 认证流程
构建分层的密码安全管理:
resetPasswordWithVerification(request: PasswordResetRequest): ResetResult {
// 身份验证
const user = this.findUserByIdentifier(request.identifier);
if (!user) {
return { success: false, error: '用户不存在' };
}
// 验证码校验
if (!this.verifyResetCode(request.identifier, request.verificationCode)) {
return { success: false, error: '验证码错误或已过期' };
}
// 密码策略检查
if (!this.validatePasswordPolicy(request.newPassword)) {
return { success: false, error: '密码不符合安全要求' };
}
// 密码更新
user.password = request.newPassword;
this.updateUserPassword(user);
// 安全通知
this.sendPasswordChangeNotification(user);
return { success: true };
}
安全问题:
验证码:验证码尝试次数限制和冷却时间控制
密码强度:强制密码复杂度要求,防止弱密码
通知:密码变更实时通知用户,及时发现异常操作
4.2 密码
可配置的密码安全管理:
export class PasswordPolicy {
minLength: number = 8; // 最小长度要求
requireUppercase: boolean = true; // 必须包含大写字母
requireLowercase: boolean = true; // 必须包含小写字母
requireNumbers: boolean = true; // 必须包含数字
requireSpecialChars: boolean = false; // 必须包含特殊字符
maxAgeDays: number = 90; // 密码最长有效期
historySize: number = 5; // 历史密码记忆数量
validate(password: string): ValidationResult {
const issues: string[] = [];
if (password.length < this.minLength) {
issues.push(`密码长度至少${this.minLength}位`);
}
if (this.requireUppercase && !/[A-Z]/.test(password)) {
issues.push('必须包含大写字母');
}
// 可以添加更多验证规则
return {
isValid: issues.length === 0,
issues: issues
};
}
}
5. 数据持久化架构
5.1 分层存储策略
基于数据特性和访问模式设计的多级存储方案:
implementDataPersistence(): void {
// 内存缓存层 - 高频访问数据
this.userCache = new Map<string, User>();
// 本地存储层 - 持久化数据
this.preferencesUtil = PreferencesUtil.getInstance();
// 文件存储层 - 大容量数据
this.fileManager = new UserFileManager();
// 同步管理层 - 数据一致性
this.syncManager = new DataSyncManager();
}
存储:
缓存预热:应用启动时预加载当前用户数据
增量更新:只同步变更数据,减少输入输出的操作
压缩存储:大文本数据压缩后存储,能够节省空间
5.2 数据迁移与兼容
支持应用升级时的数据迁移:
handleDataMigration(oldVersion: string, newVersion: string): boolean {
// 版本差异分析
const migrationPath = this.analyzeMigrationPath(oldVersion, newVersion);
// 数据备份
this.backupUserData();
// 逐步迁移
for (const step of migrationPath.steps) {
if (!this.executeMigrationStep(step)) {
this.rollbackMigration();
return false;
}
}
// 迁移验证
return this.validateMigrationResult();
}
6. 用户界面交互设计
6.1 注册页面用户体验优化
注册流程通过分步引导和实时反馈提升用户完成率:
@Entry
@Component
struct RegisterFlow {
@State currentStep: number = 1;
@State registerData: RegisterData = {
username: '',
phoneNumber: '',
password: '',
agreeTerms: false
};
@State validationErrors: Map<string, string> = new Map();
build() {
Column() {
// 步骤指示器
this.BuildStepIndicator()
// 动态内容区域
if (this.currentStep === 1) {
this.BuildAccountInfoStep()
} else if (this.currentStep === 2) {
this.BuildPasswordStep()
} else {
this.BuildVerificationStep()
}
// 导航按钮
this.BuildNavigationButtons()
}
}
@Builder
BuildAccountInfoStep() {
Column({ space: 20 }) {
// 用户名输入带实时验证
TextInput({ placeholder: '请输入用户名' })
.onChange((value: string) => {
this.registerData.username = value;
this.validateUsername(value);
})
// 验证错误提示
if (this.validationErrors.has('username')) {
Text(this.validationErrors.get('username'))
.fontColor('#FF6B6B')
.fontSize(12)
}
// 手机号输入
TextInput({ placeholder: '请输入手机号' })
.type(InputType.Number)
.onChange((value: string) => {
this.registerData.phoneNumber = value;
this.validatePhoneNumber(value);
})
}
}
private validateUsername(username: string): void {
if (username.length < 3) {
this.validationErrors.set('username', '用户名至少3个字符');
} else if (!/^[a-zA-Z0-9_]+$/.test(username)) {
this.validationErrors.set('username', '只能包含字母、数字和下划线');
} else {
this.validationErrors.delete('username');
// 异步检查用户名是否可用
this.checkUsernameAvailability(username);
}
}
}
交互优化:
实时验证:输入时即时反馈验证结果,减少表单提交失败
智能提示:根据输入内容提供智能建议和错误修正
状态持久:页面刷新或应用重启时恢复填写进度
6.2 登录状态自适应界面
根据用户认证状态动态调整界面内容和功能:
@Entry
@Component
struct AdaptiveInterface {
@State currentUser: User | null = null;
@State isLoading: boolean = true;
aboutToAppear(): void {
this.loadUserState();
}
build() {
Column() {
if (this.isLoading) {
this.BuildLoadingState()
} else if (this.currentUser) {
this.BuildAuthenticatedInterface()
} else {
this.BuildUnauthenticatedInterface()
}
}
}
@Builder
BuildAuthenticatedInterface() {
Column() {
// 用户欢迎信息
Text(`欢迎回来,${this.currentUser.nickname}`)
.fontSize(20)
.fontWeight(FontWeight.Bold)
// 个性化内容推荐
this.BuildPersonalizedContent()
// 用户操作菜单
this.BuildUserActionsMenu()
}
}
@Builder
BuildUnauthenticatedInterface() {
Column({ space: 15 }) {
Text('开启您的运动之旅')
.fontSize(24)
.fontWeight(FontWeight.Bold)
Button('登录/注册')
.onClick(() => {
router.pushUrl({ url: 'pages/Login' });
})
// 游客模式功能
this.BuildGuestFeatures()
}
}
}
7.总结
最后总结一下,目前为止已经完成了基本的架构和前期的准备,比如用户的管理储存创建,注册、登录,数据持久性的保证和页面交互的优化等,使用的代码可以参考一下,有些引用可能不对,会存在问题,需要具体分析和调试,只展示方法。
更多推荐




所有评论(0)