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.总结

        最后总结一下,目前为止已经完成了基本的架构和前期的准备,比如用户的管理储存创建,注册、登录,数据持久性的保证和页面交互的优化等,使用的代码可以参考一下,有些引用可能不对,会存在问题,需要具体分析和调试,只展示方法。

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐