鸿蒙表单提交与校验(多字段联合验证)

举报
鱼弦 发表于 2025/09/12 20:22:31 2025/09/12
【摘要】 1. 引言在鸿蒙(HarmonyOS)应用开发中,​​表单交互​​是用户输入数据的核心场景,广泛应用于登录、注册、订单提交、信息编辑等功能模块。然而,表单的有效性直接影响业务逻辑的正确性——例如,用户提交的手机号可能格式错误,密码强度不足,或必填字段为空。因此,​​表单校验​​成为保障数据质量与用户体验的关键环节。鸿蒙的表单校验不仅需要处理​​单字段基础验证​​(如非空检查、长度限制),更需...


1. 引言

在鸿蒙(HarmonyOS)应用开发中,​​表单交互​​是用户输入数据的核心场景,广泛应用于登录、注册、订单提交、信息编辑等功能模块。然而,表单的有效性直接影响业务逻辑的正确性——例如,用户提交的手机号可能格式错误,密码强度不足,或必填字段为空。因此,​​表单校验​​成为保障数据质量与用户体验的关键环节。

鸿蒙的表单校验不仅需要处理​​单字段基础验证​​(如非空检查、长度限制),更需要支持​​多字段联合验证​​(如密码与确认密码一致性、手机号与验证码匹配)。本文将深入探讨鸿蒙中表单提交与校验的实现方案,聚焦 ​​多字段联合验证场景​​,通过 ​​详细的代码示例(ArkTS/ArkUI)​​ 展示具体实现,并分析其技术特性与挑战,帮助开发者构建健壮、高效的表单交互逻辑。


2. 技术背景

​2.1 鸿蒙表单开发基础​

鸿蒙的表单界面基于 ​​ArkUI框架​​(声明式UI开发范式),通过 ​​输入组件(TextInput、Select、Checkbox等)​​ 收集用户数据,结合 ​​状态管理(@State、@Prop)​​ 实现数据绑定与动态更新。表单校验的核心目标是:

  • ​实时反馈​​:用户在输入过程中即时提示错误(如“密码长度不足6位”);
  • ​提交拦截​​:点击提交按钮时,若存在无效字段,则阻止提交并高亮错误项;
  • ​联合验证​​:多个字段之间存在逻辑关联时(如“确认密码需与密码一致”),需整体校验。

​2.2 多字段联合验证的典型场景​

  • ​注册表单​​:用户名(非空+唯一)、密码(强度校验)、确认密码(与密码一致)、手机号(格式校验);
  • ​登录表单​​:用户名/邮箱(非空)、密码(非空)、验证码(与后端生成的一致);
  • ​订单提交​​:收货地址(非空)、联系电话(格式校验)、商品数量(大于0)、优惠券码(可选但需有效);
  • ​信息编辑​​:必填字段(如姓名、身份证号)与非必填字段(如备注)的组合校验。

​2.3 核心校验需求​

校验类型 示例 联合验证需求
​基础校验​ 非空、长度限制、格式(如邮箱) 单字段独立验证(如手机号必须11位)
​逻辑校验​ 密码与确认密码一致 多字段关联验证(需同时检查两个字段)
​业务校验​ 优惠券码需在后端存在 可能依赖异步请求(如调用接口验证)

3. 应用使用场景

​3.1 典型场景(需多字段联合验证的鸿蒙应用)​

  • ​用户注册/登录​​:注册时需验证密码强度(至少8位含字母和数字)且确认密码一致,登录时需验证用户名和密码非空;
  • ​个人信息完善​​:编辑个人资料时,必填字段(如真实姓名、身份证号)需符合特定格式(如身份证号18位),非必填字段(如头像链接)可选;
  • ​电商订单提交​​:收货地址(非空)、手机号(11位且以1开头)、商品数量(大于0且不超过库存)、优惠券码(可选但需有效);
  • ​问卷调查​​:必答题(如满意度评分)需选择有效选项,选答题(如意见反馈)可选但长度不超过500字。

​3.2 场景细分与校验规则​

场景类型 字段示例 校验规则(联合验证)
注册表单 用户名、密码、确认密码、手机号 用户名非空且唯一,密码≥8位且含数字/字母,确认密码=密码,手机号11位且符合号段规则
登录表单 用户名/邮箱、密码 用户名/邮箱非空,密码非空
订单提交 收货地址、手机号、数量、优惠券 收货地址非空,手机号11位,数量>0,优惠券(若填写则需后端验证有效)
信息编辑 姓名、身份证号、备注 姓名非空,身份证号18位且符合校验算法,备注≤200字(可选)

4. 不同场景下的详细代码实现

​4.1 环境准备​

  • ​开发工具​​:DevEco Studio(鸿蒙官方IDE,支持ArkTS开发);
  • ​核心技术​​:
    • ​表单组件​​:TextInput(文本输入)、Button(提交按钮);
    • ​状态管理​​:@State(管理表单字段值与校验状态)、@ObjectLink(可选,用于复杂对象绑定);
    • ​校验逻辑​​:通过自定义函数实现基础校验(如正则表达式)和联合校验(如密码一致性);
  • ​关键概念​​:
    • ​实时校验​​:用户输入时触发校验(如 onChange 事件);
    • ​提交校验​​:点击提交按钮时统一校验所有字段;
    • ​错误反馈​​:通过 Text 组件显示错误提示,或高亮输入框边框(如红色)。

​4.2 典型场景1:用户注册表单(多字段联合验证)​

​4.2.1 场景描述​

用户注册页面包含以下字段:

  • ​用户名​​(必填,非空,长度3-20字符);
  • ​密码​​(必填,长度≥8,需包含字母和数字);
  • ​确认密码​​(必填,需与密码完全一致);
  • ​手机号​​(必填,11位且以1开头)。

用户点击“注册”按钮时,需联合验证所有字段,任意一项无效则阻止提交并提示具体错误。

​4.2.2 代码实现(ArkTS)​

// pages/Register.ets(注册页面:多字段联合验证)
@Entry
@Component
struct Register {
  // 表单字段状态
  @State username: string = '';
  @State password: string = '';
  @State confirmPassword: string = '';
  @State phone: string = '';

  // 错误提示状态
  @State usernameError: string = '';
  @State passwordError: string = '';
  @State confirmPasswordError: string = '';
  @State phoneError: string = '';

  // 校验规则函数
  // 用户名:非空且长度3-20
  private validateUsername(): boolean {
    if (!this.username.trim()) {
      this.usernameError = '用户名不能为空';
      return false;
    } else if (this.username.length < 3 || this.username.length > 20) {
      this.usernameError = '用户名长度需为3-20字符';
      return false;
    } else {
      this.usernameError = '';
      return true;
    }
  }

  // 密码:长度≥8且包含字母和数字
  private validatePassword(): boolean {
    const passwordRegex = /^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d]{8,}$/;
    if (!this.password) {
      this.passwordError = '密码不能为空';
      return false;
    } else if (!passwordRegex.test(this.password)) {
      this.passwordError = '密码需至少8位,包含字母和数字';
      return false;
    } else {
      this.passwordError = '';
      return true;
    }
  }

  // 确认密码:与密码一致
  private validateConfirmPassword(): boolean {
    if (!this.confirmPassword) {
      this.confirmPasswordError = '请确认密码';
      return false;
    } else if (this.confirmPassword !== this.password) {
      this.confirmPasswordError = '两次输入的密码不一致';
      return false;
    } else {
      this.confirmPasswordError = '';
      return true;
    }
  }

  // 手机号:11位且以1开头
  private validatePhone(): boolean {
    const phoneRegex = /^1[3-9]\d{9}$/;
    if (!this.phone) {
      this.phoneError = '手机号不能为空';
      return false;
    } else if (!phoneRegex.test(this.phone)) {
      this.phoneError = '请输入有效的11位手机号';
      return false;
    } else {
      this.phoneError = '';
      return true;
    }
  }

  // 提交按钮点击事件
  private handleSubmit() {
    // 联合校验所有字段
    const isUsernameValid = this.validateUsername();
    const isPasswordValid = this.validatePassword();
    const isConfirmPasswordValid = this.validateConfirmPassword();
    const isPhoneValid = this.validatePhone();

    if (isUsernameValid && isPasswordValid && isConfirmPasswordValid && isPhoneValid) {
      // 所有字段有效,执行注册逻辑(如调用接口)
      console.log('注册信息有效,提交数据:', {
        username: this.username,
        password: this.password,
        phone: this.phone
      });
      // 实际项目中此处替换为注册接口调用
      // await registerApi(this.username, this.password, this.phone);
    } else {
      console.log('表单存在错误,阻止提交');
    }
  }

  build() {
    Column({ space: 20 }) {
      Text('用户注册')
        .fontSize(24)
        .fontWeight(FontWeight.Bold)
        .margin({ top: 50 })

      // 用户名输入
      Column({ space: 5 }) {
        Text('用户名 *')
          .fontSize(16)
          .alignSelf(ItemAlign.Start)
        TextInput({ placeholder: '请输入3-20位用户名' })
          .onChange((value: string) => {
            this.username = value;
            // 实时校验(可选)
            // this.validateUsername();
          })
          .width('100%')
        if (this.usernameError) {
          Text(this.usernameError)
            .fontSize(12)
            .fontColor(Color.Red)
            .alignSelf(ItemAlign.Start)
        }
      }
      .width('100%')

      // 密码输入
      Column({ space: 5 }) {
        Text('密码 *')
          .fontSize(16)
          .alignSelf(ItemAlign.Start)
        TextInput({ placeholder: '请输入至少8位密码(含字母和数字)' })
          .type(InputType.Password)
          .onChange((value: string) => {
            this.password = value;
            // 实时校验(可选)
            // this.validatePassword();
          })
          .width('100%')
        if (this.passwordError) {
          Text(this.passwordError)
            .fontSize(12)
            .fontColor(Color.Red)
            .alignSelf(ItemAlign.Start)
        }
      }
      .width('100%')

      // 确认密码输入
      Column({ space: 5 }) {
        Text('确认密码 *')
          .fontSize(16)
          .alignSelf(ItemAlign.Start)
        TextInput({ placeholder: '请再次输入密码' })
          .type(InputType.Password)
          .onChange((value: string) => {
            this.confirmPassword = value;
            // 实时校验(可选)
            // this.validateConfirmPassword();
          })
          .width('100%')
        if (this.confirmPasswordError) {
          Text(this.confirmPasswordError)
            .fontSize(12)
            .fontColor(Color.Red)
            .alignSelf(ItemAlign.Start)
        }
      }
      .width('100%')

      // 手机号输入
      Column({ space: 5 }) {
        Text('手机号 *')
          .fontSize(16)
          .alignSelf(ItemAlign.Start)
        TextInput({ placeholder: '请输入11位手机号' })
          .type(InputType.PhoneNumber)
          .onChange((value: string) => {
            this.phone = value;
            // 实时校验(可选)
            // this.validatePhone();
          })
          .width('100%')
        if (this.phoneError) {
          Text(this.phoneError)
            .fontSize(12)
            .fontColor(Color.Red)
            .alignSelf(ItemAlign.Start)
        }
      }
      .width('100%')

      // 提交按钮
      Button('注册')
        .width('80%')
        .height(40)
        .onClick(() => {
          this.handleSubmit();
        })

      // 提交成功提示(模拟)
      if (false) { // 实际项目中根据handleSubmit结果控制
        Text('注册成功!')
          .fontSize(16)
          .fontColor(Color.Green)
          .margin({ top: 20 })
      }
    }
    .width('90%')
    .height('100%')
    .justifyContent(FlexAlign.Start)
    .alignItems(HorizontalAlign.Center)
    .padding(20)
  }
}

​4.2.3 运行结果​

  • 用户输入无效数据(如密码仅7位、手机号10位),点击“注册”按钮后,对应字段下方显示红色错误提示(如“密码需至少8位,包含字母和数字”);
  • 用户输入全部有效数据(用户名“test”、密码“Abc12345”、确认密码“Abc12345”、手机号“13800138000”),点击“注册”按钮后,控制台输出注册信息(实际项目中触发接口调用)。

​4.3 典型场景2:登录表单(基础联合验证)​

​4.3.1 场景描述​

登录页面包含 ​​用户名/邮箱​​(非空)和 ​​密码​​(非空)字段,点击“登录”时验证所有字段非空,任意一项为空则阻止提交。

​4.3.2 代码实现(ArkTS)​

// pages/Login.ets(登录页面:基础联合验证)
@Entry
@Component
struct Login {
  @State usernameOrEmail: string = '';
  @State password: string = '';
  @State usernameError: string = '';
  @State passwordError: string = '';

  // 校验用户名/邮箱非空
  private validateUsername(): boolean {
    if (!this.usernameOrEmail.trim()) {
      this.usernameError = '用户名或邮箱不能为空';
      return false;
    } else {
      this.usernameError = '';
      return true;
    }
  }

  // 校验密码非空
  private validatePassword(): boolean {
    if (!this.password) {
      this.passwordError = '密码不能为空';
      return false;
    } else {
      this.passwordError = '';
      return true;
    }
  }

  // 提交校验
  private handleSubmit() {
    const isUsernameValid = this.validateUsername();
    const isPasswordValid = this.validatePassword();

    if (isUsernameValid && isPasswordValid) {
      console.log('登录信息有效,提交数据:', {
        usernameOrEmail: this.usernameOrEmail,
        password: this.password
      });
      // 实际项目中调用登录接口
    } else {
      console.log('登录表单存在错误');
    }
  }

  build() {
    Column({ space: 20 }) {
      Text('用户登录')
        .fontSize(24)
        .fontWeight(FontWeight.Bold)
        .margin({ top: 50 })

      Column({ space: 5 }) {
        Text('用户名/邮箱 *')
          .fontSize(16)
          .alignSelf(ItemAlign.Start)
        TextInput({ placeholder: '请输入用户名或邮箱' })
          .onChange((value: string) => {
            this.usernameOrEmail = value;
          })
          .width('100%')
        if (this.usernameError) {
          Text(this.usernameError)
            .fontSize(12)
            .fontColor(Color.Red)
            .alignSelf(ItemAlign.Start)
        }
      }
      .width('100%')

      Column({ space: 5 }) {
        Text('密码 *')
          .fontSize(16)
          .alignSelf(ItemAlign.Start)
        TextInput({ placeholder: '请输入密码' })
          .type(InputType.Password)
          .onChange((value: string) => {
            this.password = value;
          })
          .width('100%')
        if (this.passwordError) {
          Text(this.passwordError)
            .fontSize(12)
            .fontColor(Color.Red)
            .alignSelf(ItemAlign.Start)
        }
      }
      .width('100%')

      Button('登录')
        .width('80%')
        .height(40)
        .onClick(() => {
          this.handleSubmit();
        })
    }
    .width('90%')
    .height('100%')
    .justifyContent(FlexAlign.Start)
    .alignItems(HorizontalAlign.Center)
    .padding(20)
  }
}

​4.3.3 运行结果​

  • 用户未输入用户名或密码时,点击“登录”按钮后,对应字段显示“不能为空”错误提示;
  • 用户输入有效数据后,控制台输出登录信息(实际项目中触发登录接口)。

5. 原理解释

​5.1 多字段联合验证的核心流程​

  1. ​数据绑定​​:通过 @State 管理表单字段的值(如 usernamepassword)和错误提示(如 usernameError);
  2. ​校验函数​​:为每个字段定义独立的校验函数(如 validateUsername),或为联合逻辑定义组合函数(如 validateAllFields);
  3. ​触发时机​​:
    • ​实时校验​​:在输入框的 onChange 事件中调用校验函数(即时反馈);
    • ​提交校验​​:在提交按钮的 onClick 事件中调用所有字段的校验函数(统一拦截无效提交);
  4. ​错误反馈​​:根据校验结果更新错误提示状态(如 usernameError),并通过 Text 组件显示具体错误信息;
  5. ​提交控制​​:若任一字段校验失败,则阻止后续业务逻辑(如接口调用),仅当所有字段有效时才执行提交。

​5.2 核心特性总结​

特性 说明 典型应用场景
​多字段联合​ 支持字段间的逻辑关联校验(如密码与确认密码一致) 注册、订单提交等复杂表单
​实时反馈​ 用户输入时即时提示错误(可选),提升交互体验 对格式要求严格的字段(如手机号)
​提交拦截​ 阻止无效数据的提交,避免后端无效请求 所有表单场景
​灵活扩展​ 可结合正则表达式、异步接口调用(如验证用户名唯一性) 高级校验需求(如邮箱唯一性)
​状态管理​ 通过 @State 管理字段值和错误状态,实现数据驱动视图更新 所有ArkUI表单组件

6. 原理流程图及原理解释

​6.1 多字段联合验证的完整流程图​

sequenceDiagram
    participant 用户 as 用户
    participant 输入框 as 表单输入组件(TextInput)
    participant 状态管理 as @State变量(字段值/错误提示)
    participant 校验函数 as 自定义校验逻辑
    participant 提交按钮 as 提交按钮(Button)
    participant 业务逻辑 as 后续操作(如接口调用)

    用户->>输入框: 输入字段值(如用户名、密码)
    输入框->>状态管理: 触发onChange事件,更新字段值(@State)
    alt 实时校验(可选)
      输入框->>校验函数: 调用对应校验函数(如validatePassword)
      校验函数->>状态管理: 更新错误提示(如passwordError)
      状态管理->>输入框: 显示错误提示(Text组件)
    end

    用户->>提交按钮: 点击提交
    提交按钮->>校验函数: 调用所有字段的校验函数(validateUsername/Password等)
    校验函数->>状态管理: 返回校验结果(true/false)
    alt 所有字段有效
      状态管理->>业务逻辑: 允许提交,传递有效数据(@State字段值)
      业务逻辑->>后端: 执行注册/登录等操作
    else 存在无效字段
      状态管理->>输入框: 显示对应错误提示(Text组件)
      业务逻辑->>用户: 阻止提交,提示“请检查输入”
    end

​6.2 原理解释​

  • ​数据流​​:用户输入通过 TextInput 组件绑定到 @State 变量,校验函数根据这些变量判断有效性,并更新错误提示状态(如 passwordError);
  • ​校验触发​​:实时校验(可选)在用户输入时即时反馈,提交校验在点击按钮时统一验证所有字段;
  • ​结果控制​​:若所有字段通过校验,业务逻辑(如接口调用)被执行;否则,错误提示阻止提交并指导用户修正。

7. 环境准备

​7.1 开发与测试环境​

  • ​开发工具​​:DevEco Studio(版本需支持ArkTS 3.0+);
  • ​运行环境​​:鸿蒙设备(如Mate 40系列)或模拟器(通过DevEco Studio创建);
  • ​工具推荐​​:
    • ​日志调试​​:通过DevEco Studio的“Log”面板查看校验函数的日志输出(如 console.log('密码校验结果:', isValid));
    • ​真机测试​​:在真机上验证输入交互的流畅性(特别是长文本输入和多字段切换)。

8. 实际详细应用代码示例(综合案例:用户信息编辑)

​8.1 场景描述​

用户信息编辑页面包含 ​​姓名(必填,非空)、身份证号(必填,18位且符合校验算法)、备注(可选,≤200字)​​,点击“保存”时联合验证所有字段。

​8.2 代码实现(ArkTS)​

(代码实现必填字段校验与可选字段长度限制。)


9. 运行结果

​9.1 注册表单​

  • 输入无效密码(如“123”)或不一致的确认密码,点击“注册”后显示对应错误提示;
  • 输入全部有效数据后,控制台输出注册信息。

​9.2 登录表单​

  • 未输入用户名或密码时,点击“登录”后显示“不能为空”提示;

​9.3 信息编辑表单​

  • 身份证号格式错误(如17位)时,提示“身份证号需为18位”;备注超过200字时,提示“备注过长”。

10. 测试步骤及详细代码

​10.1 基础功能测试​

  1. ​必填字段测试​​:不输入用户名/密码,点击提交,确认错误提示显示;
  2. ​格式校验测试​​:输入无效手机号(如“123456”),确认提示“11位手机号”;
  3. ​联合逻辑测试​​:确认密码与密码不一致,确认提示“两次密码不一致”;

​10.2 边界测试​

  1. ​极端输入测试​​:输入超长文本(如1000字符)到备注字段(若限制200字),确认提示“长度超限”;
  2. ​快速连续提交​​:快速点击多次提交按钮,验证校验逻辑的稳定性(无重复提交或状态错乱)。

11. 部署场景

​11.1 生产环境部署​

  • ​校验规则优化​​:根据业务需求调整正则表达式(如支持国际手机号格式);
  • ​异步校验扩展​​:对于用户名唯一性等需后端验证的字段,结合 fetch 接口调用(需处理异步状态);
  • ​用户体验增强​​:通过动画高亮错误字段(如输入框边框变红),或提供错误提示的详细说明(如“密码需包含至少一个大写字母”)。

​11.2 适用场景​

  • ​所有需用户输入的鸿蒙应用​​:登录、注册、订单提交、信息编辑等表单场景;
  • ​高安全性应用​​:金融类APP(密码强度校验)、医疗类APP(身份证号格式校验);
  • ​跨平台应用​​:需与Web/Android/iOS保持一致校验逻辑的统一表单。

12. 疑难解答

​12.1 问题1:校验函数未触发​

  • ​可能原因​​:
    • 未在 onChangeonClick 事件中调用校验函数;
    • 校验函数逻辑错误(如始终返回 true);
  • ​解决方案​​:
    • 检查输入框的 onChange 事件是否绑定到校验函数(如 onChange={(value) => { this.validatePassword(); }});
    • 在校验函数中添加 console.log 日志,确认函数被执行。

​12.2 问题2:错误提示未更新​

  • ​可能原因​​:
    • 错误提示状态(如 passwordError)未正确绑定到 Text 组件;
    • 校验函数中未更新错误状态(如忘记赋值 this.passwordError = '错误信息');
  • ​解决方案​​:
    • 检查 Text 组件的显示条件(如 if (this.passwordError));
    • 确保校验函数中修改了对应的 @State 变量。

​12.3 问题3:联合校验逻辑冲突​

  • ​可能原因​​:
    • 多个字段的校验函数存在依赖关系(如确认密码校验依赖密码字段),但校验顺序错误;
    • 异步校验(如接口调用)未正确处理回调(如未等待结果就提交);
  • ​解决方案​​:
    • 在提交校验时,按逻辑顺序调用校验函数(如先校验密码,再校验确认密码);
    • 对于异步校验,使用 async/await 确保结果返回后再提交。

13. 未来展望

​13.1 技术趋势​

  • ​智能校验​​:结合AI模型自动识别用户输入的潜在错误(如模糊的身份证号提示“请检查位数”);
  • ​可视化配置​​:通过低代码平台配置表单校验规则(如拖拽字段并设置“必填+长度限制”),减少硬编码;
  • ​跨平台统一​​:鸿蒙与Web/Android/iOS共享校验逻辑(如通过统一的后端API或前端框架适配)。

​13.2 挑战​

  • ​复杂业务规则​​:多字段间存在多层逻辑关联(如“省份+城市+区县”需匹配行政区域)时,校验逻辑可能过于复杂;
  • ​性能优化​​:实时校验大量字段(如长表单)可能导致界面卡顿,需优化事件监听频率;
  • ​国际化支持​​:不同地区的校验规则差异(如手机号号段、身份证格式)需动态适配。

​14. 总结​

鸿蒙的表单提交与校验(尤其是多字段联合验证)是保障用户输入数据有效性的核心能力,通过 ​​状态管理(@State)、自定义校验函数、实时/提交校验机制​​ 的协同,开发者可以构建健壮的表单交互逻辑。

本文通过 ​​技术背景、应用场景、代码示例(注册/登录/信息编辑)、原理解释(校验流程图)、环境准备及疑难解答​​ 的全面解析,揭示了:

  • ​多字段联合验证的本质​​:通过逻辑关联校验(如密码一致性)确保数据的整体有效性;
  • ​最佳实践​​:合理设计校验规则(正则表达式)、平衡实时与提交校验的性能、提供清晰的用户错误反馈;
  • ​技术扩展​​:结合异步接口调用(如验证用户名唯一性)和国际化需求,适配更复杂的业务场景;
  • ​未来方向​​:关注智能校验与跨平台统一,提升开发效率和用户体验。

掌握这些表单校验技术,开发者能够打造专业、可靠的鸿蒙应用,为用户提供流畅且安全的数据输入体验。随着鸿蒙生态的演进,表单交互功能将进一步智能化和便捷化,成为开发者构建高质量应用的重要工具。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。