鸿蒙 兴趣课程推荐(基于用户画像)

举报
鱼弦 发表于 2025/10/23 17:49:59 2025/10/23
【摘要】 一、引言在终身学习与个性化教育兴起的背景下,用户对兴趣课程的需求从“泛泛获取”转向“精准匹配”。传统的课程推荐系统往往依赖热门榜单或简单分类(如“编程”“绘画”),难以真正贴合用户的个性化兴趣(如“零基础学Python”“儿童创意绘画进阶”)。鸿蒙操作系统(HarmonyOS)凭借其​​“一次开发,多端部署”​​的能力、​​分布式用户数据同步​​技术以及​​智能设备交互能力​​(如智能手表记...


一、引言

在终身学习与个性化教育兴起的背景下,用户对兴趣课程的需求从“泛泛获取”转向“精准匹配”。传统的课程推荐系统往往依赖热门榜单或简单分类(如“编程”“绘画”),难以真正贴合用户的个性化兴趣(如“零基础学Python”“儿童创意绘画进阶”)。鸿蒙操作系统(HarmonyOS)凭借其​​“一次开发,多端部署”​​的能力、​​分布式用户数据同步​​技术以及​​智能设备交互能力​​(如智能手表记录学习时长、平板提供沉浸式课程体验),为构建“懂用户”的兴趣课程推荐系统提供了独特优势——通过多维度用户画像(如年龄、兴趣标签、学习行为、设备使用习惯)实现精准推荐,并通过鸿蒙原生能力优化推荐触达与学习体验。
本文将深入探讨鸿蒙兴趣课程推荐系统的核心技术实现,涵盖用户画像构建、推荐算法逻辑与多设备协同推荐,结合ArkUI开发框架与鸿蒙分布式能力,通过代码示例与原理解析,帮助开发者打造个性化、智能化的课程推荐应用。

二、技术背景

1. 兴趣课程推荐的核心挑战

  • ​用户兴趣模糊性​​:用户可能无法清晰描述自身兴趣(如“想学点有趣的技能”),需通过行为数据(如浏览历史、收藏课程、学习时长)间接推断。
  • ​多维度画像构建​​:兴趣不仅与显式标签(如“摄影”“音乐”)相关,还受隐式因素影响(如学习时段偏好、设备类型(手机/平板)、地理位置)。
  • ​动态兴趣变化​​:用户的兴趣可能随时间推移而改变(如从“基础绘画”进阶到“油画创作”),推荐系统需实时更新画像。
  • ​跨设备协同需求​​:用户可能在手机上浏览课程,在平板上学习,需同步学习进度与兴趣标签。

2. 鸿蒙的核心能力支撑

  • ​分布式用户数据管理​​:通过鸿蒙的​​分布式数据服务(DistributedDataManagement, DDM)​​,将用户的兴趣标签、学习行为(如浏览时长、收藏课程)同步至关联设备(如手机、平板、智能手表),构建统一的用户画像。
  • ​多设备交互感知​​:智能手表可记录用户的运动状态(如“晨跑后更倾向学习放松类课程”),平板可通过重力传感器判断学习姿势(如“横屏观看视频课程更专注”),这些数据辅助丰富用户画像维度。
  • ​智能推荐算法适配​​:基于用户画像(如“25岁女性,兴趣标签:绘画、零基础,最近浏览水彩课程3次”),通过协同过滤(Collaborative Filtering)或内容推荐(Content-Based Filtering)算法生成个性化课程列表。
  • ​跨端一致体验​​:通过ArkUI的响应式布局,推荐页面自动适配手机(竖屏列表)、平板(横屏网格)等不同屏幕尺寸,保障推荐内容的呈现效果。

3. 传统推荐系统的局限性

  • ​数据孤岛​​:各设备(手机、平板)的学习行为数据独立存储,难以整合为完整画像。
  • ​静态推荐​​:推荐结果依赖历史数据,无法实时响应用户兴趣变化(如用户突然对“编程”感兴趣)。
  • ​缺乏场景感知​​:未考虑用户当前设备环境(如通勤时推荐短视频课程,居家时推荐长视频课程)。

三、应用使用场景

1. 个人兴趣探索(手机端为主)

​场景需求​​:用户(如大学生)想学习“有趣的新技能”,但不知道具体方向,希望通过浏览推荐课程发现兴趣点(如“插花艺术”“咖啡拉花”)。
​系统价值​​:基于用户的基础信息(如年龄20-25岁、常见浏览时段晚间)和初始兴趣标签(如“生活类”),推荐轻量化、趣味性强的入门课程,激发学习动力。

2. 技能深度学习(平板/智慧屏)

​场景需求​​:用户(如职场人士)已确定兴趣方向(如“Python编程”),希望通过系统推荐“进阶课程”(如“Django Web开发”)或关联内容(如“算法基础”)。
​系统价值​​:通过分析用户的历史学习记录(如已学完“Python基础语法”),推荐难度递进的课程,并适配平板的大屏优势(如视频课程全屏播放)。

3. 儿童兴趣培养(家庭多设备协同)

​场景需求​​:家长为孩子(6-12岁)选择兴趣课程(如“儿童绘画”“编程启蒙”),希望根据孩子的年龄、学习进度(如已完成“基础线条绘画”)推荐合适的进阶内容。
​系统价值​​:通过家长端设置儿童画像(如年龄、兴趣标签“绘画”),多设备(手机选课、平板学习)同步学习进度,推荐符合儿童认知水平的趣味课程。

4. 跨场景推荐(智能手表辅助)

​场景需求​​:用户在通勤(智能手表监测到步行状态)时,系统推荐5分钟内的短视频课程(如“冷知识科普”);居家(智能手表监测到静止状态)时,推荐长视频课程(如“纪录片解读”)。
​系统价值​​:通过智能手表的传感器数据(如运动状态、心率)判断用户场景,动态调整推荐课程的时长与形式。

四、不同场景下详细代码实现

场景1:基于鸿蒙的用户画像构建与兴趣课程推荐(ArkUI + 分布式数据管理)

以下示例展示如何通过鸿蒙的​​分布式数据服务(DistributedDataManagement)​​存储用户画像(如兴趣标签、学习行为),并根据画像推荐课程。

1. 项目初始化

通过DevEco Studio创建鸿蒙应用项目(选择“Empty Ability”模板),配置目标设备(如Phone、Tablet)。

2. 核心代码结构

entry/src/main/ets/
├── pages/
│   ├── HomePage.ets         // 首页(展示推荐课程)
│   └── ProfilePage.ets      // 用户画像设置页(可选)
├── common/
│   └── model/
│       ├── UserProfile.ets  // 用户画像模型
│       └── Course.ets       // 课程模型
├── utils/
│   └── RecommendationUtils.ets // 推荐算法工具类
└── resources/
    └── base/
        └── element/
            └── string.json  // 多语言文本

3. 用户画像模型(common/model/UserProfile.ets)

// 用户画像实体类(包含显式标签与隐式行为)
export class UserProfile {
  userId: string = '';          // 用户唯一标识(如华为账号ID)
  age: number = 0;              // 年龄
  gender: string = '';          // 性别(可选)
  interestTags: string[] = [];  // 显式兴趣标签(如['绘画','编程'])
  learningBehavior: LearningBehavior[] = []; // 学习行为记录
  devicePreference: string = 'phone'; // 常用设备(phone/tablet)
}

// 学习行为记录(如浏览、收藏、学习时长)
export class LearningBehavior {
  courseId: string = '';        // 课程ID
  behaviorType: string = '';    // 行为类型(browse/collect/learn)
  timestamp: number = 0;        // 行为时间(时间戳)
  duration?: number;            // 学习时长(分钟,可选)
}

4. 课程模型(common/model/Course.ets)

// 课程实体类
export class Course {
  id: string = '';              // 课程唯一标识
  title: string = '';           // 课程标题(如'零基础水彩课')
  description: string = '';     // 课程描述
  tags: string[] = [];          // 课程标签(如['绘画','水彩','入门'])
  difficulty: string = '';      // 难度等级(beginner/intermediate/advanced)
  duration: number = 0;         // 课程时长(分钟)
  category: string = '';        // 课程类别(如'艺术','科技')
}

5. 分布式数据管理工具类(utils/DistributedDataUtils.ets)

import distributedData from '@ohos.data.distributedData';

// 分布式数据管理工具(存储/读取用户画像)
export class DistributedDataUtils {
  private kvManager: distributedData.DistributedKVManager | null = null;
  private kvStore: distributedData.KVStore | null = null;

  // 初始化分布式KV存储(所有关联设备共享)
  async initKVStore() {
    try {
      this.kvManager = distributedData.getKVManager({
        bundleName: 'com.example.courseapp', // 当前应用包名
        userId: distributedData.UserId.CURRENT_USER
      });

      this.kvStore = await this.kvManager.getKVStore({
        storeId: 'user_profile_store', // 存储唯一标识
        options: { encrypt: true }     // 加密存储用户隐私数据
      });
    } catch (error) {
      console.error('分布式KV初始化失败:', error);
    }
  }

  // 保存用户画像到分布式存储
  async saveUserProfile(profile: UserProfile) {
    if (!this.kvStore) return;
    try {
      await this.kvStore.put('user_profile', JSON.stringify(profile));
      await this.kvStore.flush(); // 确保数据持久化
    } catch (error) {
      console.error('保存用户画像失败:', error);
    }
  }

  // 从分布式存储加载用户画像
  async loadUserProfile(): Promise<UserProfile | null> {
    if (!this.kvStore) return null;
    try {
      const data = await this.kvStore.get('user_profile', '{}');
      return data ? JSON.parse(data) as UserProfile : null;
    } catch (error) {
      console.error('加载用户画像失败:', error);
      return null;
    }
  }
}

6. 推荐算法工具类(utils/RecommendationUtils.ets)

import { UserProfile } from '../model/UserProfile';
import { Course } from '../model/Course';

// 推荐算法工具类(基于用户画像匹配课程)
export class RecommendationUtils {
  // 核心推荐逻辑:根据用户画像筛选匹配课程
  static recommendCourses(userProfile: UserProfile, allCourses: Course[]): Course[] {
    if (!userProfile.interestTags || userProfile.interestTags.length === 0) {
      return this.getPopularCourses(allCourses); // 无明确兴趣时返回热门课程
    }

    // 筛选与兴趣标签匹配的课程(标签重合度高的优先)
    const matchedCourses = allCourses.filter(course => {
      const commonTags = course.tags.filter(tag => 
        userProfile.interestTags.includes(tag)
      );
      return commonTags.length > 0; // 至少有一个共同标签
    });

    // 按匹配标签数量排序(重合度越高越靠前)
    return matchedCourses.sort((a, b) => {
      const aCommon = a.tags.filter(tag => userProfile.interestTags.includes(tag)).length;
      const bCommon = b.tags.filter(tag => userProfile.interestTags.includes(tag)).length;
      return bCommon - aCommon; // 降序
    }).slice(0, 5); // 返回前5个推荐课程
  }

  // 辅助方法:无明确兴趣时返回热门课程(模拟数据)
  private static getPopularCourses(allCourses: Course[]): Course[] {
    return allCourses.sort((a, b) => b.duration - a.duration).slice(0, 5); // 模拟:时长较长的课程(假设更受欢迎)
  }
}

7. 首页(pages/HomePage.ets)——展示推荐课程

import { UserProfile } from '../common/model/UserProfile';
import { Course } from '../common/model/Course';
import { DistributedDataUtils } from '../utils/DistributedDataUtils';
import { RecommendationUtils } from '../utils/RecommendationUtils';

@Entry
@Component
struct HomePage {
  @State recommendedCourses: Course[] = []; // 推荐课程列表
  private userProfile: UserProfile | null = null;
  private allCourses: Course[] = [ // 模拟课程数据(实际从服务端获取)
    {
      id: 'c1',
      title: '零基础水彩课',
      description: '适合初学者的水彩入门教程',
      tags: ['绘画', '水彩', '入门'],
      difficulty: 'beginner',
      duration: 30,
      category: '艺术'
    },
    {
      id: 'c2',
      title: 'Python编程入门',
      description: '从零开始学Python',
      tags: ['编程', 'Python', '入门'],
      difficulty: 'beginner',
      duration: 45,
      category: '科技'
    },
    {
      id: 'c3',
      title: '儿童创意绘画',
      tags: ['绘画', '儿童', '创意'],
      difficulty: 'beginner',
      duration: 25,
      category: '教育'
    },
    // 更多课程...
  ];

  aboutToAppear() {
    this.initUserProfileAndRecommend();
  }

  // 初始化用户画像并生成推荐
  async initUserProfileAndRecommend() {
    try {
      // 初始化分布式数据管理
      const dataUtils = new DistributedDataUtils();
      await dataUtils.initKVStore();

      // 加载用户画像(若无则创建默认画像)
      this.userProfile = await dataUtils.loadUserProfile();
      if (!this.userProfile) {
        this.userProfile = this.createDefaultProfile();
        await dataUtils.saveUserProfile(this.userProfile); // 保存默认画像
      }

      // 生成推荐课程
      this.recommendedCourses = RecommendationUtils.recommendCourses(
        this.userProfile,
        this.allCourses
      );
    } catch (error) {
      console.error('推荐初始化失败:', error);
      // 降级:返回模拟推荐
      this.recommendedCourses = this.allCourses.slice(0, 3);
    }
  }

  // 创建默认用户画像(无历史数据时)
  private createDefaultProfile(): UserProfile {
    const defaultProfile = new UserProfile();
    defaultProfile.userId = 'default_user'; // 实际应从华为账号获取
    defaultProfile.age = 25; // 默认年龄
    defaultProfile.interestTags = ['艺术', '科技']; // 默认兴趣
    return defaultProfile;
  }

  build() {
    Column() {
      Text('为您推荐的兴趣课程')
        .fontSize(24)
        .fontWeight(FontWeight.Bold)
        .margin({ bottom: 20 });

      List({ space: 15 }) {
        ForEach(this.recommendedCourses, (course: Course) => {
          ListItem() {
            this.CourseCard(course);
          }
        });
      }
      .layoutWeight(1);
    }
    .width('100%')
    .height('100%')
    .padding(16);
  }

  // 课程卡片组件(简化展示)
  @Builder
  CourseCard(course: Course) {
    Row() {
      // 课程封面占位(实际项目用Image组件加载图片)
      Rect()
        .width(60)
        .height(80)
        .fill('#f0f0f0')
        .borderRadius(8);

      Column() {
        Text(course.title)
          .fontSize(18)
          .fontWeight(FontWeight.Medium)
          .maxLines(1)
          .margin({ bottom: 5 });

        Text(course.tags.slice(0, 2).join(' · ')) // 显示前两个标签
          .fontSize(14)
          .fontColor('#666')
          .maxLines(1);

        Text(`${course.duration}分钟 · ${course.difficulty}`)
          .fontSize(12)
          .fontColor('#999')
          .margin({ top: 3 });
      }
      .alignItems(HorizontalAlign.Start)
      .layoutWeight(1)
      .margin({ left: 15 });
    }
    .width('100%')
    .padding(12)
    .backgroundColor('#fff')
    .borderRadius(12)
    .shadow({
      radius: 4,
      color: '#00000010',
      offsetX: 0,
      offsetY: 2
    });
  }
}

场景2:用户画像动态更新(学习行为追踪)

当用户浏览课程、收藏课程或完成学习时,系统需实时更新用户画像中的learningBehavior,从而优化后续推荐。以下代码展示如何记录用户行为并同步至分布式存储。

1. 行为记录工具类(utils/BehaviorTracker.ets)

import { UserProfile } from '../model/UserProfile';
import { LearningBehavior } from '../model/UserProfile';
import { DistributedDataUtils } from './DistributedDataUtils';

// 学习行为追踪工具
export class BehaviorTracker {
  private dataUtils: DistributedDataUtils = new DistributedDataUtils();

  // 记录用户浏览课程行为
  async trackBrowseCourse(courseId: string) {
    await this.updateBehavior(courseId, 'browse');
  }

  // 记录用户收藏课程行为
  async trackCollectCourse(courseId: string) {
    await this.updateBehavior(courseId, 'collect');
  }

  // 记录用户学习课程行为(含时长)
  async trackLearnCourse(courseId: string, duration: number) {
    await this.updateBehavior(courseId, 'learn', duration);
  }

  // 更新用户行为(核心逻辑)
  private async updateBehavior(courseId: string, behaviorType: string, duration?: number) {
    try {
      const profile = await this.dataUtils.loadUserProfile();
      if (!profile) return;

      // 添加新的学习行为记录
      const newBehavior: LearningBehavior = {
        courseId: courseId,
        behaviorType: behaviorType,
        timestamp: Date.now(),
        duration: duration
      };
      profile.learningBehavior.push(newBehavior);

      // 保存更新后的画像
      await this.dataUtils.saveUserProfile(profile);
    } catch (error) {
      console.error('行为记录失败:', error);
    }
  }
}

2. 在课程详情页调用行为追踪(示例)

// 在课程详情页(pages/CourseDetail.ets)中,当用户点击“浏览”“收藏”或“完成学习”时调用:
import { BehaviorTracker } from '../utils/BehaviorTracker';

// 示例:用户浏览课程时
const tracker = new BehaviorTracker();
tracker.trackBrowseCourse('c1'); // 课程ID为c1

// 用户收藏课程时
tracker.trackCollectCourse('c1');

// 用户完成学习(学习了30分钟)时
tracker.trackLearnCourse('c1', 30);

五、原理解释

1. 用户画像驱动的推荐流程

+---------------------+       +---------------------+       +---------------------+
|  用户使用应用       | ----> |  记录行为数据       | ----> |  更新分布式用户画像 |
|  (浏览/收藏/学习)   |       |  (BehaviorTracker)  |       |  (DistributedDataUtils)|
+---------------------+       +---------------------+       +---------------------+
          |                           |                           |
          |  用户打开首页      |                           |
          |------------------------>|                           |
          |  请求推荐课程      |                           |
          |------------------------>|                           |
          |                           |  加载用户画像       |
          |                           |  (含兴趣标签+行为)  |
          |                           |------------------------>|
          |                           |  执行推荐算法       |
          |                           |  (RecommendationUtils)|
          |                           |------------------------>|
          |                           |  返回匹配课程列表   |
          |                           |------------------------>|
          |                           |  展示推荐结果       |
          v                           v                           v
+---------------------+       +---------------------+       +---------------------+
|  鸿蒙分布式存储     |       |  推荐算法逻辑       |       |  用户看到个性化课程 |
|  (统一用户画像)     |       |  (标签匹配/热度排序)|       |  (HomePage展示)     |
+---------------------+       +---------------------+       +---------------------+

2. 核心机制解析

  • ​用户画像构建​​:通过分布式数据服务(DistributedDataManagement)存储用户的显式兴趣标签(如“绘画”“编程”)和隐式行为数据(如浏览时长、收藏课程、学习进度),所有关联设备(手机、平板)共享同一份画像数据。
  • ​推荐算法逻辑​​:基于用户画像中的兴趣标签,筛选课程标签与之重合度高的课程(如用户标签“绘画”匹配课程标签“水彩”“油画”),并按重合度排序;若无明确兴趣,则返回热门课程作为兜底推荐。
  • ​动态更新机制​​:用户每次浏览、收藏或学习课程时,行为数据(如behaviorType: 'learn'duration: 30)被记录到用户画像的learningBehavior中,后续推荐算法可根据这些行为优化匹配(如“学习过Python基础的用户更可能对‘Django进阶’感兴趣”)。

3. 分布式能力的价值

  • ​多设备一致性​​:用户在手机上收藏的课程、学习的时长会自动同步至平板和智慧屏,确保所有设备的推荐结果基于完整画像。
  • ​隐私安全​​:用户画像数据通过加密存储(options: { encrypt: true })保护,仅授权设备可访问。
  • ​跨场景适配​​:智能手表可记录用户的运动状态(如“晨跑后”),通过分布式数据同步至手机,推荐更适合当前场景的轻松课程(如“冥想放松”)。

六、核心特性

特性
说明
优势
​精准个性化推荐​
基于用户兴趣标签(显式+隐式)和学习行为动态生成推荐列表
推荐结果贴合用户真实需求,提升学习动力
​多设备数据同步​
通过鸿蒙分布式数据服务,统一管理手机、平板等设备的用户画像
所有设备推荐结果一致,避免重复操作
​动态兴趣适应​
实时更新用户行为(如新收藏的课程、学习时长),优化后续推荐
推荐内容随用户兴趣变化而调整
​跨端一致体验​
基于ArkUI的响应式布局,推荐页面自动适配手机、平板等屏幕
统一美观的界面,支持多设备无缝切换
​隐私保护​
用户画像数据加密存储,仅当前用户授权的设备可访问
保障用户学习偏好与行为数据的安全性
​低延迟响应​
分布式数据读写高效,推荐结果在用户打开首页时即时生成
无需等待,快速呈现个性化内容

七、原理流程图及原理解释

原理流程图(兴趣课程推荐全流程)

+---------------------+       +---------------------+       +---------------------+
|  用户启动应用       | ----> |  加载分布式用户画像 | ----> |  获取兴趣标签+行为  |
|  (HomePage)         |       |  (DistributedDataUtils)|       |  (UserProfile)      |
+---------------------+       +---------------------+       +---------------------+
          |                           |                           |
          |  用户浏览/收藏/学习 |                           |
          |------------------------>|                           |
          |  记录行为数据       |                           |
          |  (BehaviorTracker)  |                           |
          |------------------------>|                           |
          |  更新用户画像       |                           |
          |------------------------>|                           |
          |                           |  重新保存画像至分布式存储 |
          |                           |  (自动同步至关联设备)   |
          |                           |                           |
          |  请求推荐课程      |                           |
          |------------------------>|                           |
          |  执行推荐算法       |                           |
          |  (RecommendationUtils)|                           |
          |------------------------>|                           |
          |  返回匹配课程列表   |                           |
          |------------------------>|                           |
          |  展示推荐结果       |                           |
          v                           v                           v
+---------------------+       +---------------------+       +---------------------+
|  鸿蒙分布式存储     |       |  推荐逻辑核心       |       |  用户看到个性化课程 |
|  (统一画像数据)     |       |  (标签匹配/行为分析)|       |  (HomePage卡片展示) |
+---------------------+       +---------------------+       +---------------------+

原理解释

  1. ​用户画像初始化​​:用户首次使用应用时,系统创建默认画像(如兴趣标签“艺术”“科技”),或从分布式存储加载已有的完整画像(包含历史兴趣与行为)。
  2. ​行为数据采集​​:用户在浏览课程(trackBrowseCourse)、收藏课程(trackCollectCourse)或完成学习(trackLearnCourse)时,行为数据(如课程ID、行为类型、时长)被记录到用户画像的learningBehavior数组中。
  3. ​分布式同步​​:所有行为数据通过鸿蒙的分布式数据服务(DistributedDataManagement)存储在共享的KV存储中,确保手机、平板、智慧屏等关联设备访问的是同一份最新画像。
  4. ​推荐生成​​:当用户打开首页时,系统从分布式存储加载用户画像,基于兴趣标签(如“绘画”)筛选课程标签重合度高的课程(如“水彩课”“油画课”),并按重合度排序生成推荐列表。
  5. ​结果展示​​:推荐课程以卡片形式展示在首页(HomePage),用户点击后可进入详情页进一步学习,同时行为数据继续反馈至画像,形成“行为-推荐-优化”的闭环。

八、环境准备

1. 开发环境要求

  • ​操作系统​​:Windows 10/11、macOS 10.15+或Linux(推荐Windows 11或macOS Monterey)。
  • ​开发工具​​:DevEco Studio(鸿蒙官方IDE,版本3.1 Release及以上,需配置JDK 11和Gradle 7.3)。
  • ​SDK​​:HarmonyOS SDK(通过DevEco Studio自动下载,选择API Version 9或更高)。
  • ​真机/模拟器​​:华为真机(需开启开发者模式)或鸿蒙模拟器(通过DevEco Studio创建,支持Phone、Tablet等设备类型)。

2. 项目创建

  1. 打开DevEco Studio,选择“Create Project”。
  2. 选择“Application”→“Empty Ability”,填写项目名称(如“InterestCourseRecommend”),选择目标设备(如Phone)。
  3. 确认项目模板后,等待依赖下载完成。

3. 权限配置(config.json)

entry/src/main/module.json5中添加必要权限(如分布式数据管理):
{
  "module": {
    "requestPermissions": [
      {
        "name": "ohos.permission.DISTRIBUTED_DATASYNC",
        "reason": "用于多设备用户画像同步"
      }
    ]
  }
}

九、实际详细应用代码示例实现

完整代码结构

entry/src/main/ets/
├── pages/
│   ├── HomePage.ets         // 首页(推荐课程展示)
│   └── ProfilePage.ets      // 用户画像设置页(可选)
├── common/
│   └── model/
│       ├── UserProfile.ets  // 用户画像模型
│       └── Course.ets       // 课程模型
├── utils
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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